Zusammenfassung Stand 19. August 2021

Vergleichsmessungen zwischen verschiedenen Elementaranalysemethoden- und Geräten haben gezeigt, dass wir systematische Fehler bei der Stickstoff-Bestimmung mit dem SoliTOC und/oder EA-IRMS sehen. Nachdem die Bodenproben (Stickstoff-Standard) nun über längere Zeit stabile Stickstoff-Werte beim SoliTOC zeigen und der Spezifikation des Standards entsprechen, stellt sich die Frage, ob die Abweichungen bei Vergleichsmessungen geräte- oder proben-bedingt sind. In einem Fall gibt es die Vermutung, dass eine starke Metallverschmutzung durch Zinn in den Sedimentproben zu Fehlern bei der Stickstoff-Messung geführt haben.

Hintergrund

Der Elementar SoliTOC wurde am 3. und 4. Mai 2021 an der Eawag installiert. Bei der Installation zeigte sich, dass die Werte für Stickstoff in den Standardproben nicht stimmten. Ein weiteres Problem ergab sich dadurch, dass der bei der Werkskalibration verwendete Bodenstandard nicht genau denselben Stickstoff-Gehalt aufwies (0.131 %) wie der mitgelieferte Standard (0.122 %). Aufgrund der schlechten Stickstoff-Werte wurden am 18. Mai 2021 neue Standard-Proben (CaCO\(_3\) für C und Bodenstandard für N) gemessen. Anschliessend wurden am 25. Mai 2021 noch einmal neue N-Standard-Proben gemessen. Nachfolgend eine kurze Zusammenfassung.

knitr::opts_chunk$set(message=FALSE, warning = FALSE, dpi=300)

# Pakete laden
library(tidyverse)
library(readxl)
library(lubridate)
library(broom)
library(stargazer)
library(ggfortify)
library(plotly)
library(rcartocolor)

# Anteile an C resp. N in Kalibrationsstandards
C_caco3 <- 12.00 / 100
N_boden_15 <- 0.131 / 100
N_boden_low <- 0.122 / 100

# Kalibrations- und Proben-Daten einlesen
calibration_250521 <- read_xlsx("data/processed/210525_cal.xlsx")
calibration_180521 <- read_xlsx("data/processed/20210518.xlsx")
calibration_factory <- read_xlsx("data/processed/werkskalibration.xlsx")
calibration_210721 <- read_xlsx("data/processed/210721_EGL19-2_Bodenstd_cal.xlsx")

EGL_SoliTOC_rohdaten <- read_xlsx("data/processed/20210527_solitoc_EGL.xlsx")

EGL_SoliTOC <- read_xlsx("data/processed/EGL_Vergleich.xlsx", 1) %>%
  pivot_longer(TIC:TN, names_to = "Parameter", values_to = "Wert")
EGL_CoulomatTC <- read_xlsx("data/processed/EGL_Vergleich.xlsx", 2) %>%
  pivot_longer(TN:TOC, names_to = "Parameter", values_to = "Wert")
EGL_EAIRMS <- read_xlsx("data/processed/EGL_Vergleich.xlsx", 3) %>%
  pivot_longer(TC:TN, names_to = "Parameter", values_to = "Wert")
EGL_Tiefen <- read_xlsx("data/processed/EGL_Vergleich.xlsx", 4)

EGL_SoliTOC_neu <- read_delim("data/processed/20220429_EGL19-2_31-59_Soli_raw.csv", delim = ";", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "EGL")) %>% 
  #filter(!("Pos." %in% c(14, 15, 17, 18, 19))) %>% 
  select(Name, TN = "N  [%]", TC = "TC  [%]", TOC = "TOC  [%]", TIC = "TIC900  [%]") %>% 
  mutate(Quelle = "SoliTOC", Run = "Neu") %>% 
  pivot_longer(TN:TIC, names_to = "Parameter", values_to = "Wert")

EGL_SoliTOC_neu_rerun <- read_delim("data/processed/20220512_LP22_EGL_SoliTOC_raw.csv", delim = "\t", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "EGL")) %>% 
  select(Name, TN = "N  [%]", TC = "TC  [%]", TOC = "TOC  [%]", TIC = "TIC900  [%]") %>% 
  mutate(Quelle = "SoliTOC", Run = "Neu Rerun") %>% 
  pivot_longer(TN:TIC, names_to = "Parameter", values_to = "Wert")

EGL_tbl <- bind_rows(EGL_CoulomatTC, EGL_SoliTOC, EGL_EAIRMS) %>%
  mutate(Run = "Alt") %>% 
  bind_rows(EGL_SoliTOC_neu, EGL_SoliTOC_neu_rerun) %>% 
  left_join(EGL_Tiefen, by = "Name")


HUT <- read_delim("data/processed/HUT1902_Soli_EA_CNS_Coulomat.csv", delim = ";") %>% 
  select(-depth_top, -depth_bottom) %>% 
  pivot_longer(CNS_TN:SoliTOC_TIC, names_to = "Parameter", values_to = "Wert") %>% 
  mutate(Quelle = str_split_fixed(Parameter, pattern = "_", n = 2)[,1], Parameter = str_split_fixed(Parameter, pattern = "_", n = 2)[,2], Run = "Alt")

HUT_Soli_neu <- read_delim("data/processed/20220406_HUT19-2_Soli.csv", delim = ";", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "HUT")) %>% 
  mutate(CoreID = "HUT19-02", Quelle = "SoliTOC", Run = "Neu") %>% 
  left_join(HUT %>% select(Name, meandepth)) %>% 
  pivot_longer(TN:TIC, names_to = "Parameter", values_to = "Wert") %>% 
  select(CoreID, Name, meandepth, Parameter, Wert, Quelle, Run)

HUT <- bind_rows(HUT, HUT_Soli_neu)

GEN <- read_delim("data/processed/GEN2101_EA_Coulo_Soli.csv", delim = ";", trim_ws = TRUE) %>% 
  pivot_longer(EA_TN:SoliTOC_TIC, names_to = "Parameter", values_to = "Wert") %>% 
  mutate(Quelle = str_split_fixed(Parameter, pattern = "_", n = 2)[,1], Parameter = str_split_fixed(Parameter, pattern = "_", n = 2)[,2], Run = "Alt")

GEN_Soli_neu <- read_delim("data/processed/20220427_GEN21.csv", delim = ";", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "GEN")) %>% 
  mutate(CoreID = "GEN21-01", Quelle = "SoliTOC", Run = "Neu") %>% 
  pivot_longer(TN:TIC, names_to = "Parameter", values_to = "Wert") %>% 
  select(CoreID, Name, meandepth, Parameter, Wert, Quelle, Run)

GEN <- bind_rows(GEN, GEN_Soli_neu)

ZH1935_Soli_EA <- read_delim("data/processed/ZH1935_Soli_EA.csv", delim = ";") %>% 
  pivot_longer(SoliTOC_TN:EA_d13C, names_to = "Parameter", values_to = "Wert") %>% 
  mutate(Quelle = str_split_fixed(Parameter, pattern = "_", n = 2)[,1], Parameter = str_split_fixed(Parameter, pattern = "_", n = 2)[,2], Datum = "2021-07-09", Quelle = if_else(Quelle == "EA", "EA-IRMS", Quelle))

ZH1935_Soli_neu <- read_delim("data/processed/20220412_ZH19-35_Soli_raw.csv", delim = ";") %>% 
  filter(str_detect(Name, "ZH19-35")) %>% 
  select(Name, TN = "N  [%]", TC = "TC  [%]", TOC = "TOC  [%]", TIC = "TIC900  [%]") %>% 
  mutate(CoreID = "ZH19-35", Quelle = "SoliTOC", Datum = "2022-04-12") %>% 
  left_join(ZH1935_Soli_EA %>% select(Name, depth_top, depth_bottom, meandepth), by = "Name") %>% 
  pivot_longer(TN:TIC, names_to = "Parameter", values_to = "Wert")

ZH1935_EA_20220419 <- read_delim("data/processed/20220419_ZH19-35_EA_raw.csv", delim = ";", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "ZH19-35")) %>% 
  select(Name, TN = "N  [%]", TC = "C  [%]") %>% 
  mutate(CoreID = "ZH19-35", Quelle = "EA-IRMS", Datum = "2022-04-19") %>%
  left_join(ZH1935_Soli_EA %>% select(Name, depth_top, depth_bottom, meandepth), by = "Name") %>% 
  pivot_longer(TN:TC, names_to = "Parameter", values_to = "Wert")

ZH1935_IRMS_20220419 <- read_delim("data/processed/20220419_ZH19-35_IRMS_raw.csv", delim = ";", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "ZH19-35")) %>% 
  select(Name, d15N = "δ¹⁵N (Air)", d13C = "δ¹³C (VPDB)") %>% 
  mutate(CoreID = "ZH19-35", Quelle = "EA-IRMS", Datum = "2022-04-19") %>%
  left_join(ZH1935_Soli_EA %>% select(Name, depth_top, depth_bottom, meandepth), by = "Name") %>% 
  pivot_longer(d15N:d13C, names_to = "Parameter", values_to = "Wert")

ZH1935_EA_20220421 <- read_delim("data/processed/20220419_ZH19-35_EA_raw.csv", delim = ";", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "ZH19-35")) %>% 
  select(Name, TN = "N  [%]", TC = "C  [%]") %>% 
  mutate(CoreID = "ZH19-35", Quelle = "EA-IRMS", Datum = "2022-04-21") %>%
  left_join(ZH1935_Soli_EA %>% select(Name, depth_top, depth_bottom, meandepth), by = "Name") %>% 
  pivot_longer(TN:TC, names_to = "Parameter", values_to = "Wert")

ZH1935_IRMS_20220421 <- read_delim("data/processed/20220419_ZH19-35_IRMS_raw.csv", delim = ";", trim_ws = TRUE) %>% 
  filter(str_detect(Name, "ZH19-35")) %>% 
  select(Name, d15N = "δ¹⁵N (Air)", d13C = "δ¹³C (VPDB)") %>% 
  mutate(CoreID = "ZH19-35", Quelle = "EA-IRMS", Datum = "2022-04-21") %>%
  left_join(ZH1935_Soli_EA %>% select(Name, depth_top, depth_bottom, meandepth), by = "Name") %>% 
  pivot_longer(d15N:d13C, names_to = "Parameter", values_to = "Wert")

load("data/processed/icpms_oes_allresults.RData")

ZH1935_Soli_EA_icpoes <- icpms_oes_allresults %>% 
  filter(CoreID %in% "ZH19-35", Element %in% c("Fe", "Sn")) %>% 
  select(CoreID, Name = SampleID, Parameter = Element, Wert = Concentration) %>% 
  mutate(Quelle = "ICP-OES", Wert = Wert / 10000, Datum = "") %>% # Converting mg/kg to % w/w
  left_join(ZH1935_Soli_EA %>% select(CoreID, Name, depth_top, depth_bottom, meandepth)) %>% 
  bind_rows(ZH1935_Soli_EA, ZH1935_Soli_neu, ZH1935_EA_20220419, ZH1935_IRMS_20220419, ZH1935_EA_20220421, ZH1935_IRMS_20220421)

# Daten aufbereiten
sample_tbl <- bind_rows(calibration_factory, calibration_180521, calibration_250521, calibration_210721) %>%
  mutate(
    Type = case_when(
      Name == "caco3" ~ "C",
      Name == "Bodenstandard 1,5% TOC" ~ "N",
      Name == "bodenstandard 1,5% TOC" ~ "N",
      Name == "bodenstandard low" ~ "N"
    ),
    CalRun = as_factor(case_when(
      year(Datum) == 2020 ~ "Werkskalibration",
      date(Datum) == "2021-05-17" ~ "Kalibration 18. Mai",
      date(Datum) == "2021-05-18" ~ "Kalibration 18. Mai",
      date(Datum) == "2021-05-25" ~ "Kalibration 25. Mai",
      date(Datum) == "2021-05-26" ~ "Kalibration 25. Mai",
      date(Datum) == "2021-07-21" ~ "Kalibration 21. Juli",
      date(Datum) == "2021-07-22" ~ "Kalibration 21. Juli"
    )),
    Fraction = case_when(
      Type == "C" ~ C_caco3,
      Type == "N" & CalRun == "Werkskalibration" ~ N_boden_15,
      Type == "N" & CalRun != "Werkskalibration" ~ N_boden_low
    ),
    Content = `Gewicht  [mg]` * Fraction
  ) %>%
  select(Type, Weight = `Gewicht  [mg]`, Fraction, Content, Name, Methode, Info, CalRun, C = `TIC900  Fläche`, N = `N  Fläche`)

calibration_tbl <- sample_tbl %>%
  pivot_longer(C:N, names_to = "Element", values_to = "Area") %>%
  filter(!is.na(Type), Element == Type) %>%
  slice(-7, -62) %>%
  filter(!(CalRun == "Kalibration 25. Mai" & Type == "C")) %>% 
  select(-Type)

sedisamples_tbl <- sample_tbl %>%
  select(Weight, Name, C, N) %>%
  pivot_longer(C:N, names_to = "Element", values_to = "Area") %>%
  filter(Name == "Sediment" | Name == "Sandy")

calibration_lm <- calibration_tbl %>%
  select(Content, Area, Element, CalRun) %>%
  nest(data = c(Content, Area)) %>%
  group_by(Element, CalRun) %>%
  mutate(
    model = map(data, ~ lm(Content ~ Area, data = .x)),
    tidied = map(model, tidy),
    glanced = map(model, glance),
  ) %>%
  ungroup() %>%
  unnest(tidied)

calibration_poly <- calibration_tbl %>%
  select(Content, Area, Element, CalRun) %>%
  nest(data = c(Content, Area)) %>%
  group_by(Element, CalRun) %>%
  mutate(
    model = map(data, ~ lm(Content ~ poly(Area, 2, raw = TRUE), data = .x)),
    tidied = map(model, tidy),
    glanced = map(model, glance)
  ) %>%
  ungroup() %>%
  unnest(tidied)

EGL_SoliTOC_counts <- EGL_SoliTOC_rohdaten %>%
  select(Weight = `Gewicht  [mg]`, Name, `TOC400  Fläche`:`N  Fläche`) %>% 
  pivot_longer(`TOC400  Fläche`:`N  Fläche`, names_to = "Parameter", values_to = "Area", names_pattern = "(^\\S+)") %>% 
  mutate(Name = str_replace(Name, "EGL19-02", "EGL19"), Name = str_replace(Name, "EGL19-", "EGL19_"), Name = str_replace(Name, "EGL19", "EGL19-02")) %>% 
  left_join(EGL_Tiefen, by = "Name")

pal4safe_cal <- carto_pal(n=8, name ='Safe')[5:8]
names(pal4safe_cal) <- c("Werkskalibration", "Kalibration 18. Mai", "Kalibration 25. Mai", "Kalibration 21. Juli")

pal4safe_source <- carto_pal(n=4, name ='Safe')
names(pal4safe_source) <- c("CNS", "Coulomat", "EA-IRMS", "SoliTOC")

Resultate der Standardmessungen

Kohlenstoff-Kalibrierung

Ein visueller Vergleich der Kalibrationskurven zeigt für Kohlenstoff sehr gute Übereinstimmungen. Die Punkte liegen nahe beieinander und es ist keine Krümmung der Kurve zu erkennen. Ein lineares Modell scheint hier gut geeignet, was auch die Regressionskoeffizienten bestätigen.

ggplot(calibration_tbl %>%  filter(Element == "C"), aes(x = Area, y = Content, colour = CalRun)) + geom_point() + ggtitle("C-Kalibrierung (Calciumcarbonat)") + xlab("Fläche") + ylab("Gehalt [mg]") + scale_color_manual(values = pal4safe_cal)


cal_C_210518_lm <- calibration_lm %>%  filter(Element == "C", CalRun %in% "Kalibration 18. Mai") %>% slice(1)
stargazer(cal_C_210518_lm$model, type = "html")
Dependent variable:
Content
Area 0.00000***
(0.000)
Constant 0.042***
(0.011)
Observations 21
R2 1.000
Adjusted R2 1.000
Residual Std. Error 0.034 (df = 19)
F Statistic 209,780.100*** (df = 1; 19)
Note: p<0.1; p<0.05; p<0.01


Stickstoff-Kalibrierung

Bei Stickstoff jedoch gibt es einen grossen Unterschied zwischen der Werkskalibration und den an der Eawag erfolgten Kalibrationen. Die Kalibrationskurven sind visuell betrachtet auch nicht linear, sondern weisen einen systematischen Abweichung auf. Dies wird besonders deutlich, wenn man eine lineare Regression auf die Kurven anwendet. Für die Kalibration vom 21. Juli wurden nur noch im Bereich von 2-160 mg Bodenstandard Standardproben eingewogen (vormals 2-400 mg).

ggplot(calibration_tbl %>%  filter(Element == "N"), aes(x = Area, y = Content, colour = CalRun)) + geom_point() + ggtitle("N-Kalibrierung (Bodenstandards)") + xlab("Fläche") + ylab("Gehalt [mg]") + scale_color_manual(values = pal4safe_cal)

ggplot(calibration_tbl, aes(x = Area, y = Content, colour = CalRun)) + geom_point() + facet_wrap(~Element, scales = "free") + geom_smooth(method = lm, formula = y ~ x) + scale_color_manual(values = pal4safe_cal)

Standardreihe vom 18. Mai

Im Folgenden wird die Werkskalibration nicht mehr berücksichtigt. Für Stickstoff zeigt eine lineare Regression folgende Regressions-Koeffizienten für die Kalibration vom 18. Mai. Der Korrelationskoeffizient R\(^2\) für das lineare Modell ist erwartungsgemäss nicht sehr gut.


cal_N_210518_lm <- calibration_lm %>% filter(Element == "N", CalRun %in% "Kalibration 18. Mai") %>% slice(1)
stargazer(cal_N_210518_lm$model, type = "html")
Dependent variable:
Content
Area 0.00001***
(0.00000)
Constant -0.019**
(0.008)
Observations 14
R2 0.988
Adjusted R2 0.987
Residual Std. Error 0.019 (df = 12)
F Statistic 951.980*** (df = 1; 12)
Note: p<0.1; p<0.05; p<0.01


Die diagnostischen Plots für das lineare Modell bestätigen auch, dass es sich nicht um eine lineare Funktion handelt (erster Plot oben links). Die Fehler sind allerdings einigermassen normalverteilt (oben rechts) und weisen keine systematischen Abweichungen auf (unten links).

autoplot(cal_N_210518_lm[[4]][[1]])

Für diese Stickstoff-Kalibration scheint sich ein Polynom zweiter Ordnung deutlich besser zu eignen. Dies sieht man visuell in er nachstehenden Grafik, aber auch in den Regressionskoeffizienten und im Korrelationskoeffizienten, der quasi bei 1 liegt. Auch die diagnostischen Plots sehen gut aus.

ggplot(calibration_tbl %>%  filter(Element == "N", CalRun != "Werkskalibration"), aes(x = Area, y = Content, colour = CalRun)) + geom_point() + geom_smooth(method = lm, formula = y ~ poly(x, 2, raw = TRUE)) + ggtitle("N-Kalibrierung Polynom-Regression 2. Grad") + xlab("Fläche") + ylab("Gehalt [mg]") + scale_color_manual(values = pal4safe_cal, na.translate = FALSE)


cal_N_210518_poly <- calibration_poly %>% filter(Element == "N", CalRun %in% "Kalibration 18. Mai") %>% slice(1)
stargazer(cal_N_210518_poly$model, type = "html")
Dependent variable:
Content
poly(Area, 2, raw = TRUE)1 0.00000***
(0.00000)
poly(Area, 2, raw = TRUE)2 0.000***
(0.000)
Constant 0.003
(0.003)
Observations 14
R2 0.999
Adjusted R2 0.999
Residual Std. Error 0.005 (df = 11)
F Statistic 6,757.260*** (df = 2; 11)
Note: p<0.1; p<0.05; p<0.01


autoplot(cal_N_210518_poly[[4]][[1]])

Wenn man das obenstehende polynomiale Modell verwendet, um die Stickstoffkonzentration in den Bodenstandards vom 25. Mai zu berechnen, zeigt sich, dass die Werte ab ca. 15mg Einwaage gut stimmen. Der SoliTOC misst daher grundsätzlich im festgelegten Bereich Stickstoff (niedrigste Einwaage für die Kalibration gemäss Elementar ist 20 mg). Der Boxplot aller Bodenstandards (Einwaage > 15mg) zeigt, dass die berechneten Werte sehr nahe bei den erwarteten 0.122% N liegen.

calassample210525 <- calibration_tbl %>% filter(Element == "N", CalRun == "Kalibration 25. Mai")
calassample210525$conc <- predict(cal_N_210518_poly[[4]][[1]], newdata = calassample210525)/calassample210525$Weight*100

ggplot(calassample210525, aes(x = Weight, y = conc)) + geom_point() + scale_x_log10("Einwaage [mg]") + ylab("Konzentration N %")

ggplot(calassample210525 %>% filter(Weight > 15), aes(y = conc, x = Element)) + geom_boxplot() + ylab("Konzentration N %")

Standardreihe vom 21. Juli

Am 21. Juli wurden weitere Bodenstandards gemessen (2-160 mg). Die Modellanalyse zeigt, dass für die neue Standardreihe mit kleinerem Wertebereich ein lineares Modell wohl ausreicht.

cal_N_210721_lm <- calibration_lm %>% filter(Element == "N", CalRun %in% "Kalibration 21. Juli") %>% slice(1)
stargazer(cal_N_210721_lm$model, type = "html")
Dependent variable:
Content
Area 0.00001***
(0.00000)
Constant -0.006*
(0.003)
Observations 19
R2 0.988
Adjusted R2 0.987
Residual Std. Error 0.007 (df = 17)
F Statistic 1,365.459*** (df = 1; 17)
Note: p<0.1; p<0.05; p<0.01

Vergleichsmessungen

Vergleichsmessungen Egelseeproben

Ein Vergleich der bereits zuvor auf verschiedenen Plattformen gemessenen Proben vom Egelsee (TIC gemessen mit Coulomat, TC/TN gemessen mit altem EA und neuem Elementar EA-IRMS) mit den SoliTOC-Werten (gemessen am 27. Mai) zeigt sehr gute Übereinstimmungen für TIC, TOC und TC, allerdings erstaunlicherweise schlechte Übereinstimmungen für TN (Konzentrationen vom SoliTOC berechnet).

ggplot(EGL_tbl, aes(x = TiefeMittelW, y = Wert, colour = Quelle, lty = Run)) + geom_line() + facet_wrap(~ Parameter, scales = "free_y") + scale_x_continuous("Tiefe [cm]") + scale_y_continuous("Konzentration [%]") + ggtitle("C/N Messungen Vergleich EGL19-02") 

Selbst wenn man die Vorhersage-Unsicherheit (blau schattiert) aus dem Modell einbezieht und die Konzentrationen manuell berechnet, liegen die Resultate ausserhalb der Modell-Unsicherheiten. Die Stickstoff-Gehalte (bzw. gemessenen Flächen) aus den Proben liegen dabei innerhalb der Grenzen für die Kalibration.

egl_samples_N <- EGL_SoliTOC_counts %>% filter(Parameter == "N", str_detect(Name, "EGL"), !str_detect(Name, "EGL19-02_03"))
egl_samples_N_predint <- bind_cols(egl_samples_N, data.frame(predict(cal_N_210518_poly[[4]][[1]], newdata = egl_samples_N, interval = "prediction")/egl_samples_N$Weight*100))

ggplot(egl_samples_N_predint, aes(x = TiefeMittelW, y = fit)) +
  geom_ribbon(aes(ymin = lwr, ymax = upr), fill = "blue", alpha = 0.5) +
  geom_line() + 
  ylab("Konzentration N %") +
  xlab("Tiefe [cm]")

Die ebenfalls vorhergesagten Konzentrationen der Stickstoffstandards stimmen grundsätzlich, aber zeigen eine grösse Variabilität als bei den Messungen vom 25. Mai. Weitere Messungen haben ebenfalls bestätigt, dass die Stickstoff-Werte weiterhin bei den Proben nicht gut stimmen, bei den Standards aber in Ordnung sind.

egl_bodenstandards_N <- EGL_SoliTOC_counts %>% filter(Parameter == "N", str_detect(Name, "BODEN|boden|Boden"))
egl_bodenstandards_N$conc <- predict(cal_N_210518_poly[[4]][[1]], newdata = egl_bodenstandards_N)/egl_bodenstandards_N$Weight*100

ggplot(egl_bodenstandards_N, aes(y = conc, x = Parameter)) + geom_jitter() + ylab("Konzentration N %")

Vergleichsmessungen Hüttwilersee

Beim Hüttwilersee zeigt sich dasselbe Muster, dass TC/TIC/TOC gut stimmen, TN zwischen den drei Messmethoden aber abweicht. Auffällig ist insbesonders die TN-Messung des SoliTOC.

HUTplot <- ggplot(HUT %>% drop_na(), aes(x = meandepth, y = Wert, colour = Quelle, lty = Run)) + geom_line() + facet_wrap(~ Parameter, scales = "free_y") + scale_x_continuous("Tiefe [cm]") + scale_y_continuous("Konzentration [%]") + ggtitle("C/N Messungen Vergleich HUT19-02")

HUTplot

Vergleichsmessungen Genfersee

Bei den Genferseeproben stimmen die TN-Werte besser überein, es gibt allerdings weiterhin einen gewissen Offset.

GENplot <- ggplot(GEN %>% drop_na(), aes(x = meandepth, y = Wert, colour = Quelle, lty = Run)) + geom_line() + facet_wrap(~ Parameter, scales = "free_y") + scale_x_continuous("Tiefe [cm]") + scale_y_continuous("Konzentration [%]") + ggtitle("C/N Messungen Vergleich GEN21-01")

GENplot

Vergleichsmessungen Zürichsee

Bei den Vergleichsmessungen von Proben aus dem Zürichsee zeigte sich wieder eine auffällige, Proben-abhängige systematische Abweichung beim TN. Da diese Proben sehr stark Zinn-belastet sind (ca. 12% w/w maximal) ergibt sich die Vermutung, dass die Probenmatrix in der Tat einen Einfluss auf die TN-Resultate des SoliTOC (oder EA-IRMS) haben.

ZRHplot <- ggplot(ZH1935_Soli_EA_icpoes %>% drop_na(), aes(x = meandepth, y = Wert, lty = Quelle, colour = Datum)) + geom_line() + facet_wrap(~ Parameter, scales = "free_y") + scale_x_continuous("Tiefe [cm]") + scale_y_continuous("Konzentration [% w/w dw]") + ggtitle("C/N/ICP-OES Messungen Vergleich ZH19-35")

ZRHplot