| Title: | Marine Source Unmixing Toolkit |
|---|---|
| Description: | Reconstructs the provenance of particulate matter and marine sediments by 'unmixing' isotopic and elemental signatures. Provides a specialized toolkit for marine biogeochemistry, coastal tracing, and oceanographic sediment transport following the step-by-step procedure described in Cepeda 'et' 'al.' (2026) <doi:10.1002/lom3.70083>, which is tested using artificial mixtures. |
| Authors: | Esther Cepeda [aut, cre], Maarten Wynants [aut], Ivan Lizaga [aut, ths, ldr], Samuel Bodé [ctb], Pascal Boeckx [ctb], Jan Vanaverbeke [ctb], Ulrike Braeckman [ctb], Margarita Villalonga [ctb], Aiming Liang [ctb], Borja Latorre [ctb], Leticia Gaspar [ctb], Ana Navas [ctb], Vince Q Vu [ctb] |
| Maintainer: | Esther Cepeda <cepeda.esther@hotmail.com> |
| License: | GPL (>= 2) |
| Version: | 1.0.2 |
| Built: | 2026-10-15 20:37:36 UTC |
| Source: | https://github.com/cran/OceanTracer |
Corrects isotopic ratios by subtracting a source amino acid baseline (e.g., Phe or Lys) to isolate trophic enrichment. Automatically handles both raw data and averaged (Mean/SD) data, applying exact quadrature error propagation for standard deviations.
aa_baseline_correction( data, references = "Phe", invert = "Thr", drop_ref = TRUE )aa_baseline_correction( data, references = "Phe", invert = "Thr", drop_ref = TRUE )
data |
A data frame containing isotopic ratios. |
references |
Character vector of the amino acid(s) to use as the baseline.
If multiple are provided (e.g., |
invert |
Character vector of amino acids that undergo inverse trophic
fractionation (typically |
drop_ref |
Logical. If |
A data.frame of the same class as data with baseline-corrected
isotopic values. For raw datasets, ratios are updated in place; for averaged datasets,
means and standard deviations are updated with propagated quadrature errors.
If drop_ref = TRUE, columns corresponding to references are omitted.
# Example using raw isotopic ratio data raw_df <- data.frame( R_Phe = c(5.1, 5.3, 5.0), R_Glu = c(15.2, 16.0, 15.5), R_Thr = c(-2.1, -2.5, -2.0) ) aa_baseline_correction(raw_df, references = "Phe", invert = "Thr")# Example using raw isotopic ratio data raw_df <- data.frame( R_Phe = c(5.1, 5.3, 5.0), R_Glu = c(15.2, 16.0, 15.5), R_Thr = c(-2.1, -2.5, -2.0) ) aa_baseline_correction(raw_df, references = "Phe", invert = "Thr")
Example dataset included with OceanTracer containing isotopic tracer ratios and concentration data for sediment sources and mixture samples.
artificial_datasetartificial_dataset
A data frame with 13 rows and 26 columns:
Character. Unique sample identifier.
Factor or Character. Source classification group ("S1", "S2", "S3") or mixture sample ("Mx").
Numeric. Isotopic ratios for individual amino acids.
Numeric. Amino acid concentrations.
The dataset contains isotopic amino acid tracer ratios and concentration measurements for three potential sediment sources (S1, S2, S3) and one mixture sample (Mx). It is designed for demonstrating source apportionment, conservativeness index (CI) calculations, and tracer selection workflows.
A data frame containing the artificial data values.
Synthetic example dataset created for the OceanTracer package.
data("artificial_dataset") head(artificial_dataset)data("artificial_dataset") head(artificial_dataset)
Quantifies how consistently each tracer constrains the mixture apportionment when paired with randomly chosen complementary tracers.
CI_Method( data, points = 2000, Means = NULL, triangles = "virtual", seed = 123456L )CI_Method( data, points = 2000, Means = NULL, triangles = "virtual", seed = 123456L )
data |
Data frame in standard OceanTracer format (sources + mixture). |
points |
Integer. Number of Monte Carlo draws per tracer. Default 2000. |
Means |
Logical or NULL (default). Auto-detected if NULL. |
triangles |
Character. Strategy to select accompanying tracers ("virtual" or "dataset"). |
seed |
Integer. Random seed for reproducibility. Default 123456L. |
A list containing tracer output data frames, the original dataset, and the final summary CI index table.
Takes the output of CTS_n_sources and groups the tracer
combinations into clusters of similar source contributions (w1, w2, ...).
This helps identify the dominant apportionment solutions and how many
individual tracers support each one.
cluster_solutions( cts_result, top_n = 50L, k = NULL, max_k = 6L, interactive = FALSE, seed = NULL )cluster_solutions( cts_result, top_n = 50L, k = NULL, max_k = 6L, interactive = FALSE, seed = NULL )
cts_result |
Data frame returned by |
top_n |
Integer. Number of top rows to use for clustering. Default 50. |
k |
Integer or |
max_k |
Integer. Maximum k to evaluate when |
interactive |
Boolean. If |
seed |
Integer or |
Hierarchical clustering with Ward.D2 linkage is used because contribution
clusters are rarely spherical or equal-sized. The optimal number of clusters
is selected automatically via the average silhouette width criterion, but
can be overridden with the k argument.
Visualisation adapts to the number of sources:
2 sources: single 2D panel (w1 vs w2).
3 sources: two 2D panels (w1~w2, w1~w3) plus optional interactive 3D plotly scatter.
4+ sources: all pairwise 2D panels as a grid. Interactive 3D is not available (dimensionality reduction would obscure interpretation).
A named list:
summaryData frame: one row per cluster with mean/SD of each contribution, n_pairs, n_unique_tracers, avg_silhouette.
tracersNamed list. Each element has $pairs (character
vector) and $individual_tracers (data frame ranked by frequency).
plotggplot2 or plotly visualisation.
Transforms isotopic ratio and elemental content data into virtual scalar tracers that can be directly used in classical unmixing models.
Conservative_Balance( data, error_propagation = "ratio", impute_nas = FALSE, ... ) CB_Method(data, ...) cb_method(...)Conservative_Balance( data, error_propagation = "ratio", impute_nas = FALSE, ... ) CB_Method(data, ...) cb_method(...)
data |
Data frame. Contains the isotopic tracer characteristics of sediment sources and one mixture. Both averaged and raw formats are supported. |
error_propagation |
Character. Error propagation method for averaged data: "ratio" (default) or "full". |
impute_nas |
Logical. If TRUE, automatically imputes missing values (NAs) in source samples using their respective group means. Default FALSE. |
... |
Additional arguments passed to internal helper functions or aliases. |
A data frame with isotopic tracers replaced by their CB-transformed scalar equivalents.
Assesses the mathematical consistency of a tracer selection by computing the normalized error between the predicted and observed tracer concentrations in the mixture. A low error (typically below 0.05) for all tracers indicates a consistent selection. High errors point to non-conservative tracers or multiple partial solutions in the dataset.
consistency_error(data, solution) CTS_error(data, solution) cts_error(data, solution)consistency_error(data, solution) CTS_error(data, solution) cts_error(data, solution)
data |
A data frame containing the characteristics of sediment sources and one mixture, in the standard fingerprinting format. |
solution |
Either a numeric vector of apportionment weights (one per
source, in the same order as they appear in |
The error for each tracer is the absolute difference between the observed mixture concentration and the virtual mixture reconstructed from the apportionment solution, after normalizing by the range of the source confidence intervals.
A data frame with columns tracer and consistency_error,
one row per tracer.
Latorre, B., Lizaga, I., Gaspar, L., & Navas, A. (2021). A novel method for analysing consistency and unravelling multiple solutions in sediment fingerprinting. Science of The Total Environment, 789, 147804.
Generates a correlation matrix scatterplot of dataset properties, grouped by source, to aid in collinearity diagnosis and optimal tracer selection.
Correlation_Chart( data, tracers = 1:(ncol(data) - 2), mixtures = TRUE, nmixtures = 2, colors = NULL, seed = NULL ) correlationPlot( data, tracers = 1:(ncol(data) - 2), mixtures = TRUE, nmixtures = 2, colors = NULL, seed = NULL ) correlation_plot( data, tracers = 1:(ncol(data) - 2), mixtures = TRUE, nmixtures = 2, colors = NULL, seed = NULL )Correlation_Chart( data, tracers = 1:(ncol(data) - 2), mixtures = TRUE, nmixtures = 2, colors = NULL, seed = NULL ) correlationPlot( data, tracers = 1:(ncol(data) - 2), mixtures = TRUE, nmixtures = 2, colors = NULL, seed = NULL ) correlation_plot( data, tracers = 1:(ncol(data) - 2), mixtures = TRUE, nmixtures = 2, colors = NULL, seed = NULL )
data |
Data frame. Contains source and mixture data in the standard fingerprinting format. |
tracers |
Numeric vector. Indices of the tracers to include in the matrix. Default |
mixtures |
Logical. If TRUE, includes mixture samples in the correlation plots. Default TRUE. |
nmixtures |
Integer. Number of mixture samples present in the dataset. Default 2. |
colors |
Character vector. Custom colors for the scatterplot groups. Default NULL. |
seed |
Integer. Random seed for reproducibility. Default NULL. |
A GGally::ggpairs object.
Computes the Consensus Ranking (CR) method, an ensemble technique to identify non-conservative and dissenting tracers. The method combines predictions from single-tracer models and is based on a scoring function derived from a series of random "debates" between tracers, utilizing advanced thresholding logic for extreme datasets.
CR_Method( data, debates = 1000, completion_quantile = 0.9, apportionment_threshold = 0.05, seed = 123456, verbose = TRUE ) CR( data, debates = 1000, completion_quantile = 0.9, apportionment_threshold = 0.05, seed = 123456, verbose = TRUE ) cr_ns( data, debates = 1000, completion_quantile = 0.9, apportionment_threshold = 0.05, seed = 123456, verbose = TRUE )CR_Method( data, debates = 1000, completion_quantile = 0.9, apportionment_threshold = 0.05, seed = 123456, verbose = TRUE ) CR( data, debates = 1000, completion_quantile = 0.9, apportionment_threshold = 0.05, seed = 123456, verbose = TRUE ) cr_ns( data, debates = 1000, completion_quantile = 0.9, apportionment_threshold = 0.05, seed = 123456, verbose = TRUE )
data |
Data frame. Contains source and mixture data in the standard OceanTracer format. |
debates |
Integer. Target number of random debates per tracer. Default 1000. |
completion_quantile |
Numeric [0,1]. Quantile threshold for debate completion. For example, 0.5 stops the simulation once half the tracers hit the debates target. Default 0.9. |
apportionment_threshold |
Numeric. Tolerance boundary for valid debate apportionments (e.g., defining valid as -threshold to 1 + threshold). Default 0.05. |
seed |
Integer. Random seed for reproducibility. Default 123456. |
verbose |
Logical. Whether to show a progress bar in the console. Default is TRUE. |
A data frame containing the CR score, debates won, and debates lost per tracer.
Lizaga, I., Latorre, B., Gaspar, L., & Navas, A. (2020). Consensus ranking as a method to identify non-conservative and dissenting tracers in fingerprinting studies. *Science of The Total Environment*, *720*, 137537. https://doi.org/10.1016/j.scitotenv.2020.137537
Solves determined systems for 1 tracer and 2 sources to assess solution dispersion and discriminant capacity.
CTS_2_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) singles(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_singles(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)CTS_2_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) singles(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_singles(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)
source |
Data frame of sediment sources containing source means, standard deviations, and sample sizes. |
mixture |
Data frame of mixture samples. |
iter |
Number of Monte Carlo iterations. Default is 1000. |
seed |
Integer seed for reproducibility. Default is 123456. |
verbose |
Logical. Whether to show a progress bar in the console. Default is TRUE. |
A data.frame ordered by max_dw (lowest dispersion first) containing:
id |
Tracer name identifier. |
w1, w2
|
Calculated proportion contributions for Source 1 and Source 2. |
dw1, dw2
|
Dispersion uncertainties for Source 1 and Source 2 (half 84% - 16% quantile range). |
cons |
Proportion of Monte Carlo iterations yielding physically valid proportions between 0 and 1. |
max_dw |
Maximum dispersion uncertainty across both sources. |
# Prepare small dummy datasets src <- data.frame( ID = c("Src1", "Src2"), Tracer1 = c(10.5, 20.2), Tracer1_SD = c(1.1, 1.8), n = c(10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 15.0) # Run engine result <- CTS_2_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)# Prepare small dummy datasets src <- data.frame( ID = c("Src1", "Src2"), Tracer1 = c(10.5, 20.2), Tracer1_SD = c(1.1, 1.8), n = c(10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 15.0) # Run engine result <- CTS_2_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)
Solves determined systems for 2 tracers and 3 sources to assess solution dispersion and discriminant capacity.
CTS_3_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) pairs(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_pairs(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)CTS_3_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) pairs(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_pairs(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)
source |
Data frame of sediment sources containing 3 source rows, mean values, standard deviations, and sample size ('n'). |
mixture |
Data frame of mixture samples. |
iter |
Number of Monte Carlo iterations. Default is 1000. |
seed |
Integer seed for reproducibility. Default is 123456. |
verbose |
Logical. Whether to show a progress bar in the console. Default is TRUE. |
A data.frame ordered by max_dw (lowest dispersion first) containing:
id |
Pair of tracer names used for the system. |
w1, w2, w3
|
Calculated proportion contributions for Sources 1, 2, and 3. |
dw1, dw2, dw3
|
Dispersion uncertainties for Sources 1, 2, and 3 (half 84% - 16% quantile range). |
cons |
Proportion of Monte Carlo iterations yielding physically valid proportions between 0 and 1. |
max_dw |
Maximum dispersion uncertainty across all three sources. |
# Prepare small dummy datasets for 3 sources and 2 tracers src <- data.frame( ID = c("Src1", "Src2", "Src3"), Tracer1 = c(10.5, 20.2, 5.0), Tracer2 = c(2.1, 8.5, 12.3), Tracer1_SD = c(1.1, 1.8, 0.5), Tracer2_SD = c(0.3, 0.9, 1.1), n = c(10, 10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 12.0, Tracer2 = 6.0) # Run engine result <- CTS_3_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)# Prepare small dummy datasets for 3 sources and 2 tracers src <- data.frame( ID = c("Src1", "Src2", "Src3"), Tracer1 = c(10.5, 20.2, 5.0), Tracer2 = c(2.1, 8.5, 12.3), Tracer1_SD = c(1.1, 1.8, 0.5), Tracer2_SD = c(0.3, 0.9, 1.1), n = c(10, 10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 12.0, Tracer2 = 6.0) # Run engine result <- CTS_3_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)
Solves determined systems for 3 tracers and 4 sources to assess solution dispersion and discriminant capacity.
CTS_4_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) triplets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_triplets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)CTS_4_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) triplets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_triplets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)
source |
Data frame of sediment sources containing 4 source rows, mean values, standard deviations, and sample size ('n'). |
mixture |
Data frame of mixture samples. |
iter |
Number of Monte Carlo iterations. Default is 1000. |
seed |
Integer seed for reproducibility. Default is 123456. |
verbose |
Logical. Whether to show a progress bar in the console. Default is TRUE. |
A data.frame ordered by max_dw (lowest dispersion first) containing:
id |
Triplet of tracer names used for the system. |
w1, w2, w3, w4
|
Calculated proportion contributions for Sources 1 through 4. |
dw1, dw2, dw3, dw4
|
Dispersion uncertainties for Sources 1 through 4 (half 84% - 16% quantile range). |
cons |
Proportion of Monte Carlo iterations yielding physically valid proportions. |
max_dw |
Maximum dispersion uncertainty across all four sources. |
# Prepare small dummy datasets for 4 sources and 3 tracers src <- data.frame( ID = c("Src1", "Src2", "Src3", "Src4"), Tracer1 = c(10.5, 20.2, 5.0, 15.1), Tracer2 = c(2.1, 8.5, 12.3, 4.2), Tracer3 = c(0.5, 1.2, 3.4, 0.9), Tracer1_SD = c(1.1, 1.8, 0.5, 0.8), Tracer2_SD = c(0.3, 0.9, 1.1, 0.4), Tracer3_SD = c(0.1, 0.2, 0.3, 0.1), n = c(10, 10, 10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 12.0, Tracer2 = 6.0, Tracer3 = 1.5) # Run engine result <- CTS_4_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)# Prepare small dummy datasets for 4 sources and 3 tracers src <- data.frame( ID = c("Src1", "Src2", "Src3", "Src4"), Tracer1 = c(10.5, 20.2, 5.0, 15.1), Tracer2 = c(2.1, 8.5, 12.3, 4.2), Tracer3 = c(0.5, 1.2, 3.4, 0.9), Tracer1_SD = c(1.1, 1.8, 0.5, 0.8), Tracer2_SD = c(0.3, 0.9, 1.1, 0.4), Tracer3_SD = c(0.1, 0.2, 0.3, 0.1), n = c(10, 10, 10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 12.0, Tracer2 = 6.0, Tracer3 = 1.5) # Run engine result <- CTS_4_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)
Solves determined linear systems for 4 tracers and 5 sources using Monte Carlo simulation to assess solution dispersion and discriminant capacity.
CTS_5_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) quartets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_quartets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)CTS_5_sources(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) quartets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE) CTS_seeds_quartets(source, mixture, iter = 1000, seed = 123456, verbose = TRUE)
source |
Data frame of sediment sources containing 5 source rows, tracer mean values, standard deviations, and sample size ('n'). |
mixture |
Data frame of mixture samples containing tracer measurements. |
iter |
Number of Monte Carlo iterations. Default is 1000. |
seed |
Integer seed for reproducibility. Default is 123456. |
verbose |
Logical. Whether to show a progress bar in the console. Default is TRUE. |
A data.frame ordered by max_dw (lowest dispersion first) containing:
id |
Quartet of tracer names used for the system. |
w1, w2, w3, w4, w5
|
Calculated proportion contributions for Sources 1 through 5. |
dw1, dw2, dw3, dw4, dw5
|
Dispersion uncertainties for Sources 1 through 5 (half 84% - 16% quantile range). |
cons |
Proportion of Monte Carlo iterations yielding physically valid proportions. |
max_dw |
Maximum dispersion uncertainty across all five sources. |
# Prepare small dummy datasets for 5 sources and 4 tracers src <- data.frame( ID = c("Src1", "Src2", "Src3", "Src4", "Src5"), Tracer1 = c(10.5, 20.2, 5.0, 15.1, 8.4), Tracer2 = c(2.1, 8.5, 12.3, 4.2, 6.7), Tracer3 = c(0.5, 1.2, 3.4, 0.9, 2.1), Tracer4 = c(100, 250, 400, 180, 310), Tracer1_SD = c(1.1, 1.8, 0.5, 0.8, 0.6), Tracer2_SD = c(0.3, 0.9, 1.1, 0.4, 0.5), Tracer3_SD = c(0.1, 0.2, 0.3, 0.1, 0.2), Tracer4_SD = c(10, 20, 35, 15, 22), n = c(10, 10, 10, 10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 12.0, Tracer2 = 6.0, Tracer3 = 1.5, Tracer4 = 220) # Run engine result <- CTS_5_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)# Prepare small dummy datasets for 5 sources and 4 tracers src <- data.frame( ID = c("Src1", "Src2", "Src3", "Src4", "Src5"), Tracer1 = c(10.5, 20.2, 5.0, 15.1, 8.4), Tracer2 = c(2.1, 8.5, 12.3, 4.2, 6.7), Tracer3 = c(0.5, 1.2, 3.4, 0.9, 2.1), Tracer4 = c(100, 250, 400, 180, 310), Tracer1_SD = c(1.1, 1.8, 0.5, 0.8, 0.6), Tracer2_SD = c(0.3, 0.9, 1.1, 0.4, 0.5), Tracer3_SD = c(0.1, 0.2, 0.3, 0.1, 0.2), Tracer4_SD = c(10, 20, 35, 15, 22), n = c(10, 10, 10, 10, 10) ) mix <- data.frame(ID = "Mix1", Tracer1 = 12.0, Tracer2 = 6.0, Tracer3 = 1.5, Tracer4 = 220) # Run engine result <- CTS_5_sources(source = src, mixture = mix, iter = 100, verbose = FALSE) head(result)
Identifies the most discriminant minimal tracer combinations (n-1) by solving determined systems and assessing solution dispersion. Lower dispersion indicates higher discriminant capacity.
CTS_n_sources(data, iter = 1000, seed = 123456) CTS_seeds(data, iter = 1000, seed = 123456)CTS_n_sources(data, iter = 1000, seed = 123456) CTS_seeds(data, iter = 1000, seed = 123456)
data |
Data frame containing sediment source and mixture data. |
iter |
Number of Monte Carlo iterations for variability analysis. |
seed |
Integer for reproducibility. |
A data frame with all tracer combinations, source apportionments (wi), physical feasibility (0 < wi < 1), and solution dispersion (sd_wi). Results are sorted by the lowest maximum dispersion.
Latorre, B., Lizaga, I., Gaspar, L., & Navas, A. (2021). A novel method for analysing consistency and unravelling multiple solutions in sediment fingerprinting.
Performs stepwise forward variable selection using the Wilks Lambda criterion. Tracers are added one at a time when they improve inter-source discrimination beyond the specified significance threshold.
DFATest(data, niveau = 0.1, verbose = TRUE)DFATest(data, niveau = 0.1, verbose = TRUE)
data |
Data frame in the standard OceanTracer format (sources + mixture). |
niveau |
Numeric. Significance level for the F-test at each step. Default 0.1. |
verbose |
Logical. Whether to print DFA selection summaries to the console. Default is |
A list containing the retained data frame and the DFA model output.
Estimates the fractional contribution of each sediment source to a mixture by solving an overdetermined mass-balance system with least-squares minimisation. Source variability is propagated by Monte Carlo resampling: at each iteration, synthetic source signatures are drawn from a normal distribution defined by the measured mean and standard deviation, and the system is solved independently for each draw.
frequentist_unconstrained( data, variability = "SEM", iter = 1000, means = FALSE, seed = 123456L, verbose = TRUE )frequentist_unconstrained( data, variability = "SEM", iter = 1000, means = FALSE, seed = 123456L, verbose = TRUE )
data |
Data frame in the standard OceanTracer format (sources + mixture). |
variability |
Character. |
iter |
Integer or character. Number of Monte Carlo iterations (e.g., |
means |
Logical. |
seed |
Integer. Random seed for reproducibility. Default is 123456L. |
verbose |
Logical. Whether to show progress bars and summary messages in the console. Default is TRUE. |
This function is the computational back-end called by unmixing.
For most users, calling unmixing directly is recommended.
A data frame with one row per iteration containing the mixture ID, goodness-of-fit (GOF), and one column per source with the estimated fractional contribution.
Estimates the fractional contribution of each sediment source to a mixture by solving an overdetermined mass-balance system with least-squares minimisation. Unlike classical Monte Carlo propagation, uncertainty is handled analytically through Linear Variability Propagation (LVP): the Jacobian of the least-squares solution propagates source covariances directly into the apportionment uncertainty, avoiding assumptions of independent normally distributed errors.
frequentist_unconstrained_lvp( data, variability = "SEM", iter = 1000, means = FALSE, seed = 123456L, verbose = TRUE )frequentist_unconstrained_lvp( data, variability = "SEM", iter = 1000, means = FALSE, seed = 123456L, verbose = TRUE )
data |
Data frame in the standard OceanTracer format (sources + mixture). |
variability |
Character. |
iter |
Integer or character. Number of iterations (e.g., |
means |
Logical. |
seed |
Integer. Random seed for reproducibility. Default is 123456L. |
verbose |
Logical. Whether to show progress bars and summary messages in the console. Default is TRUE. |
LVP is recommended when source variability is high or when apportionment are near the physical boundaries (0 or 1), where Monte Carlo resampling tends to underestimate uncertainty.
This function is the computational back-end called by unmixing
when lvp = TRUE. For most users, calling unmixing directly
is recommended.
A data frame with one row per iteration containing the mixture ID, goodness-of-fit (GOF), and one column per source with the estimated fractional contribution.
Latorre, B., Lizaga, I., Gaspar, L., & Navas, A. (2025). Evaluating the impact of high source variability and extreme contributing sources on sediment fingerprinting models. Water Resources Management. doi:10.1007/s11269-025-04169-8
Renders a custom publication-ready biplot for PCA models created via
prcomp(), princomp(), FactoMineR::PCA(), or MASS::lda().
ggbiplot( pcobj, choices = 1:2, scale = 1, pc.biplot = TRUE, obs.scale = 1 - scale, var.scale = scale, groups = NULL, ellipse = FALSE, ellipse.prob = 0.68, labels = NULL, labels.size = 3, alpha = 1, var.axes = TRUE, circle = FALSE, circle.prob = 0.69, varname.size = 3, varname.adjust = 1.5, varname.abbrev = FALSE, ... )ggbiplot( pcobj, choices = 1:2, scale = 1, pc.biplot = TRUE, obs.scale = 1 - scale, var.scale = scale, groups = NULL, ellipse = FALSE, ellipse.prob = 0.68, labels = NULL, labels.size = 3, alpha = 1, var.axes = TRUE, circle = FALSE, circle.prob = 0.69, varname.size = 3, varname.adjust = 1.5, varname.abbrev = FALSE, ... )
pcobj |
Object. A PCA object returned by |
choices |
Numeric vector of length 2. Indices of principal components to plot. Default |
scale |
Numeric. Scale factor (0 or 1). Covariance biplot (scale = 1), form biplot (scale = 0). Default 1. |
pc.biplot |
Logical. If |
obs.scale |
Numeric. Scale factor applied to observations. Default |
var.scale |
Numeric. Scale factor applied to variables. Default |
groups |
Factor. Optional grouping variable to color-code observations. Default |
ellipse |
Logical. If |
ellipse.prob |
Numeric. Probability level for concentration ellipse size. Default |
labels |
Character vector. Optional custom labels for observations. Default |
labels.size |
Numeric. Text size used for observation labels. Default |
alpha |
Numeric [0, 1]. Transparency for points. Default |
var.axes |
Logical. If |
circle |
Logical. If |
circle.prob |
Numeric. Size of the correlation circle in Normal probability. Default |
varname.size |
Numeric. Text size for variable names. Default |
varname.adjust |
Numeric. Adjustment factor for variable name placement ( |
varname.abbrev |
Logical. If |
... |
Additional arguments passed to |
A ggplot object.
Visualizes the distribution of continuous tracer variables across sources and mixtures. It displays summary statistics (median, hinges, whiskers) alongside individual outliers.
Graph_boxplots( data, tracers = 1:(ncol(data) - 2), ncol = 3, colors = NULL, seed = NULL ) boxPlot( data, tracers = 1:(ncol(data) - 2), ncol = 3, colors = NULL, seed = NULL ) box_plot( data, tracers = 1:(ncol(data) - 2), ncol = 3, colors = NULL, seed = NULL )Graph_boxplots( data, tracers = 1:(ncol(data) - 2), ncol = 3, colors = NULL, seed = NULL ) boxPlot( data, tracers = 1:(ncol(data) - 2), ncol = 3, colors = NULL, seed = NULL ) box_plot( data, tracers = 1:(ncol(data) - 2), ncol = 3, colors = NULL, seed = NULL )
data |
Data frame containing source and mixture data in the standard format. |
tracers |
Numeric vector. Indices of the tracers to plot (1 refers to the first tracer column). Default is 1 to (ncol(data) - 2). |
ncol |
Integer. Number of plot columns per row in the grid layout. Default is 3. |
colors |
Character vector. Optional hex codes or color names for custom boxplot colors. Default is NULL. |
seed |
Integer. Random seed for reproducible jittering or sampling. Default is NULL. |
Invisibly returns the combined plot grid object created by gridExtra::grid.arrange().
data <- data.frame( ID = paste0("S", 1:12), Group = rep(c("SourceA", "SourceB", "Mixture"), each = 4), Tracer1 = c(10, 12, 11, 13, 20, 22, 21, 23, 15, 16, 15, 17), Tracer2 = c(5, 6, 5, 7, 15, 14, 16, 15, 10, 11, 10, 12) ) Graph_boxplots(data, tracers = 1:2, ncol = 2)data <- data.frame( ID = paste0("S", 1:12), Group = rep(c("SourceA", "SourceB", "Mixture"), each = 4), Tracer1 = c(10, 12, 11, 13, 20, 22, 21, 23, 15, 16, 15, 17), Tracer2 = c(5, 6, 5, 7, 15, 14, 16, 15, 10, 11, 10, 12) ) Graph_boxplots(data, tracers = 1:2, ncol = 2)
Identifies and returns the rows corresponding to the sediment mixture(s)
in a combined source-mixture data frame. The mixture is assumed to be the
last unique group in the second column of data. Both raw and
averaged (Mean_/SD_) formats are supported.
inputSample(data) inputMixture(data)inputSample(data) inputMixture(data)
data |
Data frame in the standard OceanTracer format, where the second column encodes the group identity (sources and mixture). |
A data frame containing only the mixture rows, with column names standardised to the OceanTracer convention.
inputSource for extracting source rows.
Selects and extracts the source samples from the dataset, computing mean,
standard deviation, and sample size (n) when the input is in raw format.
When pre-aggregated data is provided, column names are normalized to
Mean_/SD_ so that all downstream functions work correctly.
inputSource(data, na.omit = TRUE)inputSource(data, na.omit = TRUE)
data |
Data frame containing source and mixture data. |
na.omit |
Logical. If |
A data.frame where each row represents a sediment source containing:
id |
Factor or character vector identifying the source group. |
Mean_... |
Mean tracer values for each tracer. |
SD_... |
Standard deviations of tracer values for each tracer. |
n |
Sample size for each source group. |
# Example 1: Processing raw sample data raw_df <- data.frame( ID = paste0("S", 1:9), Group = rep(c("SourceA", "SourceB", "Mixture"), each = 3), Tracer1 = c(10, 12, 11, 20, 22, 21, 15, 16, 17), Tracer2 = c(5, 6, 5, 15, 14, 16, 10, 11, 12) ) inputSource(raw_df) # Example 2: Normalizing pre-averaged data with legacy column names summary_df <- data.frame( ID = c("Src1", "Src2", "Mix"), Group = c("SourceA", "SourceB", "Mixture"), mean_Tracer1 = c(11.0, 21.0, 16.0), mean_Tracer2 = c(5.33, 15.0, 11.0), sd_Tracer1 = c(1.0, 1.0, 1.0), sd_Tracer2 = c(0.58, 1.0, 1.0), n = c(3, 3, 3) ) inputSource(summary_df)# Example 1: Processing raw sample data raw_df <- data.frame( ID = paste0("S", 1:9), Group = rep(c("SourceA", "SourceB", "Mixture"), each = 3), Tracer1 = c(10, 12, 11, 20, 22, 21, 15, 16, 17), Tracer2 = c(5, 6, 5, 15, 14, 16, 10, 11, 12) ) inputSource(raw_df) # Example 2: Normalizing pre-averaged data with legacy column names summary_df <- data.frame( ID = c("Src1", "Src2", "Mix"), Group = c("SourceA", "SourceB", "Mixture"), mean_Tracer1 = c(11.0, 21.0, 16.0), mean_Tracer2 = c(5.33, 15.0, 11.0), sd_Tracer1 = c(1.0, 1.0, 1.0), sd_Tracer2 = c(0.58, 1.0, 1.0), n = c(3, 3, 3) ) inputSource(summary_df)
Retains only tracer properties that show statistically significant differences across source groups according to the non-parametric Kruskal-Wallis rank-sum test. Tracers with no discriminant power add noise to the unmixing model and should be removed before unmixing.
KWTest(data, pvalue = 0.05, verbose = TRUE)KWTest(data, pvalue = 0.05, verbose = TRUE)
data |
Data frame in the standard OceanTracer format (sources + mixture). |
pvalue |
Numeric. Significance threshold. Default 0.05. |
verbose |
Logical. Whether to print test summaries to the console. Default is |
A data frame retaining only tracer columns with p-value below pvalue.
Performs a linear discriminant analysis (LDA) to project data into maximum-separation dimensions. Includes a comprehensive discrimination summary detailing variance explained, a leave-one-out cross-validation confusion matrix, and misclassification rates to rigorously assess source separability.
LDA_Chart( data, Plot3D = FALSE, text = FALSE, colors = NULL, interactive = FALSE, seed = NULL, verbose = TRUE ) LDA_plot( data, Plot3D = FALSE, text = FALSE, colors = NULL, interactive = FALSE, seed = NULL, verbose = TRUE ) LDAPlot( data, Plot3D = FALSE, text = FALSE, colors = NULL, interactive = FALSE, seed = NULL, verbose = TRUE )LDA_Chart( data, Plot3D = FALSE, text = FALSE, colors = NULL, interactive = FALSE, seed = NULL, verbose = TRUE ) LDA_plot( data, Plot3D = FALSE, text = FALSE, colors = NULL, interactive = FALSE, seed = NULL, verbose = TRUE ) LDAPlot( data, Plot3D = FALSE, text = FALSE, colors = NULL, interactive = FALSE, seed = NULL, verbose = TRUE )
data |
Data frame. Contains source and mixture data in standard format. |
Plot3D |
Logical. If |
text |
Logical. If |
colors |
Character vector. Custom colors for the source groups. Default is |
interactive |
Logical. If |
seed |
Integer. Random seed for reproducibility. Default is |
verbose |
Logical. Whether to print discrimination summaries and variance explained to the console. Default is |
Invisibly returns a named list containing:
lda |
An object of class |
confusion |
A cross-tabulation table of leave-one-out cross-validation predictions versus actual sources. |
prop_var |
A numeric vector indicating the percentage of variance explained by each discriminant axis. |
data <- data.frame( ID = paste0("S", 1:12), Group = rep(c("SourceA", "SourceB", "SourceC", "Mixture"), each = 3), Tracer1 = c(10, 12, 11, 20, 22, 21, 30, 31, 32, 20, 21, 22), Tracer2 = c(5, 6, 5, 15, 14, 16, 25, 26, 24, 15, 15, 16), Tracer3 = c(1, 2, 1.5, 5, 6, 5.5, 9, 10, 9.5, 5, 5.5, 6) ) LDA_Chart(data, seed = 123)data <- data.frame( ID = paste0("S", 1:12), Group = rep(c("SourceA", "SourceB", "SourceC", "Mixture"), each = 3), Tracer1 = c(10, 12, 11, 20, 22, 21, 30, 31, 32, 20, 21, 22), Tracer2 = c(5, 6, 5, 15, 14, 16, 25, 26, 24, 15, 15, 16), Tracer3 = c(1, 2, 1.5, 5, 6, 5.5, 9, 10, 9.5, 5, 5.5, 6) ) LDA_Chart(data, seed = 123)
Displays the relative contribution of sediment sources to each mixture as density or violin plots. Designed to take the output of unmixing functions directly.
plot_apportionment( data, violin = FALSE, bounds = c(0, 1), scaled = TRUE, y_high = 1, colors = NULL, vlines = NULL, title = NULL, bw = "nrd" ) plotResults( data, violin = FALSE, bounds = c(0, 1), scaled = TRUE, y_high = 1, colors = NULL, vlines = NULL, title = NULL, bw = "nrd" ) plot_results( data, violin = FALSE, bounds = c(0, 1), scaled = TRUE, y_high = 1, colors = NULL, vlines = NULL, title = NULL, bw = "nrd" )plot_apportionment( data, violin = FALSE, bounds = c(0, 1), scaled = TRUE, y_high = 1, colors = NULL, vlines = NULL, title = NULL, bw = "nrd" ) plotResults( data, violin = FALSE, bounds = c(0, 1), scaled = TRUE, y_high = 1, colors = NULL, vlines = NULL, title = NULL, bw = "nrd" ) plot_results( data, violin = FALSE, bounds = c(0, 1), scaled = TRUE, y_high = 1, colors = NULL, vlines = NULL, title = NULL, bw = "nrd" )
data |
A data frame, typically the output from |
violin |
Logical. If |
bounds |
A numeric vector of length 2 specifying the lower and upper
display bounds (the camera window). Default is |
scaled |
Logical. If |
y_high |
Maximum value for the y-axis. Only used when
|
colors |
An optional named character vector of colors, one per source. Default is |
vlines |
An optional named numeric vector specifying true/expected values
for specific sources. Draws a dashed vertical line to allow visual validation
of the model's accuracy (e.g., |
title |
Optional character string to add a main title to the plot. Default is |
bw |
The smoothing bandwidth to be used. Can be a numeric value (e.g., |
A ggplot object visualizing the source contribution distributions.
# Generate mock unmixing output set.seed(123) mock_unmix <- data.frame( id = 1:100, gof = runif(100, 85, 95), SourceA = rnorm(100, mean = 0.45, sd = 0.05), SourceB = rnorm(100, mean = 0.35, sd = 0.04), SourceC = rnorm(100, mean = 0.20, sd = 0.03) ) # Density Plot plot_apportionment(mock_unmix, title = "Source Contributions (Density)") # Violin Plot with true values true_vals <- c("SourceA" = 0.45, "SourceB" = 0.35, "SourceC" = 0.20) plot_apportionment( mock_unmix, violin = TRUE, vlines = true_vals, title = "Source Contributions (Violin)" )# Generate mock unmixing output set.seed(123) mock_unmix <- data.frame( id = 1:100, gof = runif(100, 85, 95), SourceA = rnorm(100, mean = 0.45, sd = 0.05), SourceB = rnorm(100, mean = 0.35, sd = 0.04), SourceC = rnorm(100, mean = 0.20, sd = 0.03) ) # Density Plot plot_apportionment(mock_unmix, title = "Source Contributions (Density)") # Violin Plot with true values true_vals <- c("SourceA" = 0.45, "SourceB" = 0.35, "SourceC" = 0.20) plot_apportionment( mock_unmix, violin = TRUE, vlines = true_vals, title = "Source Contributions (Violin)" )
Performs a PCA on the tracer data and displays a biplot with source group
ellipses. Averaged datasets (with Mean_/SD_ or
mean_/sd_ columns) are automatically expanded to individual
observations by sampling from a normal distribution before the PCA is
computed, so all formats are accepted.
plot_pca(data, components = c(1L, 2L), colors = NULL, seed = NULL) PCAPlot(data, components = c(1L, 2L), colors = NULL, seed = NULL) PCA_plot(data, components = c(1L, 2L), colors = NULL, seed = NULL)plot_pca(data, components = c(1L, 2L), colors = NULL, seed = NULL) PCAPlot(data, components = c(1L, 2L), colors = NULL, seed = NULL) PCA_plot(data, components = c(1L, 2L), colors = NULL, seed = NULL)
data |
A data frame containing source and mixture data in the standard fingerprinting format (raw or averaged). |
components |
A numeric vector of length 2 indicating which principal
components to display. Default |
colors |
An optional character vector of colors, one per group. If
|
seed |
An integer value used to initialize the random number generator. |
A ggplot object (also printed to the active graphics device).
Evaluates source samples and removes rows that exceed user-defined thresholds for missing isotopic ratios or missing/zero elemental contents. Absolute zeros in content columns are treated as analytically missing data and are actively converted to NAs to prevent downstream statistical bias. The mixture row (assumed to be the last row) is always preserved.
prefilter_tracers(data, max_na_ratio = 0.3, max_zero_content = 0.3)prefilter_tracers(data, max_na_ratio = 0.3, max_zero_content = 0.3)
data |
Data frame containing source and mixture samples. Supports raw and averaged formats. |
max_na_ratio |
Numeric. Maximum allowable proportion of missing ratio values per row (0 to 1). Default 0.30. |
max_zero_content |
Numeric. Maximum allowable proportion of missing or zero content values per row (0 to 1). Default 0.30. |
A cleaned data frame with failing source rows removed and zeros in content columns converted to NAs.
Removes tracer properties whose mixture value falls outside the envelope defined by the minimum and maximum values observed across all source groups. Tracers failing this test cannot be explained by any linear combination of the measured sources and should be excluded before unmixing.
rangeTest(data, verbose = TRUE)rangeTest(data, verbose = TRUE)
data |
Data frame in the standard OceanTracer format (sources + mixture). |
verbose |
Logical. Whether to print removal summaries to the console. Default is |
A data frame retaining only tracer columns that pass the range test.
Visualizes Conservativeness Index (CI) predictions using ternary diagrams. Incorporates advanced hierarchical clustering to automatically group and color-code structurally similar apportionment solutions.
Ternary_Plot( data, tracers = 1:4, n_row = 1, n_col = 2, Means = FALSE, cluster = FALSE, dendro_lvls = 5, vrtl_sol = FALSE, vrtl = c(0.05, 0.9, 0.05), seed = NULL ) Ternary_diagram( data, tracers = 1:4, n_row = 1, n_col = 2, Means = FALSE, cluster = FALSE, dendro_lvls = 5, vrtl_sol = FALSE, vrtl = c(0.05, 0.9, 0.05), seed = NULL ) ternary_diagram( data, tracers = 1:4, n_row = 1, n_col = 2, Means = FALSE, cluster = FALSE, dendro_lvls = 5, vrtl_sol = FALSE, vrtl = c(0.05, 0.9, 0.05), seed = NULL )Ternary_Plot( data, tracers = 1:4, n_row = 1, n_col = 2, Means = FALSE, cluster = FALSE, dendro_lvls = 5, vrtl_sol = FALSE, vrtl = c(0.05, 0.9, 0.05), seed = NULL ) Ternary_diagram( data, tracers = 1:4, n_row = 1, n_col = 2, Means = FALSE, cluster = FALSE, dendro_lvls = 5, vrtl_sol = FALSE, vrtl = c(0.05, 0.9, 0.05), seed = NULL ) ternary_diagram( data, tracers = 1:4, n_row = 1, n_col = 2, Means = FALSE, cluster = FALSE, dendro_lvls = 5, vrtl_sol = FALSE, vrtl = c(0.05, 0.9, 0.05), seed = NULL )
data |
List. The output generated by the CI_Method function. |
tracers |
Numeric vector. Indices of the tracers to display. Default 1:4. |
n_row |
Integer. Number of rows in the output grid layout. Default 1. |
n_col |
Integer. Number of columns in the output grid layout. Default 2. |
Means |
Logical. If TRUE, indicates the input utilizes mean and SD formats rather than raw observations. Default FALSE. |
cluster |
Logical. If TRUE, applies hierarchical clustering to group structurally similar ternary solutions. Default FALSE. |
dendro_lvls |
Integer. Number of branch levels to cut the clustering dendrogram. Default 5. |
vrtl_sol |
Logical. If TRUE, overlays a theoretical or target virtual solution on the plot. Default FALSE. |
vrtl |
Numeric vector. Apportionment values for the theoretical solution. Default c(0.05, 0.9, 0.05). |
seed |
Integer. Random seed for reproducible cluster ordering when cluster = TRUE. Default NULL. |
Ternary diagrams from the individual tracer predictions.
Evaluates the directional bias introduced by individual tracers within Consistent Tracer Selection (CTS) subset models. This function unpacks unconstrained source apportionments to reveal if specific tracers are systematically pulling source contributions into physically impossible spaces (e.g., >1 or <0).
tracer_pull_analysis(cts_result)tracer_pull_analysis(cts_result)
cts_result |
A data frame containing the output from a CTS run. It must contain an
|
Global unmixing models (using all tracers simultaneously) can suffer from "tracer compensation," where extreme mathematical contradictions between non-conservative tracers cancel each other out, resulting in a misleadingly plausible central solution.
This function exposes that illusion. By taking the output of a CTS run (e.g., CTS_n_sources),
it isolates every debate a specific tracer participated in. It then calculates the marginal effect
(median, mean, and SD) that the tracer has on the fractional weight of each source.
Visualizations are automatically generated and stored in the returned list:
boxplot: Displays the distribution of calculated weights for each source, grouped by tracer. Red dashed lines denote the physical boundaries of 0 and 1.
heatmap: Displays the median weight pull. Deep red indicates a strong positive pull (overestimation), while deep blue indicates a negative pull (pushing the source into negative mass space).
A named list containing four elements:
summaryA tibble containing the Mean, Median, and SD of the weights forced by each tracer on each source.
boxplotA ggplot object showing the distribution of source weights grouped by tracer.
heatmapA ggplot object visualizing the median tracer bias across all sources.
raw_expandedA tibble of the raw, pivoted data used for calculations and plotting.
# Create a toy dataset mimicking a CTS model output cts_out <- data.frame( id = c("TracerA TracerB", "TracerA TracerC", "TracerB TracerC"), w1 = c(0.3, 0.4, 0.2), w2 = c(0.7, 0.6, 0.8) ) # Analyze tracer pull pull_results <- tracer_pull_analysis(cts_out) # View summary statistics and display boxplot print(pull_results$summary) print(pull_results$boxplot)# Create a toy dataset mimicking a CTS model output cts_out <- data.frame( id = c("TracerA TracerB", "TracerA TracerC", "TracerB TracerC"), w1 = c(0.3, 0.4, 0.2), w2 = c(0.7, 0.6, 0.8) ) # Analyze tracer pull pull_results <- tracer_pull_analysis(cts_out) # View summary statistics and display boxplot print(pull_results$summary) print(pull_results$boxplot)
Generates a generalized, faceted point plot to visualize tracer selection metrics across different datasets. Evaluates Classification Rate (CR), Concentration Indicator (CI), and Consistency Error (CONS) against user-defined thresholds.
tracer_selection_diagnostic_plot( data, cr_threshold = 70, ci_threshold = 2.5, cons_threshold = 0.025, custom_theme = ggplot2::theme_minimal() )tracer_selection_diagnostic_plot( data, cr_threshold = 70, ci_threshold = 2.5, cons_threshold = 0.025, custom_theme = ggplot2::theme_minimal() )
data |
Data frame. Must contain the columns: |
cr_threshold |
Numeric. Minimum passing score for CR. Default 70. |
ci_threshold |
Numeric. Minimum passing score for CI. Default 2.50. |
cons_threshold |
Numeric. Maximum allowable consistency error. Default 0.025. |
custom_theme |
A ggplot2 theme object. Defaults to |
A ggplot object visualizing tracer metric statuses.
For each tracer of interest, solves a series of minimal determined linear systems to assess how consistently that tracer constrains the source apportionment. In each iteration the tracer under evaluation is kept fixed while the remaining tracers needed to complete the system are drawn at random from the other measured tracers in the dataset.
triangles_dataset( sources, mixtures, tracer = 0L, iter = 100L, seed = 69512L, pb = NULL, pb_offset = 0L, tracer_current = NULL, tracer_total = NULL, verbose = TRUE )triangles_dataset( sources, mixtures, tracer = 0L, iter = 100L, seed = 69512L, pb = NULL, pb_offset = 0L, tracer_current = NULL, tracer_total = NULL, verbose = TRUE )
sources |
Data frame of source statistics: ID, one mean column per
tracer, one SD column per tracer, and sample size |
mixtures |
Data frame of mixture samples with the same tracer columns. |
tracer |
Integer (0-based). Index of the tracer under evaluation. |
iter |
Integer. Number of Monte Carlo iterations per mixture sample. Default 100L. |
seed |
Integer. Random seed for reproducibility. Default |
pb |
An optional |
pb_offset |
Integer. Starting offset for the external progress bar. Default |
tracer_current |
Integer. Position of this tracer in the outer loop. Default |
tracer_total |
Integer. Total number of tracers in the outer loop. Default |
verbose |
Logical. Whether to print tracer progress messages to the console. Default is |
This function is called internally by CI_Method() and is not usually
invoked directly by the user.
A data frame with nrow(mixtures) * iter rows containing mixture ID,
GOF, and estimated source proportions (w.*).
For each tracer of interest, solves a series of minimal determined linear
systems to assess how consistently that tracer constrains the source
apportionment. In each iteration the tracer under evaluation is kept fixed
while the remaining tracers needed to complete the system are replaced by
uniformly random values in (virtual approach).
triangles_virtual( sources, mixtures, tracer = 0L, iter = 100L, seed = 69512L, pb = NULL, pb_offset = 0L, tracer_current = NULL, tracer_total = NULL, verbose = TRUE )triangles_virtual( sources, mixtures, tracer = 0L, iter = 100L, seed = 69512L, pb = NULL, pb_offset = 0L, tracer_current = NULL, tracer_total = NULL, verbose = TRUE )
sources |
Data frame of source statistics: ID, one mean column per
tracer, one SD column per tracer, and sample size |
mixtures |
Data frame of mixture samples with the same tracer columns. |
tracer |
Integer (0-based). Index of the tracer under evaluation. |
iter |
Integer. Number of Monte Carlo iterations per mixture sample. Default |
seed |
Integer. Random seed for reproducibility. Default |
pb |
External |
pb_offset |
Integer. Starting offset for external progress bar. Default |
tracer_current |
Integer. Position of this tracer in outer loop. Default |
tracer_total |
Integer. Total number of tracers in outer loop. Default |
verbose |
Logical. Whether to print tracer progress messages to the console. Default is |
A data frame with nrow(mixtures) * iter rows containing mixture ID,
GOF (fixed at 1), and apportioned weights per source.
A wrapper function that seamlessly formats an OceanTracer dataset (raw or averaged)
and passes it to the MixSIAR Bayesian unmixing engine.
unmix_mixsiar( data, tracers = NULL, prior_type = "uninformative", prior_values = NULL, run = "normal", process_err = FALSE, resid_err = TRUE )unmix_mixsiar( data, tracers = NULL, prior_type = "uninformative", prior_values = NULL, run = "normal", process_err = FALSE, resid_err = TRUE )
data |
Data frame. Contains source and mixture data in standard OceanTracer format. |
tracers |
Character vector. Names of the tracers to include in the model. Default is |
prior_type |
Character. |
prior_values |
Numeric vector. Required if |
run |
Character. MCMC run length. Options: |
process_err |
Logical. Include process error in the JAGS model? Default |
resid_err |
Logical. Include residual error in the JAGS model? Default |
A named list containing:
apportionment |
A data frame with posterior draw proportions for each source, formatted for |
bayesian_summary |
A data frame summarizing MCMC parameter posteriors (mean, SD, quantiles, Rhat). |
jags_model |
The raw |
# Requires the external JAGS C++ library and MixSIAR R package installed if (requireNamespace("MixSIAR", quietly = TRUE)) { # Sample dataset in OceanTracer raw format raw_data <- data.frame( ID = paste0("Sample_", 1:9), Group = rep(c("Source_A", "Source_B", "Mix_1"), each = 3), d13C = c(-24, -25, -24.5, -12, -11.5, -12.2, -18, -18.2, -17.9), d15N = c(5, 5.5, 5.2, 12, 11.8, 12.1, 8.5, 8.7, 8.4) ) # Run MixSIAR test chain (1,000 iterations) try({ res <- unmix_mixsiar( data = raw_data, tracers = c("d13C", "d15N"), run = "test" ) # Plot posterior proportions plot_apportionment(res$apportionment, title = "MixSIAR Apportionment") }, silent = TRUE) }# Requires the external JAGS C++ library and MixSIAR R package installed if (requireNamespace("MixSIAR", quietly = TRUE)) { # Sample dataset in OceanTracer raw format raw_data <- data.frame( ID = paste0("Sample_", 1:9), Group = rep(c("Source_A", "Source_B", "Mix_1"), each = 3), d13C = c(-24, -25, -24.5, -12, -11.5, -12.2, -18, -18.2, -17.9), d15N = c(5, 5.5, 5.2, 12, 11.8, 12.1, 8.5, 8.7, 8.4) ) # Run MixSIAR test chain (1,000 iterations) try({ res <- unmix_mixsiar( data = raw_data, tracers = c("d13C", "d15N"), run = "test" ) # Plot posterior proportions plot_apportionment(res$apportionment, title = "MixSIAR Apportionment") }, silent = TRUE) }
Estimates the fractional contribution of each potential source to one or more mixtures. Users can seamlessly switch between a lightning-fast Frequentist least-squares approach (with optional Linear Variability Propagation) or a standard Bayesian MCMC approach.
unmixing( data, model = "frequentist", iter = 1000L, variability = "SEM", lvp = TRUE, seed = 123456L, ... )unmixing( data, model = "frequentist", iter = 1000L, variability = "SEM", lvp = TRUE, seed = 123456L, ... )
data |
Data frame in the standard OceanTracer format. |
model |
Character. |
iter |
Integer. Number of iterations for frequentist Monte Carlo/LVP.
Default |
variability |
Character. Uncertainty metric: |
lvp |
Logical. |
seed |
Integer. Random seed for reproducibility. Default |
... |
Additional arguments passed to the Bayesian engine (e.g., |
Both raw (individual observations) and averaged (Mean_/SD_
columns) input formats are accepted. When multiple mixture samples are
present, the model processes each independently.
For the "frequentist" model, a data frame with one row per iteration
and mixture. For the "bayesian" model, a named list containing the
formatted apportionment data frame, the MixSIAR summary statistics, and the
raw JAGS model object.
Latorre, B., Lizaga, I., Gaspar, L., & Navas, A. (2025). Evaluating the impact of high source variability and extreme contributing sources on sediment fingerprinting models. Water Resources Management. doi:10.1007/s11269-025-04169-8