aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--R/ds_mixed.R17
-rw-r--r--_pkgdown.yml3
-rw-r--r--data/ds_mixed.rdabin0 -> 6935 bytes
-rw-r--r--inst/dataset_generation/ds_mixed.R105
-rw-r--r--log/check.log4
-rw-r--r--log/test.log28
-rw-r--r--man/ds_mixed.Rd24
-rw-r--r--tests/testthat/_snaps/multistart/llhist-for-dfop-sfo-fit.svg (renamed from tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg)0
-rw-r--r--tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg30
-rw-r--r--tests/testthat/_snaps/multistart/parplot-for-dfop-sfo-fit.svg (renamed from tests/testthat/_snaps/multistart/parplot-for-biphasic-saemix-fit.svg)0
-rw-r--r--tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg90
-rw-r--r--tests/testthat/anova_sfo_saem.txt10
-rw-r--r--tests/testthat/print_dfop_saem_1.txt (renamed from tests/testthat/print_dfop_saemix_1.txt)8
-rw-r--r--tests/testthat/print_fits_synth_const.txt2
-rw-r--r--tests/testthat/print_mmkin_sfo_1_mixed.txt4
-rw-r--r--tests/testthat/print_multistart_dfop_sfo.txt (renamed from tests/testthat/print_multistart_biphasic.txt)0
-rw-r--r--tests/testthat/print_sfo_saem_1_reduced.txt12
-rw-r--r--tests/testthat/setup_script.R99
-rw-r--r--tests/testthat/summary_hfit_sfo_tc.txt26
-rw-r--r--tests/testthat/summary_saem_dfop_sfo_s.txt (renamed from tests/testthat/summary_saem_biphasic_s.txt)0
-rw-r--r--tests/testthat/test_mixed.R32
-rw-r--r--tests/testthat/test_multistart.R30
-rw-r--r--tests/testthat/test_plot.R22
-rw-r--r--tests/testthat/test_saemix_parent.R40
24 files changed, 324 insertions, 262 deletions
diff --git a/R/ds_mixed.R b/R/ds_mixed.R
new file mode 100644
index 00000000..c5055712
--- /dev/null
+++ b/R/ds_mixed.R
@@ -0,0 +1,17 @@
+#' Synthetic data for hierarchical kinetic degradation models
+#'
+#' The R code used to create this data object is installed with this package in
+#' the 'dataset_generation' directory.
+#'
+#' @name ds_mixed
+#' @aliases ds_sfo ds_fomc ds_dfop ds_hs ds_dfop_sfo
+#' @examples
+#' \dontrun{
+#' sfo_mmkin <- mmkin("SFO", ds_sfo, quiet = TRUE, error_model = "tc", cores = 15)
+#' sfo_saem <- saem(sfo_mmkin, no_random_effect = "parent_0")
+#' plot(sfo_saem)
+#' }
+#'
+#' # This is the code used to generate the datasets
+#' cat(readLines(system.file("dataset_generation/ds_mixed.R", package = "mkin")), sep = "\n")
+NULL
diff --git a/_pkgdown.yml b/_pkgdown.yml
index 8aa44ed4..98ed84f2 100644
--- a/_pkgdown.yml
+++ b/_pkgdown.yml
@@ -67,7 +67,7 @@ reference:
- parplot
- title: Datasets and known results
contents:
- - focus_soil_moisture
+ - ds_mixed
- D24_2014
- dimethenamid_2018
- FOCUS_2006_A
@@ -82,6 +82,7 @@ reference:
- synthetic_data_for_UBA_2014
- experimental_data_for_UBA_2019
- test_data_from_UBA_2014
+ - focus_soil_moisture
- mkinds
- mkindsg
- title: NAFTA guidance
diff --git a/data/ds_mixed.rda b/data/ds_mixed.rda
new file mode 100644
index 00000000..cf9f6463
--- /dev/null
+++ b/data/ds_mixed.rda
Binary files differ
diff --git a/inst/dataset_generation/ds_mixed.R b/inst/dataset_generation/ds_mixed.R
new file mode 100644
index 00000000..f2ae6e7e
--- /dev/null
+++ b/inst/dataset_generation/ds_mixed.R
@@ -0,0 +1,105 @@
+# Synthetic data for hierarchical kinetic models
+# Refactored version of the code previously in tests/testthat/setup_script.R
+# The number of datasets was 3 for FOMC, and 10 for HS in that script, now it
+# is always 15 for consistency
+
+library(mkin) # We use mkinmod and mkinpredict
+sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
+n <- 15
+log_sd <- 0.3
+err_1 = list(const = 1, prop = 0.05)
+tc <- function(value) sigma_twocomp(value, err_1$const, err_1$prop)
+const <- function(value) 2
+
+set.seed(123456)
+SFO <- mkinmod(parent = mkinsub("SFO"))
+sfo_pop <- list(parent_0 = 100, k_parent = 0.03)
+sfo_parms <- as.matrix(data.frame(
+ k_parent = rlnorm(n, log(sfo_pop$k_parent), log_sd)))
+set.seed(123456)
+ds_sfo <- lapply(1:n, function(i) {
+ ds_mean <- mkinpredict(SFO, sfo_parms[i, ],
+ c(parent = sfo_pop$parent_0), sampling_times)
+ add_err(ds_mean, tc, n = 1)[[1]]
+})
+attr(ds_sfo, "pop") <- sfo_pop
+attr(ds_sfo, "parms") <- sfo_parms
+
+set.seed(123456)
+FOMC <- mkinmod(parent = mkinsub("FOMC"))
+fomc_pop <- list(parent_0 = 100, alpha = 2, beta = 8)
+fomc_parms <- as.matrix(data.frame(
+ alpha = rlnorm(n, log(fomc_pop$alpha), 0.4),
+ beta = rlnorm(n, log(fomc_pop$beta), 0.2)))
+set.seed(123456)
+ds_fomc <- lapply(1:n, function(i) {
+ ds_mean <- mkinpredict(FOMC, fomc_parms[i, ],
+ c(parent = fomc_pop$parent_0), sampling_times)
+ add_err(ds_mean, tc, n = 1)[[1]]
+})
+attr(ds_fomc, "pop") <- fomc_pop
+attr(ds_fomc, "parms") <- fomc_parms
+
+set.seed(123456)
+DFOP <- mkinmod(parent = mkinsub("DFOP"))
+dfop_pop <- list(parent_0 = 100, k1 = 0.06, k2 = 0.015, g = 0.4)
+dfop_parms <- as.matrix(data.frame(
+ k1 = rlnorm(n, log(dfop_pop$k1), log_sd),
+ k2 = rlnorm(n, log(dfop_pop$k2), log_sd),
+ g = plogis(rnorm(n, qlogis(dfop_pop$g), log_sd))))
+set.seed(123456)
+ds_dfop <- lapply(1:n, function(i) {
+ ds_mean <- mkinpredict(DFOP, dfop_parms[i, ],
+ c(parent = dfop_pop$parent_0), sampling_times)
+ add_err(ds_mean, tc, n = 1)[[1]]
+})
+attr(ds_dfop, "pop") <- dfop_pop
+attr(ds_dfop, "parms") <- dfop_parms
+
+set.seed(123456)
+HS <- mkinmod(parent = mkinsub("HS"))
+hs_pop <- list(parent_0 = 100, k1 = 0.08, k2 = 0.01, tb = 15)
+hs_parms <- as.matrix(data.frame(
+ k1 = rlnorm(n, log(hs_pop$k1), log_sd),
+ k2 = rlnorm(n, log(hs_pop$k2), log_sd),
+ tb = rlnorm(n, log(hs_pop$tb), 0.1)))
+set.seed(123456)
+ds_hs <- lapply(1:n, function(i) {
+ ds_mean <- mkinpredict(HS, hs_parms[i, ],
+ c(parent = hs_pop$parent_0), sampling_times)
+ add_err(ds_mean, const, n = 1)[[1]]
+})
+attr(ds_hs, "pop") <- hs_pop
+attr(ds_hs, "parms") <- hs_parms
+
+set.seed(123456)
+DFOP_SFO <- mkinmod(
+ parent = mkinsub("DFOP", "m1"),
+ m1 = mkinsub("SFO"),
+ quiet = TRUE)
+dfop_sfo_pop <- list(parent_0 = 100,
+ k_m1 = 0.007, f_parent_to_m1 = 0.5,
+ k1 = 0.1, k2 = 0.02, g = 0.5)
+dfop_sfo_parms <- as.matrix(data.frame(
+ k1 = rlnorm(n, log(dfop_sfo_pop$k1), log_sd),
+ k2 = rlnorm(n, log(dfop_sfo_pop$k2), log_sd),
+ g = plogis(rnorm(n, qlogis(dfop_sfo_pop$g), log_sd)),
+ f_parent_to_m1 = plogis(rnorm(n,
+ qlogis(dfop_sfo_pop$f_parent_to_m1), log_sd)),
+ k_m1 = rlnorm(n, log(dfop_sfo_pop$k_m1), log_sd)))
+ds_dfop_sfo_mean <- lapply(1:n,
+ function(i) {
+ mkinpredict(DFOP_SFO, dfop_sfo_parms[i, ],
+ c(parent = dfop_sfo_pop$parent_0, m1 = 0), sampling_times)
+ }
+)
+set.seed(123456)
+ds_dfop_sfo <- lapply(ds_dfop_sfo_mean, function(ds) {
+ add_err(ds,
+ sdfunc = function(value) sqrt(err_1$const^2 + value^2 * err_1$prop^2),
+ n = 1, secondary = "m1")[[1]]
+})
+attr(ds_dfop_sfo, "pop") <- dfop_sfo_pop
+attr(ds_dfop_sfo, "parms") <- dfop_sfo_parms
+
+#save(ds_sfo, ds_fomc, ds_dfop, ds_hs, ds_dfop_sfo, file = "data/ds_mixed.rda", version = 2)
diff --git a/log/check.log b/log/check.log
index 7aa4610c..31fc31eb 100644
--- a/log/check.log
+++ b/log/check.log
@@ -5,7 +5,7 @@
* using options ‘--no-tests --as-cran’
* checking for file ‘mkin/DESCRIPTION’ ... OK
* checking extension type ... Package
-* this is package ‘mkin’ version ‘1.2.0’
+* this is package ‘mkin’ version ‘1.2.1’
* package encoding: UTF-8
* checking CRAN incoming feasibility ... Note_to_CRAN_maintainers
Maintainer: ‘Johannes Ranke <johannes.ranke@jrwb.de>’
@@ -41,7 +41,7 @@ Maintainer: ‘Johannes Ranke <johannes.ranke@jrwb.de>’
* checking S3 generic/method consistency ... OK
* checking replacement functions ... OK
* checking foreign function calls ... OK
-* checking R code for possible problems ... [18s/18s] OK
+* checking R code for possible problems ... [17s/17s] OK
* checking Rd files ... OK
* checking Rd metadata ... OK
* checking Rd line widths ... OK
diff --git a/log/test.log b/log/test.log
index 87d24690..d1de270e 100644
--- a/log/test.log
+++ b/log/test.log
@@ -5,19 +5,19 @@
✔ | 5 | Calculation of Akaike weights
✔ | 3 | Export dataset for reading into CAKE
✔ | 12 | Confidence intervals and p-values [1.0s]
-✔ | 1 12 | Dimethenamid data from 2018 [31.5s]
+✔ | 1 12 | Dimethenamid data from 2018 [32.6s]
────────────────────────────────────────────────────────────────────────────────
Skip ('test_dmta.R:98'): Different backends get consistent results for SFO-SFO3+, dimethenamid data
Reason: Fitting this ODE model with saemix takes about 15 minutes on my system
────────────────────────────────────────────────────────────────────────────────
-✔ | 14 | Error model fitting [5.0s]
+✔ | 14 | Error model fitting [5.1s]
✔ | 5 | Time step normalisation
✔ | 4 | Calculation of FOCUS chi2 error levels [0.6s]
✔ | 14 | Results for FOCUS D established in expertise for UBA (Ranke 2014) [0.8s]
✔ | 4 | Test fitting the decline of metabolites from their maximum [0.4s]
✔ | 1 | Fitting the logistic model [0.2s]
-✔ | 10 | Batch fitting and diagnosing hierarchical kinetic models [24.4s]
-✔ | 1 12 | Nonlinear mixed-effects models [0.3s]
+✔ | 10 | Batch fitting and diagnosing hierarchical kinetic models [24.6s]
+✔ | 1 13 | Nonlinear mixed-effects models [0.4s]
────────────────────────────────────────────────────────────────────────────────
Skip ('test_mixed.R:79'): saemix results are reproducible for biphasic fits
Reason: Fitting with saemix takes around 10 minutes when using deSolve
@@ -26,32 +26,32 @@ Reason: Fitting with saemix takes around 10 minutes when using deSolve
✔ | 10 | Special cases of mkinfit calls [0.5s]
✔ | 3 | mkinfit features [0.7s]
✔ | 8 | mkinmod model generation and printing [0.2s]
-✔ | 3 | Model predictions with mkinpredict [0.3s]
-✔ | 9 | Multistart method for saem.mmkin models [36.2s]
+✔ | 3 | Model predictions with mkinpredict [0.4s]
+✔ | 9 | Multistart method for saem.mmkin models [37.3s]
✔ | 16 | Evaluations according to 2015 NAFTA guidance [2.5s]
-✔ | 9 | Nonlinear mixed-effects models with nlme [8.8s]
-✔ | 16 | Plotting [10.0s]
+✔ | 9 | Nonlinear mixed-effects models with nlme [9.2s]
+✔ | 16 | Plotting [10.1s]
✔ | 4 | Residuals extracted from mkinfit models
-✔ | 1 36 | saemix parent models [65.8s]
+✔ | 1 36 | saemix parent models [71.4s]
────────────────────────────────────────────────────────────────────────────────
Skip ('test_saemix_parent.R:143'): We can also use mkin solution methods for saem
Reason: This still takes almost 2.5 minutes although we do not solve ODEs
────────────────────────────────────────────────────────────────────────────────
✔ | 2 | Complex test case from Schaefer et al. (2007) Piacenza paper [1.4s]
✔ | 11 | Processing of residue series
-✔ | 10 | Fitting the SFORB model [3.7s]
+✔ | 10 | Fitting the SFORB model [3.9s]
✔ | 1 | Summaries of old mkinfit objects
✔ | 5 | Summary [0.2s]
-✔ | 4 | Results for synthetic data established in expertise for UBA (Ranke 2014) [2.2s]
-✔ | 9 | Hypothesis tests [8.0s]
+✔ | 4 | Results for synthetic data established in expertise for UBA (Ranke 2014) [2.3s]
+✔ | 9 | Hypothesis tests [8.3s]
✔ | 4 | Calculation of maximum time weighted average concentrations (TWAs) [2.2s]
══ Results ═════════════════════════════════════════════════════════════════════
-Duration: 210.4 s
+Duration: 220.0 s
── Skipped tests ──────────────────────────────────────────────────────────────
• Fitting this ODE model with saemix takes about 15 minutes on my system (1)
• Fitting with saemix takes around 10 minutes when using deSolve (1)
• This still takes almost 2.5 minutes although we do not solve ODEs (1)
-[ FAIL 0 | WARN 0 | SKIP 3 | PASS 269 ]
+[ FAIL 0 | WARN 0 | SKIP 3 | PASS 270 ]
diff --git a/man/ds_mixed.Rd b/man/ds_mixed.Rd
new file mode 100644
index 00000000..227b8e7f
--- /dev/null
+++ b/man/ds_mixed.Rd
@@ -0,0 +1,24 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/ds_mixed.R
+\name{ds_mixed}
+\alias{ds_mixed}
+\alias{ds_sfo}
+\alias{ds_fomc}
+\alias{ds_dfop}
+\alias{ds_hs}
+\alias{ds_dfop_sfo}
+\title{Synthetic data for hierarchical kinetic degradation models}
+\description{
+The R code used to create this data object is installed with this package in
+the 'dataset_generation' directory.
+}
+\examples{
+\dontrun{
+ sfo_mmkin <- mmkin("SFO", ds_sfo, quiet = TRUE, error_model = "tc", cores = 15)
+ sfo_saem <- saem(sfo_mmkin, no_random_effect = "parent_0")
+ plot(sfo_saem)
+}
+
+# This is the code used to generate the datasets
+cat(readLines(system.file("dataset_generation/ds_mixed.R", package = "mkin")), sep = "\n")
+}
diff --git a/tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg b/tests/testthat/_snaps/multistart/llhist-for-dfop-sfo-fit.svg
index 6015aed8..6015aed8 100644
--- a/tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg
+++ b/tests/testthat/_snaps/multistart/llhist-for-dfop-sfo-fit.svg
diff --git a/tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg b/tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg
index 98513d06..028c69de 100644
--- a/tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg
+++ b/tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg
@@ -25,20 +25,22 @@
<line x1='374.40' y1='502.56' x2='374.40' y2='509.76' style='stroke-width: 0.75;' />
<line x1='520.40' y1='502.56' x2='520.40' y2='509.76' style='stroke-width: 0.75;' />
<line x1='666.40' y1='502.56' x2='666.40' y2='509.76' style='stroke-width: 0.75;' />
-<text x='82.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-649.836</text>
-<text x='228.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-649.834</text>
-<text x='374.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-649.832</text>
-<text x='520.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-649.830</text>
-<text x='666.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-649.828</text>
+<text x='82.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-646.124</text>
+<text x='228.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-646.123</text>
+<text x='374.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-646.122</text>
+<text x='520.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-646.121</text>
+<text x='666.40' y='528.48' text-anchor='middle' style='font-size: 12.00px; font-family: sans;' textLength='47.38px' lengthAdjust='spacingAndGlyphs'>-646.120</text>
<line x1='59.04' y1='486.13' x2='59.04' y2='75.47' style='stroke-width: 0.75;' />
<line x1='59.04' y1='486.13' x2='51.84' y2='486.13' style='stroke-width: 0.75;' />
-<line x1='59.04' y1='349.24' x2='51.84' y2='349.24' style='stroke-width: 0.75;' />
-<line x1='59.04' y1='212.36' x2='51.84' y2='212.36' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='383.47' x2='51.84' y2='383.47' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='280.80' x2='51.84' y2='280.80' style='stroke-width: 0.75;' />
+<line x1='59.04' y1='178.13' x2='51.84' y2='178.13' style='stroke-width: 0.75;' />
<line x1='59.04' y1='75.47' x2='51.84' y2='75.47' style='stroke-width: 0.75;' />
<text x='44.64' y='490.26' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>0</text>
-<text x='44.64' y='353.37' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>1</text>
-<text x='44.64' y='216.48' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
-<text x='44.64' y='79.60' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text x='44.64' y='387.60' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>1</text>
+<text x='44.64' y='284.93' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>2</text>
+<text x='44.64' y='182.26' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>3</text>
+<text x='44.64' y='79.60' text-anchor='end' style='font-size: 12.00px; font-family: sans;' textLength='6.67px' lengthAdjust='spacingAndGlyphs'>4</text>
</g>
<defs>
<clipPath id='cpNTkuMDR8Njg5Ljc2fDU5LjA0fDUwMi41Ng=='>
@@ -46,11 +48,11 @@
</clipPath>
</defs>
<g clip-path='url(#cpNTkuMDR8Njg5Ljc2fDU5LjA0fDUwMi41Ng==)'>
-<rect x='82.40' y='349.24' width='146.00' height='136.89' style='stroke-width: 0.75; fill: #D3D3D3;' />
+<rect x='82.40' y='280.80' width='146.00' height='205.33' style='stroke-width: 0.75; fill: #D3D3D3;' />
<rect x='228.40' y='75.47' width='146.00' height='410.67' style='stroke-width: 0.75; fill: #D3D3D3;' />
-<rect x='374.40' y='75.47' width='146.00' height='410.67' style='stroke-width: 0.75; fill: #D3D3D3;' />
-<rect x='520.40' y='349.24' width='146.00' height='136.89' style='stroke-width: 0.75; fill: #D3D3D3;' />
-<line x1='232.06' y1='502.56' x2='232.06' y2='59.04' style='stroke-width: 0.75; stroke: #DF536B;' />
+<rect x='374.40' y='383.47' width='146.00' height='102.67' style='stroke-width: 0.75; fill: #D3D3D3;' />
+<rect x='520.40' y='383.47' width='146.00' height='102.67' style='stroke-width: 0.75; fill: #D3D3D3;' />
+<line x1='110.97' y1='502.56' x2='110.97' y2='59.04' style='stroke-width: 0.75; stroke: #DF536B;' />
<line x1='101.38' y1='95.62' x2='122.98' y2='95.62' style='stroke-width: 0.75; stroke: #DF536B;' />
<text x='133.78' y='99.75' style='font-size: 12.00px; font-family: sans;' textLength='51.35px' lengthAdjust='spacingAndGlyphs'>original fit</text>
</g>
diff --git a/tests/testthat/_snaps/multistart/parplot-for-biphasic-saemix-fit.svg b/tests/testthat/_snaps/multistart/parplot-for-dfop-sfo-fit.svg
index 7017908e..7017908e 100644
--- a/tests/testthat/_snaps/multistart/parplot-for-biphasic-saemix-fit.svg
+++ b/tests/testthat/_snaps/multistart/parplot-for-dfop-sfo-fit.svg
diff --git a/tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg b/tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg
index 18eb7fcc..a47a585a 100644
--- a/tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg
+++ b/tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg
@@ -25,42 +25,44 @@
</clipPath>
</defs>
<g clip-path='url(#cpNTkuMDR8Njg5Ljc2fDU5LjA0fDUwMi41Ng==)'>
-<polygon points='94.08,280.80 187.52,280.80 187.52,280.77 94.08,280.77 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<polygon points='94.08,280.80 187.52,280.80 187.52,280.79 94.08,280.79 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
<line x1='94.08' y1='280.79' x2='187.52' y2='280.79' style='stroke-width: 2.25; stroke-linecap: butt;' />
-<line x1='140.80' y1='280.81' x2='140.80' y2='280.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='140.80' y1='280.74' x2='140.80' y2='280.77' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='117.44' y1='280.81' x2='164.16' y2='280.81' style='stroke-width: 0.75;' />
-<line x1='117.44' y1='280.74' x2='164.16' y2='280.74' style='stroke-width: 0.75;' />
-<polygon points='94.08,280.80 187.52,280.80 187.52,280.77 94.08,280.77 ' style='stroke-width: 0.75; fill: none;' />
-<polygon points='210.88,280.81 304.32,280.81 304.32,280.73 210.88,280.73 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
-<line x1='210.88' y1='280.78' x2='304.32' y2='280.78' style='stroke-width: 2.25; stroke-linecap: butt;' />
-<line x1='257.60' y1='280.82' x2='257.60' y2='280.81' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='257.60' y1='280.65' x2='257.60' y2='280.73' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='234.24' y1='280.82' x2='280.96' y2='280.82' style='stroke-width: 0.75;' />
-<line x1='234.24' y1='280.65' x2='280.96' y2='280.65' style='stroke-width: 0.75;' />
-<polygon points='210.88,280.81 304.32,280.81 304.32,280.73 210.88,280.73 ' style='stroke-width: 0.75; fill: none;' />
-<polygon points='327.68,280.90 421.12,280.90 421.12,280.70 327.68,280.70 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
-<line x1='327.68' y1='280.84' x2='421.12' y2='280.84' style='stroke-width: 2.25; stroke-linecap: butt;' />
-<line x1='374.40' y1='280.92' x2='374.40' y2='280.90' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='374.40' y1='280.67' x2='374.40' y2='280.70' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='351.04' y1='280.92' x2='397.76' y2='280.92' style='stroke-width: 0.75;' />
-<line x1='351.04' y1='280.67' x2='397.76' y2='280.67' style='stroke-width: 0.75;' />
-<polygon points='327.68,280.90 421.12,280.90 421.12,280.70 327.68,280.70 ' style='stroke-width: 0.75; fill: none;' />
-<circle cx='374.40' cy='280.36' r='2.70' style='stroke-width: 0.75;' />
-<polygon points='444.48,280.85 537.92,280.85 537.92,280.79 444.48,280.79 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
-<line x1='444.48' y1='280.82' x2='537.92' y2='280.82' style='stroke-width: 2.25; stroke-linecap: butt;' />
-<line x1='491.20' y1='280.88' x2='491.20' y2='280.85' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='491.20' y1='280.74' x2='491.20' y2='280.79' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='467.84' y1='280.88' x2='514.56' y2='280.88' style='stroke-width: 0.75;' />
-<line x1='467.84' y1='280.74' x2='514.56' y2='280.74' style='stroke-width: 0.75;' />
-<polygon points='444.48,280.85 537.92,280.85 537.92,280.79 444.48,280.79 ' style='stroke-width: 0.75; fill: none;' />
-<polygon points='561.28,280.75 654.72,280.75 654.72,280.57 561.28,280.57 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
-<line x1='561.28' y1='280.65' x2='654.72' y2='280.65' style='stroke-width: 2.25; stroke-linecap: butt;' />
-<line x1='608.00' y1='280.80' x2='608.00' y2='280.75' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='608.00' y1='280.45' x2='608.00' y2='280.57' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
-<line x1='584.64' y1='280.80' x2='631.36' y2='280.80' style='stroke-width: 0.75;' />
-<line x1='584.64' y1='280.45' x2='631.36' y2='280.45' style='stroke-width: 0.75;' />
-<polygon points='561.28,280.75 654.72,280.75 654.72,280.57 561.28,280.57 ' style='stroke-width: 0.75; fill: none;' />
+<line x1='140.80' y1='280.80' x2='140.80' y2='280.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='140.80' y1='280.79' x2='140.80' y2='280.79' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='117.44' y1='280.80' x2='164.16' y2='280.80' style='stroke-width: 0.75;' />
+<line x1='117.44' y1='280.79' x2='164.16' y2='280.79' style='stroke-width: 0.75;' />
+<polygon points='94.08,280.80 187.52,280.80 187.52,280.79 94.08,280.79 ' style='stroke-width: 0.75; fill: none;' />
+<polygon points='210.88,280.80 304.32,280.80 304.32,280.77 210.88,280.77 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='210.88' y1='280.79' x2='304.32' y2='280.79' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='257.60' y1='280.81' x2='257.60' y2='280.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='257.60' y1='280.77' x2='257.60' y2='280.77' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='234.24' y1='280.81' x2='280.96' y2='280.81' style='stroke-width: 0.75;' />
+<line x1='234.24' y1='280.77' x2='280.96' y2='280.77' style='stroke-width: 0.75;' />
+<polygon points='210.88,280.80 304.32,280.80 304.32,280.77 210.88,280.77 ' style='stroke-width: 0.75; fill: none;' />
+<polygon points='327.68,280.94 421.12,280.94 421.12,280.80 327.68,280.80 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='327.68' y1='280.82' x2='421.12' y2='280.82' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='374.40' y1='280.98' x2='374.40' y2='280.94' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='374.40' y1='280.80' x2='374.40' y2='280.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='351.04' y1='280.98' x2='397.76' y2='280.98' style='stroke-width: 0.75;' />
+<line x1='351.04' y1='280.80' x2='397.76' y2='280.80' style='stroke-width: 0.75;' />
+<polygon points='327.68,280.94 421.12,280.94 421.12,280.80 327.68,280.80 ' style='stroke-width: 0.75; fill: none;' />
+<circle cx='374.40' cy='280.60' r='2.70' style='stroke-width: 0.75;' />
+<polygon points='444.48,280.81 537.92,280.81 537.92,280.78 444.48,280.78 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='444.48' y1='280.80' x2='537.92' y2='280.80' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='491.20' y1='280.82' x2='491.20' y2='280.81' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='491.20' y1='280.77' x2='491.20' y2='280.78' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='467.84' y1='280.82' x2='514.56' y2='280.82' style='stroke-width: 0.75;' />
+<line x1='467.84' y1='280.77' x2='514.56' y2='280.77' style='stroke-width: 0.75;' />
+<polygon points='444.48,280.81 537.92,280.81 537.92,280.78 444.48,280.78 ' style='stroke-width: 0.75; fill: none;' />
+<circle cx='491.20' cy='280.87' r='2.70' style='stroke-width: 0.75;' />
+<polygon points='561.28,280.89 654.72,280.89 654.72,280.79 561.28,280.79 ' style='stroke-width: 0.75; stroke: none; fill: #D3D3D3;' />
+<line x1='561.28' y1='280.84' x2='654.72' y2='280.84' style='stroke-width: 2.25; stroke-linecap: butt;' />
+<line x1='608.00' y1='280.92' x2='608.00' y2='280.89' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='608.00' y1='280.70' x2='608.00' y2='280.79' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
+<line x1='584.64' y1='280.92' x2='631.36' y2='280.92' style='stroke-width: 0.75;' />
+<line x1='584.64' y1='280.70' x2='631.36' y2='280.70' style='stroke-width: 0.75;' />
+<polygon points='561.28,280.89 654.72,280.89 654.72,280.79 561.28,280.79 ' style='stroke-width: 0.75; fill: none;' />
+<circle cx='608.00' cy='281.12' r='2.70' style='stroke-width: 0.75;' />
</g>
<g clip-path='url(#cpMC4wMHw3MjAuMDB8MC4wMHw1NzYuMDA=)'>
<line x1='140.80' y1='502.56' x2='608.00' y2='502.56' style='stroke-width: 0.75;' />
@@ -87,15 +89,15 @@
<polygon points='59.04,502.56 689.76,502.56 689.76,59.04 59.04,59.04 ' style='stroke-width: 0.75; fill: none;' />
</g>
<g clip-path='url(#cpNTkuMDR8Njg5Ljc2fDU5LjA0fDUwMi41Ng==)'>
-<circle cx='140.80' cy='280.97' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
-<circle cx='257.60' cy='281.05' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
-<circle cx='374.40' cy='257.89' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
-<circle cx='491.20' cy='-615.24' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
-<circle cx='140.80' cy='280.75' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
-<circle cx='257.60' cy='280.67' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
-<circle cx='374.40' cy='280.50' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
-<circle cx='491.20' cy='280.92' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
-<circle cx='608.00' cy='280.49' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='140.80' cy='280.66' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='257.60' cy='280.66' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='374.40' cy='243.83' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='491.20' cy='-614.23' r='8.10' style='stroke-width: 0.75; stroke: #61D04F;' />
+<circle cx='140.80' cy='280.82' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='257.60' cy='280.85' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='374.40' cy='280.96' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='491.20' cy='280.75' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
+<circle cx='608.00' cy='280.97' r='5.40' style='stroke-width: 0.75; stroke: #DF536B;' />
<line x1='59.04' y1='280.80' x2='689.76' y2='280.80' style='stroke-width: 0.75; stroke-dasharray: 4.00,4.00;' />
<line x1='93.82' y1='465.98' x2='115.42' y2='465.98' style='stroke-width: 0.75;' />
<circle cx='104.62' cy='437.18' r='2.70' style='stroke-width: 0.75; stroke: #61D04F;' />
diff --git a/tests/testthat/anova_sfo_saem.txt b/tests/testthat/anova_sfo_saem.txt
index 9e4bf71f..0ccd6d5c 100644
--- a/tests/testthat/anova_sfo_saem.txt
+++ b/tests/testthat/anova_sfo_saem.txt
@@ -1,7 +1,7 @@
-Data: 262 observations of 1 variable(s) grouped in 15 datasets
+Data: 263 observations of 1 variable(s) grouped in 15 datasets
npar AIC BIC Lik Chisq Df Pr(>Chisq)
-sfo_saem_1_reduced 5 1310 1313 -650
-sfo_saem_1_reduced_mkin 5 1310 1313 -650 0 0
-sfo_saem_1 6 1312 1316 -650 0 1 1
-sfo_saem_1_mkin 6 1312 1316 -650 0 0
+sfo_saem_1_reduced 5 1302 1306 -646
+sfo_saem_1_reduced_mkin 5 1302 1306 -646 0 0
+sfo_saem_1 6 1304 1308 -646 0 1 1
+sfo_saem_1_mkin 6 1303 1308 -646 1 0
diff --git a/tests/testthat/print_dfop_saemix_1.txt b/tests/testthat/print_dfop_saem_1.txt
index 1d399a52..bdc40065 100644
--- a/tests/testthat/print_dfop_saemix_1.txt
+++ b/tests/testthat/print_dfop_saem_1.txt
@@ -13,11 +13,11 @@ Likelihood computed by importance sampling
Fitted parameters:
estimate lower upper
-parent_0 100.00 99.00 100.00
-log_k1 -2.70 -3.00 -2.50
-log_k2 -4.10 -4.30 -4.00
+parent_0 99.92 98.77 101.06
+log_k1 -2.72 -2.95 -2.50
+log_k2 -4.14 -4.27 -4.01
g_qlogis -0.35 -0.53 -0.16
-a.1 0.92 0.68 1.20
+a.1 0.92 0.68 1.16
b.1 0.05 0.04 0.06
SD.log_k1 0.37 0.23 0.51
SD.log_k2 0.23 0.14 0.31
diff --git a/tests/testthat/print_fits_synth_const.txt b/tests/testthat/print_fits_synth_const.txt
index 2ea1f133..b4bbe6ca 100644
--- a/tests/testthat/print_fits_synth_const.txt
+++ b/tests/testthat/print_fits_synth_const.txt
@@ -4,7 +4,7 @@ Status of individual fits:
dataset
model 1 2 3 4 5 6
SFO OK OK OK OK OK OK
- FOMC C C OK OK OK OK
+ FOMC C OK OK OK OK C
C: Optimisation did not converge:
false convergence (8)
diff --git a/tests/testthat/print_mmkin_sfo_1_mixed.txt b/tests/testthat/print_mmkin_sfo_1_mixed.txt
index 33e5bf5c..c12cfe2b 100644
--- a/tests/testthat/print_mmkin_sfo_1_mixed.txt
+++ b/tests/testthat/print_mmkin_sfo_1_mixed.txt
@@ -3,7 +3,7 @@ Structural model:
d_parent/dt = - k_parent * parent
Data:
-262 observations of 1 variable(s) grouped in 15 datasets
+263 observations of 1 variable(s) grouped in 15 datasets
<mmkin> object
Status of individual fits:
@@ -16,4 +16,4 @@ OK: No warnings
Mean fitted parameters:
parent_0 log_k_parent
- 99.9 -3.3
+ 100.0 -3.4
diff --git a/tests/testthat/print_multistart_biphasic.txt b/tests/testthat/print_multistart_dfop_sfo.txt
index b4344f22..b4344f22 100644
--- a/tests/testthat/print_multistart_biphasic.txt
+++ b/tests/testthat/print_multistart_dfop_sfo.txt
diff --git a/tests/testthat/print_sfo_saem_1_reduced.txt b/tests/testthat/print_sfo_saem_1_reduced.txt
index bac8848e..1c7fb588 100644
--- a/tests/testthat/print_sfo_saem_1_reduced.txt
+++ b/tests/testthat/print_sfo_saem_1_reduced.txt
@@ -3,16 +3,16 @@ Structural model:
d_parent/dt = - k_parent * parent
Data:
-262 observations of 1 variable(s) grouped in 15 datasets
+263 observations of 1 variable(s) grouped in 15 datasets
Likelihood computed by importance sampling
AIC BIC logLik
- 1310 1313 -650
+ 1302 1306 -646
Fitted parameters:
estimate lower upper
-parent_0 1e+02 99.08 1e+02
-k_parent 4e-02 0.03 4e-02
-a.1 9e-01 0.75 1e+00
+parent_0 1e+02 99.03 1e+02
+k_parent 3e-02 0.03 4e-02
+a.1 9e-01 0.71 1e+00
b.1 5e-02 0.04 5e-02
-SD.k_parent 3e-01 0.20 4e-01
+SD.k_parent 2e-01 0.14 3e-01
diff --git a/tests/testthat/setup_script.R b/tests/testthat/setup_script.R
index 362038c3..c554800d 100644
--- a/tests/testthat/setup_script.R
+++ b/tests/testthat/setup_script.R
@@ -81,112 +81,27 @@ fit_obs_1 <- mkinfit(m_synth_SFO_lin, SFO_lin_a, error_model = "obs", quiet = TR
fit_tc_1 <- mkinfit(m_synth_SFO_lin, SFO_lin_a, error_model = "tc", quiet = TRUE,
error_model_algorithm = "threestep")
-# Mixed models data and fits
-sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
-n <- n_biphasic <- 15
-log_sd <- 0.3
-err_1 = list(const = 1, prop = 0.05)
-tc <- function(value) sigma_twocomp(value, err_1$const, err_1$prop)
-const <- function(value) 2
-
-set.seed(123456)
-SFO <- mkinmod(parent = mkinsub("SFO"))
-k_parent = rlnorm(n, log(0.03), log_sd)
-set.seed(123456)
-ds_sfo <- lapply(1:n, function(i) {
- ds_mean <- mkinpredict(SFO, c(k_parent = k_parent[i]),
- c(parent = 100), sampling_times)
- add_err(ds_mean, tc, n = 1)[[1]]
-})
-
-set.seed(123456)
-FOMC <- mkinmod(parent = mkinsub("FOMC"))
-fomc_pop <- list(parent_0 = 100, alpha = 2, beta = 8)
-fomc_parms <- as.matrix(data.frame(
- alpha = rlnorm(n, log(fomc_pop$alpha), 0.4),
- beta = rlnorm(n, log(fomc_pop$beta), 0.2)))
-set.seed(123456)
-ds_fomc <- lapply(1:3, function(i) {
- ds_mean <- mkinpredict(FOMC, fomc_parms[i, ],
- c(parent = 100), sampling_times)
- add_err(ds_mean, tc, n = 1)[[1]]
-})
-
-set.seed(123456)
-DFOP <- mkinmod(parent = mkinsub("DFOP"))
-dfop_pop <- list(parent_0 = 100, k1 = 0.06, k2 = 0.015, g = 0.4)
-dfop_parms <- as.matrix(data.frame(
- k1 = rlnorm(n, log(dfop_pop$k1), log_sd),
- k2 = rlnorm(n, log(dfop_pop$k2), log_sd),
- g = plogis(rnorm(n, qlogis(dfop_pop$g), log_sd))))
-set.seed(123456)
-ds_dfop <- lapply(1:n, function(i) {
- ds_mean <- mkinpredict(DFOP, dfop_parms[i, ],
- c(parent = dfop_pop$parent_0), sampling_times)
- add_err(ds_mean, tc, n = 1)[[1]]
-})
-
-set.seed(123456)
-HS <- mkinmod(parent = mkinsub("HS"))
-hs_pop <- list(parent_0 = 100, k1 = 0.08, k2 = 0.01, tb = 15)
-hs_parms <- as.matrix(data.frame(
- k1 = rlnorm(n, log(hs_pop$k1), log_sd),
- k2 = rlnorm(n, log(hs_pop$k2), log_sd),
- tb = rlnorm(n, log(hs_pop$tb), 0.1)))
-set.seed(123456)
-ds_hs <- lapply(1:10, function(i) {
- ds_mean <- mkinpredict(HS, hs_parms[i, ],
- c(parent = hs_pop$parent_0), sampling_times)
- add_err(ds_mean, const, n = 1)[[1]]
-})
-
-set.seed(123456)
-DFOP_SFO <- mkinmod(
- parent = mkinsub("DFOP", "m1"),
- m1 = mkinsub("SFO"),
- quiet = TRUE)
-dfop_sfo_pop <- list(parent_0 = 100,
- k_m1 = 0.007, f_parent_to_m1 = 0.5,
- k1 = 0.1, k2 = 0.02, g = 0.5)
-syn_biphasic_parms <- as.matrix(data.frame(
- k1 = rlnorm(n_biphasic, log(dfop_sfo_pop$k1), log_sd),
- k2 = rlnorm(n_biphasic, log(dfop_sfo_pop$k2), log_sd),
- g = plogis(rnorm(n_biphasic, qlogis(dfop_sfo_pop$g), log_sd)),
- f_parent_to_m1 = plogis(rnorm(n_biphasic,
- qlogis(dfop_sfo_pop$f_parent_to_m1), log_sd)),
- k_m1 = rlnorm(n_biphasic, log(dfop_sfo_pop$k_m1), log_sd)))
-ds_biphasic_mean <- lapply(1:n_biphasic,
- function(i) {
- mkinpredict(DFOP_SFO, syn_biphasic_parms[i, ],
- c(parent = 100, m1 = 0), sampling_times)
- }
-)
-set.seed(123456)
-ds_biphasic <- lapply(ds_biphasic_mean, function(ds) {
- add_err(ds,
- sdfunc = function(value) sqrt(err_1$const^2 + value^2 * err_1$prop^2),
- n = 1, secondary = "m1")[[1]]
-})
-
# Mixed model fits
mmkin_sfo_1 <- mmkin("SFO", ds_sfo, quiet = TRUE, error_model = "tc", cores = n_cores)
mmkin_dfop_1 <- mmkin("DFOP", ds_dfop, quiet = TRUE, cores = n_cores,
error_model = "tc")
-mmkin_biphasic <- mmkin(list("DFOP-SFO" = DFOP_SFO), ds_biphasic, quiet = TRUE, cores = n_cores,
+DFOP_SFO <- mkinmod(parent = mkinsub("DFOP", "m1"),
+ m1 = mkinsub("SFO"), quiet = TRUE)
+mmkin_dfop_sfo <- mmkin(list("DFOP-SFO" = DFOP_SFO), ds_dfop_sfo, quiet = TRUE, cores = n_cores,
control = list(eval.max = 500, iter.max = 400),
error_model = "tc")
# nlme
dfop_nlme_1 <- suppressWarnings(nlme(mmkin_dfop_1))
-nlme_biphasic <- suppressWarnings(nlme(mmkin_biphasic))
+nlme_dfop_sfo <- suppressWarnings(nlme(mmkin_dfop_sfo))
# saemix
sfo_saem_1 <- saem(mmkin_sfo_1, quiet = TRUE, transformations = "saemix")
sfo_saem_1_reduced <- update(sfo_saem_1, no_random_effect = "parent_0")
-dfop_saemix_1 <- saem(mmkin_dfop_1, quiet = TRUE, transformations = "mkin",
+dfop_saem_1 <- saem(mmkin_dfop_1, quiet = TRUE, transformations = "mkin",
no_random_effect = c("parent_0", "g_qlogis"))
-saem_biphasic_m <- saem(mmkin_biphasic, transformations = "mkin", quiet = TRUE)
-saem_biphasic_s <- saem(mmkin_biphasic, transformations = "saemix", quiet = TRUE)
+saem_dfop_sfo_m <- saem(mmkin_dfop_sfo, transformations = "mkin", quiet = TRUE)
+saem_dfop_sfo_s <- saem(mmkin_dfop_sfo, transformations = "saemix", quiet = TRUE)
diff --git a/tests/testthat/summary_hfit_sfo_tc.txt b/tests/testthat/summary_hfit_sfo_tc.txt
index 41743091..bb5bf6fb 100644
--- a/tests/testthat/summary_hfit_sfo_tc.txt
+++ b/tests/testthat/summary_hfit_sfo_tc.txt
@@ -8,7 +8,7 @@ Equations:
d_parent/dt = - k_parent * parent
Data:
-106 observations of 1 variable(s) grouped in 6 datasets
+104 observations of 1 variable(s) grouped in 6 datasets
Model predictions using solution type analytical
@@ -28,15 +28,15 @@ Results:
Likelihood computed by importance sampling
AIC BIC logLik
- 533 531 -261
+ 524 523 -257
Optimised parameters:
- est. lower upper
-parent_0 101.02 99.58 102.46
-log_k_parent -3.32 -3.53 -3.11
-a.1 0.91 0.64 1.17
-b.1 0.05 0.04 0.06
-SD.log_k_parent 0.27 0.11 0.42
+ est. lower upper
+parent_0 100.68 99.27 102.08
+log_k_parent -3.38 -3.55 -3.21
+a.1 0.87 0.59 1.14
+b.1 0.05 0.04 0.06
+SD.log_k_parent 0.21 0.09 0.33
Correlation:
pr_0
@@ -44,18 +44,18 @@ log_k_parent 0.1
Random effects:
est. lower upper
-SD.log_k_parent 0.3 0.1 0.4
+SD.log_k_parent 0.2 0.09 0.3
Variance model:
est. lower upper
-a.1 0.91 0.64 1.17
+a.1 0.87 0.59 1.14
b.1 0.05 0.04 0.06
Backtransformed parameters:
est. lower upper
-parent_0 1e+02 1e+02 1e+02
-k_parent 4e-02 3e-02 4e-02
+parent_0 1e+02 99.27 1e+02
+k_parent 3e-02 0.03 4e-02
Estimated disappearance times:
DT50 DT90
-parent 19 64
+parent 20 68
diff --git a/tests/testthat/summary_saem_biphasic_s.txt b/tests/testthat/summary_saem_dfop_sfo_s.txt
index 7c337843..7c337843 100644
--- a/tests/testthat/summary_saem_biphasic_s.txt
+++ b/tests/testthat/summary_saem_dfop_sfo_s.txt
diff --git a/tests/testthat/test_mixed.R b/tests/testthat/test_mixed.R
index 2d53c6dd..ab8dfc27 100644
--- a/tests/testthat/test_mixed.R
+++ b/tests/testthat/test_mixed.R
@@ -1,22 +1,23 @@
context("Nonlinear mixed-effects models")
+
# Round error model parameters as they are not rounded in print methods
dfop_nlme_1$modelStruct$varStruct$const <-
signif(dfop_nlme_1$modelStruct$varStruct$const, 3)
dfop_nlme_1$modelStruct$varStruct$prop <-
signif(dfop_nlme_1$modelStruct$varStruct$prop, 4)
+dfop_sfo_pop <- attr(ds_dfop_sfo, "pop")
+
test_that("Print methods work", {
expect_known_output(print(fits[, 2:3], digits = 2), "print_mmkin_parent.txt")
expect_known_output(print(mixed(mmkin_sfo_1), digits = 2), "print_mmkin_sfo_1_mixed.txt")
expect_known_output(print(dfop_nlme_1, digits = 1), "print_dfop_nlme_1.txt")
+ expect_known_output(print(sfo_saem_1_reduced, digits = 1), "print_sfo_saem_1_reduced.txt")
- # In order to address the platform dependence of the results, we round to two
- # significant digits before printing
- dfop_saemix_1_print <- dfop_saemix_1
- dfop_saemix_1_print$so@results@conf.int[c("estimate", "lower", "upper")] <-
- signif(dfop_saemix_1_print$so@results@conf.int[c("estimate", "lower", "upper")], 2)
- expect_known_output(print(dfop_saemix_1_print, digits = 1), "print_dfop_saemix_1.txt")
+ skip_on_cran() # The following test is platform dependent and fails on
+ # win-builder with current (18 Nov 2022) R-devel and on the Fedora CRAN check systems
+ expect_known_output(print(dfop_saem_1, digits = 1), "print_dfop_saem_1.txt")
})
test_that("nlme results are reproducible to some degree", {
@@ -36,17 +37,16 @@ test_that("nlme results are reproducible to some degree", {
# k1 and k2 just fail the first test (lower bound of the ci), so we need to exclude it
dfop_no_k1_k2 <- c("parent_0", "k_m1", "f_parent_to_m1", "g")
dfop_sfo_pop_no_k1_k2 <- as.numeric(dfop_sfo_pop[dfop_no_k1_k2])
- dfop_sfo_pop <- as.numeric(dfop_sfo_pop) # to remove names
- ci_dfop_sfo_n <- summary(nlme_biphasic)$confint_back
+ ci_dfop_sfo_n <- summary(nlme_dfop_sfo)$confint_back
expect_true(all(ci_dfop_sfo_n[dfop_no_k1_k2, "lower"] < dfop_sfo_pop_no_k1_k2))
- expect_true(all(ci_dfop_sfo_n[, "upper"] > dfop_sfo_pop))
+ expect_true(all(ci_dfop_sfo_n[, "upper"] > as.numeric(dfop_sfo_pop)))
})
test_that("saemix results are reproducible for biphasic fits", {
- test_summary <- summary(saem_biphasic_s)
+ test_summary <- summary(saem_dfop_sfo_s)
test_summary$saemixversion <- "Dummy 0.0 for testing"
test_summary$mkinversion <- "Dummy 0.0 for testing"
test_summary$Rversion <- "Dummy R version for testing"
@@ -54,33 +54,33 @@ test_that("saemix results are reproducible for biphasic fits", {
test_summary$date.summary <- "Dummy date for testing"
test_summary$time <- c(elapsed = "test time 0")
- expect_known_output(print(test_summary, digits = 1), "summary_saem_biphasic_s.txt")
+ expect_known_output(print(test_summary, digits = 1), "summary_saem_dfop_sfo_s.txt")
dfop_sfo_pop <- as.numeric(dfop_sfo_pop)
no_k1 <- c(1, 2, 3, 5, 6)
no_k2 <- c(1, 2, 3, 4, 6)
no_k1_k2 <- c(1, 2, 3, 6)
- ci_dfop_sfo_s_s <- summary(saem_biphasic_s)$confint_back
+ ci_dfop_sfo_s_s <- summary(saem_dfop_sfo_s)$confint_back
expect_true(all(ci_dfop_sfo_s_s[, "lower"] < dfop_sfo_pop))
expect_true(all(ci_dfop_sfo_s_s[, "upper"] > dfop_sfo_pop))
# k2 is not fitted well
- ci_dfop_sfo_s_m <- summary(saem_biphasic_m)$confint_back
+ ci_dfop_sfo_s_m <- summary(saem_dfop_sfo_m)$confint_back
expect_true(all(ci_dfop_sfo_s_m[no_k2, "lower"] < dfop_sfo_pop[no_k2]))
expect_true(all(ci_dfop_sfo_s_m[no_k1, "upper"] > dfop_sfo_pop[no_k1]))
# I tried to only do few iterations in routine tests as this is so slow
# but then deSolve fails at some point (presumably at the switch between
# the two types of iterations)
- #saem_biphasic_2 <- saem(mmkin_biphasic, solution_type = "deSolve",
+ #saem_dfop_sfo_2 <- saem(mmkin_biphasic, solution_type = "deSolve",
# control = list(nbiter.saemix = c(10, 5), nbiter.burn = 5), quiet = TRUE)
skip("Fitting with saemix takes around 10 minutes when using deSolve")
- saem_biphasic_2 <- saem(mmkin_biphasic, solution_type = "deSolve", quiet = TRUE)
+ saem_dfop_sfo_2 <- saem(mmkin_dfop_sfo, solution_type = "deSolve", quiet = TRUE)
# As with the analytical solution, k1 and k2 are not fitted well
- ci_dfop_sfo_s_d <- summary(saem_biphasic_2)$confint_back
+ ci_dfop_sfo_s_d <- summary(saem_dfop_sfo_2)$confint_back
expect_true(all(ci_dfop_sfo_s_d[no_k2, "lower"] < dfop_sfo_pop[no_k2]))
expect_true(all(ci_dfop_sfo_s_d[no_k1, "upper"] > dfop_sfo_pop[no_k1]))
})
diff --git a/tests/testthat/test_multistart.R b/tests/testthat/test_multistart.R
index 502cee98..3a511e06 100644
--- a/tests/testthat/test_multistart.R
+++ b/tests/testthat/test_multistart.R
@@ -9,26 +9,22 @@ test_that("multistart works for saem.mmkin models", {
best(saem_sfo_s_multi),
test = TRUE
)
- # On winbuilder, sfo_saem_1 gives an AIC of 1310.8, while we get 1311.7
- # locally (using saemix 3.2, which likely makes the difference due to the
- # error parameter patch) on Linux and Windows. The other, well-determined
- # fits both give 1309.7.
- expect_equal(round(anova_sfo, 1)["sfo_saem_1_reduced", "AIC"], 1309.7)
- expect_equal(round(anova_sfo, 1)["best(saem_sfo_s_multi)", "AIC"], 1309.7)
- expect_true(anova_sfo[3, "Pr(>Chisq)"] > 0.2) # Local: 1, CRAN: 0.4
+ expect_equal(round(anova_sfo, 1)["sfo_saem_1_reduced", "AIC"], 1302.2)
+ expect_equal(round(anova_sfo, 1)["best(saem_sfo_s_multi)", "AIC"], 1302.2)
+ expect_true(anova_sfo[3, "Pr(>Chisq)"] > 0.2) # Local: 1, win-builder: 0.4
set.seed(123456)
- saem_biphasic_m_multi <- multistart(saem_biphasic_m, n = 8,
+ saem_dfop_sfo_m_multi <- multistart(saem_dfop_sfo_m, n = 8,
cores = n_cores)
- expect_known_output(print(saem_biphasic_m_multi),
- file = "print_multistart_biphasic.txt")
+ expect_known_output(print(saem_dfop_sfo_m_multi),
+ file = "print_multistart_dfop_sfo.txt")
- anova_biphasic <- anova(saem_biphasic_m,
- best(saem_biphasic_m_multi))
+ anova_dfop_sfo <- anova(saem_dfop_sfo_m,
+ best(saem_dfop_sfo_m_multi))
# With the new starting parameters we do not improve
# with multistart any more
- expect_equal(anova_biphasic[2, "AIC"], anova_biphasic[1, "AIC"],
+ expect_equal(anova_dfop_sfo[2, "AIC"], anova_dfop_sfo[1, "AIC"],
tolerance = 1e-4)
skip_on_travis() # Plots are platform dependent
@@ -37,10 +33,10 @@ test_that("multistart works for saem.mmkin models", {
vdiffr::expect_doppelganger("llhist for sfo fit", llhist_sfo)
vdiffr::expect_doppelganger("parplot for sfo fit", parplot_sfo)
- llhist_biphasic <- function() llhist(saem_biphasic_m_multi)
- parplot_biphasic <- function() parplot(saem_biphasic_m_multi,
+ llhist_dfop_sfo <- function() llhist(saem_dfop_sfo_m_multi)
+ parplot_dfop_sfo <- function() parplot(saem_dfop_sfo_m_multi,
ylim = c(0.5, 2))
- vdiffr::expect_doppelganger("llhist for biphasic saemix fit", llhist_biphasic)
- vdiffr::expect_doppelganger("parplot for biphasic saemix fit", parplot_biphasic)
+ vdiffr::expect_doppelganger("llhist for dfop sfo fit", llhist_dfop_sfo)
+ vdiffr::expect_doppelganger("parplot for dfop sfo fit", parplot_dfop_sfo)
})
diff --git a/tests/testthat/test_plot.R b/tests/testthat/test_plot.R
index 13058c00..01b0c1ee 100644
--- a/tests/testthat/test_plot.R
+++ b/tests/testthat/test_plot.R
@@ -44,24 +44,24 @@ test_that("Plotting mkinfit, mmkin and mixed model objects is reproducible", {
f_uba_dfop_sfo_saem <- saem(f_uba_mmkin["DFOP-SFO", ], quiet = TRUE, transformations = "saemix")
- plot_biphasic_mmkin <- function() plot(f_uba_dfop_sfo_mixed, pop_curve = TRUE)
- vdiffr::expect_doppelganger("mixed model fit for mmkin object", plot_biphasic_mmkin)
+ plot_dfop_sfo_mmkin <- function() plot(f_uba_dfop_sfo_mixed, pop_curve = TRUE)
+ vdiffr::expect_doppelganger("mixed model fit for mmkin object", plot_dfop_sfo_mmkin)
- plot_biphasic_saem_s <- function() plot(f_uba_dfop_sfo_saem)
- vdiffr::expect_doppelganger("mixed model fit for saem object with saemix transformations", plot_biphasic_saem_s)
+ plot_dfop_sfo_saem_s <- function() plot(f_uba_dfop_sfo_saem)
+ vdiffr::expect_doppelganger("mixed model fit for saem object with saemix transformations", plot_dfop_sfo_saem_s)
skip_on_travis()
- plot_biphasic_nlme <- function() plot(dfop_nlme_1)
- vdiffr::expect_doppelganger("mixed model fit for nlme object", plot_biphasic_nlme)
+ plot_dfop_sfo_nlme <- function() plot(dfop_nlme_1)
+ vdiffr::expect_doppelganger("mixed model fit for nlme object", plot_dfop_sfo_nlme)
- #plot_biphasic_mmkin <- function() plot(mixed(mmkin_biphasic))
+ #plot_dfop_sfo_mmkin <- function() plot(mixed(mmkin_dfop_sfo))
# Biphasic fits with lots of data and fits have lots of potential for differences
- plot_biphasic_nlme <- function() plot(nlme_biphasic)
- #plot_biphasic_saem_s <- function() plot(saem_biphasic_s)
- plot_biphasic_saem_m <- function() plot(saem_biphasic_m)
+ plot_dfop_sfo_nlme <- function() plot(nlme_dfop_sfo)
+ #plot_dfop_sfo_saem_s <- function() plot(saem_dfop_sfo_s)
+ plot_dfop_sfo_saem_m <- function() plot(saem_dfop_sfo_m)
- vdiffr::expect_doppelganger("mixed model fit for saem object with mkin transformations", plot_biphasic_saem_m)
+ vdiffr::expect_doppelganger("mixed model fit for saem object with mkin transformations", plot_dfop_sfo_saem_m)
# different results when working with eigenvalues
plot_errmod_fit_D_obs_eigen <- function() plot_err(fit_D_obs_eigen, sep_obs = FALSE)
diff --git a/tests/testthat/test_saemix_parent.R b/tests/testthat/test_saemix_parent.R
index 20889c6c..31605931 100644
--- a/tests/testthat/test_saemix_parent.R
+++ b/tests/testthat/test_saemix_parent.R
@@ -38,11 +38,11 @@ test_that("Parent fits using saemix are correctly implemented", {
s_sfo_nlme_1 <- summary(sfo_nlme_1)
# Compare with input
- expect_equal(round(s_sfo_saem_1$confint_ranef["SD.k_parent", "est."], 1), 0.3)
- expect_equal(round(s_sfo_saem_1_mkin$confint_ranef["SD.log_k_parent", "est."], 1), 0.3)
+ expect_equal(round(s_sfo_saem_1$confint_ranef["SD.k_parent", "est."], 1), 0.3, tol = 0.1)
+ expect_equal(round(s_sfo_saem_1_mkin$confint_ranef["SD.log_k_parent", "est."], 1), 0.3, tol = 0.1)
# k_parent is a bit different from input 0.03 here
- expect_equal(round(s_sfo_saem_1$confint_back["k_parent", "est."], 3), 0.035)
- expect_equal(round(s_sfo_saem_1_mkin$confint_back["k_parent", "est."], 3), 0.035)
+ expect_equal(round(s_sfo_saem_1$confint_back["k_parent", "est."], 3), 0.033)
+ expect_equal(round(s_sfo_saem_1_mkin$confint_back["k_parent", "est."], 3), 0.033)
# But the result is pretty unanimous between methods
expect_equal(round(s_sfo_saem_1_reduced$confint_back["k_parent", "est."], 3),
@@ -74,7 +74,7 @@ test_that("Parent fits using saemix are correctly implemented", {
mmkin_fomc_1 <- mmkin("FOMC", ds_fomc, quiet = TRUE, error_model = "tc", cores = n_cores)
fomc_saem_1 <- saem(mmkin_fomc_1, quiet = TRUE, transformations = "saemix", no_random_effect = "parent_0")
- fomc_pop <- as.numeric(fomc_pop)
+ fomc_pop <- as.numeric(attr(ds_fomc, "pop"))
ci_fomc_s1 <- summary(fomc_saem_1)$confint_back
expect_true(all(ci_fomc_s1[, "lower"] < fomc_pop))
expect_true(all(ci_fomc_s1[, "upper"] > fomc_pop))
@@ -87,14 +87,14 @@ test_that("Parent fits using saemix are correctly implemented", {
expect_equal(endpoints(fomc_saem_1), endpoints(fomc_saem_2), tol = 0.01)
# DFOP
- dfop_saemix_2 <- saem(mmkin_dfop_1, quiet = TRUE, transformations = "saemix",
+ dfop_saem_2 <- saem(mmkin_dfop_1, quiet = TRUE, transformations = "saemix",
no_random_effect = "parent_0")
- s_dfop_s1 <- summary(dfop_saemix_1) # mkin transformations
- s_dfop_s2 <- summary(dfop_saemix_2) # saemix transformations
+ s_dfop_s1 <- summary(dfop_saem_1) # mkin transformations
+ s_dfop_s2 <- summary(dfop_saem_2) # saemix transformations
s_dfop_n <- summary(dfop_nlme_1)
- dfop_pop <- as.numeric(dfop_pop)
+ dfop_pop <- as.numeric(attr(ds_dfop, "pop"))
expect_true(all(s_dfop_s1$confint_back[, "lower"] < dfop_pop))
expect_true(all(s_dfop_s1$confint_back[, "upper"] > dfop_pop))
@@ -111,18 +111,18 @@ test_that("Parent fits using saemix are correctly implemented", {
# SFORB
mmkin_sforb_1 <- mmkin("SFORB", ds_dfop, quiet = TRUE, cores = n_cores)
- sforb_saemix_1 <- saem(mmkin_sforb_1, quiet = TRUE,
+ sforb_saem_1 <- saem(mmkin_sforb_1, quiet = TRUE,
no_random_effect = c("parent_free_0"),
transformations = "mkin")
- sforb_saemix_2 <- saem(mmkin_sforb_1, quiet = TRUE,
+ sforb_saem_2 <- saem(mmkin_sforb_1, quiet = TRUE,
no_random_effect = c("parent_free_0"),
transformations = "saemix")
expect_equal(
- log(endpoints(dfop_saemix_1)$distimes[1:2]),
- log(endpoints(sforb_saemix_1)$distimes[1:2]), tolerance = 0.01)
+ log(endpoints(dfop_saem_1)$distimes[1:2]),
+ log(endpoints(sforb_saem_1)$distimes[1:2]), tolerance = 0.01)
expect_equal(
- log(endpoints(sforb_saemix_1)$distimes[1:2]),
- log(endpoints(sforb_saemix_2)$distimes[1:2]), tolerance = 0.01)
+ log(endpoints(sforb_saem_1)$distimes[1:2]),
+ log(endpoints(sforb_saem_2)$distimes[1:2]), tolerance = 0.01)
mmkin_hs_1 <- mmkin("HS", ds_hs, quiet = TRUE, error_model = "const", cores = n_cores)
hs_saem_1 <- saem(mmkin_hs_1, quiet = TRUE, no_random_effect = "parent_0")
@@ -131,7 +131,7 @@ test_that("Parent fits using saemix are correctly implemented", {
expect_equal(endpoints(hs_saem_1), endpoints(hs_saem_2), tol = 0.01)
ci_hs_s1 <- summary(hs_saem_1)$confint_back
- hs_pop <- as.numeric(hs_pop)
+ hs_pop <- as.numeric(attr(ds_hs, "pop"))
#expect_true(all(ci_hs_s1[, "lower"] < hs_pop)) # k1 is overestimated
expect_true(all(ci_hs_s1[, "upper"] > hs_pop))
})
@@ -141,10 +141,10 @@ test_that("We can also use mkin solution methods for saem", {
"saemix transformations is only supported if an analytical solution is implemented"
)
skip("This still takes almost 2.5 minutes although we do not solve ODEs")
- dfop_saemix_3 <- saem(mmkin_dfop_1, quiet = TRUE, transformations = "mkin",
- solution_type = "analytical", no_random_effect = "parent_0")
- distimes_dfop <- endpoints(dfop_saemix_1)$distimes
- distimes_dfop_analytical <- endpoints(dfop_saemix_3)$distimes
+ dfop_saem_3 <- saem(mmkin_dfop_1, quiet = TRUE, transformations = "mkin",
+ solution_type = "analytical", no_random_effect = c("parent_0", "g_qlogis"))
+ distimes_dfop <- endpoints(dfop_saem_1)$distimes
+ distimes_dfop_analytical <- endpoints(dfop_saem_3)$distimes
rel_diff <- abs(distimes_dfop_analytical - distimes_dfop) / distimes_dfop
expect_true(all(rel_diff < 0.01))
})

Contact - Imprint