diff options
Diffstat (limited to 'vignettes/web_only/saem_benchmarks.rmd')
-rw-r--r-- | vignettes/web_only/saem_benchmarks.rmd | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/vignettes/web_only/saem_benchmarks.rmd b/vignettes/web_only/saem_benchmarks.rmd new file mode 100644 index 00000000..116713de --- /dev/null +++ b/vignettes/web_only/saem_benchmarks.rmd @@ -0,0 +1,207 @@ +--- +title: "Benchmark timings for saem.mmkin" +author: "Johannes Ranke" +date: Last change 14 November 2022 (rebuilt `r Sys.Date()`) +output: + html_document: + toc: true + toc_float: true + code_folding: show + fig_retina: null +vignette: > + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +library("knitr") # For the kable() function +opts_chunk$set(tidy = FALSE, cache = FALSE) +library("mkin") +``` + +Each system is characterized by operating system type, CPU type, +mkin version, saemix version and R version. A compiler was available, so if no +analytical solution was available, compiled ODE models are used. + +Every fit is only performed once, so the accuracy of the benchmarks is limited. + +```{r include = FALSE} +cpu_model <- benchmarkme::get_cpu()$model_name +# Abbreviate CPU identifiers +cpu_model <- gsub("AMD ", "", cpu_model) +cpu_model <- gsub("Intel\\(R\\) Core\\(TM\\) ", "", cpu_model) +cpu_model <- gsub(" Eight-Core Processor", "", cpu_model) +cpu_model <- gsub(" CPU @ 2.50GHz", "", cpu_model) + +operating_system <- Sys.info()[["sysname"]] +mkin_version <- as.character(packageVersion("mkin")) +saemix_version <- as.character(packageVersion("saemix")) +R_version <- paste0(R.version$major, ".", R.version$minor) +system_string <- paste0(operating_system, ", ", cpu_model, ", mkin ", mkin_version, ", saemix ", saemix_version, ", R ", R_version) + +benchmark_path = normalizePath("~/git/mkin/vignettes/web_only/saem_benchmarks.rda") +load(benchmark_path) + +# Initialization 14 November 2022 +#saem_benchmarks <- data.frame() + +saem_benchmarks[system_string, c("CPU", "OS", "mkin", "saemix", "R")] <- + c(cpu_model, operating_system, mkin_version, saemix_version, R_version) +``` + +For the initial mmkin fits, we use all available cores. + +```{r setup} +n_cores <- parallel::detectCores() +``` + +## Test data + +Please refer to the vignette `dimethenamid_2018` for an explanation +of the following preprocessing. + +```{r dimethenamid_data} +dmta_ds <- lapply(1:7, function(i) { + ds_i <- dimethenamid_2018$ds[[i]]$data + ds_i[ds_i$name == "DMTAP", "name"] <- "DMTA" + ds_i$time <- ds_i$time * dimethenamid_2018$f_time_norm[i] + ds_i +}) +names(dmta_ds) <- sapply(dimethenamid_2018$ds, function(ds) ds$title) +dmta_ds[["Elliot"]] <- rbind(dmta_ds[["Elliot 1"]], dmta_ds[["Elliot 2"]]) +dmta_ds[["Elliot 1"]] <- NULL +dmta_ds[["Elliot 2"]] <- NULL +``` + +## Test cases + +### Parent only + +```{r parent_only} +parent_mods <- c("SFO", "DFOP", "SFORB", "HS") +parent_sep_const <- mmkin(parent_mods, dmta_ds, quiet = TRUE, cores = n_cores) +parent_sep_tc <- update(parent_sep_const, error_model = "tc") + +t1 <- system.time(sfo_const <- saem(parent_sep_const["SFO", ]))[["elapsed"]] +t2 <- system.time(dfop_const <- saem(parent_sep_const["DFOP", ]))[["elapsed"]] +t3 <- system.time(sforb_const <- saem(parent_sep_const["SFORB", ]))[["elapsed"]] +t4 <- system.time(hs_const <- saem(parent_sep_const["HS", ]))[["elapsed"]] +t5 <- system.time(sfo_tc <- saem(parent_sep_tc["SFO", ]))[["elapsed"]] +t6 <- system.time(dfop_tc <- saem(parent_sep_tc["DFOP", ]))[["elapsed"]] +t7 <- system.time(sforb_tc <- saem(parent_sep_tc["SFORB", ]))[["elapsed"]] +t8 <- system.time(hs_tc <- saem(parent_sep_tc["HS", ]))[["elapsed"]] +``` + +```{r} +anova( + sfo_const, dfop_const, sforb_const, hs_const, + sfo_tc, dfop_tc, sforb_tc, hs_tc) |> kable(, digits = 1) +``` + +The above model comparison suggests to use the SFORB model with two-component +error. For comparison, we keep the DFOP model with two-component error, +as it competes with SFORB for biphasic curves. + +```{r} +illparms(dfop_tc) +illparms(sforb_tc) +``` + +For these two models, random effects for the transformed parameters `k2` and +`k_DMTA_bound_free` could not be quantified. + + +### One metabolite + +We remove parameters that were found to be ill-defined in the parent only fits. + +```{r one_metabolite, message = FALSE} +one_met_mods <- list( + DFOP_SFO = mkinmod( + DMTA = mkinsub("DFOP", "M23"), + M23 = mkinsub("SFO")), + SFORB_SFO = mkinmod( + DMTA = mkinsub("SFORB", "M23"), + M23 = mkinsub("SFO"))) + +one_met_sep_const <- mmkin(one_met_mods, dmta_ds, error_model = "const", + cores = n_cores, quiet = TRUE) +one_met_sep_tc <- mmkin(one_met_mods, dmta_ds, error_model = "tc", + cores = n_cores, quiet = TRUE) + +t9 <- system.time(dfop_sfo_tc <- saem(one_met_sep_tc["DFOP_SFO", ], + no_random_effect = "log_k2"))[["elapsed"]] +t10 <- system.time(sforb_sfo_tc <- saem(one_met_sep_tc["SFORB_SFO", ], + no_random_effect = "log_k_DMTA_bound_free"))[["elapsed"]] +``` + +### Three metabolites + +For the case of three metabolites, we only keep the SFORB model in order +to limit the time for compiling this vignette, and as fitting in parallel +may disturb the benchmark. Again, we do not include random effects that +were ill-defined in previous fits of subsets of the degradation model. + +```{r} +illparms(sforb_sfo_tc) +``` + +```{r three_metabolites, message = FALSE} +three_met_mods <- list( + SFORB_SFO3_plus = mkinmod( + DMTA = mkinsub("SFORB", c("M23", "M27", "M31")), + M23 = mkinsub("SFO"), + M27 = mkinsub("SFO"), + M31 = mkinsub("SFO", "M27", sink = FALSE))) + +three_met_sep_tc <- mmkin(three_met_mods, dmta_ds, error_model = "tc", + cores = n_cores, quiet = TRUE) + +t11 <- system.time(sforb_sfo3_plus_const <- saem(three_met_sep_tc["SFORB_SFO3_plus", ], + no_random_effect = "log_k_DMTA_bound_free"))[["elapsed"]] +``` + +```{r results, include = FALSE} +saem_benchmarks[system_string, paste0("t", 1:11)] <- + c(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) +save(saem_benchmarks, file = benchmark_path) +# Hide rownames from kable for results section +rownames(saem_benchmarks) <- NULL +``` + +## Results + +Benchmarks for all available error models are shown. They are intended for +improving mkin, not for comparing CPUs or operating systems. All trademarks +belong to their respective owners. + +### Parent only + +Constant variance for SFO, DFOP, SFORB and HS. + +```{r, echo = FALSE} +kable(saem_benchmarks[, c(1:4, 6:9)]) +``` + +Two-component error fits for SFO, DFOP, SFORB and HS. + +```{r, echo = FALSE} +kable(saem_benchmarks[, c(1:4, 10:13)]) +``` + +### One metabolite + +Two-component error for DFOP-SFO and SFORB-SFO. + +```{r, echo = FALSE} +kable(saem_benchmarks[, c(1:4, 14:15)]) +``` + +### Three metabolites + +Two-component error for SFORB-SFO3-plus + +```{r, echo = FALSE} +kable(saem_benchmarks[, c(1:4, 16)]) +``` + |