diff options
| author | Johannes Ranke <jranke@uni-bremen.de> | 2020-07-15 12:30:39 +0200 | 
|---|---|---|
| committer | Johannes Ranke <jranke@uni-bremen.de> | 2020-07-15 12:30:39 +0200 | 
| commit | 9f8e1eb33b586beb7e889212bdababa081b6ff67 (patch) | |
| tree | a8ec85a113df890d6a4e3bf15001cbd0fe76abd7 | |
| parent | 46763edbd1c9b14cff15c53d96312a7930225704 (diff) | |
Improve handling of (partially) failing fits
| -rw-r--r-- | NEWS.md | 4 | ||||
| -rw-r--r-- | R/mkinfit.R | 46 | ||||
| -rw-r--r-- | R/mmkin.R | 5 | ||||
| -rw-r--r-- | check.log | 12 | ||||
| -rw-r--r-- | test.log | 10 | ||||
| -rw-r--r-- | tests/testthat/FOCUS_2006_D.csf | 2 | 
6 files changed, 48 insertions, 31 deletions
| @@ -12,6 +12,10 @@  - 'mkinfit': Run 'stats::shapiro.test()' on standardized residuals and warn if p < 0.05 +- 'mkinfit': 'error_model_algorithm' = 'd_3' does not fail if direct fitting fails, but reports that the results for the threestep algorithm are returned + +- 'mmkin': Do not fail any more if one of the fits fails, but assign the try-error to the respective position in the mmkin object +  # mkin 0.9.50.2 (2020-05-12)  - Increase tolerance for a platform specific test results on the Solaris test machine on CRAN diff --git a/R/mkinfit.R b/R/mkinfit.R index 154c2a18..73fe43e0 100644 --- a/R/mkinfit.R +++ b/R/mkinfit.R @@ -712,17 +712,17 @@ mkinfit <- function(mkinmod, observed,      if (error_model_algorithm == "d_3") {        if (!quiet) message("Directly optimising the complete model")        parms.start <- c(degparms, errparms) -      fit_direct <- nlminb(parms.start, cost_function, +      fit_direct <- try(nlminb(parms.start, cost_function,          lower = lower[names(parms.start)],          upper = upper[names(parms.start)], -        control = control, ...) -      fit_direct$logLik <- - cost.current -      if (error_model_algorithm == "direct") { -        degparms <- fit_direct$par[degparms_index] -        errparms <- fit_direct$par[errparms_index] -      } else { +        control = control, ...)) +      if (!inherits(fit_direct, "try-error")) { +        fit_direct$logLik <- - cost.current          cost.current <- Inf # reset to avoid conflict with the OLS step          data_direct <- current_data # We need this later if it was better +        direct_failed = FALSE +      } else { +        direct_failed = TRUE        }      }      if (error_model_algorithm != "direct") { @@ -775,24 +775,30 @@ mkinfit <- function(mkinmod, observed,        if (error_model_algorithm == "d_3") {          d_3_messages = c( +           direct_failed = "Direct fitting failed, results of three-step fitting are returned",             same = "Direct fitting and three-step fitting yield approximately the same likelihood",             threestep = "Three-step fitting yielded a higher likelihood than direct fitting",             direct = "Direct fitting yielded a higher likelihood than three-step fitting") -        rel_diff <- abs((fit_direct$logLik - fit$logLik))/-mean(c(fit_direct$logLik, fit$logLik)) -        if (rel_diff < 0.0001) { -          if (!quiet) message(d_3_messages["same"]) -          fit$d_3_message <- d_3_messages["same"] +        if (direct_failed) { +          if (!quiet) message(d_3_messages["direct_failed"]) +          fit$d_3_message <- d_3_messages["direct_failed"]          } else { -          if (fit$logLik > fit_direct$logLik) { -            if (!quiet) message(d_3_messages["threestep"]) -            fit$d_3_message <- d_3_messages["threestep"] +          rel_diff <- abs((fit_direct$logLik - fit$logLik))/-mean(c(fit_direct$logLik, fit$logLik)) +          if (rel_diff < 0.0001) { +            if (!quiet) message(d_3_messages["same"]) +            fit$d_3_message <- d_3_messages["same"]            } else { -            if (!quiet) message(d_3_messages["direct"]) -            fit <- fit_direct -            fit$d_3_message <- d_3_messages["direct"] -            degparms <- fit$par[degparms_index] -            errparms <- fit$par[errparms_index] -            current_data  <- data_direct +            if (fit$logLik > fit_direct$logLik) { +              if (!quiet) message(d_3_messages["threestep"]) +              fit$d_3_message <- d_3_messages["threestep"] +            } else { +              if (!quiet) message(d_3_messages["direct"]) +              fit <- fit_direct +              fit$d_3_message <- d_3_messages["direct"] +              degparms <- fit$par[degparms_index] +              errparms <- fit$par[errparms_index] +              current_data  <- data_direct +            }            }          }        } @@ -19,8 +19,9 @@  #' @param \dots Further arguments that will be passed to \code{\link{mkinfit}}.  #' @importFrom parallel mclapply parLapply detectCores  #' @return A two-dimensional \code{\link{array}} of \code{\link{mkinfit}} -#'   objects that can be indexed using the model names for the first index (row index)  -#'   and the dataset names for the second index (column index). +#'   objects and/or try-errors that can be indexed using the model names for the +#'   first index (row index) and the dataset names for the second index (column +#'   index).  #' @author Johannes Ranke  #' @seealso \code{\link{[.mmkin}} for subsetting, \code{\link{plot.mmkin}} for  #'   plotting. @@ -1,5 +1,5 @@  * using log directory ‘/home/jranke/git/mkin/mkin.Rcheck’ -* using R version 4.0.0 (2020-04-24) +* using R version 4.0.2 (2020-06-22)  * using platform: x86_64-pc-linux-gnu (64-bit)  * using session charset: UTF-8  * using options ‘--no-tests --as-cran’ @@ -7,8 +7,10 @@  * checking extension type ... Package  * this is package ‘mkin’ version ‘0.9.50.3’  * package encoding: UTF-8 -* checking CRAN incoming feasibility ... Note_to_CRAN_maintainers +* checking CRAN incoming feasibility ... NOTE  Maintainer: ‘Johannes Ranke <jranke@uni-bremen.de>’ + +The Date field is over a month old.  * checking package namespace information ... OK  * checking package dependencies ... OK  * checking if this is a source package ... OK @@ -67,5 +69,9 @@ Maintainer: ‘Johannes Ranke <jranke@uni-bremen.de>’  * 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. + @@ -9,7 +9,7 @@ Testing mkin  ✔ |   5       | Analytical solutions for coupled models [3.2 s]  ✔ |   5       | Calculation of Akaike weights  ✔ |  10       | Confidence intervals and p-values [1.1 s] -✔ |  14       | Error model fitting [3.8 s] +✔ |  14       | Error model fitting [3.7 s]  ✔ |   4       | Test fitting the decline of metabolites from their maximum [0.3 s]  ✔ |   1       | Fitting the logistic model [0.2 s]  ✔ |   1       | Test dataset class mkinds used in gmkin @@ -24,22 +24,22 @@ Reason: getRversion() < "4.1.0"  is TRUE  test_nafta.R:53: skip: Test data from Appendix D are correctly evaluated  Reason: getRversion() < "4.1.0"  is TRUE  ──────────────────────────────────────────────────────────────────────────────── -✔ |   9       | Nonlinear mixed-effects models [7.8 s] +✔ |   9       | Nonlinear mixed-effects models [7.7 s]  ✔ |   0     1 | Plotting [0.7 s]  ────────────────────────────────────────────────────────────────────────────────  test_plot.R:24: skip: Plotting mkinfit and mmkin objects is reproducible  Reason: getRversion() < "4.1.0"  is TRUE  ────────────────────────────────────────────────────────────────────────────────  ✔ |   4       | Residuals extracted from mkinfit models -✔ |   2       | Complex test case from Schaefer et al. (2007) Piacenza paper [1.5 s] +✔ |   2       | Complex test case from Schaefer et al. (2007) Piacenza paper [1.4 s]  ✔ |   4       | Summary [0.1 s]  ✔ |   1       | Summaries of old mkinfit objects  ✔ |   4       | Results for synthetic data established in expertise for UBA (Ranke 2014) [2.2 s]  ✔ |   9       | Hypothesis tests [6.8 s] -✔ |   4       | Calculation of maximum time weighted average concentrations (TWAs) [2.5 s] +✔ |   4       | Calculation of maximum time weighted average concentrations (TWAs) [2.4 s]  ══ Results ═════════════════════════════════════════════════════════════════════ -Duration: 37.2 s +Duration: 36.8 s  OK:       145  Failed:   0 diff --git a/tests/testthat/FOCUS_2006_D.csf b/tests/testthat/FOCUS_2006_D.csf index aa9fc233..232d7dad 100644 --- a/tests/testthat/FOCUS_2006_D.csf +++ b/tests/testthat/FOCUS_2006_D.csf @@ -5,7 +5,7 @@ Description:  MeasurementUnits: % AR  TimeUnits: days  Comments: Created using mkin::CAKE_export -Date: 2020-06-15 +Date: 2020-07-15  Optimiser: IRLS  [Data] | 
