From 20b9c584e7c43ecbb708459e531c24a1a4751e17 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Sat, 9 Nov 2019 01:05:51 +0100 Subject: Add a lack-of-fit test - Switch an example dataset in the test setup to a dataset with replicates, adapt tests - Skip the test for lrtest with an update specification as it does not only fail when pkgdown generates static help pages, but also in testthat --- NAMESPACE | 5 + NEWS.md | 2 + R/loftest.R | 112 +++++++++++++ R/logLik.mkinfit.R | 11 +- _pkgdown.yml | 1 + docs/news/index.html | 1 + docs/reference/index.html | 6 + docs/reference/loftest-1.png | Bin 0 -> 27354 bytes docs/reference/loftest-2.png | Bin 0 -> 27721 bytes docs/reference/loftest-3.png | Bin 0 -> 65409 bytes docs/reference/loftest-4.png | Bin 0 -> 64457 bytes docs/reference/loftest-5.png | Bin 0 -> 63057 bytes docs/reference/loftest.html | 343 +++++++++++++++++++++++++++++++++++++++ docs/sitemap.xml | 3 + man/loftest.Rd | 81 +++++++++ test.log | 26 +-- tests/testthat/FOCUS_2006_D.csf | 2 +- tests/testthat/setup_script.R | 10 +- tests/testthat/test_confidence.R | 7 +- tests/testthat/test_tests.R | 22 ++- 20 files changed, 605 insertions(+), 27 deletions(-) create mode 100644 R/loftest.R create mode 100644 docs/reference/loftest-1.png create mode 100644 docs/reference/loftest-2.png create mode 100644 docs/reference/loftest-3.png create mode 100644 docs/reference/loftest-4.png create mode 100644 docs/reference/loftest-5.png create mode 100644 docs/reference/loftest.html create mode 100644 man/loftest.Rd diff --git a/NAMESPACE b/NAMESPACE index 8ea4c684..f428a612 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -4,6 +4,7 @@ S3method("[",mmkin) S3method(AIC,mmkin) S3method(BIC,mmkin) S3method(confint,mkinfit) +S3method(loftest,mkinfit) S3method(logLik,mkinfit) S3method(lrtest,mkinfit) S3method(mkinpredict,mkinfit) @@ -32,6 +33,7 @@ export(backtransform_odeparms) export(endpoints) export(ilr) export(invilr) +export(loftest) export(logistic.solution) export(lrtest) export(max_twa_dfop) @@ -73,8 +75,11 @@ importFrom(parallel,parLapply) importFrom(stats,AIC) importFrom(stats,BIC) importFrom(stats,aggregate) +importFrom(stats,coef) importFrom(stats,cov2cor) importFrom(stats,dist) +importFrom(stats,dnorm) +importFrom(stats,lm) importFrom(stats,logLik) importFrom(stats,nlminb) importFrom(stats,nobs) diff --git a/NEWS.md b/NEWS.md index 395cd623..965105f4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # mkin 0.9.49.8 (unreleased) +- 'loftest': Add a lack-of-fit test + - 'plot_res', 'plot_sep' and 'mkinerrplot': Add the possibility to show standardized residuals and make it the default for fits with error models other than 'const' - 'lrtest.mkinfit': Improve naming of the compared fits in the case of fixed parameters diff --git a/R/loftest.R b/R/loftest.R new file mode 100644 index 00000000..29721e23 --- /dev/null +++ b/R/loftest.R @@ -0,0 +1,112 @@ +#' Lack-of-fit test for models fitted to data with replicates +#' +#' This is a generic function with a method currently only defined for mkinfit +#' objects. It fits an anova model to the data contained in the object and +#' compares the likelihoods using the likelihood ratio test +#' \code{\link[lmtest]{lrtest.default}} from the lmtest package. +#' +#' The anova model is interpreted as the simplest form of an mkinfit model, +#' assuming only a constant variance about the means, but not enforcing any +#' structure of the means, so we have one model parameter for every mean +#' of replicate samples. +#' +#' @param object A model object with a defined loftest method +#' @param \dots Not used +#' @export +loftest <- function(object, ...) { + UseMethod("loftest") +} + +#' @rdname loftest +#' @importFrom stats logLik lm dnorm coef +#' @seealso lrtest +#' @examples +#' \dontrun{ +#' test_data <- subset(synthetic_data_for_UBA_2014[[12]]$data, name == "parent") +#' sfo_fit <- mkinfit("SFO", test_data, quiet = TRUE) +#' plot_res(sfo_fit) # We see a clear pattern in the residuals +#' loftest(sfo_fit) # We have a clear lack of fit +#' # +#' # We try a different model (the one that was used to generate the data) +#' dfop_fit <- mkinfit("DFOP", test_data, quiet = TRUE) +#' plot_res(dfop_fit) # We don't see systematic deviations, but heteroscedastic residuals +#' # therefore we should consider adapting the error model, although we have +#' loftest(dfop_fit) # no lack of fit +#' # +#' # This is the anova model used internally for the comparison +#' test_data_anova <- test_data +#' test_data_anova$time <- as.factor(test_data_anova$time) +#' anova_fit <- lm(value ~ time, data = test_data_anova) +#' summary(anova_fit) +#' logLik(anova_fit) # We get the same likelihood and degrees of freedom +#' # +#' test_data_2 <- synthetic_data_for_UBA_2014[[12]]$data +#' m_synth_SFO_lin <- mkinmod(parent = list(type = "SFO", to = "M1"), +#' M1 = list(type = "SFO", to = "M2"), +#' M2 = list(type = "SFO"), use_of_ff = "max") +#' sfo_lin_fit <- mkinfit(m_synth_SFO_lin, test_data_2, quiet = TRUE) +#' plot_res(sfo_lin_fit) # not a good model, we try parallel formation +#' loftest(sfo_lin_fit) +#' # +#' m_synth_SFO_par <- mkinmod(parent = list(type = "SFO", to = c("M1", "M2")), +#' M1 = list(type = "SFO"), +#' M2 = list(type = "SFO"), use_of_ff = "max") +#' sfo_par_fit <- mkinfit(m_synth_SFO_par, test_data_2, quiet = TRUE) +#' plot_res(sfo_par_fit) # much better for metabolites +#' loftest(sfo_par_fit) +#' # +#' m_synth_DFOP_par <- mkinmod(parent = list(type = "DFOP", to = c("M1", "M2")), +#' M1 = list(type = "SFO"), +#' M2 = list(type = "SFO"), use_of_ff = "max") +#' dfop_par_fit <- mkinfit(m_synth_DFOP_par, test_data_2, quiet = TRUE) +#' plot_res(dfop_par_fit) # No visual lack of fit +#' loftest(dfop_par_fit) # no lack of fit found by the test +#' # +#' # The anova model used for comparison in the case of transformation products +#' test_data_anova_2 <- dfop_par_fit$data +#' test_data_anova_2$variable <- as.factor(test_data_anova_2$variable) +#' test_data_anova_2$time <- as.factor(test_data_anova_2$time) +#' anova_fit_2 <- lm(observed ~ time:variable - 1, data = test_data_anova_2) +#' summary(anova_fit_2) +#' } +#' @export +loftest.mkinfit <- function(object, ...) { + + name_function <- function(x) { + object_name <- paste(x$mkinmod$name, "with error model", x$err_mod) + if (length(x$bparms.fixed) > 0) { + object_name <- paste(object_name, + "and fixed parameter(s)", + paste(names(x$bparms.fixed), collapse = ", ")) + } + return(object_name) + } + + # Check if we have replicates in the data + if (max(aggregate(object$data$observed, + by = list(object$data$variable, object$data$time), length)$x) == 1) { + stop("Not defined for fits to data without replicates") + } + + data_anova <- object$data + data_anova$time <- as.factor(data_anova$time) + data_anova$variable <- as.factor(data_anova$variable) + if (nlevels(data_anova$variable) == 1) { + object_2 <- lm(observed ~ time - 1, data = data_anova) + } else { + object_2 <- lm(observed ~ variable:time - 1, + data = data_anova) + } + + object_2$mkinmod <- list(name = "ANOVA") + object_2$err_mod <- "const" + sigma_mle <- sqrt(sum(residuals(object_2)^2)/nobs(object_2)) + object_2$logLik <- sum(dnorm(x = object_2$residuals, + mean = 0, sd = sigma_mle, log = TRUE)) + object_2$data <- object$data # to make the nobs.mkinfit method work + object_2$bparms.optim <- coef(object_2) + object_2$errparms <- 1 # We have estimated one error model parameter + class(object_2) <- "mkinfit" + + lmtest::lrtest.default(object_2, object, name = name_function) +} diff --git a/R/logLik.mkinfit.R b/R/logLik.mkinfit.R index cadc0d0a..1c025893 100644 --- a/R/logLik.mkinfit.R +++ b/R/logLik.mkinfit.R @@ -1,15 +1,15 @@ #' Calculated the log-likelihood of a fitted mkinfit object -#' +#' #' This function returns the product of the likelihood densities of each #' observed value, as calculated as part of the fitting procedure using #' \code{\link{dnorm}}, i.e. assuming normal distribution, and with the means #' predicted by the degradation model, and the standard deviations predicted by #' the error model. -#' +#' #' The total number of estimated parameters returned with the value of the #' likelihood is calculated as the sum of fitted degradation model parameters #' and the fitted error model parameters. -#' +#' #' @param object An object of class \code{\link{mkinfit}}. #' @param \dots For compatibility with the generic method #' @return An object of class \code{\link{logLik}} with the number of estimated @@ -19,7 +19,7 @@ #' @seealso Compare the AIC of columns of \code{\link{mmkin}} objects using #' \code{\link{AIC.mmkin}}. #' @examples -#' +#' #' \dontrun{ #' sfo_sfo <- mkinmod( #' parent = mkinsub("SFO", to = "m1"), @@ -31,11 +31,12 @@ #' f_tc <- mkinfit(sfo_sfo, d_t, error_model = "tc", quiet = TRUE) #' AIC(f_nw, f_obs, f_tc) #' } -#' +#' #' @export logLik.mkinfit <- function(object, ...) { val <- object$logLik # Number of estimated parameters attr(val, "df") <- length(object$bparms.optim) + length(object$errparms) + class(val) <- "logLik" return(val) } diff --git a/_pkgdown.yml b/_pkgdown.yml index c222a817..c298256f 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -22,6 +22,7 @@ reference: - confint.mkinfit - update.mkinfit - lrtest.mkinfit + - loftest - mkinerrmin - endpoints - CAKE_export diff --git a/docs/news/index.html b/docs/news/index.html index 48ba25e5..9aa2e18b 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -134,6 +134,7 @@ mkin 0.9.49.8 (unreleased) Unreleased @@ -425,7 +425,7 @@ summary {

Development

-

Contributions are welcome! Your mkin fork is just a mouse click away… The master branch on github should always be in good shape, I implement new features in separate branches now. If you prefer subversion, project members for the r-forge project are welcome as well. Generally, the source code of the latest CRAN version should be available there. You can also browse the source code at cgit.jrwb.de/mkin.

+

Contributions are welcome!

diff --git a/README.md b/README.md index e89bdc72..602324fa 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ and at [R-Forge](http://kinfit.r-forge.r-project.org/mkin_static/index.html). so their estimators can more reasonably be expected to follow a normal distribution. This has the side effect that no constraints are needed in the optimisation. Thanks to René Lehmann for the nice - cooperation on this, especially the isometric logration transformation + cooperation on this, especially the isometric log-ratio transformation that is now used for the formation fractions. * A side effect of this is that when parameter estimates are backtransformed to match the model definition, confidence intervals calculated from @@ -91,9 +91,9 @@ and at [R-Forge](http://kinfit.r-forge.r-project.org/mkin_static/index.html). * Three different error models can be selected using the argument `error_model` to the [`mkinfit`](https://pkgdown.jrwb.de/mkin/reference/mkinfit.html) function. -* Iteratively reweighted least squares fitting is now obsolete, and the - variance by variable error model should now be specified as `error_model - = "obs"`. +* The 'variance by variable' error model which is often fitted using + Iteratively Reweighted Least Squares (IRLS) should now be specified as + `error_model = "obs"`. * A two-component error model similar to the one proposed by [Rocke and Lorenzato](https://pkgdown.jrwb.de/mkin/reference/sigma_twocomp.html) can be selected using the argument `error_model = "tc"`. @@ -160,11 +160,4 @@ will hopefully be able to learn from each other in the future as well. ## Development -Contributions are welcome! Your -[mkin fork](https://help.github.com/articles/fork-a-repo) is just a mouse click -away... The master branch on github should always be in good shape, I implement -new features in separate branches now. If you prefer subversion, project -members for the -[r-forge project](http://r-forge.r-project.org/R/?group_id=615) are welcome as well. -Generally, the source code of the latest CRAN version should be available there. -You can also browse the source code at [cgit.jrwb.de/mkin](http://cgit.jrwb.de/mkin). +Contributions are welcome! diff --git a/docs/index.html b/docs/index.html index 231ef39f..c89fc122 100644 --- a/docs/index.html +++ b/docs/index.html @@ -127,14 +127,14 @@
  • As of version 0.9-39, fitting of several models to several datasets, optionally in parallel, is supported, see for example plot.mmkin.
  • Model solution (forward modelling) in the function mkinpredict is performed either using the analytical solution for the case of parent only degradation, an eigenvalue based solution if only simple first-order (SFO) or SFORB kinetics are used in the model, or using a numeric solver from the deSolve package (default is lsoda).
  • If a C compiler is installed, the kinetic models are compiled from automatically generated C code, see vignette compiled_models. The autogeneration of C code was inspired by the ccSolve package. Thanks to Karline Soetaert for her work on that.
  • -
  • By default, kinetic rate constants and kinetic formation fractions are transformed internally using transform_odeparms so their estimators can more reasonably be expected to follow a normal distribution. This has the side effect that no constraints are needed in the optimisation. Thanks to René Lehmann for the nice cooperation on this, especially the isometric logration transformation that is now used for the formation fractions.
  • +
  • By default, kinetic rate constants and kinetic formation fractions are transformed internally using transform_odeparms so their estimators can more reasonably be expected to follow a normal distribution. This has the side effect that no constraints are needed in the optimisation. Thanks to René Lehmann for the nice cooperation on this, especially the isometric log-ratio transformation that is now used for the formation fractions.
  • A side effect of this is that when parameter estimates are backtransformed to match the model definition, confidence intervals calculated from standard errors are also backtransformed to the correct scale, and will not include meaningless values like negative rate constants or formation fractions adding up to more than 1, which can not occur in a single experiment with a single defined radiolabel position.
  • The usual one-sided t-test for significant difference from zero is nevertheless shown based on estimators for the untransformed parameters.
  • Summary and plotting functions. The summary of an mkinfit object is in fact a full report that should give enough information to be able to approximately reproduce the fit with other tools.
  • The chi-squared error level as defined in the FOCUS kinetics guidance (see below) is calculated for each observed variable.
  • When a metabolite decline phase is not described well by SFO kinetics, SFORB kinetics can be used for the metabolite.
  • Three different error models can be selected using the argument error_model to the mkinfit function.
  • -
  • Iteratively reweighted least squares fitting is now obsolete, and the variance by variable error model should now be specified as error_model = "obs".
  • +
  • The ‘variance by variable’ error model which is often fitted using Iteratively Reweighted Least Squares (IRLS) should now be specified as error_model = "obs".
  • A two-component error model similar to the one proposed by Rocke and Lorenzato can be selected using the argument error_model = "tc".
  • @@ -163,7 +163,7 @@

    Development

    -

    Contributions are welcome! Your mkin fork is just a mouse click away… The master branch on github should always be in good shape, I implement new features in separate branches now. If you prefer subversion, project members for the r-forge project are welcome as well. Generally, the source code of the latest CRAN version should be available there. You can also browse the source code at cgit.jrwb.de/mkin.

    +

    Contributions are welcome!

    -- cgit v1.2.1 From 51535c943d2846bc73ad69a11909aac606996b7d Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Wed, 13 Nov 2019 22:16:43 +0100 Subject: Improve formatting using markdown --- R/aw.R | 16 +++++++--------- docs/reference/aw.html | 12 ++++++------ man/aw.Rd | 12 ++++++------ 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/R/aw.R b/R/aw.R index 24078f38..f46b20ec 100644 --- a/R/aw.R +++ b/R/aw.R @@ -4,16 +4,17 @@ #' expected Kullback-Leibler information as specified #' by Burnham and Anderson (2004). #' -#' @param object An mmkin column object, containing two or more -#' \code{\link{mkinfit}} models that have been fitted to the same data, +#' @param object An [mmkin] column object, containing two or more +#' [mkinfit] models that have been fitted to the same data, #' or an mkinfit object. In the latter case, further mkinfit #' objects fitted to the same data should be specified #' as dots arguments. -#' @param \dots Not used in the method for mmkin column objects, -#' further mkinfit objects in the method for mkinfit objects. +#' @param \dots Not used in the method for [mmkin] column objects, +#' further [mkinfit] objects in the method for mkinfit objects. #' @references Burnham KP and Anderson DR (2004) Multimodel -#' Inference: Understanding AIC and BIC in Model Selection -#' Sociological Methods & Research 33(2) 261-304 +#' Inference: Understanding AIC and BIC in Model Selection. +#' *Sociological Methods & Research* **33**(2) 261-304 +#' @md #' @examples #' \dontrun{ #' f_sfo <- mkinfit("SFO", FOCUS_2006_D, quiet = TRUE) @@ -55,6 +56,3 @@ aw.mmkin <- function(object, ...) { if (ncol(object) > 1) stop("Please supply an mmkin column object") do.call(aw, object) } - - - diff --git a/docs/reference/aw.html b/docs/reference/aw.html index b6f3ce48..22201229 100644 --- a/docs/reference/aw.html +++ b/docs/reference/aw.html @@ -153,24 +153,24 @@ by Burnham and Anderson (2004).

    object -

    An mmkin column object, containing two or more -mkinfit models that have been fitted to the same data, +

    An mmkin column object, containing two or more +mkinfit models that have been fitted to the same data, or an mkinfit object. In the latter case, further mkinfit objects fitted to the same data should be specified as dots arguments.

    ... -

    Not used in the method for mmkin column objects, -further mkinfit objects in the method for mkinfit objects.

    +

    Not used in the method for mmkin column objects, +further mkinfit objects in the method for mkinfit objects.

    References

    Burnham KP and Anderson DR (2004) Multimodel - Inference: Understanding AIC and BIC in Model Selection - Sociological Methods & Research 33(2) 261-304

    +Inference: Understanding AIC and BIC in Model Selection. +Sociological Methods & Research 33(2) 261-304

    Examples

    # \dontrun{ diff --git a/man/aw.Rd b/man/aw.Rd index f0994b94..40676716 100644 --- a/man/aw.Rd +++ b/man/aw.Rd @@ -13,14 +13,14 @@ aw(object, ...) \method{aw}{mmkin}(object, ...) } \arguments{ -\item{object}{An mmkin column object, containing two or more -\code{\link{mkinfit}} models that have been fitted to the same data, +\item{object}{An \link{mmkin} column object, containing two or more +\link{mkinfit} models that have been fitted to the same data, or an mkinfit object. In the latter case, further mkinfit objects fitted to the same data should be specified as dots arguments.} -\item{\dots}{Not used in the method for mmkin column objects, -further mkinfit objects in the method for mkinfit objects.} +\item{\dots}{Not used in the method for \link{mmkin} column objects, +further \link{mkinfit} objects in the method for mkinfit objects.} } \description{ Akaike weights are calculated based on the relative @@ -42,6 +42,6 @@ aw(f[c("SFO", "DFOP")]) } \references{ Burnham KP and Anderson DR (2004) Multimodel - Inference: Understanding AIC and BIC in Model Selection - Sociological Methods & Research 33(2) 261-304 +Inference: Understanding AIC and BIC in Model Selection. +\emph{Sociological Methods & Research} \strong{33}(2) 261-304 } -- cgit v1.2.1 From 7ea467e0e0ba5bf51540b26e197869a58ed1a092 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Mon, 9 Dec 2019 15:21:11 +0100 Subject: Consistently use "two-component error model" instead of "two component error model" --- R/sigma_twocomp.R | 2 +- docs/reference/index.html | 2 +- docs/reference/sigma_twocomp.html | 8 ++++---- man/sigma_twocomp.Rd | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/R/sigma_twocomp.R b/R/sigma_twocomp.R index c9a15aa8..1e012d15 100644 --- a/R/sigma_twocomp.R +++ b/R/sigma_twocomp.R @@ -1,4 +1,4 @@ -#' Two component error model +#' Two-component error model #' #' Function describing the standard deviation of the measurement error in #' dependence of the measured value \eqn{y}: diff --git a/docs/reference/index.html b/docs/reference/index.html index 3d417267..73dfbe4c 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -444,7 +444,7 @@ kinetic models fitted with mkinfit

    sigma_twocomp()

    -

    Two component error model

    +

    Two-component error model

    diff --git a/docs/reference/sigma_twocomp.html b/docs/reference/sigma_twocomp.html index d95e1c28..1795e6c3 100644 --- a/docs/reference/sigma_twocomp.html +++ b/docs/reference/sigma_twocomp.html @@ -6,7 +6,7 @@ -Two component error model — sigma_twocomp • mkin +Two-component error model — sigma_twocomp • mkin @@ -35,7 +35,7 @@ - + @@ -70,7 +70,7 @@ dependence of the measured value \(y\):" /> mkin - 0.9.49.6 + 0.9.49.8
    @@ -128,7 +128,7 @@ dependence of the measured value \(y\):" />
    diff --git a/man/sigma_twocomp.Rd b/man/sigma_twocomp.Rd index 3e7854f1..0004144f 100644 --- a/man/sigma_twocomp.Rd +++ b/man/sigma_twocomp.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/sigma_twocomp.R \name{sigma_twocomp} \alias{sigma_twocomp} -\title{Two component error model} +\title{Two-component error model} \usage{ sigma_twocomp(y, sigma_low, rsd_high) } -- cgit v1.2.1 From 49d80b149ec36eb967cb6da3a8b6726e48bf0ecc Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Tue, 10 Dec 2019 20:46:05 +0100 Subject: Update and amend the README --- README.html | 19 +++++++++++++++++-- README.md | 24 +++++++++++++++++++++--- docs/index.html | 22 ++++++++++++++++++++-- 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/README.html b/README.html index 1e9d7932..dd4ea2c4 100644 --- a/README.html +++ b/README.html @@ -414,8 +414,8 @@ summary {

    Credits and historical remarks

    -

    mkin would not be possible without the underlying software stack consisting of R and the packages deSolve and FME, to say the least.

    -

    It could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits from and largely follows the work done by the FOCUS Degradation Kinetics Workgroup, as detailed in their guidance document from 2006, slightly updated in 2011 and in 2014.

    +

    mkin would not be possible without the underlying software stack consisting of R and the package deSolve. In previous version, mkin was also using the functionality of the FME package.

    +

    mkin could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits from and largely follows the work done by the FOCUS Degradation Kinetics Workgroup, as detailed in their guidance document from 2006, slightly updated in 2011 and in 2014.

    Also, it was inspired by the first version of KinGUI developed by BayerCropScience, which is based on the MatLab runtime environment.

    The companion package kinfit (now deprecated) was started in 2008 and first published on CRAN on 01 May 2010.

    The first mkin code was published on 11 May 2010 and the first CRAN version on 18 May 2010.

    @@ -423,6 +423,21 @@ summary {

    Somewhat in parallel, Syngenta has sponsored the development of an mkin and KinGUII based GUI application called CAKE, which also adds IRLS and MCMC, is more limited in the model formulation, but puts more weight on usability. CAKE is available for download from the CAKE website, where you can also find a zip archive of the R scripts derived from mkin, published under the GPL license.

    Finally, there is KineticEval, which contains a further development of the scripts used for KinGUII, so the different tools will hopefully be able to learn from each other in the future as well.

    +
    +

    References

    + + + + + + + +
    +Ranke J, Meinecke S (2019) Error Models for the Kinetic Evaluation of Chemical Degradation Data Environments 6 (12) 124 doi:10.3390/environments6120124 +
    +Ranke J, Wöltjen J, Meinecke S (2018) Comparison of software tools for kinetic evaluation of chemical degradation data Environmental Sciences Europe 30 17 doi:10.1186/s12302-018-0145-1 +
    +

    Development

    Contributions are welcome!

    diff --git a/README.md b/README.md index 602324fa..acbad934 100644 --- a/README.md +++ b/README.md @@ -112,10 +112,11 @@ and one for the [github master branch](https://github.com/jranke/mkin/blob/maste ## Credits and historical remarks `mkin` would not be possible without the underlying software stack consisting -of R and the packages [deSolve](https://cran.r-project.org/package=deSolve) -and [FME](https://cran.r-project.org/package=FME), to say the least. +of R and the package [deSolve](https://cran.r-project.org/package=deSolve). +In previous version, `mkin` was also using the functionality of the +[FME](https://cran.r-project.org/package=FME) package. -It could not have been written without me being introduced to regulatory fate +`mkin` could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). `mkin` greatly profits from and largely follows the work done by the @@ -157,6 +158,23 @@ Finally, there is a further development of the scripts used for KinGUII, so the different tools will hopefully be able to learn from each other in the future as well. +## References + + + + + +
    Ranke J, Meinecke S (2019) + Error Models for the Kinetic Evaluation of Chemical Degradation Data + Environments + 6 (12) 124 + doi:10.3390/environments6120124 +
    Ranke J, Wöltjen J, Meinecke S (2018) + Comparison of software tools for kinetic evaluation of chemical degradation data + Environmental Sciences Europe + 30 17 + doi:10.1186/s12302-018-0145-1 +
    ## Development diff --git a/docs/index.html b/docs/index.html index c89fc122..2e960df1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -151,8 +151,8 @@

    Credits and historical remarks

    -

    mkin would not be possible without the underlying software stack consisting of R and the packages deSolve and FME, to say the least.

    -

    It could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits from and largely follows the work done by the FOCUS Degradation Kinetics Workgroup, as detailed in their guidance document from 2006, slightly updated in 2011 and in 2014.

    +

    mkin would not be possible without the underlying software stack consisting of R and the package deSolve. In previous version, mkin was also using the functionality of the FME package.

    +

    mkin could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits from and largely follows the work done by the FOCUS Degradation Kinetics Workgroup, as detailed in their guidance document from 2006, slightly updated in 2011 and in 2014.

    Also, it was inspired by the first version of KinGUI developed by BayerCropScience, which is based on the MatLab runtime environment.

    The companion package kinfit (now deprecated) was started in 2008 and first published on CRAN on 01 May 2010.

    The first mkin code was published on 11 May 2010 and the first CRAN version on 18 May 2010.

    @@ -160,6 +160,24 @@

    Somewhat in parallel, Syngenta has sponsored the development of an mkin and KinGUII based GUI application called CAKE, which also adds IRLS and MCMC, is more limited in the model formulation, but puts more weight on usability. CAKE is available for download from the CAKE website, where you can also find a zip archive of the R scripts derived from mkin, published under the GPL license.

    Finally, there is KineticEval, which contains a further development of the scripts used for KinGUII, so the different tools will hopefully be able to learn from each other in the future as well.

    +
    +

    +References

    + + + +
    Ranke J, Meinecke S (2019) + Error Models for the Kinetic Evaluation of Chemical Degradation Data + Environments + 6 (12) 124 + doi:10.3390/environments6120124 +
    Ranke J, Wöltjen J, Meinecke S (2018) + Comparison of software tools for kinetic evaluation of chemical degradation data + Environmental Sciences Europe + 30 17 + doi:10.1186/s12302-018-0145-1 +
    +

    Development

    -- cgit v1.2.1 From 7c8e06d4bae9ec80574147005b7e933937447220 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Tue, 10 Dec 2019 20:56:10 +0100 Subject: More additions to the README --- README.html | 2 +- README.md | 10 +++++++--- docs/index.html | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/README.html b/README.html index dd4ea2c4..d7ebe451 100644 --- a/README.html +++ b/README.html @@ -414,7 +414,7 @@ summary {

    Credits and historical remarks

    -

    mkin would not be possible without the underlying software stack consisting of R and the package deSolve. In previous version, mkin was also using the functionality of the FME package.

    +

    mkin would not be possible without the underlying software stack consisting of, among others, R and the package deSolve. In previous version, mkin was also using the functionality of the FME package. Please refer to the package page on CRAN for the full list of imported and suggested R packages. Also, Debian Linux, the vim editor and the Nvim-R plugin have been invaluable in its development.

    mkin could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits from and largely follows the work done by the FOCUS Degradation Kinetics Workgroup, as detailed in their guidance document from 2006, slightly updated in 2011 and in 2014.

    Also, it was inspired by the first version of KinGUI developed by BayerCropScience, which is based on the MatLab runtime environment.

    The companion package kinfit (now deprecated) was started in 2008 and first published on CRAN on 01 May 2010.

    diff --git a/README.md b/README.md index acbad934..8a0ecc50 100644 --- a/README.md +++ b/README.md @@ -111,10 +111,14 @@ and one for the [github master branch](https://github.com/jranke/mkin/blob/maste ## Credits and historical remarks -`mkin` would not be possible without the underlying software stack consisting -of R and the package [deSolve](https://cran.r-project.org/package=deSolve). +`mkin` would not be possible without the underlying software stack consisting of, +among others, R and the package [deSolve](https://cran.r-project.org/package=deSolve). In previous version, `mkin` was also using the functionality of the -[FME](https://cran.r-project.org/package=FME) package. +[FME](https://cran.r-project.org/package=FME) package. Please refer to the +[package page on CRAN](https://cran.r-project.org/package=mkin) for the full list +of imported and suggested R packages. Also, [Debian Linux](https://debian.org), +the vim editor and the [Nvim-R](https://github.com/jalvesaq/Nvim-R) plugin have +been invaluable in its development. `mkin` could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories diff --git a/docs/index.html b/docs/index.html index 2e960df1..fcb9c90b 100644 --- a/docs/index.html +++ b/docs/index.html @@ -151,7 +151,7 @@

    Credits and historical remarks

    -

    mkin would not be possible without the underlying software stack consisting of R and the package deSolve. In previous version, mkin was also using the functionality of the FME package.

    +

    mkin would not be possible without the underlying software stack consisting of, among others, R and the package deSolve. In previous version, mkin was also using the functionality of the FME package. Please refer to the package page on CRAN for the full list of imported and suggested R packages. Also, Debian Linux, the vim editor and the Nvim-R plugin have been invaluable in its development.

    mkin could not have been written without me being introduced to regulatory fate modelling of pesticides by Adrian Gurney during my time at Harlan Laboratories Ltd (formerly RCC Ltd). mkin greatly profits from and largely follows the work done by the FOCUS Degradation Kinetics Workgroup, as detailed in their guidance document from 2006, slightly updated in 2011 and in 2014.

    Also, it was inspired by the first version of KinGUI developed by BayerCropScience, which is based on the MatLab runtime environment.

    The companion package kinfit (now deprecated) was started in 2008 and first published on CRAN on 01 May 2010.

    -- cgit v1.2.1 From 1868c1c6b98afa4c8a11b7c065d717bfb4ec1a8e Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Mon, 16 Dec 2019 02:51:19 +0100 Subject: Argument ymax for plot.mmkin --- R/plot.mmkin.R | 26 ++++++++++++++++---------- docs/reference/plot.mmkin.html | 8 ++++++-- man/plot.mmkin.Rd | 4 +++- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/R/plot.mmkin.R b/R/plot.mmkin.R index eefafe12..182e74ca 100644 --- a/R/plot.mmkin.R +++ b/R/plot.mmkin.R @@ -1,13 +1,13 @@ #' Plot model fits (observed and fitted) and the residuals for a row or column #' of an mmkin object -#' +#' #' When x is a row selected from an mmkin object (\code{\link{[.mmkin}}), the #' same model fitted for at least one dataset is shown. When it is a column, #' the fit of at least one model to the same dataset is shown. -#' +#' #' If the current plot device is a \code{\link[tikzDevice]{tikz}} device, then #' latex is being used for the formatting of the chi2 error level. -#' +#' #' @param x An object of class \code{\link{mmkin}}, with either one row or one #' column. #' @param main The main title placed on the outer margin of the plot. @@ -24,12 +24,13 @@ #' @param cex Passed to the plot functions and \code{\link{mtext}}. #' @param rel.height.middle The relative height of the middle plot, if more #' than two rows of plots are shown. +#' @param ymax Maximum y axis value for \code{\link{plot.mkinfit}}. #' @param \dots Further arguments passed to \code{\link{plot.mkinfit}} and #' \code{\link{mkinresplot}}. #' @return The function is called for its side effect. #' @author Johannes Ranke #' @examples -#' +#' #' \dontrun{ #' # Only use one core not to offend CRAN checks #' fits <- mmkin(c("FOMC", "HS"), @@ -37,22 +38,23 @@ #' cores = 1, quiet = TRUE, error_model = "tc") #' plot(fits[, "FOCUS C"]) #' plot(fits["FOMC", ]) -#' +#' #' # We can also plot a single fit, if we like the way plot.mmkin works, but then the plot #' # height should be smaller than the plot width (this is not possible for the html pages #' # generated by pkgdown, as far as I know). #' plot(fits["FOMC", "FOCUS C"]) # same as plot(fits[1, 2]) -#' +#' #' # Show the error models #' plot(fits["FOMC", ], resplot = "errmod") #' } -#' +#' #' @export -plot.mmkin <- function(x, main = "auto", legends = 1, +plot.mmkin <- function(x, main = "auto", legends = 1, resplot = c("time", "errmod"), show_errmin = TRUE, errmin_var = "All data", errmin_digits = 3, - cex = 0.7, rel.height.middle = 0.9, ...) { + cex = 0.7, rel.height.middle = 0.9, + ymax = "auto", ...) { n.m <- nrow(x) n.d <- ncol(x) @@ -107,7 +109,11 @@ plot.mmkin <- function(x, main = "auto", legends = 1, } fit <- x[[i.fit]] - plot(fit, legend = legends == i.fit, ...) + if (ymax == "auto") { + plot(fit, legend = legends == i.fit, ...) + } else { + plot(fit, legend = legends == i.fit, ylim = c(0, ymax), ...) + } title(main, outer = TRUE, line = -2) diff --git a/docs/reference/plot.mmkin.html b/docs/reference/plot.mmkin.html index 8b68cfae..18907aa2 100644 --- a/docs/reference/plot.mmkin.html +++ b/docs/reference/plot.mmkin.html @@ -73,7 +73,7 @@ the fit of at least one model to the same dataset is shown." /> mkin - 0.9.49.6 + 0.9.49.8
    @@ -147,7 +147,7 @@ the fit of at least one model to the same dataset is shown.

    plot(x, main = "auto", legends = 1, resplot = c("time", "errmod"), show_errmin = TRUE, errmin_var = "All data", errmin_digits = 3, cex = 0.7, - rel.height.middle = 0.9, ...)
    + rel.height.middle = 0.9, ymax = "auto", ...)

    Arguments

    @@ -195,6 +195,10 @@ chi2 error percentage.

    + + + +

    The relative height of the middle plot, if more than two rows of plots are shown.

    ymax

    Maximum y axis value for plot.mkinfit.

    ...

    Further arguments passed to plot.mkinfit and diff --git a/man/plot.mmkin.Rd b/man/plot.mmkin.Rd index 333998da..605e458e 100644 --- a/man/plot.mmkin.Rd +++ b/man/plot.mmkin.Rd @@ -8,7 +8,7 @@ of an mmkin object} \method{plot}{mmkin}(x, main = "auto", legends = 1, resplot = c("time", "errmod"), show_errmin = TRUE, errmin_var = "All data", errmin_digits = 3, cex = 0.7, - rel.height.middle = 0.9, ...) + rel.height.middle = 0.9, ymax = "auto", ...) } \arguments{ \item{x}{An object of class \code{\link{mmkin}}, with either one row or one @@ -36,6 +36,8 @@ chi2 error percentage.} \item{rel.height.middle}{The relative height of the middle plot, if more than two rows of plots are shown.} +\item{ymax}{Maximum y axis value for \code{\link{plot.mkinfit}}.} + \item{\dots}{Further arguments passed to \code{\link{plot.mkinfit}} and \code{\link{mkinresplot}}.} } -- cgit v1.2.1 From bc42b66fab81afaf4fd90aeb24cdf2b0c2d44202 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Wed, 8 Jan 2020 15:06:49 +0100 Subject: Typos in NEWS, update static docs --- NEWS.md | 2 +- docs/news/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/NEWS.md b/NEWS.md index 28cf76ad..622a82b0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,7 +14,7 @@ - Fix a bug introduced in 0.9.49.6 that occurred if the direct optimisation yielded a higher likelihood than the three-step optimisation in the d_3 algorithm, which caused the fitted parameters of the three-step optimisation to be returned instead of the parameters of the direct optimisation -- Add an 'nobs' method for mkinfit methods, enabling the default 'BIC' method from the stats package. Also, add a 'BIC' method for mmkin column objects. +- Add a 'nobs' method for mkinfit objects, enabling the default 'BIC' method from the stats package. Also, add a 'BIC' method for mmkin column objects. # mkin 0.9.49.6 (2019-10-31) diff --git a/docs/news/index.html b/docs/news/index.html index 6b0b89fa..00257521 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -147,7 +147,7 @@

    • Fix a bug introduced in 0.9.49.6 that occurred if the direct optimisation yielded a higher likelihood than the three-step optimisation in the d_3 algorithm, which caused the fitted parameters of the three-step optimisation to be returned instead of the parameters of the direct optimisation

    • -
    • Add an ‘nobs’ method for mkinfit methods, enabling the default ‘BIC’ method from the stats package. Also, add a ‘BIC’ method for mmkin column objects.

    • +
    • Add a ‘nobs’ method for mkinfit objects, enabling the default ‘BIC’ method from the stats package. Also, add a ‘BIC’ method for mmkin column objects.

    -- cgit v1.2.1 From 571d328361fe9e4d47ceca35cc622ad7f930d608 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Wed, 8 Jan 2020 15:31:10 +0100 Subject: Todays date in DESCRIPTION, update check log --- DESCRIPTION | 2 +- check.log | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b0bcc39d..f9bed994 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: mkin Type: Package Title: Kinetic Evaluation of Chemical Degradation Data Version: 0.9.49.8 -Date: 2019-11-01 +Date: 2020-01-08 Authors@R: c(person("Johannes", "Ranke", role = c("aut", "cre", "cph"), email = "jranke@uni-bremen.de", comment = c(ORCID = "0000-0003-4371-6538")), diff --git a/check.log b/check.log index 85055c74..b7555c55 100644 --- a/check.log +++ b/check.log @@ -1,5 +1,5 @@ * using log directory ‘/home/jranke/git/mkin/mkin.Rcheck’ -* using R version 3.6.1 (2019-07-05) +* using R version 3.6.2 (2019-12-12) * using platform: x86_64-pc-linux-gnu (64-bit) * using session charset: UTF-8 * using options ‘--no-tests --as-cran’ @@ -63,6 +63,7 @@ Maintainer: ‘Johannes Ranke ’ * checking package vignettes in ‘inst/doc’ ... OK * checking re-building of vignette outputs ... OK * checking PDF version of manual ... OK +* checking for detritus in the temp directory ... OK * DONE Status: OK -- cgit v1.2.1 From 70fe6d14e27fa8fb0634856ecc45a27f4f689d88 Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Thu, 9 Jan 2020 17:50:23 +0100 Subject: Remove unused FME package from DESCRIPTION text --- DESCRIPTION | 13 ++++++------- build.log | 2 +- docs/404.html | 2 +- docs/articles/index.html | 2 +- docs/authors.html | 2 +- docs/index.html | 11 +++++------ docs/news/index.html | 2 +- docs/reference/index.html | 2 +- docs/reference/parms.html | 2 +- 9 files changed, 18 insertions(+), 20 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index f9bed994..0bc78ed2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: mkin Type: Package Title: Kinetic Evaluation of Chemical Degradation Data -Version: 0.9.49.8 -Date: 2020-01-08 +Version: 0.9.49.9 +Date: 2020-01-09 Authors@R: c(person("Johannes", "Ranke", role = c("aut", "cre", "cph"), email = "jranke@uni-bremen.de", comment = c(ORCID = "0000-0003-4371-6538")), @@ -12,11 +12,10 @@ Authors@R: c(person("Johannes", "Ranke", role = c("aut", "cre", "cph"), Description: Calculation routines based on the FOCUS Kinetics Report (2006, 2014). Includes a function for conveniently defining differential equation models, model solution based on eigenvalues if possible or using numerical - solvers and a choice of the optimisation methods made available by the 'FME' - package. If a C compiler (on windows: 'Rtools') is installed, differential - equation models are solved using compiled C functions. Please note that no - warranty is implied for correctness of results or fitness for a particular - purpose. + solvers. If a C compiler (on windows: 'Rtools') is installed, differential + equation models are solved using automatically generated C functions. Please + note that no warranty is implied for correctness of results or fitness for a + particular purpose. Imports: stats, graphics, methods, deSolve, R6, inline, parallel, numDeriv, lmtest Suggests: knitr, rbenchmark, tikzDevice, testthat, rmarkdown, covr, vdiffr, diff --git a/build.log b/build.log index ffd56a90..b0765ebb 100644 --- a/build.log +++ b/build.log @@ -6,5 +6,5 @@ * checking for LF line-endings in source and make files and shell scripts * checking for empty or unneeded directories * looking to see if a ‘data/datalist’ file should be added -* building ‘mkin_0.9.49.8.tar.gz’ +* building ‘mkin_0.9.49.9.tar.gz’ diff --git a/docs/404.html b/docs/404.html index 2a71e496..3658a137 100644 --- a/docs/404.html +++ b/docs/404.html @@ -67,7 +67,7 @@ mkin - 0.9.49.8 + 0.9.49.9
    diff --git a/docs/articles/index.html b/docs/articles/index.html index ac5f5df1..3e181a2c 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -67,7 +67,7 @@ mkin - 0.9.49.8 + 0.9.49.9 diff --git a/docs/authors.html b/docs/authors.html index fb50f268..2bb2557a 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -67,7 +67,7 @@ mkin - 0.9.49.8 + 0.9.49.9 diff --git a/docs/index.html b/docs/index.html index fcb9c90b..fe334eb8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -14,11 +14,10 @@ + solvers. If a C compiler (on windows: Rtools) is installed, differential + equation models are solved using automatically generated C functions. Please + note that no warranty is implied for correctness of results or fitness for a + particular purpose.">