From 99947961be1cf0a7eed80426bc3d8cc6daa6d106 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Thu, 31 Oct 2019 11:47:23 +0100 Subject: Reorganize tests to reduce time on winbuilder --- test.log | 19 +++++++++---------- tests/testthat/setup_script.R | 21 +++------------------ tests/testthat/test_FOCUS_chi2_error_level.R | 11 ++--------- tests/testthat/test_confidence.R | 3 ++- tests/testthat/test_from_max_mean.R | 3 +-- tests/testthat/test_mkinfit_errors.R | 8 -------- tests/testthat/test_mkinpredict_SFO_SFO.R | 20 ++++++++++---------- tests/testthat/test_residuals.R | 4 +++- tests/testthat/test_tests.R | 25 ++++++++++++++++++++++--- 9 files changed, 52 insertions(+), 62 deletions(-) diff --git a/test.log b/test.log index 7b397ee1..4ae27f0d 100644 --- a/test.log +++ b/test.log @@ -1,16 +1,15 @@ Loading mkin Testing mkin -Successfully compiled differential equation model from auto-generated C code. ✔ | OK F W S | Context ✔ | 2 | Export dataset for reading into CAKE -✔ | 10 | Confidence intervals and p-values [10.2 s] -✔ | 10 | Error model fitting [38.3 s] -✔ | 5 | Calculation of FOCUS chi2 error levels [3.5 s] -✔ | 13 | Results for FOCUS D established in expertise for UBA (Ranke 2014) [3.3 s] -✔ | 6 | Test fitting the decline of metabolites from their maximum [0.9 s] +✔ | 10 | Confidence intervals and p-values [9.7 s] +✔ | 10 | Error model fitting [37.4 s] +✔ | 4 | Calculation of FOCUS chi2 error levels [2.2 s] +✔ | 13 | Results for FOCUS D established in expertise for UBA (Ranke 2014) [3.4 s] +✔ | 6 | Test fitting the decline of metabolites from their maximum [0.7 s] ✔ | 1 | Fitting the logistic model [0.9 s] ✔ | 1 | Test dataset class mkinds used in gmkin -✔ | 12 | Special cases of mkinfit calls [2.7 s] +✔ | 12 | Special cases of mkinfit calls [2.4 s] ✔ | 9 | mkinmod model generation and printing [0.2 s] ✔ | 3 | Model predictions with mkinpredict [0.3 s] ✔ | 16 | Evaluations according to 2015 NAFTA guidance [4.1 s] @@ -22,11 +21,11 @@ Successfully compiled differential equation model from auto-generated C code. ✔ | 2 | Complex test case from Schaefer et al. (2007) Piacenza paper [5.3 s] ✔ | 4 | Fitting the SFORB model [1.7 s] ✔ | 1 | Summaries of old mkinfit objects -✔ | 4 | Results for synthetic data established in expertise for UBA (Ranke 2014) [7.2 s] -✔ | 5 | Hypothesis tests [9.9 s] +✔ | 4 | Results for synthetic data established in expertise for UBA (Ranke 2014) [7.1 s] +✔ | 6 | Hypothesis tests [31.3 s] ══ Results ═════════════════════════════════════════════════════════════════════ -Duration: 91.5 s +Duration: 109.7 s OK: 127 Failed: 0 diff --git a/tests/testthat/setup_script.R b/tests/testthat/setup_script.R index fc972a3d..9becdd2a 100644 --- a/tests/testthat/setup_script.R +++ b/tests/testthat/setup_script.R @@ -47,6 +47,9 @@ SFO_SFO <- mkinmod(parent = list(type = "SFO", to = "m1"), SFO_SFO.ff <- mkinmod(parent = list(type = "SFO", to = "m1"), m1 = list(type = "SFO"), use_of_ff = "max", quiet = TRUE) +SFO_SFO.ff.nosink <- mkinmod( + parent = mkinsub("SFO", "m1", sink = FALSE), + m1 = mkinsub("SFO"), quiet = TRUE, use_of_ff = "max") f_sfo_sfo_desolve <- mkinfit(SFO_SFO, subset(FOCUS_2006_D, value != 0), @@ -76,8 +79,6 @@ m_synth_DFOP_par <- mkinmod(parent = mkinsub("DFOP", c("M1", "M2")), use_of_ff = "max", quiet = TRUE) fit_nw_1 <- mkinfit(m_synth_SFO_lin, SFO_lin_a, quiet = TRUE) -fit_nw_1_ML <- mkinfit(m_synth_SFO_lin, SFO_lin_a, quiet = TRUE, - error_model = "const", error_model_algorithm = "direct") # We know direct optimization is OK and direct needs 4 sec versus 5.5 for threestep and 6 for IRLS fit_obs_1 <- mkinfit(m_synth_SFO_lin, SFO_lin_a, error_model = "obs", quiet = TRUE, @@ -85,19 +86,3 @@ fit_obs_1 <- mkinfit(m_synth_SFO_lin, SFO_lin_a, error_model = "obs", quiet = TR # We know threestep is OK, and threestep (and IRLS) need 4.8 se versus 5.6 for direct fit_tc_1 <- mkinfit(m_synth_SFO_lin, SFO_lin_a, error_model = "tc", quiet = TRUE, error_model_algorithm = "threestep") - -# We know direct optimization is OK and direct needs 8 sec versus 11 sec for threestep -f_tc_2 <- mkinfit(m_synth_DFOP_par, DFOP_par_c, error_model = "tc", - error_model_algorithm = "direct", quiet = TRUE) - -# Experimental data for UBA -dfop_sfo_sfo <- mkinmod( - parent = mkinsub("DFOP", to = "A1"), - A1 = mkinsub("SFO", to = "A2"), - A2 = mkinsub("SFO"), - use_of_ff = "max" -) - -f_soil_1_tc <- mkinfit(dfop_sfo_sfo, - experimental_data_for_UBA_2019[[1]]$data, - error_model = "tc", quiet = TRUE) diff --git a/tests/testthat/test_FOCUS_chi2_error_level.R b/tests/testthat/test_FOCUS_chi2_error_level.R index d7f8d9e7..d091cb95 100644 --- a/tests/testthat/test_FOCUS_chi2_error_level.R +++ b/tests/testthat/test_FOCUS_chi2_error_level.R @@ -18,10 +18,6 @@ context("Calculation of FOCUS chi2 error levels") -SFO_SFO.ff <- mkinmod(parent = list(type = "SFO", to = "m1"), - m1 = list(type = "SFO"), - use_of_ff = "max", quiet = TRUE) - errmin.FOCUS_2006_D_rounded = data.frame( err.min = c(0.0640, 0.0646, 0.0469), n.optim = c(4, 2, 2), @@ -36,16 +32,13 @@ errmin.FOCUS_2006_E_rounded = data.frame( test_that("Chi2 error levels for FOCUS D are as in mkin 0.9-33", { - fit <- expect_warning(mkinfit(SFO_SFO.ff, FOCUS_2006_D, quiet = TRUE), - "Observations with value of zero") - - - expect_equal(round(mkinerrmin(fit), 4), + expect_equal(round(mkinerrmin(f_sfo_sfo.ff), 4), errmin.FOCUS_2006_D_rounded) }) test_that("Chi2 error levels are independent of setting parms.ini that are not in the model", { + skip_on_cran() fit.2 <- expect_warning(mkinfit(SFO_SFO.ff, FOCUS_2006_D, quiet = TRUE, parms.ini = c(tb = 5)), "Observations with value of zero") diff --git a/tests/testthat/test_confidence.R b/tests/testthat/test_confidence.R index 2443fa66..a2bf1401 100644 --- a/tests/testthat/test_confidence.R +++ b/tests/testthat/test_confidence.R @@ -73,7 +73,8 @@ test_that("Likelihood profile based confidence intervals work", { } f_mle <- stats4::mle(f_nll, start = as.list(parms(f)), nobs = nrow(FOCUS_2006_C)) - ci_mkin_1_p_0.95 <- confint(f, method = "profile", level = 0.95, quiet = TRUE) + ci_mkin_1_p_0.95 <- confint(f, method = "profile", level = 0.95, + cores = n_cores, quiet = TRUE) # Magically, we get very similar boundaries as stats4::mle # (we need to capture the output to avoid printing this while testing as diff --git a/tests/testthat/test_from_max_mean.R b/tests/testthat/test_from_max_mean.R index c4d6bfe4..3edf5969 100644 --- a/tests/testthat/test_from_max_mean.R +++ b/tests/testthat/test_from_max_mean.R @@ -19,8 +19,7 @@ context("Test fitting the decline of metabolites from their maximum") test_that("Fitting from maximum mean value works", { - SFO_SFO <- mkinmod(parent = mkinsub("SFO", "m1"), - m1 = mkinsub("SFO")) + expect_warning( expect_error(mkinfit(SFO_SFO, FOCUS_2006_D, from_max_mean = TRUE), "only implemented for models with a single observed variable"), diff --git a/tests/testthat/test_mkinfit_errors.R b/tests/testthat/test_mkinfit_errors.R index 8adb05c1..3a04e9c6 100644 --- a/tests/testthat/test_mkinfit_errors.R +++ b/tests/testthat/test_mkinfit_errors.R @@ -18,14 +18,6 @@ context("Special cases of mkinfit calls") -SFO_SFO.ff.nosink <- mkinmod( - parent = mkinsub("SFO", "m1", sink = FALSE), - m1 = mkinsub("SFO"), quiet = TRUE, use_of_ff = "max") - -SFO_SFO.ff <- mkinmod( - parent = mkinsub("SFO", "m1"), - m1 = mkinsub("SFO"), quiet = TRUE, use_of_ff = "max") - test_that("mkinfit stops to prevent and/or explain user errors", { expect_error(mkinfit("foo", FOCUS_2006_A)) expect_error(mkinfit(3, FOCUS_2006_A)) diff --git a/tests/testthat/test_mkinpredict_SFO_SFO.R b/tests/testthat/test_mkinpredict_SFO_SFO.R index 3fcdb3a2..d0d856fa 100644 --- a/tests/testthat/test_mkinpredict_SFO_SFO.R +++ b/tests/testthat/test_mkinpredict_SFO_SFO.R @@ -31,20 +31,20 @@ test_that("Variants of model predictions for SFO_SFO model give equivalent resul m1 = list(type = "SFO"), use_of_ff = "max", quiet = TRUE) ot = seq(0, 100, by = 1) - r.1.e <- subset(mkinpredict(SFO_SFO.1, - c(k_parent_m1 = 0.1, k_parent_sink = 0.1, k_m1_sink = 0.1), - c(parent = 100, m1 = 0), ot, solution_type = "eigen"), + r.1.e <- subset(mkinpredict(SFO_SFO.1, + c(k_parent_m1 = 0.1, k_parent_sink = 0.1, k_m1_sink = 0.1), + c(parent = 100, m1 = 0), ot, solution_type = "eigen"), time %in% c(1, 10, 50, 100)) - r.1.d <- subset(mkinpredict(SFO_SFO.1, - c(k_parent_m1 = 0.1, k_parent_sink = 0.1, k_m1_sink = 0.1), - c(parent = 100, m1 = 0), ot, solution_type = "deSolve"), + r.1.d <- subset(mkinpredict(SFO_SFO.1, + c(k_parent_m1 = 0.1, k_parent_sink = 0.1, k_m1_sink = 0.1), + c(parent = 100, m1 = 0), ot, solution_type = "deSolve"), time %in% c(1, 10, 50, 100)) - r.2.e <- subset(mkinpredict(SFO_SFO.2, c(k_parent = 0.2, f_parent_to_m1 = 0.5, k_m1 = 0.1), - c(parent = 100, m1 = 0), ot, solution_type = "eigen"), + r.2.e <- subset(mkinpredict(SFO_SFO.2, c(k_parent = 0.2, f_parent_to_m1 = 0.5, k_m1 = 0.1), + c(parent = 100, m1 = 0), ot, solution_type = "eigen"), time %in% c(1, 10, 50, 100)) - r.2.d <- subset(mkinpredict(SFO_SFO.2, c(k_parent = 0.2, f_parent_to_m1 = 0.5, k_m1 = 0.1), - c(parent = 100, m1 = 0), ot, solution_type = "deSolve"), + r.2.d <- subset(mkinpredict(SFO_SFO.2, c(k_parent = 0.2, f_parent_to_m1 = 0.5, k_m1 = 0.1), + c(parent = 100, m1 = 0), ot, solution_type = "deSolve"), time %in% c(1, 10, 50, 100)) # Compare eigen and deSolve for minimum use of formation fractions diff --git a/tests/testthat/test_residuals.R b/tests/testthat/test_residuals.R index 275b33b9..35a143f6 100644 --- a/tests/testthat/test_residuals.R +++ b/tests/testthat/test_residuals.R @@ -4,5 +4,7 @@ test_that("Residuals are correctly returned", { f <- fits[["FOMC", "FOCUS_C"]] expect_equal(residuals(f)[1:3], c(-0.7748906, 2.7090589, -1.9451989)) - expect_equivalent(residuals(f_tc_2, standardized = TRUE)[1:3], c(0.52579103, 0.40714911, 1.66394233), tolerance = 0.0001) + expect_equivalent( + residuals(f, standardized = TRUE)[1:3], + c(-0.4171812, 1.4584875, -1.0472450), tolerance = 0.0001) }) diff --git a/tests/testthat/test_tests.R b/tests/testthat/test_tests.R index d8b97815..6edb4dfa 100644 --- a/tests/testthat/test_tests.R +++ b/tests/testthat/test_tests.R @@ -2,7 +2,7 @@ context("Hypothesis tests") test_that("The likelihood ratio test works", { - expect_error(lrtest(fit_tc_1, f_tc_2), "not been fitted to the same data") + expect_error(lrtest(f_1_mkin_trans, f_2_mkin), "not been fitted to the same data") res <- lrtest(fit_nw_1, fit_tc_1) expect_equal(res[["2", "Pr(>Chisq)"]], 1, tolerance = 1e-5) @@ -10,13 +10,27 @@ test_that("The likelihood ratio test works", { }) test_that("We can conveniently fix parameters using 'fixed_parms'", { + f_k2_fixed <- mkinfit("DFOP", FOCUS_2006_C, fixed_parms = c(k2 = 0.05), quiet = TRUE) expect_equivalent(f_k2_fixed$bparms.ode["k2"], 0.05) + }) test_that("Updating fitted models works", { - f_dfop_const <- mkinfit("DFOP", FOCUS_2006_C, quiet = TRUE) - f_dfop_tc <- update(f_dfop_const, error_model = "tc") + + skip_on_cran() + f_dfop_tc <- update(f_2_mkin, error_model = "tc") + + dfop_sfo_sfo <- mkinmod( + parent = mkinsub("DFOP", to = "A1"), + A1 = mkinsub("SFO", to = "A2"), + A2 = mkinsub("SFO"), + use_of_ff = "max" + ) + + f_soil_1_tc <- mkinfit(dfop_sfo_sfo, + experimental_data_for_UBA_2019[[1]]$data, + error_model = "tc", quiet = TRUE) f_soil_1_nw <- update(f_soil_1_tc, error_model = "const") f_soil_1_nw_A2 <- update(f_soil_1_nw, fixed_parms = c(k_A2 = 0)) @@ -25,3 +39,8 @@ test_that("Updating fitted models works", { test_nw_A2 <- lrtest(f_soil_1_nw, f_soil_1_nw_A2) expect_equivalent(test_nw_A2[["2", "Pr(>Chisq)"]], 1, tolerance = 1e-4) }) + +test_that("We can do a likelihood ratio test using an update specification", { + test_2_mkin_k2 <- lrtest(f_2_mkin, fixed_parms = c(k2 = 0)) + expect_equivalent(test_2_mkin_k2[["2", "Pr(>Chisq)"]], 1.139e-6, tolerance = 1e-8) +}) -- cgit v1.2.1