From a5e458ecb33ae87e46b2237174a194f6252a97cf Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Thu, 10 Oct 2019 08:53:30 +0200 Subject: Finish documentation of set_nd and test it --- ChangeLog | 6 ++ DESCRIPTION | 2 +- R/process_residues.R | 107 ------------------- R/set_nd.R | 109 +++++++++++++++++++ _pkgdown.yml | 1 + docs/reference/index.html | 15 +++ docs/reference/set_nd.html | 247 +++++++++++++++++++++++++++++++++++++++++++ docs/sitemap.xml | 3 + man/set_nd.Rd | 8 +- test.log | 27 ++--- tests/testthat/test_set_nd.R | 42 ++++++++ 11 files changed, 444 insertions(+), 123 deletions(-) delete mode 100644 R/process_residues.R create mode 100644 R/set_nd.R create mode 100644 docs/reference/set_nd.html create mode 100644 tests/testthat/test_set_nd.R diff --git a/ChangeLog b/ChangeLog index 17ffa8a..a14aa23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +commit 63df3871a442de4bf47e4d9de1449e7f6ed65b2f +Author: Johannes Ranke +Date: 2019-10-09 19:17:07 +0200 + + Function to set non-detects in residue series + commit 9f848a9518aabf162723271bafba244221ee83ed Author: Johannes Ranke Date: 2019-09-27 12:55:03 +0200 diff --git a/DESCRIPTION b/DESCRIPTION index 73c561d..39e174b 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-09 +Date: 2019-10-10 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/R/process_residues.R b/R/process_residues.R deleted file mode 100644 index 35d3a4e..0000000 --- a/R/process_residues.R +++ /dev/null @@ -1,107 +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 stop_after_first_nondetect Should we really stop after the first non-detection? -#' @references FOCUS (2014) p. 75, 76, 131, 132 -#' @export -#' @examples -#' 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")) stop("You need to specify lod and loq") - } - - # Handle nd values - if (time_zero) { - if (r[1] == "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 (next_value == "nd") residues_in_next = FALSE - else residues_in_next = TRUE - } else { - residues_in_next = FALSE - } - - 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 - } - - } - return(as.numeric(result)) -} - -#' @describeIn set_nd Set non-detects in residues series according to FOCUS rules -#' @export -set_nd_focus <- function(res, lod, loq = NA, time_zero = TRUE) { - result <- set_nd(res, 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.R b/R/set_nd.R new file mode 100644 index 0000000..5d98940 --- /dev/null +++ b/R/set_nd.R @@ -0,0 +1,109 @@ +#' 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) p. 75, 76, 131, 132 +#' @export +#' @examples +#' 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")) stop("You need to specify lod and loq") + } + + # Handle nd values + if (time_zero) { + if (r[1] == "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 (next_value == "nd") residues_in_next = FALSE + else residues_in_next = TRUE + } else { + residues_in_next = FALSE + } + + 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 + } + + } + 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/_pkgdown.yml b/_pkgdown.yml index bec5bf7..e12082d 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -18,6 +18,7 @@ reference: - pfm_degradation - SFO_actual_twa - FOMC_actual_twa + - set_nd - title: Predicted environmental concentrations in soil contents: - PEC_soil diff --git a/docs/reference/index.html b/docs/reference/index.html index e1acfc1..a704ad0 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -167,6 +167,21 @@

FOMC_actual_twa()

Actual and maximum moving window time average concentrations for FOMC kinetics

+ + + +

set_nd() set_nd_focus()

+ +

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.

diff --git a/docs/reference/set_nd.html b/docs/reference/set_nd.html new file mode 100644 index 0000000..32ac155 --- /dev/null +++ b/docs/reference/set_nd.html @@ -0,0 +1,247 @@ + + + + + + + + +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. — set_nd • pfm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+
+ + +
+ +

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.

+ +
+ +
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 at time zero?

stop_after_first_nondetect

Should we really stop after the first non-detection?

+ +

Functions

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

  • +
+ +

References

+ +

FOCUS (2014) p. 75, 76, 131, 132

+ + +

Examples

+
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/sitemap.xml b/docs/sitemap.xml index 6eff936..79d9b14 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -99,6 +99,9 @@ https://pkgdown.jrwb.de/pfm/reference/sawtooth.html + + https://pkgdown.jrwb.de/pfm/reference/set_nd.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 index 8c766ac..8c6003c 100644 --- a/man/set_nd.Rd +++ b/man/set_nd.Rd @@ -1,5 +1,5 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/process_residues.R +% Please edit documentation in R/set_nd.R \name{set_nd} \alias{set_nd} \alias{set_nd_focus} @@ -17,7 +17,7 @@ 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(res, lod, loq = NA, time_zero = TRUE) +set_nd_focus(r, lod, loq = NA, time_zero = TRUE) } \arguments{ \item{r}{A character vector of sequential residues without replicates, with @@ -29,6 +29,10 @@ detection specified as 'nq', otherwise coercible to 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{ diff --git a/test.log b/test.log index bd894ec..06512a8 100644 --- a/test.log +++ b/test.log @@ -2,23 +2,24 @@ Loading pfm Loading required package: R6 Loading required package: mkin Testing pfm -✔ | OK F W S | Context - ⠏ | 0 | Exposit calculations ⠋ | 1 | Exposit calculations ⠙ | 2 | Exposit calculations ⠹ | 3 | Exposit calculations ⠸ | 4 | Exposit calculations ⠼ | 5 | Exposit calculations ⠴ | 6 | Exposit calculations ⠦ | 7 | Exposit calculations ✔ | 7 | Exposit calculations - ⠏ | 0 | Geometric mean calculation ⠋ | 1 | Geometric mean calculation ⠙ | 2 | Geometric mean calculation ⠹ | 3 | Geometric mean calculation ⠸ | 4 | Geometric mean calculation ⠼ | 5 | Geometric mean calculation ⠴ | 6 | 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 [2.0 s] - ⠏ | 0 | Simple PEC sediment calculations ⠋ | 1 | Simple PEC sediment calculations ✔ | 1 | Simple PEC sediment calculations - ⠏ | 0 | Simple PEC soil calculations ⠋ | 1 | Simple PEC soil calculations ⠙ | 2 | Simple PEC soil calculations ⠹ | 3 | Simple PEC soil calculations ⠸ | 4 | Simple PEC soil calculations ⠼ | 5 | Simple PEC soil calculations ⠴ | 6 | Simple PEC soil calculations ⠦ | 7 | Simple PEC soil calculations ⠧ | 8 | Simple PEC soil calculations ⠇ | 9 | Simple PEC soil calculations ⠏ | 10 | Simple PEC soil calculations ⠋ | 11 | Simple PEC soil calculations ⠙ | 12 | Simple PEC soil calculations ⠹ | 13 | Simple PEC soil calculations ⠸ | 14 | Simple PEC soil calculations ⠼ | 15 | Simple PEC soil calculations ⠴ | 16 | Simple PEC soil calculations ⠦ | 17 | Simple PEC soil calculations ✔ | 17 | Simple PEC soil calculations [0.2 s] - ⠏ | 0 | Simple PEC surface water calculations with drift entry ⠋ | 1 | Simple PEC surface water calculations with drift entry ⠙ | 2 | Simple PEC surface water calculations with drift entry ✔ | 2 | Simple PEC surface water calculations with drift entry - ⠏ | 0 | Actual and time weighted average concentrations for SFO kinetics ⠋ | 1 | Actual and time weighted average concentrations for SFO kinetics ✔ | 1 | Actual and time weighted average concentrations for SFO kinetics - ⠏ | 0 | FOCUS Step 1 calculations ⠋ | 1 | FOCUS Step 1 calculations ⠙ | 2 | FOCUS Step 1 calculations ⠹ | 3 | FOCUS Step 1 calculations ⠸ | 4 | FOCUS Step 1 calculations ⠼ | 5 | FOCUS Step 1 calculations ⠴ | 6 | FOCUS Step 1 calculations ⠦ | 7 | FOCUS Step 1 calculations ⠧ | 8 | FOCUS Step 1 calculations ⠇ | 9 | FOCUS Step 1 calculations ✔ | 9 | FOCUS Step 1 calculations [0.1 s] - ⠏ | 0 | FOCUS Steps 12 input files ⠋ | 1 | FOCUS Steps 12 input files ⠙ | 2 | FOCUS Steps 12 input files ⠹ | 3 | FOCUS Steps 12 input files ⠸ | 4 | FOCUS Steps 12 input files ⠼ | 5 | FOCUS Steps 12 input files ⠴ | 6 | FOCUS Steps 12 input files ⠦ | 7 | FOCUS Steps 12 input files ⠧ | 8 | FOCUS Steps 12 input files ✔ | 8 | FOCUS Steps 12 input files - ⠏ | 0 | Read and analyse TOXSWA cwa files ⠋ | 1 | Read and analyse TOXSWA cwa files ⠙ | 2 | Read and analyse TOXSWA cwa files ⠹ | 3 | Read and analyse TOXSWA cwa files ⠸ | 4 | Read and analyse TOXSWA cwa files ⠼ | 5 | Read and analyse TOXSWA cwa files ⠴ | 6 | Read and analyse TOXSWA cwa files ⠦ | 7 | Read and analyse TOXSWA cwa files ✔ | 7 | Read and analyse TOXSWA cwa files [5.6 s] - ⠏ | 0 | UK drainage PEC calculations ⠋ | 1 | UK drainage PEC calculations ⠙ | 2 | UK drainage PEC calculations ⠹ | 3 | UK drainage PEC calculations ⠸ | 4 | UK drainage PEC calculations ⠼ | 5 | UK drainage PEC calculations ⠴ | 6 | UK drainage PEC calculations ⠦ | 7 | UK drainage PEC calculations ⠧ | 8 | UK drainage PEC calculations ⠇ | 9 | UK drainage PEC calculations ⠏ | 10 | UK drainage PEC calculations ⠋ | 11 | UK drainage PEC calculations ⠙ | 12 | UK drainage PEC calculations ✔ | 12 | UK drainage PEC calculations +✔ | 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 | 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 | 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 + ⠏ | 0 | Read and analyse TOXSWA cwa files ⠋ | 1 | Read and analyse TOXSWA cwa files ⠸ | 4 | Read and analyse TOXSWA cwa files ⠼ | 5 | Read and analyse TOXSWA cwa files ⠴ | 6 | Read and analyse TOXSWA cwa files ✔ | 7 | Read and analyse TOXSWA cwa files [5.5 s] + ⠏ | 0 | UK drainage PEC calculations ✔ | 12 | UK drainage PEC calculations ══ Results ═════════════════════════════════════════════════════════════════════════════════════════ Duration: 8.0 s -OK: 71 +OK: 79 Failed: 0 Warnings: 0 Skipped: 0 diff --git a/tests/testthat/test_set_nd.R b/tests/testthat/test_set_nd.R new file mode 100644 index 0000000..29087a8 --- /dev/null +++ b/tests/testthat/test_set_nd.R @@ -0,0 +1,42 @@ +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") +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", { + + expect_equal(set_nd(parent_1, 0.02), + c(.12, .09, .05, .03, .01, rep(NA, 5))) + + expect_equal(set_nd(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), + c(NA, NA, .01, .03, .06, .1, .11, .1, .09, .05, .03, .01, NA)) + +}) + +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), + c(.12, .09, .05, .03, .01, rep(NA, 5))) + + # Parent 2 + expect_equal(set_nd_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), + c(.12, .09, .05, .03, .01, .01, .06, .01, NA, NA)) + + # Metabolite + expect_equal(set_nd_focus(metabolite, 0.02, loq = 0.05), + c(0, NA, .01, .03, .06, .1, .11, .1, .09, .05, .03, .01, NA)) + +}) -- cgit v1.2.1