diff options
-rw-r--r-- | NAMESPACE | 3 | ||||
-rw-r--r-- | NEWS.md | 4 | ||||
-rw-r--r-- | R/llhist.R | 3 | ||||
-rw-r--r-- | R/multistart.R | 6 | ||||
-rw-r--r-- | R/parplot.R (renamed from R/parhist.R) | 12 | ||||
-rw-r--r-- | R/saem.R | 2 | ||||
-rw-r--r-- | log/test.log | 42 | ||||
-rw-r--r-- | man/logLik.saem.mmkin.Rd | 2 | ||||
-rw-r--r-- | man/multistart.Rd | 6 | ||||
-rw-r--r-- | man/parplot.Rd (renamed from man/parhist.Rd) | 17 | ||||
-rw-r--r-- | tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg | 1 | ||||
-rw-r--r-- | tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg | 2 | ||||
-rw-r--r-- | tests/testthat/_snaps/multistart/parplot-for-biphasic-saemix-fit.svg (renamed from tests/testthat/_snaps/multistart/parhist-for-biphasic-saemix-fit.svg) | 0 | ||||
-rw-r--r-- | tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg (renamed from tests/testthat/_snaps/multistart/parhist-for-sfo-fit.svg) | 0 | ||||
-rw-r--r-- | tests/testthat/test_multistart.R | 8 | ||||
-rw-r--r-- | vignettes/web_only/multistart.rmd | 6 |
16 files changed, 63 insertions, 51 deletions
@@ -36,6 +36,7 @@ S3method(parms,mkinfit) S3method(parms,mmkin) S3method(parms,multistart) S3method(parms,saem.mmkin) +S3method(parplot,multistart.saem.mmkin) S3method(plot,mixed.mmkin) S3method(plot,mkinfit) S3method(plot,mmkin) @@ -126,8 +127,8 @@ export(nafta) export(nlme) export(nlme_data) export(nlme_function) -export(parhist) export(parms) +export(parplot) export(plot_err) export(plot_res) export(plot_sep) @@ -1,6 +1,6 @@ # mkin 1.1.2 -- 'R/multistart.R': New method for testing multiple start parameters for hierarchical model fits, with diagnostic plotting functions 'llhist' and 'parhist'. +- 'R/multistart.R': New method for testing multiple start parameters for hierarchical model fits, with diagnostic plotting functions 'llhist' and 'parplot'. - 'R/mhmkin.R': New method for performing multiple hierarchical mkin fits in one function call, optionally in parallel. @@ -8,7 +8,7 @@ - 'R/saem.R': 'logLik' and 'update' methods for 'saem.mmkin' objects. -- 'R/convergence.R': New generic to show convergence information with methods for 'mmkin' and 'mhmkin' objects. +- 'R/status.R': New generic to show status information for fit array objects with methods for 'mmkin' and 'mhmkin' objects. - 'R/illparms.R': New generic to show ill-defined parameters with methods for 'mkinfit', 'mmkin', 'saem.mmkin' and 'mhmkin' objects. @@ -25,6 +25,7 @@ llhist <- function(object, breaks = "Sturges", lpos = "topleft", main = "", stop("llhist is only implemented for multistart.saem.mmkin objects") } + ll_orig <- logLik(attr(object, "orig")) ll <- stats::na.omit(sapply(object, llfunc)) par(las = 1) @@ -34,7 +35,7 @@ llhist <- function(object, breaks = "Sturges", lpos = "topleft", main = "", freq_factor <- h$counts[1] / h$density[1] - abline(v = logLik(attr(object, "orig")), col = 2) + abline(v = ll_orig, col = 2) legend(lpos, inset = c(0.05, 0.05), bty = "n", lty = 1, col = c(2), diff --git a/R/multistart.R b/R/multistart.R index 29ccdc44..14683c11 100644 --- a/R/multistart.R +++ b/R/multistart.R @@ -17,7 +17,7 @@ #' @param x The multistart object to print #' @return A list of [saem.mmkin] objects, with class attributes #' 'multistart.saem.mmkin' and 'multistart'. -#' @seealso [parhist], [llhist] +#' @seealso [parplot], [llhist] #' #' @references Duchesne R, Guillemin A, Gandrillon O, Crauste F. Practical #' identifiability in the frame of nonlinear mixed effects models: the example @@ -40,7 +40,7 @@ #' f_mmkin <- mmkin("DFOP", dmta_ds, error_model = "tc", cores = 7, quiet = TRUE) #' f_saem_full <- saem(f_mmkin) #' f_saem_full_multi <- multistart(f_saem_full, n = 16, cores = 16) -#' parhist(f_saem_full_multi, lpos = "bottomleft") +#' parplot(f_saem_full_multi, lpos = "bottomleft") #' illparms(f_saem_full) #' #' f_saem_reduced <- update(f_saem_full, no_random_effect = "log_k2") @@ -52,7 +52,7 @@ #' cl <- makePSOCKcluster(12) #' clusterExport(cl, "f_mmkin") #' f_saem_reduced_multi <- multistart(f_saem_reduced, n = 16, cluster = cl) -#' parhist(f_saem_reduced_multi, lpos = "topright") +#' parplot(f_saem_reduced_multi, lpos = "topright") #' } multistart <- function(object, n = 50, cores = if (Sys.info()["sysname"] == "Windows") 1 else parallel::detectCores(), diff --git a/R/parhist.R b/R/parplot.R index 0f9c9964..627a4eb8 100644 --- a/R/parhist.R +++ b/R/parplot.R @@ -1,4 +1,4 @@ -#' Plot parameter distributions from multistart objects +#' Plot parameter variability of multistart objects #' #' Produces a boxplot with all parameters from the multiple runs, scaled #' either by the parameters of the run with the highest likelihood, @@ -18,7 +18,13 @@ #' @seealso [multistart] #' @importFrom stats median #' @export -parhist <- function(object, llmin = -Inf, scale = c("best", "median"), +parplot <- function(object, ...) { + UseMethod("parplot") +} + +#' @rdname parplot +#' @export +parplot.multistart.saem.mmkin <- function(object, llmin = -Inf, scale = c("best", "median"), lpos = "bottomleft", main = "", ...) { oldpar <- par(no.readonly = TRUE) @@ -35,7 +41,7 @@ parhist <- function(object, llmin = -Inf, scale = c("best", "median"), else return(logLik(object$so)) } } else { - stop("parhist is only implemented for multistart.saem.mmkin objects") + stop("parplot is only implemented for multistart.saem.mmkin objects") } ll <- sapply(object, llfunc) selected <- which(ll > llmin) @@ -726,7 +726,7 @@ saemix_data <- function(object, covariates = NULL, verbose = FALSE, ...) { #' @param \dots Passed to [saemix::logLik.SaemixObject] #' @param method Passed to [saemix::logLik.SaemixObject] #' @export -logLik.saem.mmkin <- function(object, ..., method = c("lin", "is", "gq")) { +logLik.saem.mmkin <- function(object, ..., method = c("is", "lin", "gq")) { method <- match.arg(method) return(logLik(object$so, method = method)) } diff --git a/log/test.log b/log/test.log index 429a2e02..0e2ca6b2 100644 --- a/log/test.log +++ b/log/test.log @@ -1,53 +1,53 @@ ℹ Testing mkin ✔ | F W S OK | Context ✔ | 5 | AIC calculation -✔ | 5 | Analytical solutions for coupled models [3.3s] +✔ | 5 | Analytical solutions for coupled models [3.4s] ✔ | 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 [43.2s] +✔ | 1 12 | Dimethenamid data from 2018 [63.1s] ──────────────────────────────────────────────────────────────────────────────── Skip (test_dmta.R:98:3): 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 [11.5s] +✔ | 14 | Error model fitting [5.5s] ✔ | 5 | Time step normalisation -✔ | 4 | Calculation of FOCUS chi2 error levels [1.3s] -✔ | 14 | Results for FOCUS D established in expertise for UBA (Ranke 2014) [1.9s] -✔ | 4 | Test fitting the decline of metabolites from their maximum [0.9s] -✔ | 1 | Fitting the logistic model [0.6s] -✔ | 7 | Batch fitting and diagnosing hierarchical kinetic models [30.9s] -✔ | 1 12 | Nonlinear mixed-effects models [0.4s] +✔ | 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] +✔ | 7 | Batch fitting and diagnosing hierarchical kinetic models [28.6s] +✔ | 1 12 | Nonlinear mixed-effects models [0.6s] ──────────────────────────────────────────────────────────────────────────────── Skip (test_mixed.R:74:3): saemix results are reproducible for biphasic fits Reason: Fitting with saemix takes around 10 minutes when using deSolve ──────────────────────────────────────────────────────────────────────────────── ✔ | 3 | Test dataset classes mkinds and mkindsg -✔ | 10 | Special cases of mkinfit calls [0.7s] -✔ | 3 | mkinfit features [1.0s] -✔ | 8 | mkinmod model generation and printing [0.3s] -✔ | 3 | Model predictions with mkinpredict [0.3s] -✔ | 7 | Multistart method for saem.mmkin models [39.8s] -✔ | 16 | Evaluations according to 2015 NAFTA guidance [2.6s] -✔ | 9 | Nonlinear mixed-effects models with nlme [8.8s] -✔ | 16 | Plotting [10.1s] +✔ | 10 | Special cases of mkinfit calls [1.1s] +✔ | 3 | mkinfit features [1.7s] +✔ | 8 | mkinmod model generation and printing [0.4s] +✔ | 3 | Model predictions with mkinpredict [0.6s] +✔ | 7 | Multistart method for saem.mmkin models [93.9s] +✔ | 16 | Evaluations according to 2015 NAFTA guidance [7.0s] +✔ | 9 | Nonlinear mixed-effects models with nlme [13.0s] +✔ | 16 | Plotting [11.3s] ✔ | 4 | Residuals extracted from mkinfit models -✔ | 1 36 | saemix parent models [72.3s] +✔ | 1 36 | saemix parent models [72.6s] ──────────────────────────────────────────────────────────────────────────────── Skip (test_saemix_parent.R:152:3): 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 -✔ | 7 | Fitting the SFORB model [3.8s] +✔ | 7 | Fitting the SFORB model [3.7s] ✔ | 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] +✔ | 9 | Hypothesis tests [8.1s] ✔ | 4 | Calculation of maximum time weighted average concentrations (TWAs) [2.2s] ══ Results ═════════════════════════════════════════════════════════════════════ -Duration: 249.3 s +Duration: 324.3 s ── Skipped tests ────────────────────────────────────────────────────────────── • Fitting this ODE model with saemix takes about 15 minutes on my system (1) diff --git a/man/logLik.saem.mmkin.Rd b/man/logLik.saem.mmkin.Rd index 603f4607..bd0bb72e 100644 --- a/man/logLik.saem.mmkin.Rd +++ b/man/logLik.saem.mmkin.Rd @@ -4,7 +4,7 @@ \alias{logLik.saem.mmkin} \title{logLik method for saem.mmkin objects} \usage{ -\method{logLik}{saem.mmkin}(object, ..., method = c("lin", "is", "gq")) +\method{logLik}{saem.mmkin}(object, ..., method = c("is", "lin", "gq")) } \arguments{ \item{object}{The fitted \link{saem.mmkin} object} diff --git a/man/multistart.Rd b/man/multistart.Rd index ebcc7d80..1f6773fe 100644 --- a/man/multistart.Rd +++ b/man/multistart.Rd @@ -77,7 +77,7 @@ dmta_ds[["Elliot 1"]] <- dmta_ds[["Elliot 2"]] <- NULL f_mmkin <- mmkin("DFOP", dmta_ds, error_model = "tc", cores = 7, quiet = TRUE) f_saem_full <- saem(f_mmkin) f_saem_full_multi <- multistart(f_saem_full, n = 16, cores = 16) -parhist(f_saem_full_multi, lpos = "bottomleft") +parplot(f_saem_full_multi, lpos = "bottomleft") illparms(f_saem_full) f_saem_reduced <- update(f_saem_full, no_random_effect = "log_k2") @@ -89,7 +89,7 @@ library(parallel) cl <- makePSOCKcluster(12) clusterExport(cl, "f_mmkin") f_saem_reduced_multi <- multistart(f_saem_reduced, n = 16, cluster = cl) -parhist(f_saem_reduced_multi, lpos = "topright") +parplot(f_saem_reduced_multi, lpos = "topright") } } \references{ @@ -99,5 +99,5 @@ of the in vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478. doi: 10.1186/s12859-021-04373-4. } \seealso{ -\link{parhist}, \link{llhist} +\link{parplot}, \link{llhist} } diff --git a/man/parhist.Rd b/man/parplot.Rd index f86ff734..37c5841d 100644 --- a/man/parhist.Rd +++ b/man/parplot.Rd @@ -1,10 +1,13 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/parhist.R -\name{parhist} -\alias{parhist} -\title{Plot parameter distributions from multistart objects} +% Please edit documentation in R/parplot.R +\name{parplot} +\alias{parplot} +\alias{parplot.multistart.saem.mmkin} +\title{Plot parameter variability of multistart objects} \usage{ -parhist( +parplot(object, ...) + +\method{parplot}{multistart.saem.mmkin}( object, llmin = -Inf, scale = c("best", "median"), @@ -16,6 +19,8 @@ parhist( \arguments{ \item{object}{The \link{multistart} object} +\item{\dots}{Passed to \link{boxplot}} + \item{llmin}{The minimum likelihood of objects to be shown} \item{scale}{By default, scale parameters using the best available fit. @@ -24,8 +29,6 @@ If 'median', parameters are scaled using the median parameters from all fits.} \item{lpos}{Positioning of the legend.} \item{main}{Title of the plot} - -\item{\dots}{Passed to \link{boxplot}} } \description{ Produces a boxplot with all parameters from the multiple runs, scaled diff --git a/tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg b/tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg index fa92c92a..fe38865d 100644 --- a/tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg +++ b/tests/testthat/_snaps/multistart/llhist-for-biphasic-saemix-fit.svg @@ -50,6 +50,7 @@ <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='212.36' width='146.00' height='273.78' style='stroke-width: 0.75; fill: #D3D3D3;' /> <rect x='520.40' y='212.36' width='146.00' height='273.78' style='stroke-width: 0.75; fill: #D3D3D3;' /> +<line x1='352.00' y1='502.56' x2='352.00' 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/llhist-for-sfo-fit.svg b/tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg index 4342df9b..98513d06 100644 --- a/tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg +++ b/tests/testthat/_snaps/multistart/llhist-for-sfo-fit.svg @@ -50,7 +50,7 @@ <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='2159.04' y1='502.56' x2='2159.04' y2='59.04' style='stroke-width: 0.75; stroke: #DF536B;' /> +<line x1='232.06' y1='502.56' x2='232.06' 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/parhist-for-biphasic-saemix-fit.svg b/tests/testthat/_snaps/multistart/parplot-for-biphasic-saemix-fit.svg index 75519b07..75519b07 100644 --- a/tests/testthat/_snaps/multistart/parhist-for-biphasic-saemix-fit.svg +++ b/tests/testthat/_snaps/multistart/parplot-for-biphasic-saemix-fit.svg diff --git a/tests/testthat/_snaps/multistart/parhist-for-sfo-fit.svg b/tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg index f3373901..f3373901 100644 --- a/tests/testthat/_snaps/multistart/parhist-for-sfo-fit.svg +++ b/tests/testthat/_snaps/multistart/parplot-for-sfo-fit.svg diff --git a/tests/testthat/test_multistart.R b/tests/testthat/test_multistart.R index e4885191..56eb140c 100644 --- a/tests/testthat/test_multistart.R +++ b/tests/testthat/test_multistart.R @@ -25,14 +25,14 @@ test_that("multistart works for saem.mmkin models", { skip_on_travis() # Plots are platform dependent llhist_sfo <- function() llhist(saem_sfo_s_multi) - parhist_sfo <- function() parhist(saem_sfo_s_multi, ylim = c(0.5, 2)) + parplot_sfo <- function() parplot(saem_sfo_s_multi, ylim = c(0.5, 2)) vdiffr::expect_doppelganger("llhist for sfo fit", llhist_sfo) - vdiffr::expect_doppelganger("parhist for sfo fit", parhist_sfo) + vdiffr::expect_doppelganger("parplot for sfo fit", parplot_sfo) llhist_biphasic <- function() llhist(saem_biphasic_m_multi) - parhist_biphasic <- function() parhist(saem_biphasic_m_multi, + parplot_biphasic <- function() parplot(saem_biphasic_m_multi, ylim = c(0.5, 2)) vdiffr::expect_doppelganger("llhist for biphasic saemix fit", llhist_biphasic) - vdiffr::expect_doppelganger("parhist for biphasic saemix fit", parhist_biphasic) + vdiffr::expect_doppelganger("parplot for biphasic saemix fit", parplot_biphasic) }) diff --git a/vignettes/web_only/multistart.rmd b/vignettes/web_only/multistart.rmd index 94f4ef98..27a8a96a 100644 --- a/vignettes/web_only/multistart.rmd +++ b/vignettes/web_only/multistart.rmd @@ -40,7 +40,7 @@ with different starting values. ```{r} f_saem_full_multi <- multistart(f_saem_full, n = 16, cores = 16) -parhist(f_saem_full_multi) +parplot(f_saem_full_multi) ``` This confirms that the variance of k2 is the most problematic parameter, so we @@ -51,7 +51,7 @@ for k2. f_saem_reduced <- update(f_saem_full, no_random_effect = "log_k2") illparms(f_saem_reduced) f_saem_reduced_multi <- multistart(f_saem_reduced, n = 16, cores = 16) -parhist(f_saem_reduced_multi, lpos = "topright") +parplot(f_saem_reduced_multi, lpos = "topright") ``` The results confirm that all remaining parameters can be determined with sufficient @@ -67,7 +67,7 @@ The parameter histograms can be further improved by excluding the result with the low likelihood. ```{r} -parhist(f_saem_reduced_multi, lpos = "topright", llmin = -326, ylim = c(0.5, 2)) +parplot(f_saem_reduced_multi, lpos = "topright", llmin = -326, ylim = c(0.5, 2)) ``` We can use the `anova` method to compare the models, including a likelihood ratio |