From 020bce41dd821b5949f824eaa3a2998584a14585 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Tue, 15 Oct 2019 11:27:59 +0200 Subject: Residue processing for depth profiles over time --- ChangeLog | 6 + DESCRIPTION | 2 +- NAMESPACE | 4 +- R/set_nd.R | 118 ------------------ R/set_nd_nq.R | 164 ++++++++++++++++++++++++ _pkgdown.yml | 2 +- docs/reference/index.html | 11 +- docs/reference/set_nd.html | 222 --------------------------------- docs/reference/set_nd_nq.html | 284 ++++++++++++++++++++++++++++++++++++++++++ docs/sitemap.xml | 2 +- man/set_nd.Rd | 64 ---------- man/set_nd_nq.Rd | 103 +++++++++++++++ test.log | 8 +- tests/testthat/test_set_nd.R | 64 ++++++++-- 14 files changed, 627 insertions(+), 427 deletions(-) delete mode 100644 R/set_nd.R create mode 100644 R/set_nd_nq.R delete mode 100644 docs/reference/set_nd.html create mode 100644 docs/reference/set_nd_nq.html delete mode 100644 man/set_nd.Rd create mode 100644 man/set_nd_nq.Rd diff --git a/ChangeLog b/ChangeLog index 579b8bb..0ce369b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +commit a2ca8be6f5593f0afd833ea73b62149055ee84f9 +Author: Johannes Ranke +Date: 2019-10-10 14:56:35 +0200 + + Do not mess with zero values at time zero + commit a071d46f698397a6c8247e19eceb0fcd5f139056 Author: Johannes Ranke Date: 2019-10-10 12:25:42 +0200 diff --git a/DESCRIPTION b/DESCRIPTION index 39e174b..af046d1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: pfm Type: Package Title: Utilities for Pesticide Fate Modelling Version: 0.5.7 -Date: 2019-10-10 +Date: 2019-10-15 Authors@R: person("Johannes Ranke", email = "jranke@uni-bremen.de", role = c("aut", "cre", "cph"), comment = c(ORCID = "0000-0003-4371-6538")) diff --git a/NAMESPACE b/NAMESPACE index 8eb6863..fffadd7 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -36,8 +36,8 @@ export(perc_runoff_reduction_exposit) export(pfm_degradation) export(read.TOXSWA_cwa) export(sawtooth) -export(set_nd) -export(set_nd_focus) +export(set_nd_nq) +export(set_nd_nq_focus) export(soil_DT50) export(soil_Kfoc) export(soil_N) diff --git a/R/set_nd.R b/R/set_nd.R deleted file mode 100644 index a9f3df4..0000000 --- a/R/set_nd.R +++ /dev/null @@ -1,118 +0,0 @@ -#' Set non-detects in residue series without replicates -#' -#' Sets non-detects directly before or directly after detects to NA. Values between -#' lod and loq are set to their mean value if an loq is specified. -#' If 'time_zero' is set to TRUE, the residue series is assumed to start with time -#' zero, and non-detects at time zero are set to 'time_zero_nd_value'. For the -#' set_nd_focus variant, this is zero, otherwise this argument has NA as default -#' value. -#' If stopping after the first non-detection is requested, as in in the FOCUS -#' variant of the function, an loq has to be specified in order to decide -#' if any later detections are above the loq. -#' -#' @param r A character vector of sequential residues without replicates, with -#' non-detects specified as 'nd' and unquantified values above the limit of -#' detection specified as 'nq', otherwise coercible to numeric -#' @param lod Limit of detection (numeric) -#' @param loq Limit of quantification(numeric). Must be specified if the FOCUS rule to -#' stop after the first non-detection is to be applied -#' @param time_zero Is the first value in the series a time zero value? -#' @param time_zero_nd_value Which value should we use for non-detects at time zero? -#' @param stop_after_first_nondetect Should we really stop after the first non-detection? -#' @references FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation -#' Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1, -#' 18 December 2014, p. 251 -#' @describeIn set_nd Set non-detects in residues series -#' @export -#' @examples -#' # FOCUS (2014) p. 75/76 and 131/132 -#' parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd") -#' set_nd(parent_1, 0.02) -#' parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd") -#' set_nd(parent_2, 0.02) -#' set_nd_focus(parent_2, 0.02, loq = 0.05) -#' parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd") -#' set_nd(parent_3, 0.02) -#' set_nd_focus(parent_3, 0.02, loq = 0.05) -#' metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd") -#' set_nd(metabolite, 0.02) -set_nd <- function(r, lod, loq = NA, - time_zero = TRUE, time_zero_nd_value = NA, stop_after_first_nondetect = FALSE) -{ - - if (stop_after_first_nondetect & is.na(loq)) { - stop("You need to specify an loq to decide if the curve should be cut off after the first non-detect") - } - - result <- r - - # Handle nq values - if (!missing(loq)) { - nq = 0.5 * (lod + loq) - result[r == "nq"] <- nq - } else { - if (any(r == "nq", na.rm = TRUE)) stop("You need to specify lod and loq") - } - - # Handle nd values - if (time_zero) { - if (r[1] %in% c("nd")) { - residues_present = FALSE - result[1] <- time_zero_nd_value - } else { - residues_present = TRUE - } - start_i <- 2 - } else { - residues_present <- if (r[1] == "nd") FALSE else TRUE - start_i <- 1 - } - - for (i in start_i:length(r)) { - - # residues_in_next - if (i < length(r)) { - next_value <- r[i + 1] - if (is.na(next_value) || next_value == "nd") residues_in_next = FALSE - else residues_in_next = TRUE - } else { - residues_in_next = FALSE - } - - if (is.na(r[i])) { - residues_present <- FALSE - result[i] <- NA - } else { - if (r[i] == "nd") { - if (residues_present | residues_in_next) { - result[i] <- 0.5 * lod - } else { - result[i] <- NA - } - - if (stop_after_first_nondetect) { - if (residues_present & !residues_in_next) { - remaining <- (i + 1):length(r) - if (!any(suppressWarnings(as.numeric(r[remaining])) > loq, na.rm = TRUE)) { - result[remaining] <- NA - return(as.numeric(result)) - } - } - } - if (!residues_in_next) residues_present <- FALSE - else residues_present <- TRUE - } else { - residues_present <- TRUE - } - } - } - return(as.numeric(result)) -} - -#' @describeIn set_nd Set non-detects in residues series according to FOCUS rules -#' @export -set_nd_focus <- function(r, lod, loq = NA, time_zero = TRUE) { - result <- set_nd(r, lod, loq = loq, time_zero = time_zero, - time_zero_nd_value = 0, stop_after_first_nondetect = TRUE) - return(result) -} diff --git a/R/set_nd_nq.R b/R/set_nd_nq.R new file mode 100644 index 0000000..a372879 --- /dev/null +++ b/R/set_nd_nq.R @@ -0,0 +1,164 @@ +#' Set non-detects and unquantified values in residue series without replicates + +#' This function automates replacing unquantified values in residue time and +#' depth series. For time series, the function performs part of the residue +#' processing proposed in the FOCUS kinetics guidance for parent compounds +#' and metabolites. For two-dimensional residue series over time and depth, +#' it automates the proposal of Boesten et al (2015). + +#' @param res_raw Character vector of a residue time series, or matrix of +#' residue values with rows representing depth profiles for a specific sampling +#' time, and columns representing time series of residues at the same depth. +#' Values below the limit of detection (lod) have to be coded as "nd", values +#' between the limit of detection and the limit of quantification, if any, have +#' to be coded as "nq". Samples not analysed have to be coded as "na". All +#' values that are not "na", "nd" or "nq" have to be coercible to numeric +#' @param lod Limit of detection (numeric) +#' @param loq Limit of quantification(numeric). Must be specified if the FOCUS rule to +#' stop after the first non-detection is to be applied +#' @param time_zero_presence Do we assume that residues occur at time zero? +#' This only affects samples from the first sampling time that have been +#' reported as "nd" (not detected). +#' @references Boesten, J. J. T. I., van der Linden, A. M. A., Beltman, W. H. +#' J. and Pol, J. W. (2015). Leaching of plant protection products and their +#' transformation products; Proposals for improving the assessment of leaching +#' to groundwater in the Netherlands — Version 2. Alterra report 2630, Alterra +#' Wageningen UR (University & Research centre) +#' @references FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation +#' Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1, +#' 18 December 2014, p. 251 +#' @return A numeric vector, if a vector was supplied, or a numeric matrix otherwise +#' @export +#' @examples +#' # FOCUS (2014) p. 75/76 and 131/132 +#' parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd") +#' set_nd_nq(parent_1, 0.02) +#' parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd") +#' set_nd_nq(parent_2, 0.02) +#' set_nd_nq_focus(parent_2, 0.02, loq = 0.05) +#' parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd") +#' set_nd_nq(parent_3, 0.02) +#' set_nd_nq_focus(parent_3, 0.02, loq = 0.05) +#' metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd") +#' set_nd_nq(metabolite, 0.02) +#' set_nd_nq_focus(metabolite, 0.02, 0.05) +#' # +#' # Boesten et al. (2015), p. 57/58 +#' table_8 <- matrix( +#' c(10, 10, rep("nd", 4), +#' 10, 10, rep("nq", 2), rep("nd", 2), +#' 10, 10, 10, "nq", "nd", "nd", +#' "nq", 10, "nq", rep("nd", 3), +#' "nd", "nq", "nq", rep("nd", 3), +#' rep("nd", 6), rep("nd", 6)), +#' ncol = 6, byrow = TRUE) +#' set_nd_nq(table_8, 0.5, 1.5, time_zero_presence = TRUE) +#' table_10 <- matrix( +#' c(10, 10, rep("nd", 4), +#' 10, 10, rep("nd", 4), +#' 10, 10, 10, rep("nd", 3), +#' "nd", 10, rep("nd", 4), +#' rep("nd", 18)), +#' ncol = 6, byrow = TRUE) +#' set_nd_nq(table_10, 0.5, time_zero_presence = TRUE) +set_nd_nq <- function(res_raw, lod, loq = NA, time_zero_presence = FALSE) { + if (!is.character(res_raw)) { + stop("Please supply a vector or a matrix of character values") + } + if (is.vector(res_raw)) { + was_vector <- TRUE + res_raw <- as.matrix(res_raw) + } else { + was_vector <- FALSE + if (!is.matrix(res_raw)) { + stop("Please supply a vector or a matrix of character values") + } + } + nq <- 0.5 * (loq + lod) + nda <- 0.5 * lod # not detected but adjacent to detection + res_raw[res_raw == "nq"] <- nq + + if (!time_zero_presence) { + for (j in 1:ncol(res_raw)) { + if (res_raw[1, j] == "nd") res_raw[1, j] <- "na" + } + } + res_raw[res_raw == "na"] <- NA + + not_nd_na <- function(value) !(grepl("nd", value) | is.na(value)) + + for (i in 1:nrow(res_raw)) { + for (j in 1:ncol(res_raw)) { + if (!is.na(res_raw[i, j]) && res_raw[i, j] == "nd") { + if (i > 1) { # check earlier sample in same layer + if (not_nd_na(res_raw[i - 1, j])) res_raw[i, j] <- "nda" + } + if (i < nrow(res_raw)) { # check later sample + if (not_nd_na(res_raw[i + 1, j])) res_raw[i, j] <- "nda" + } + if (j > 1) { # check above sample at the same time + if (not_nd_na(res_raw[i, j - 1])) res_raw[i, j] <- "nda" + } + if (j < ncol(res_raw)) { # check sample below at the same time + if (not_nd_na(res_raw[i, j + 1])) res_raw[i, j] <- "nda" + } + } + } + } + res_raw[res_raw == "nda"] <- nda + res_raw[res_raw == "nd"] <- NA + + result <- as.numeric(res_raw) + dim(result) <- dim(res_raw) + dimnames(result) <- dimnames(res_raw) + if (was_vector) result <- as.vector(result) + return(result) +} + +#' @describeIn set_nd_nq Set non-detects in residue time series according to FOCUS rules +#' @param set_first_sample_nd Should the first sample be set to "first_sample_nd_value" +#' in case it is a non-detection? +#' @param first_sample_nd_value Value to be used for the first sample if it is a non-detection +#' @param ignore_below_loq_after_first_nd Should we ignore values below the LOQ after the first +#' non-detection that occurs after the quantified values? +#' @export +set_nd_nq_focus <- function(res_raw, lod, loq = NA, + set_first_sample_nd = TRUE, first_sample_nd_value = 0, + ignore_below_loq_after_first_nd = TRUE) +{ + + if (!is.vector(res_raw)) stop("FOCUS rules are only specified for one-dimensional time series") + + if (ignore_below_loq_after_first_nd & is.na(loq)) { + stop("You need to specify an LOQ") + } + + n <- length(res_raw) + if (ignore_below_loq_after_first_nd) { + for (i in 3:n) { + if (!res_raw[i - 2] %in% c("na", "nd")) { + if (res_raw[i - 1] == "nd") { + res_remaining <- res_raw[i:n] + res_remaining_unquantified <- ifelse(res_remaining == "na", TRUE, + ifelse(res_remaining == "nd", TRUE, + ifelse(res_remaining == "nq", TRUE, + ifelse(suppressWarnings(as.numeric(res_remaining)) < loq, TRUE, FALSE)))) + res_remaining_numeric <- suppressWarnings(as.numeric(res_remaining)) + res_remaining_below_loq <- ifelse(res_remaining == "nq", TRUE, + ifelse(!is.na(res_remaining_numeric) & res_remaining_numeric < loq, TRUE, FALSE)) + if (all(res_remaining_unquantified)) { + res_raw[i:n] <- ifelse(res_remaining_below_loq, "nd", res_remaining) + } + } + } + } + } + + result <- set_nd_nq(res_raw, lod = lod, loq = loq) + + if (set_first_sample_nd) { + if (res_raw[1] == "nd") result[1] <- first_sample_nd_value + } + + return(result) +} diff --git a/_pkgdown.yml b/_pkgdown.yml index e12082d..b40e223 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -18,7 +18,7 @@ reference: - pfm_degradation - SFO_actual_twa - FOMC_actual_twa - - set_nd + - set_nd_nq - title: Predicted environmental concentrations in soil contents: - PEC_soil diff --git a/docs/reference/index.html b/docs/reference/index.html index 455ee07..e9c7098 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -170,9 +170,14 @@ -

set_nd() set_nd_focus()

- -

Set non-detects in residue series without replicates

+

set_nd_nq() set_nd_nq_focus()

+ +

Set non-detects and unquantified values in residue series without replicates +This function automates replacing unquantified values in residue time and +depth series. For time series, the function performs part of the residue +processing proposed in the FOCUS kinetics guidance for parent compounds +and metabolites. For two-dimensional residue series over time and depth, +it automates the proposal of Boesten et al (2015).

diff --git a/docs/reference/set_nd.html b/docs/reference/set_nd.html deleted file mode 100644 index 7b0e779..0000000 --- a/docs/reference/set_nd.html +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - -Set non-detects in residue series without replicates — set_nd • pfm - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - -
- -
-
- - -
- -

Sets non-detects directly before or directly after detects to NA. Values between -lod and loq are set to their mean value if an loq is specified. -If 'time_zero' is set to TRUE, the residue series is assumed to start with time -zero, and non-detects at time zero are set to 'time_zero_nd_value'. For the -set_nd_focus variant, this is zero, otherwise this argument has NA as default -value. -If stopping after the first non-detection is requested, as in in the FOCUS -variant of the function, an loq has to be specified in order to decide -if any later detections are above the loq.

- -
- -
set_nd(r, lod, loq = NA, time_zero = TRUE, time_zero_nd_value = NA,
-  stop_after_first_nondetect = FALSE)
-
-set_nd_focus(r, lod, loq = NA, time_zero = TRUE)
- -

Arguments

- - - - - - - - - - - - - - - - - - - - - - - - - - -
r

A character vector of sequential residues without replicates, with -non-detects specified as 'nd' and unquantified values above the limit of -detection specified as 'nq', otherwise coercible to numeric

lod

Limit of detection (numeric)

loq

Limit of quantification(numeric). Must be specified if the FOCUS rule to -stop after the first non-detection is to be applied

time_zero

Is the first value in the series a time zero value?

time_zero_nd_value

Which value should we use for non-detects or zero values at time zero?

stop_after_first_nondetect

Should we really stop after the first non-detection?

- -

Functions

- - -
    -
  • set_nd: Set non-detects in residues series

  • -
  • set_nd_focus: Set non-detects in residues series according to FOCUS rules

  • -
- -

References

- -

FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation - Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1, - 18 December 2014, p. 251

- - -

Examples

-
# FOCUS (2014) p. 75/76 and 131/132 -parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd") -set_nd(parent_1, 0.02)
#> [1] 0.12 0.09 0.05 0.03 0.01 NA NA NA NA NA
parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd") -set_nd(parent_2, 0.02)
#> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.03 0.01 NA NA
set_nd_focus(parent_2, 0.02, loq = 0.05)
#> [1] 0.12 0.09 0.05 0.03 0.01 NA NA NA NA NA
parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd") -set_nd(parent_3, 0.02)
#> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01 NA NA
set_nd_focus(parent_3, 0.02, loq = 0.05)
#> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01 NA NA
metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd") -set_nd(metabolite, 0.02)
#> [1] NA NA 0.01 0.03 0.06 0.10 0.11 0.10 0.09 0.05 0.03 0.01 NA
-
- -
- - -
- - -
-

Site built with pkgdown 1.4.1.

-
- -
-
- - - - - - - - diff --git a/docs/reference/set_nd_nq.html b/docs/reference/set_nd_nq.html new file mode 100644 index 0000000..ff751dd --- /dev/null +++ b/docs/reference/set_nd_nq.html @@ -0,0 +1,284 @@ + + + + + + + + +Set non-detects and unquantified values in residue series without replicates +This function automates replacing unquantified values in residue time and +depth series. For time series, the function performs part of the residue +processing proposed in the FOCUS kinetics guidance for parent compounds +and metabolites. For two-dimensional residue series over time and depth, +it automates the proposal of Boesten et al (2015). — set_nd_nq • pfm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +
+ +

Set non-detects and unquantified values in residue series without replicates +This function automates replacing unquantified values in residue time and +depth series. For time series, the function performs part of the residue +processing proposed in the FOCUS kinetics guidance for parent compounds +and metabolites. For two-dimensional residue series over time and depth, +it automates the proposal of Boesten et al (2015).

+ +
+ +
set_nd_nq(res_raw, lod, loq = NA, time_zero_presence = FALSE)
+
+set_nd_nq_focus(res_raw, lod, loq = NA, set_first_sample_nd = TRUE,
+  first_sample_nd_value = 0, ignore_below_loq_after_first_nd = TRUE)
+ +

Arguments

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
res_raw

Character vector of a residue time series, or matrix of +residue values with rows representing depth profiles for a specific sampling +time, and columns representing time series of residues at the same depth. +Values below the limit of detection (lod) have to be coded as "nd", values +between the limit of detection and the limit of quantification, if any, have +to be coded as "nq". Samples not analysed have to be coded as "na". All +values that are not "na", "nd" or "nq" have to be coercible to numeric

lod

Limit of detection (numeric)

loq

Limit of quantification(numeric). Must be specified if the FOCUS rule to +stop after the first non-detection is to be applied

time_zero_presence

Do we assume that residues occur at time zero? +This only affects samples from the first sampling time that have been +reported as "nd" (not detected).

set_first_sample_nd

Should the first sample be set to "first_sample_nd_value" +in case it is a non-detection?

first_sample_nd_value

Value to be used for the first sample if it is a non-detection

ignore_below_loq_after_first_nd

Should we ignore values below the LOQ after the first +non-detection that occurs after the quantified values?

+ +

Value

+ +

A numeric vector, if a vector was supplied, or a numeric matrix otherwise

+ +

Functions

+ + +
    +
  • set_nd_nq_focus: Set non-detects in residue time series according to FOCUS rules

  • +
+ +

References

+ +

Boesten, J. J. T. I., van der Linden, A. M. A., Beltman, W. H. +J. and Pol, J. W. (2015). Leaching of plant protection products and their +transformation products; Proposals for improving the assessment of leaching +to groundwater in the Netherlands — Version 2. Alterra report 2630, Alterra +Wageningen UR (University & Research centre)

+

FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation + Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1, + 18 December 2014, p. 251

+ + +

Examples

+
# FOCUS (2014) p. 75/76 and 131/132 +parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd") +set_nd_nq(parent_1, 0.02)
#> [1] 0.12 0.09 0.05 0.03 0.01 NA NA NA NA NA
parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd") +set_nd_nq(parent_2, 0.02)
#> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.03 0.01 NA NA
set_nd_nq_focus(parent_2, 0.02, loq = 0.05)
#> [1] 0.12 0.09 0.05 0.03 0.01 NA NA NA NA NA
parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd") +set_nd_nq(parent_3, 0.02)
#> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01 NA NA
set_nd_nq_focus(parent_3, 0.02, loq = 0.05)
#> [1] 0.12 0.09 0.05 0.03 0.01 0.01 0.06 0.01 NA NA
metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd") +set_nd_nq(metabolite, 0.02)
#> [1] NA NA 0.01 0.03 0.06 0.10 0.11 0.10 0.09 0.05 0.03 0.01 NA
set_nd_nq_focus(metabolite, 0.02, 0.05)
#> [1] 0.00 NA 0.01 0.03 0.06 0.10 0.11 0.10 0.09 0.05 0.03 0.01 NA
# +# Boesten et al. (2015), p. 57/58 +table_8 <- matrix( + c(10, 10, rep("nd", 4), + 10, 10, rep("nq", 2), rep("nd", 2), + 10, 10, 10, "nq", "nd", "nd", + "nq", 10, "nq", rep("nd", 3), + "nd", "nq", "nq", rep("nd", 3), + rep("nd", 6), rep("nd", 6)), + ncol = 6, byrow = TRUE) +set_nd_nq(table_8, 0.5, 1.5, time_zero_presence = TRUE)
#> [,1] [,2] [,3] [,4] [,5] [,6] +#> [1,] 10.00 10.00 0.25 0.25 NA NA +#> [2,] 10.00 10.00 1.00 1.00 0.25 NA +#> [3,] 10.00 10.00 10.00 1.00 0.25 NA +#> [4,] 1.00 10.00 1.00 0.25 NA NA +#> [5,] 0.25 1.00 1.00 0.25 NA NA +#> [6,] NA 0.25 0.25 NA NA NA +#> [7,] NA NA NA NA NA NA
table_10 <- matrix( + c(10, 10, rep("nd", 4), + 10, 10, rep("nd", 4), + 10, 10, 10, rep("nd", 3), + "nd", 10, rep("nd", 4), + rep("nd", 18)), + ncol = 6, byrow = TRUE) +set_nd_nq(table_10, 0.5, time_zero_presence = TRUE)
#> [,1] [,2] [,3] [,4] [,5] [,6] +#> [1,] 10.00 10.00 0.25 NA NA NA +#> [2,] 10.00 10.00 0.25 NA NA NA +#> [3,] 10.00 10.00 10.00 0.25 NA NA +#> [4,] 0.25 10.00 0.25 NA NA NA +#> [5,] NA 0.25 NA NA NA NA +#> [6,] NA NA NA NA NA NA +#> [7,] NA NA NA NA NA NA
+
+ +
+ + +
+ + +
+

Site built with pkgdown 1.4.1.

+
+ +
+
+ + + + + + + + diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 79d9b14..b619e4d 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -100,7 +100,7 @@ https://pkgdown.jrwb.de/pfm/reference/sawtooth.html - https://pkgdown.jrwb.de/pfm/reference/set_nd.html + https://pkgdown.jrwb.de/pfm/reference/set_nd_nq.html https://pkgdown.jrwb.de/pfm/reference/soil_scenario_data_EFSA_2015.html diff --git a/man/set_nd.Rd b/man/set_nd.Rd deleted file mode 100644 index cef2705..0000000 --- a/man/set_nd.Rd +++ /dev/null @@ -1,64 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/set_nd.R -\name{set_nd} -\alias{set_nd} -\alias{set_nd_focus} -\title{Set non-detects in residue series without replicates} -\usage{ -set_nd(r, lod, loq = NA, time_zero = TRUE, time_zero_nd_value = NA, - stop_after_first_nondetect = FALSE) - -set_nd_focus(r, lod, loq = NA, time_zero = TRUE) -} -\arguments{ -\item{r}{A character vector of sequential residues without replicates, with -non-detects specified as 'nd' and unquantified values above the limit of -detection specified as 'nq', otherwise coercible to numeric} - -\item{lod}{Limit of detection (numeric)} - -\item{loq}{Limit of quantification(numeric). Must be specified if the FOCUS rule to -stop after the first non-detection is to be applied} - -\item{time_zero}{Is the first value in the series a time zero value?} - -\item{time_zero_nd_value}{Which value should we use for non-detects at time zero?} - -\item{stop_after_first_nondetect}{Should we really stop after the first non-detection?} -} -\description{ -Sets non-detects directly before or directly after detects to NA. Values between -lod and loq are set to their mean value if an loq is specified. -If 'time_zero' is set to TRUE, the residue series is assumed to start with time -zero, and non-detects at time zero are set to 'time_zero_nd_value'. For the -set_nd_focus variant, this is zero, otherwise this argument has NA as default -value. -If stopping after the first non-detection is requested, as in in the FOCUS -variant of the function, an loq has to be specified in order to decide -if any later detections are above the loq. -} -\section{Functions}{ -\itemize{ -\item \code{set_nd}: Set non-detects in residues series - -\item \code{set_nd_focus}: Set non-detects in residues series according to FOCUS rules -}} - -\examples{ -# FOCUS (2014) p. 75/76 and 131/132 -parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd") -set_nd(parent_1, 0.02) -parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd") -set_nd(parent_2, 0.02) -set_nd_focus(parent_2, 0.02, loq = 0.05) -parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd") -set_nd(parent_3, 0.02) -set_nd_focus(parent_3, 0.02, loq = 0.05) -metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd") -set_nd(metabolite, 0.02) -} -\references{ -FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation - Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1, - 18 December 2014, p. 251 -} diff --git a/man/set_nd_nq.Rd b/man/set_nd_nq.Rd new file mode 100644 index 0000000..b2da429 --- /dev/null +++ b/man/set_nd_nq.Rd @@ -0,0 +1,103 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/set_nd_nq.R +\name{set_nd_nq} +\alias{set_nd_nq} +\alias{set_nd_nq_focus} +\title{Set non-detects and unquantified values in residue series without replicates +This function automates replacing unquantified values in residue time and +depth series. For time series, the function performs part of the residue +processing proposed in the FOCUS kinetics guidance for parent compounds +and metabolites. For two-dimensional residue series over time and depth, +it automates the proposal of Boesten et al (2015).} +\usage{ +set_nd_nq(res_raw, lod, loq = NA, time_zero_presence = FALSE) + +set_nd_nq_focus(res_raw, lod, loq = NA, set_first_sample_nd = TRUE, + first_sample_nd_value = 0, ignore_below_loq_after_first_nd = TRUE) +} +\arguments{ +\item{res_raw}{Character vector of a residue time series, or matrix of +residue values with rows representing depth profiles for a specific sampling +time, and columns representing time series of residues at the same depth. +Values below the limit of detection (lod) have to be coded as "nd", values +between the limit of detection and the limit of quantification, if any, have +to be coded as "nq". Samples not analysed have to be coded as "na". All +values that are not "na", "nd" or "nq" have to be coercible to numeric} + +\item{lod}{Limit of detection (numeric)} + +\item{loq}{Limit of quantification(numeric). Must be specified if the FOCUS rule to +stop after the first non-detection is to be applied} + +\item{time_zero_presence}{Do we assume that residues occur at time zero? +This only affects samples from the first sampling time that have been +reported as "nd" (not detected).} + +\item{set_first_sample_nd}{Should the first sample be set to "first_sample_nd_value" +in case it is a non-detection?} + +\item{first_sample_nd_value}{Value to be used for the first sample if it is a non-detection} + +\item{ignore_below_loq_after_first_nd}{Should we ignore values below the LOQ after the first +non-detection that occurs after the quantified values?} +} +\value{ +A numeric vector, if a vector was supplied, or a numeric matrix otherwise +} +\description{ +Set non-detects and unquantified values in residue series without replicates +This function automates replacing unquantified values in residue time and +depth series. For time series, the function performs part of the residue +processing proposed in the FOCUS kinetics guidance for parent compounds +and metabolites. For two-dimensional residue series over time and depth, +it automates the proposal of Boesten et al (2015). +} +\section{Functions}{ +\itemize{ +\item \code{set_nd_nq_focus}: Set non-detects in residue time series according to FOCUS rules +}} + +\examples{ +# FOCUS (2014) p. 75/76 and 131/132 +parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd") +set_nd_nq(parent_1, 0.02) +parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd") +set_nd_nq(parent_2, 0.02) +set_nd_nq_focus(parent_2, 0.02, loq = 0.05) +parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd") +set_nd_nq(parent_3, 0.02) +set_nd_nq_focus(parent_3, 0.02, loq = 0.05) +metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd") +set_nd_nq(metabolite, 0.02) +set_nd_nq_focus(metabolite, 0.02, 0.05) +# +# Boesten et al. (2015), p. 57/58 +table_8 <- matrix( + c(10, 10, rep("nd", 4), + 10, 10, rep("nq", 2), rep("nd", 2), + 10, 10, 10, "nq", "nd", "nd", + "nq", 10, "nq", rep("nd", 3), + "nd", "nq", "nq", rep("nd", 3), + rep("nd", 6), rep("nd", 6)), + ncol = 6, byrow = TRUE) +set_nd_nq(table_8, 0.5, 1.5, time_zero_presence = TRUE) +table_10 <- matrix( + c(10, 10, rep("nd", 4), + 10, 10, rep("nd", 4), + 10, 10, 10, rep("nd", 3), + "nd", 10, rep("nd", 4), + rep("nd", 18)), + ncol = 6, byrow = TRUE) +set_nd_nq(table_10, 0.5, time_zero_presence = TRUE) +} +\references{ +Boesten, J. J. T. I., van der Linden, A. M. A., Beltman, W. H. +J. and Pol, J. W. (2015). Leaching of plant protection products and their +transformation products; Proposals for improving the assessment of leaching +to groundwater in the Netherlands — Version 2. Alterra report 2630, Alterra +Wageningen UR (University & Research centre) + +FOCUS (2014) Generic Guidance for Estimating Persistence and Degradation + Kinetics from Environmental Fate Studies on Pesticides in EU Registration, Version 1.1, + 18 December 2014, p. 251 +} diff --git a/test.log b/test.log index 06512a8..741e868 100644 --- a/test.log +++ b/test.log @@ -5,11 +5,11 @@ Testing pfm ✔ | OK F W S | Context ⠏ | 0 | Exposit calculations ✔ | 7 | Exposit calculations ⠏ | 0 | Geometric mean calculation ✔ | 6 | Geometric mean calculation - ⠏ | 0 | Check max_twa for parent mkinfit models against analytical solutions ⠋ | 1 | Check max_twa for parent mkinfit models against analytical solutions ✔ | 1 | Check max_twa for parent mkinfit models against analytical solutions [1.9 s] + ⠏ | 0 | Check max_twa for parent mkinfit models against analytical solutions ⠋ | 1 | Check max_twa for parent mkinfit models against analytical solutions ✔ | 1 | Check max_twa for parent mkinfit models against analytical solutions [1.0 s] ⠏ | 0 | Simple PEC sediment calculations ✔ | 1 | Simple PEC sediment calculations ⠏ | 0 | Simple PEC soil calculations ⠙ | 2 | Simple PEC soil calculations ✔ | 17 | Simple PEC soil calculations [0.2 s] ⠏ | 0 | Simple PEC surface water calculations with drift entry ✔ | 2 | Simple PEC surface water calculations with drift entry - ⠏ | 0 | Processing of residue series ✔ | 8 | Processing of residue series + ⠏ | 0 | Processing of residue series ✔ | 11 | Processing of residue series ⠏ | 0 | Actual and time weighted average concentrations for SFO kinetics ✔ | 1 | Actual and time weighted average concentrations for SFO kinetics ⠏ | 0 | FOCUS Step 1 calculations ⠹ | 3 | FOCUS Step 1 calculations ✔ | 9 | FOCUS Step 1 calculations [0.1 s] ⠏ | 0 | FOCUS Steps 12 input files ✔ | 8 | FOCUS Steps 12 input files @@ -17,9 +17,9 @@ Testing pfm ⠏ | 0 | UK drainage PEC calculations ✔ | 12 | UK drainage PEC calculations ══ Results ═════════════════════════════════════════════════════════════════════════════════════════ -Duration: 8.0 s +Duration: 7.0 s -OK: 79 +OK: 82 Failed: 0 Warnings: 0 Skipped: 0 diff --git a/tests/testthat/test_set_nd.R b/tests/testthat/test_set_nd.R index 6b73e2d..232e7c6 100644 --- a/tests/testthat/test_set_nd.R +++ b/tests/testthat/test_set_nd.R @@ -1,4 +1,5 @@ context("Processing of residue series") + # FOCUS (2014) page 76 (parent) and page 132 (metabolite) parent_1 <- c(.12, .09, .05, .03, "nd", "nd", "nd", "nd", "nd", "nd") @@ -6,39 +7,80 @@ parent_2 <- c(.12, .09, .05, .03, "nd", "nd", .03, "nd", "nd", "nd") parent_3 <- c(.12, .09, .05, .03, "nd", "nd", .06, "nd", "nd", "nd") metabolite <- c("nd", "nd", "nd", 0.03, 0.06, 0.10, 0.11, 0.10, 0.09, 0.05, 0.03, "nd", "nd") -test_that("Simple residue series processed as intended", { +test_that("Simple residue series are processed as intended", { - expect_equal(set_nd(parent_1, 0.02), + expect_equal(set_nd_nq(parent_1, 0.02), c(.12, .09, .05, .03, .01, rep(NA, 5))) - expect_equal(set_nd(parent_2, 0.02, loq = 0.05), + expect_equal(set_nd_nq(parent_2, 0.02, loq = 0.05), c(.12, .09, .05, .03, .01, .01, .03, .01, NA, NA)) - expect_equal(set_nd(metabolite, 0.02, loq = 0.05), + expect_equal(set_nd_nq(metabolite, 0.02, loq = 0.05), c(NA, NA, .01, .03, .06, .1, .11, .1, .09, .05, .03, .01, NA)) - expect_equal(set_nd(c("nd", 1, 0.2, "nd"), 0.1), c(NA, 1, 0.2, 0.05)) + expect_equal(set_nd_nq(c("nd", 1, 0.2, "nd"), 0.1), + c(NA, 1, 0.2, 0.05)) }) test_that("Simple residue series are processed as in the FOCUS guidance", { # Parent 1 - expect_error(set_nd_focus(parent_1, 0.02), - "You need to specify an loq") - expect_equal(set_nd_focus(parent_1, 0.02, 0.05), + expect_error(set_nd_nq_focus(parent_1, 0.02), + "You need to specify an LOQ") + expect_equal(set_nd_nq_focus(parent_1, 0.02, 0.05), c(.12, .09, .05, .03, .01, rep(NA, 5))) # Parent 2 - expect_equal(set_nd_focus(parent_2, 0.02, loq = 0.05), + expect_equal(set_nd_nq_focus(parent_2, 0.02, loq = 0.05), c(.12, .09, .05, .03, .01, rep(NA, 5))) # Parent 3 - expect_equal(set_nd_focus(parent_3, 0.02, loq = 0.05), + expect_equal(set_nd_nq_focus(parent_3, 0.02, loq = 0.05), c(.12, .09, .05, .03, .01, .01, .06, .01, NA, NA)) # Metabolite - expect_equal(set_nd_focus(metabolite, 0.02, loq = 0.05), + expect_equal(set_nd_nq_focus(metabolite, 0.02, loq = 0.05), c(0, NA, .01, .03, .06, .1, .11, .1, .09, .05, .03, .01, NA)) }) + +test_that("Examples Boesten et al. (2015, p. 57/58) are correctly processed", { + table_8 <- matrix( + c(10, 10, rep("nd", 4), + 10, 10, rep("nq", 2), rep("nd", 2), + 10, 10, 10, "nq", "nd", "nd", + "nq", 10, "nq", rep("nd", 3), + "nd", "nq", "nq", rep("nd", 3), + rep("nd", 6), rep("nd", 6)), + ncol = 6, byrow = TRUE) + table_8_processed <- set_nd_nq(table_8, 0.5, 1.5, time_zero_presence = TRUE) + table_9 <- matrix( + c(10, 10, 0.25, 0.25, NA, NA, + 10, 10, 1, 1, 0.25, NA, + 10, 10, 10, 1, 0.25, NA, + 1, 10, 1, 0.25, NA, NA, + 0.25, 1, 1, 0.25, NA, NA, + NA, 0.25, 0.25, NA, NA, NA, + rep(NA, 6)), + ncol = 6, byrow = TRUE) + expect_equal(table_8_processed, table_9) + + table_10 <- matrix( + c(10, 10, rep("nd", 4), + 10, 10, rep("nd", 4), + 10, 10, 10, rep("nd", 3), + "nd", 10, rep("nd", 4), + rep("nd", 18)), + ncol = 6, byrow = TRUE) + table_10_processed <- set_nd_nq(table_10, 0.5, time_zero_presence = TRUE) + table_11 <- matrix( + c(10, 10, 0.25, rep(NA, 3), + 10, 10, 0.25, rep(NA, 3), + 10, 10, 10, 0.25, NA, NA, + 0.25, 10, 0.25, rep(NA, 3), + NA, 0.25, rep(NA, 4), + rep(NA, 12)), + ncol = 6, byrow = TRUE) + expect_equal(table_10_processed, table_11) +}) -- cgit v1.2.1