Skip to contents

Introduction

This vignette deals with the evaluation of the impact of systematic and random biases on high-precision isotope data generated with the nanoSIMS 50L, and as discussed in the Supplementary Information of the paper (Supplementary Section 2.1 Precision of isotope analysis and Supplementary Section 2.3 Quasi simultaneous Arrival). The here discussed analytical artefacts all have been argued to compromise SIMS isotope analyses and do not relate to the isotope homogeneity of the analyte (i.e., the target of this study).

library(point) # regression diagnostics
library(pointapply) # load package

Download data

The assessment of these analytical artefacts is largely based on the point R package. Information on how to generate processed data from raw data can be found in the vignette Reading matlab files (vignette("data")). Alternatively, processed data can be downloaded from Zenodo with the function download_point(). Simulated data (Sensitivity by simulation (vignette("simulation")) is used to gauge the effectiveness of precision metrics (such as, the error of the mean) of an SIMS isotope analysis in detecting isotopically anomalies entrained in the analyte (intra-analysis isotope variability).

# use download_point() to obtain processed data (only has to be done once)
download_point(type = "processed")

Load data

For this example processed “real” data is loaded with a grid-cell size of 64 pixels by 64 pixels (100\(\,\mu\)m^2). Simulated data processed with Cook’s D regression diagnostics is used to compare the here developed intra-analysis isotope test statistic with precision metrics.

# load "real" data
load_point("map_sum_grid", c("MEX", "MON"), grid_cell = 64)
# load simulated data (intra-analysis isotope variability)
load_point("simu", "sens_IC_intra")
# load test statistics (intra-analysis isotope variability)
load_point("simu", "CooksD_IC_intra")

Systematic biases

Quasi simultaneous Arrival (QSA)

The combination of measuring under high ionisation efficiencies and the usage of electron multipliers (EM) for ion detection can lead to an artefact understood as the more-or-less (quasi) simultaneous arrival (QSA) of an incident ion at the detection device. Differentiation of the two secondary ions is thus not possible, and the ions are therefore counted as \(1\) detection event by the machine. In the case of isotope systems this could theoretically lead to under-sampling of the common isotope (Slodzian et al. 2004). An exact correction of under-sampling induced by QSA can be a cumbersome undertaking, as such the R package point (Schobben 2022) has a diagnostic tool that helps evaluate whether the ion count data is likely to have been compromised by this analytical artefact. The function QSA_test() fits a least-square linear model to the common isotope count rates (e.g. 12C) as a predictor, and the targeted isotope ratio (e.g. 13C/12C) as the independent variable. If under-sampling would be present in the ion count data, then this would cause a significant positive linear trend of higher isotope ratios with higher count rates of the common isotope.

library(dplyr)

# combine data
tb <- bind_rows(map_sum_grid_64_MEX, map_sum_grid_64_MON)
# QSA test
test_QSA_64_all <- QSA_test(tb, "13C", "12C", file.nm, sample.nm, grid.nm, 
                            .nest = grid.nm)
# make mlm model line
test_QSA_64_all <- mutate(
  test_QSA_64_all, 
  hat_R = alpha_grid.nm + beta_grid.nm * Xt.pr.12C
)

The function gg_dens provided in this package is used to visualise the high density data.

# labels for ion count rates
xlab <- substitute(
  a ~ "(count sec"^"-"*")", 
  list(a = point::ion_labeller("12C", "expr"))
  )
ylab <- point::R_labeller("13C", "12C", "expr")

# plot
QSA_dens <- gg_dens(
  IC = test_QSA_64_all, 
  x = Xt.pr.12C,
  y = R_Xt.pr, 
  xlab = xlab, 
  ylab = ylab, 
  ttl = "QSA test",
  gr = sample.nm,
  unit = "dim",
  facet_sc = "free",
  labels = "scientific"
)

# add lm line
QSA_dens + geom_line(aes(y = hat_R)) 

# save data
write_point(test_QSA_64_all)
 
# save plot  
save_point("point_QSA", last_plot(), width = 15, height = 10, unit = "cm")
QSA test.

QSA test.

Random bias

The random nature of secondary ions emitted from an analytical substrate (e.g. rock sample) during sputtering can be described by Poisson statistics, which can be used to predict the precision of pulsed ion counts (e.g. measurements with a Cameca NanoSIMS 50L) under ideal circumstances. More specifically, the variation can be deduced from the total counts of secondary ions. Usefully, we can compare these predictive values with the descriptive statistics; essentially estimates of the true population location (e.g. mean) and spread (variance).

First we will calculate some standard predictive and descriptive statistics for the internal precision of SIMS single iona, with the point function stat_X(). See the documentation of this package vignette("IC-precision", package = "point") for an extensive overview of the complete functionality of these functions as well as the mathematics behind the statistics.

# single ion statistics
stat_X_64_all <- stat_X(tb, file.nm, sample.nm, dim_name.nm, grid.nm)
write_point(stat_X_64_all)
head(stat_X_64_all)

The same can be done for the statistics of isotope analysis with appropriate error propagation with the function stat_R().

# single ion statistics
stat_R_64_all <- stat_R(tb, "13C", "12C", file.nm, sample.nm, dim_name.nm, 
                        grid.nm)
write_point(stat_R_64_all)
head(stat_R_64_all)

The reduced \(\chi^2\) can then be used to assess the machine performance and analyte homogeneity as it cross-validates the observed error estimate with the theoretical Poisson-based precision. For example, the reduced \(\chi^2\) of an isotope ratio equates to:

\[\begin{equation} \chi^2 = \left( \frac{s_{\bar{R}}} {\hat{s}_{\bar{R}}} \right)^2 \end{equation}\]

where values close to \(1\) suggest good agreement between the actual measurement and the predicted value (Kilburn and Wacey 2015). Values lower than \(1\) suggest that the analysis was better than predicted, and values higher than \(1\) indicate that the analysis was worse than predicted by Poisson statistics.

Intra-analysis isotope variation is measured by the test (based on F-statistic) as outlined in the paper. Varying degrees of variance in the ionization efficiency of the analyte cause a systematic trend that is mirrored in both isotopes. This ionization efficiency trend has been parameterized as the difference between the relative standard deviation of the common isotope \(\epsilon_{X^{a}}\) and the theoretical standard deviation \(\hat{\epsilon}_{N^{a}}\), based on Poisson statistics (so-called “excess” ionization, see paper). This ionization efficiency trend has an impact on the accuracy of the intra-analysis isotope test (see paper), and therefore has been included in the simulated data. For this comparative approach an excess ionization of below < 6% has been omitted, because of limited detection at the lower ranges of ionization efficiency. The remainder has been divided into three groups; low (5–15%), medium (15–25%) and high (25–35%) excess ionization with the ggplot2::cut_width() function (Wickham et al. 2021; Wickham 2016).

library(purrr)
library(rlang)
library(ggplot2)

# groups
grps <- quos(type.nm, trend.nm, force.nm, spot.nm)
# R stats synthetic data
tb_R <- stat_R(simu_sens_IC_intra, "13C", "12C", !!!grps, .X = Xt.sm, .N = N.sm) 
# single ions stats
tb_X <- stat_X(simu_sens_IC_intra, !!!grps, .X = Xt.sm, .N = N.sm) |> 
  filter(species.nm == "12C")
# filter and cut continuous ionization efficiency
simu_stat_eval_intra <- list(simu_CooksD_IC_intra, tb_X, tb_R) %>% 
  reduce(left_join, by = sapply(grps, as_name)) %>% 
  mutate(ion_trend = RS_Xt.sm - hat_RS_N.sm) %>% 
  filter(ion_trend > 6) %>% 
  mutate(
    ion_trend =
      factor(cut_width(ion_trend, 10), labels = c("low", "medium", "high"))
  )

A simple ggplot (ggplot() + geom_point()) (Wickham et al. 2021; Wickham 2016) has been used to compare the \(F\) statistic for intra-analysis isotope variability with the reduced \(\chi^2\) for an assessment of the precision.

# plot F vs Chi2
ggplot(
  data = simu_stat_eval_intra, 
  mapping = aes(x = chi2_R_N.sm, y = F_R_Xt.sm, color = force.nm)
) +
  geom_point() +
  facet_grid(cols = vars(type.nm), rows = vars(ion_trend)) +
  scale_color_distiller(
    expression("isotope variation in substrate ("* Delta[B - A] *" \u2030 )"),
    palette = "YlOrRd"
  ) +
  scale_y_continuous(
    expression(F["(2),(n-3)"]),
    expand = c(0, 0),
    breaks = scales::pretty_breaks(4),
  ) +
  scale_x_continuous(
    expression(chi^2),
    expand = c(0, 0),
    breaks = scales::pretty_breaks(4),
  ) +
  ggtitle("Precision vs. accuracy") +
  themes_IC(base = theme_bw()) 

# save 
save_point("simu_precision", last_plot(), width = 14, height = 14, unit = "cm")
The sensitivity of precision and accuracy-based test statistics to intra-isotope variability.

The sensitivity of precision and accuracy-based test statistics to intra-isotope variability.

References

Kilburn, Matt R., and David Wacey. 2015. Nanoscale secondary ion mass spectrometry (NanoSIMS) as an analytical tool in the geosciences. Vols. 2015-Janua. 4. https://doi.org/10.1039/9781782625025-00001.

Schobben, Martin. 2022. Point: Reading, Processing, and Analysing Raw Ion Count Data. https://martinschobben.github.io/point/.

Slodzian, G., F. Hillion, F. J. Stadermann, and E. Zinner. 2004. “QSA influences on isotopic ratio measurements.” Applied Surface Science 231-232: 874–77. https://doi.org/10.1016/j.apsusc.2004.03.155.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2021. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.