From 886c9ef013124aa954d960c655b349b5340ff154 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Mon, 19 Dec 2022 12:31:56 +0100 Subject: Rename template folder, create format Instead of rmarkdown::pdf_document, mkin::hierarchical_kinetics is used as a document format in the template. In this way, the template file can be freed from some R code and yaml options that the average user does not have to be aware of. --- .Rbuildignore | 6 +- .gitignore | 6 +- GNUmakefile | 4 +- NAMESPACE | 2 + NEWS.md | 4 + R/hierarchical_kinetics.R | 39 +++++ R/parplot.R | 2 +- .../rmarkdown/templates/hier/skeleton/skeleton.Rmd | 186 --------------------- inst/rmarkdown/templates/hier/template.yaml | 3 - .../hierarchical_kinetics/skeleton/header.tex | 1 + .../hierarchical_kinetics/skeleton/skeleton.Rmd | 162 ++++++++++++++++++ .../templates/hierarchical_kinetics/template.yaml | 3 + log/check.log | 21 ++- man/hierarchical_kinetics.Rd | 29 ++++ 14 files changed, 265 insertions(+), 203 deletions(-) create mode 100644 R/hierarchical_kinetics.R delete mode 100644 inst/rmarkdown/templates/hier/skeleton/skeleton.Rmd delete mode 100644 inst/rmarkdown/templates/hier/template.yaml create mode 100644 inst/rmarkdown/templates/hierarchical_kinetics/skeleton/header.tex create mode 100644 inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd create mode 100644 inst/rmarkdown/templates/hierarchical_kinetics/template.yaml create mode 100644 man/hierarchical_kinetics.Rd diff --git a/.Rbuildignore b/.Rbuildignore index 0dcec29a..1eb33577 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,9 +9,9 @@ ^test.R$ ^mkin_.*\.tar\.gz ^mkin.tar$ -^inst/rmarkdown/templates/hier/skeleton/skeleton.pdf$ -^inst/rmarkdown/templates/hier/skeleton/skeleton_cache -^inst/rmarkdown/templates/hier/skeleton/skeleton_files +^inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.pdf$ +^inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton_cache +^inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton_files ^vignettes/.build.timestamp$ ^vignettes/.*_cache$ ^vignettes/.*cache$ diff --git a/.gitignore b/.gitignore index 4f479259..9808896d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ docs/articles/*_cache/ install.log -inst/rmarkdown/templates/hier/skeleton/skeleton_cache -inst/rmarkdown/templates/hier/skeleton/skeleton_files -inst/rmarkdown/templates/hier/skeleton/skeleton.pdf +inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton_cache +inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton_files +inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.pdf mkin*.tar.gz mkin.tar mkin.Rcheck diff --git a/GNUmakefile b/GNUmakefile index 4680514c..4a33c538 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -24,8 +24,8 @@ pkgfiles = \ DESCRIPTION \ inst/WORDLIST \ inst/dataset_generation/* \ - inst/rmarkdown/templates/hier/template.yaml \ - inst/rmarkdown/templates/hier/skeleton/skeleton.Rmd \ + inst/rmarkdown/templates/hierarchical_kinetics/template.yaml \ + inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd \ inst/testdata/* \ man/* \ NAMESPACE \ diff --git a/NAMESPACE b/NAMESPACE index 107ffc54..84d6b713 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -96,6 +96,7 @@ export(create_deg_func) export(endpoints) export(f_time_norm_focus) export(get_deg_func) +export(hierarchical_kinetics) export(illparms) export(ilr) export(intervals) @@ -187,6 +188,7 @@ importFrom(stats,qf) importFrom(stats,qlogis) importFrom(stats,qnorm) importFrom(stats,qt) +importFrom(stats,quantile) importFrom(stats,residuals) importFrom(stats,rnorm) importFrom(stats,shapiro.test) diff --git a/NEWS.md b/NEWS.md index 7e65204f..2c09df35 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,9 @@ # mkin 1.2.2 +- 'inst/rmarkdown/templates/hier': R markdown template to facilitate the application of hierarchical kinetic models. + +- 'inst/testdata/lambda-cyhalothrin_soil_efsa_2014.xlsx': Example spreadsheet for use with 'read_spreadsheet()'. + - 'R/mhmkin.R': Allow an 'illparms.mhmkin' object or a list with suitable dimensions as value of the argument 'no_random_effects', making it possible to exclude random effects that were ill-defined in simpler variants of the set of degradation models. Remove the possibility to exclude random effects based on separate fits, as it did not work well. - 'R/summary.saem.mmkin.R': List all initial parameter values in the summary, including random effects and error model parameters. Avoid redundant warnings that occurred in the calculation of correlations of the fixed effects in the case that the Fisher information matrix could not be inverted. List correlations of random effects if specified by the user in the covariance model. diff --git a/R/hierarchical_kinetics.R b/R/hierarchical_kinetics.R new file mode 100644 index 00000000..f7ffb333 --- /dev/null +++ b/R/hierarchical_kinetics.R @@ -0,0 +1,39 @@ +#' Hierarchical kinetics template +#' +#' R markdown format for setting up hierarchical kinetics based on a template +#' provided with the mkin package. +#' +#' @inheritParams rmarkdown::pdf_document +#' @param ... Arguments to \code{rmarkdown::pdf_document} +#' +#' @return R Markdown output format to pass to +#' \code{\link[rmarkdown:render]{render}} +#' +#' @examples +#' +#' \dontrun{ +#' library(rmarkdown) +#' draft("New analysis.rmd", template = "hierarchical_kinetics", package = "mkin") +#' } +#' +#' @export +hierarchical_kinetics <- function(..., keep_tex = FALSE) { + + if (getRversion() < "4.1.0") + stop("You need R with version > 4.1.0 to compile this document") + + if (!requireNamespace("knitr")) stop("Please install the knitr package to use this template") + if (!requireNamespace("rmarkdown")) stop("Please install the rmarkdown package to use this template") + knitr::opts_chunk$set(echo = FALSE, cache = TRUE, comment = "", tidy = FALSE) + knitr::opts_chunk$set(fig.align = "center", fig.pos = "H") + options(knitr.kable.NA = "") + + fmt <- rmarkdown::pdf_document(..., + keep_tex = keep_tex, + toc = TRUE, + includes = rmarkdown::includes(in_header = "header.tex"), + extra_dependencies = c("float", "listing", "framed") + ) + + return(fmt) +} diff --git a/R/parplot.R b/R/parplot.R index e9c18947..3da4b51a 100644 --- a/R/parplot.R +++ b/R/parplot.R @@ -23,7 +23,7 @@ #' of the in vitro erythropoiesis. BMC Bioinformatics. 2021 Oct 4;22(1):478. #' doi: 10.1186/s12859-021-04373-4. #' @seealso [multistart] -#' @importFrom stats median +#' @importFrom stats median quantile #' @export parplot <- function(object, ...) { UseMethod("parplot") diff --git a/inst/rmarkdown/templates/hier/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/hier/skeleton/skeleton.Rmd deleted file mode 100644 index df6fa2f9..00000000 --- a/inst/rmarkdown/templates/hier/skeleton/skeleton.Rmd +++ /dev/null @@ -1,186 +0,0 @@ ---- -title: "Hierarchical kinetic modelling of degradation data" -author: -date: Last change on DD MMM YYYY, last compiled on `r format(Sys.time(), - "%e %B %Y")` -output: - pdf_document: - extra_dependencies: ["float", "listing"] -toc: yes -geometry: margin=2cm ---- - - -```{r setup, echo = FALSE, cache = FALSE} -errmods <- c(const = "constant variance", tc = "two-component error") - -knitr::opts_chunk$set( - comment = "", tidy = FALSE, cache = TRUE, fig.pos = "H", fig.align = "center" -) -options(knitr.kable.NA = "") - -# Version requirements -if (getRversion() < "4.1.0") - stop("You need R with version > 4.1.0 to compile this document") -if ((saemix_version <- packageVersion("saemix")) < "3.1") { - warning("Your saemix version is ", saemix_version, - ", you should preferably use 3.2 to compile this document") -} -if ((mkin_version <- packageVersion("mkin")) < "1.2.2") { - stop("Your mkin version is ", mkin_version, - ", you need at least 1.2.2 to compile this document") -} -``` - -```{r packages, cache = FALSE, message = FALSE, warning = FALSE, echo = FALSE} -library(mkin) -library(saemix) -library(parallel) -library(knitr) -``` - -```{r n_cores, cache = FALSE, echo = FALSE} -n_cores <- detectCores() - -if (Sys.info()["sysname"] == "Windows") { - cl <- makePSOCKcluster(n_cores) -} else { - cl <- makeForkCluster(n_cores) -} -``` - -\clearpage - -# Introduction - -This report shows hierarchical kinetic modelling for ... -The data were obtained from ... - -```{r ds} -data_path <- system.file("testdata", "lambda-cyhalothrin_soil_efsa_2014.xlsx", package = "mkin") -ds <- read_spreadsheet(data_path, valid_datasets = c(1:4, 7:13)) -covariates <- attr(ds, "covariates") -``` - -The covariate data are shown below. - -```{r results = "asis", dependson = "ds", echo = FALSE} -kable(covariates, caption = "Covariate data for all datasets") -``` - -\clearpage - -The datasets with the residue time series are shown in the tables below. Please -refer to the spreadsheet for details like data sources, treatment of values -below reporting limits and time step normalisation factors. - -```{r results = "asis", dependson = "ds", echo = FALSE} -for (ds_name in names(ds)) { - print( - kable(mkin_long_to_wide(ds[[ds_name]]), - caption = paste("Dataset", ds_name), - booktabs = TRUE, row.names = FALSE)) - cat("\n\\clearpage\n") -} -``` - -# Parent only evaluations - -The following code performs separate fits of the candidate degradation models -to all datasets using constant variance and the two-component error model. - -```{r parent-sep, dependson = "ds"} -parent_deg_mods <- c("SFO", "FOMC", "DFOP", "SFORB") -parent_sep_const <- mmkin( - parent_deg_mods, ds, - error_model = "const", - cluster = cl, quiet = TRUE) -parent_sep_tc <- update(parent_sep_const, error_model = "tc") -``` - -To select the parent model, the corresponding hierarchical fits are performed below. - -```{r parent-mhmkin, dependson = "parent-sep"} -parent_mhmkin <- mhmkin(list(parent_sep_const, parent_sep_tc), cluster = cl) -status(parent_mhmkin) |> kable() -``` - -All fits terminate without errors (status OK). The check for ill-defined -parameters shows that not all random effect parameters can be robustly -quantified. - -```{r dependson = "parent_mhmkin"} -illparms(parent_mhmkin) |> kable() -``` - -Therefore, the fits are updated, excluding random effects that were -ill-defined according to the `illparms` function. - -```{r parent-mhmkin-refined} -parent_mhmkin_refined <- update(parent_mhmkin, - no_random_effect = illparms(parent_mhmkin)) -status(parent_mhmkin_refined) |> kable() -``` - -The most suitable model is selected based on the AIC. - -```{r dependson = "parent-mhmkin"} -aic_parent <- AIC(parent_mhmkin_refined) -min_aic <- which(aic_parent == min(aic_parent), arr.ind = TRUE) -best_degmod_parent <- rownames(aic_parent)[min_aic[1]] -best_errmod_parent <- colnames(aic_parent)[min_aic[2]] -anova(parent_mhmkin_refined) |> kable(digits = 1) -``` - -Based on the AIC, the combination of the `r best_degmod_parent` degradation -model with the error model `r errmods[best_errmod_parent]` is identified to -be most suitable for the degradation of the parent. The check below -confirms that no ill-defined parameters remain for this combined model. - -```{r dependson = "parent-mhmkin"} -illparms(parent_mhmkin_refined[[best_degmod_parent, best_errmod_parent]]) -``` - -The corresponding fit is shown below. - -```{r parent-best-full, dependson = "parent-mhmkin"} -plot(parent_mhmkin_refined[[best_degmod_parent, best_errmod_parent]]) -``` - -Detailed listings of the parent fits are shown in the Appendix. - -\clearpage - -# Appendix - -## Summaries of saem fits - -### Parent fits - -```{r listings-parent, results = "asis", echo = FALSE} -for (deg_mod in parent_deg_mods) { - for (err_mod in c("const", "tc")) { - caption <- paste("Hierarchical", deg_mod, "fit with", errmods[err_mod]) - tex_listing(parent_mhmkin[[deg_mod, err_mod]], caption) - } -} -``` - -### Refined parent fits - -```{r listings-pathway, results = "asis", echo = FALSE} -for (deg_mod in parent_deg_mods) { - for (err_mod in c("const", "tc")) { - caption <- paste("Refined hierarchical", deg_mod, "fit with", errmods[err_mod]) - tex_listing(parent_mhmkin_refined[[deg_mod, err_mod]], caption) - } -} -``` - -## Session info - -```{r, echo = FALSE} -parallel::stopCluster(cl) -sessionInfo() -``` - diff --git a/inst/rmarkdown/templates/hier/template.yaml b/inst/rmarkdown/templates/hier/template.yaml deleted file mode 100644 index d8ab6a4d..00000000 --- a/inst/rmarkdown/templates/hier/template.yaml +++ /dev/null @@ -1,3 +0,0 @@ -name: Hierarchical kinetics -description: Hierarchical kinetic modelling of degradation data -create_dir: true diff --git a/inst/rmarkdown/templates/hierarchical_kinetics/skeleton/header.tex b/inst/rmarkdown/templates/hierarchical_kinetics/skeleton/header.tex new file mode 100644 index 00000000..a2b7ce83 --- /dev/null +++ b/inst/rmarkdown/templates/hierarchical_kinetics/skeleton/header.tex @@ -0,0 +1 @@ +\definecolor{shadecolor}{RGB}{248,248,248} diff --git a/inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd b/inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd new file mode 100644 index 00000000..74fae164 --- /dev/null +++ b/inst/rmarkdown/templates/hierarchical_kinetics/skeleton/skeleton.Rmd @@ -0,0 +1,162 @@ +--- +title: "Hierarchical kinetic modelling of degradation data" +author: +date: +output: mkin::hierarchical_kinetics +geometry: margin=2cm +--- + +```{r packages, cache = FALSE, message = FALSE} +library(mkin) +library(knitr) +library(saemix) +library(parallel) +library(readxl) +``` + +```{r n_cores, cache = FALSE, echo = FALSE} +n_cores <- detectCores() + +if (Sys.info()["sysname"] == "Windows") { + cl <- makePSOCKcluster(n_cores) +} else { + cl <- makeForkCluster(n_cores) +} +``` + +\clearpage + +# Introduction + +This report shows hierarchical kinetic modelling for ... +The data were obtained from ... + +```{r ds} +data_path <- system.file("testdata", "lambda-cyhalothrin_soil_efsa_2014.xlsx", package = "mkin") +ds <- read_spreadsheet(data_path, valid_datasets = c(1:4, 7:13)) +covariates <- attr(ds, "covariates") +``` + +The covariate data are shown below. + +```{r results = "asis", dependson = "ds", echo = FALSE} +kable(covariates, caption = "Covariate data for all datasets") +``` + +\clearpage + +The datasets with the residue time series are shown in the tables below. Please +refer to the spreadsheet for details like data sources, treatment of values +below reporting limits and time step normalisation factors. + +```{r results = "asis", dependson = "ds", echo = FALSE} +for (ds_name in names(ds)) { + print( + kable(mkin_long_to_wide(ds[[ds_name]]), + caption = paste("Dataset", ds_name), + booktabs = TRUE, row.names = FALSE)) + cat("\n\\clearpage\n") +} +``` + +# Parent only evaluations + +The following code performs separate fits of the candidate degradation models +to all datasets using constant variance and the two-component error model. + +```{r parent-sep, dependson = "ds"} +parent_deg_mods <- c("SFO", "FOMC", "DFOP", "SFORB") +errmods <- c(const = "constant variance", tc = "two-component error") +parent_sep_const <- mmkin( + parent_deg_mods, ds, + error_model = "const", + cluster = cl, quiet = TRUE) +parent_sep_tc <- update(parent_sep_const, error_model = "tc") +``` + +To select the parent model, the corresponding hierarchical fits are performed below. + +```{r parent-mhmkin, dependson = "parent-sep"} +parent_mhmkin <- mhmkin(list(parent_sep_const, parent_sep_tc), cluster = cl) +status(parent_mhmkin) |> kable() +``` + +All fits terminate without errors (status OK). The check for ill-defined +parameters shows that not all random effect parameters can be robustly +quantified. + +```{r dependson = "parent_mhmkin"} +illparms(parent_mhmkin) |> kable() +``` + +Therefore, the fits are updated, excluding random effects that were +ill-defined according to the `illparms` function. + +```{r parent-mhmkin-refined} +parent_mhmkin_refined <- update(parent_mhmkin, + no_random_effect = illparms(parent_mhmkin)) +status(parent_mhmkin_refined) |> kable() +``` + +The most suitable model is selected based on the AIC. + +```{r, dependson = "parent-mhmkin"} +aic_parent <- AIC(parent_mhmkin_refined) +min_aic <- which(aic_parent == min(aic_parent), arr.ind = TRUE) +best_degmod_parent <- rownames(aic_parent)[min_aic[1]] +best_errmod_parent <- colnames(aic_parent)[min_aic[2]] +anova(parent_mhmkin_refined) |> kable(digits = 1) +``` + +Based on the AIC, the combination of the `r best_degmod_parent` degradation +model with the error model `r errmods[best_errmod_parent]` is identified to +be most suitable for the degradation of the parent. The check below +confirms that no ill-defined parameters remain for this combined model. + +```{r dependson = "parent-mhmkin"} +illparms(parent_mhmkin_refined[[best_degmod_parent, best_errmod_parent]]) +``` + +The corresponding fit is shown below. + +```{r parent-best-full, dependson = "parent-mhmkin"} +plot(parent_mhmkin_refined[[best_degmod_parent, best_errmod_parent]]) +``` + +Detailed listings of the parent fits are shown in the Appendix. + +\clearpage + +# Appendix + +## Summaries of saem fits + +### Parent fits + +```{r listings-parent, results = "asis", echo = FALSE, dependson = "parent_mhmkin"} +for (deg_mod in parent_deg_mods) { + for (err_mod in c("const", "tc")) { + caption <- paste("Hierarchical", deg_mod, "fit with", errmods[err_mod]) + tex_listing(parent_mhmkin[[deg_mod, err_mod]], caption) + } +} +``` + +### Refined parent fits + +```{r listings-parent-refined, results = "asis", echo = FALSE, dependson = "parent_mhmkin_refined"} +for (deg_mod in parent_deg_mods) { + for (err_mod in c("const", "tc")) { + caption <- paste("Refined hierarchical", deg_mod, "fit with", errmods[err_mod]) + tex_listing(parent_mhmkin_refined[[deg_mod, err_mod]], caption) + } +} +``` + +## Session info + +```{r, echo = FALSE, cache = FALSE} +parallel::stopCluster(cl) +sessionInfo() +``` + diff --git a/inst/rmarkdown/templates/hierarchical_kinetics/template.yaml b/inst/rmarkdown/templates/hierarchical_kinetics/template.yaml new file mode 100644 index 00000000..d8ab6a4d --- /dev/null +++ b/inst/rmarkdown/templates/hierarchical_kinetics/template.yaml @@ -0,0 +1,3 @@ +name: Hierarchical kinetics +description: Hierarchical kinetic modelling of degradation data +create_dir: true diff --git a/log/check.log b/log/check.log index 42365918..aec61e33 100644 --- a/log/check.log +++ b/log/check.log @@ -1,5 +1,5 @@ * using log directory ‘/home/jranke/git/mkin/mkin.Rcheck’ -* using R version 4.2.2 (2022-10-31) +* using R version 4.2.2 Patched (2022-11-10 r83330) * using platform: x86_64-pc-linux-gnu (64-bit) * using session charset: UTF-8 * using options ‘--no-tests --as-cran’ @@ -18,7 +18,7 @@ Maintainer: ‘Johannes Ranke ’ * checking for portable file names ... OK * checking for sufficient/correct file permissions ... OK * checking serialization versions ... OK -* checking whether package ‘mkin’ can be installed ... [11s/11s] OK +* checking whether package ‘mkin’ can be installed ... OK * checking installed package size ... OK * checking package directory ... OK * checking for future file timestamps ... OK @@ -41,7 +41,14 @@ Maintainer: ‘Johannes Ranke ’ * checking S3 generic/method consistency ... OK * checking replacement functions ... OK * checking foreign function calls ... OK -* checking R code for possible problems ... [19s/19s] OK +* checking R code for possible problems ... NOTE +parplot.multistart.saem.mmkin: no visible global function definition + for ‘quantile’ +Undefined global functions or variables: + quantile +Consider adding + importFrom("stats", "quantile") +to your NAMESPACE file. * checking Rd files ... OK * checking Rd metadata ... OK * checking Rd line widths ... OK @@ -57,7 +64,7 @@ Maintainer: ‘Johannes Ranke ’ * checking data for ASCII and uncompressed saves ... OK * checking installed files from ‘inst/doc’ ... OK * checking files in ‘vignettes’ ... OK -* checking examples ... [24s/24s] OK +* checking examples ... [11s/11s] OK * checking for unstated dependencies in ‘tests’ ... OK * checking tests ... SKIPPED * checking for unstated dependencies in vignettes ... OK @@ -69,5 +76,9 @@ Maintainer: ‘Johannes Ranke ’ * checking for detritus in the temp directory ... OK * DONE -Status: OK +Status: 1 NOTE +See + ‘/home/jranke/git/mkin/mkin.Rcheck/00check.log’ +for details. + diff --git a/man/hierarchical_kinetics.Rd b/man/hierarchical_kinetics.Rd new file mode 100644 index 00000000..4bb82a4c --- /dev/null +++ b/man/hierarchical_kinetics.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/hierarchical_kinetics.R +\name{hierarchical_kinetics} +\alias{hierarchical_kinetics} +\title{Hierarchical kinetics template} +\usage{ +hierarchical_kinetics(..., keep_tex = FALSE) +} +\arguments{ +\item{...}{Arguments to \code{rmarkdown::pdf_document}} + +\item{keep_tex}{Keep the intermediate tex file used in the conversion to PDF} +} +\value{ +R Markdown output format to pass to +\code{\link[rmarkdown:render]{render}} +} +\description{ +R markdown format for setting up hierarchical kinetics based on a template +provided with the mkin package. +} +\examples{ + +\dontrun{ +library(rmarkdown) +draft("New analysis.rmd", template = "hierarchical_kinetics", package = "mkin") +} + +} -- cgit v1.2.1