aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NAMESPACE2
-rw-r--r--NEWS.md2
-rw-r--r--R/nlme.mmkin.R9
-rw-r--r--R/plot.nlme.mmkin.R103
-rw-r--r--_pkgdown.yml5
-rw-r--r--check.log102
-rw-r--r--docs/news/index.html1
-rw-r--r--docs/reference/index.html23
-rw-r--r--docs/reference/nlme.html32
-rw-r--r--docs/reference/nlme.mmkin.html301
-rw-r--r--docs/reference/plot.nlme.mmkin-1.pngbin0 -> 32297 bytes
-rw-r--r--docs/reference/plot.nlme.mmkin.html252
-rw-r--r--docs/sitemap.xml6
-rw-r--r--man/nlme.Rd2
-rw-r--r--man/nlme.mmkin.Rd11
-rw-r--r--man/plot.nlme.mmkin.Rd67
16 files changed, 800 insertions, 118 deletions
diff --git a/NAMESPACE b/NAMESPACE
index 5f305a3d..fce1c5f7 100644
--- a/NAMESPACE
+++ b/NAMESPACE
@@ -18,6 +18,7 @@ S3method(parms,mkinfit)
S3method(plot,mkinfit)
S3method(plot,mmkin)
S3method(plot,nafta)
+S3method(plot,nlme.mmkin)
S3method(print,mkinds)
S3method(print,mkinmod)
S3method(print,nafta)
@@ -87,6 +88,7 @@ importFrom(stats,AIC)
importFrom(stats,BIC)
importFrom(stats,aggregate)
importFrom(stats,coef)
+importFrom(stats,coefficients)
importFrom(stats,cov2cor)
importFrom(stats,dist)
importFrom(stats,dnorm)
diff --git a/NEWS.md b/NEWS.md
index 46d2d711..a4976488 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,5 +1,7 @@
# mkin 0.9.49.10 (unreleased)
+- 'nlme.mmkin': An nlme method for mmkin row objects and an associated class with plot method
+
- 'mean_degparms, nlme_data, nlme_function': Three new functions to facilitate building nlme models from mmkin row objects
- 'endpoints': Don't return the SFORB list component if it's empty. This reduces distraction and complies with the documentation
diff --git a/R/nlme.mmkin.R b/R/nlme.mmkin.R
index 784ba609..2ee46f33 100644
--- a/R/nlme.mmkin.R
+++ b/R/nlme.mmkin.R
@@ -22,8 +22,8 @@
#' @param control passed to nlme
#' @param verbose passed to nlme
#' @importFrom stats na.fail
-#' @return Upon success, a fitted nlme.mmkin object, which is
-#' an nlme object with additional elements
+#' @return Upon success, a fitted nlme.mmkin object, which is an nlme object
+#' with additional elements
#' @export
#' @seealso \code{\link{nlme_function}}
#' @examples
@@ -54,7 +54,7 @@ nlme.mmkin <- function(model, data = sys.frame(sys.parent()),
}
deg_func <- nlme_function(model)
- assign("deg_func", deg_func, parent.frame())
+ assign("deg_func", deg_func, globalenv())
# specify the model formula
this_model_text <- paste0("value ~ deg_func(",
@@ -79,7 +79,8 @@ nlme.mmkin <- function(model, data = sys.frame(sys.parent()),
}
val <- do.call("nlme.formula", thisCall)
- return(val)
+ val$mmkin_orig <- model
class(val) <- c("nlme.mmkin", "nlme", "lme")
+ return(val)
}
diff --git a/R/plot.nlme.mmkin.R b/R/plot.nlme.mmkin.R
new file mode 100644
index 00000000..ef6d100a
--- /dev/null
+++ b/R/plot.nlme.mmkin.R
@@ -0,0 +1,103 @@
+#' Plot a fitted nonlinear mixed model obtained via an mmkin row object
+#'
+#' @param x An object of class \code{\link{nlme.mmkin}}
+#' @param i A numeric index to select datasets for which to plot the nlme fit,
+#' in case plots get too large
+#' @param main The main title placed on the outer margin of the plot.
+#' @param legends An index for the fits for which legends should be shown.
+#' @param resplot Should the residuals plotted against time, using
+#' \code{\link{mkinresplot}}, or as squared residuals against predicted
+#' values, with the error model, using \code{\link{mkinerrplot}}.
+#' @param standardized Should the residuals be standardized? This option
+#' is passed to \code{\link{mkinresplot}}, it only takes effect if
+#' `resplot = "time"`.
+#' @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}}.
+#' @importFrom stats coefficients
+#' @return The function is called for its side effect.
+#' @author Johannes Ranke
+#' @examples
+#' ds <- lapply(experimental_data_for_UBA_2019[6:10],
+#' function(x) subset(x$data[c("name", "time", "value")], name == "parent"))
+#' f <- mmkin("SFO", ds, quiet = TRUE, cores = 1)
+#' #plot(f) # too many panels for pkgdown
+#' library(nlme)
+#' f_nlme <- nlme(f)
+#'
+#' #plot(f_nlme) # too many panels for pkgdown
+#' plot(f_nlme, 1:2)
+#' @export
+plot.nlme.mmkin <- function(x, i = 1:ncol(x$mmkin_orig),
+ main = "auto", legends = 1,
+ resplot = c("time", "errmod"),
+ standardized = FALSE,
+ cex = 0.7, rel.height.middle = 0.9,
+ ymax = "auto", ...)
+{
+
+ degparms_optim_nlme <- coefficients(x)
+ degparms_optim_names <- names(degparms_optim_nlme)
+
+ odeini_optim_names <- grep("_0$", degparms_optim_names, value = TRUE)
+ odeparms_optim_names <- setdiff(degparms_optim_names, odeini_optim_names)
+
+ fit_1 <- x$mmkin_orig[[1]]
+
+ mkinfit_call <- as.list(fit_1$call)[-1]
+ mkinfit_call[["mkinmod"]] <- fit_1$mkinmod
+
+ ds <- lapply(x$mmkin_orig, function(x) {
+ data.frame(name = x$data$variable,
+ time = x$data$time,
+ value = x$data$observed)
+ })
+
+ # This takes quite some time. This could be greatly reduced
+ # if the plot.mkinfit code would be imported and adapted,
+ # allowing also to overly plots of mmkin fits and nlme fits
+ mmkin_nlme <- lapply(i, function(a) {
+
+ degparms_optim <- as.numeric(degparms_optim_nlme[a, ])
+ names(degparms_optim) <- degparms_optim_names
+
+ odeini_optim <- degparms_optim[odeini_optim_names]
+ names(odeini_optim) <- gsub("_0$", "", names(odeini_optim))
+
+ odeparms_optim_trans <- degparms_optim[odeparms_optim_names]
+ odeparms_optim <- backtransform_odeparms(odeparms_optim_trans,
+ fit_1$mkinmod,
+ transform_rates = fit_1$transform_rates,
+ transform_fractions = fit_1$transform_fractions)
+
+ fit_a <- x$mmkin_orig[[a]]
+
+ state_ini <- fit_a$bparms.state
+ state_ini[names(odeini_optim)] <- odeini_optim
+
+ odeparms <- fit_a$bparms.ode
+ odeparms[names(odeparms)] <- odeparms_optim
+
+ mkinfit_call[["observed"]] <- ds[[a]]
+ mkinfit_call[["parms.ini"]] <- odeparms
+ mkinfit_call[["state.ini"]] <- state_ini
+
+ mkinfit_call[["control"]] <- list(iter.max = 1)
+
+ res <- suppressWarnings(do.call("mkinfit", mkinfit_call))
+ return(res)
+ })
+
+ # Set dimensions with names and the class (mmkin)
+ attributes(mmkin_nlme) <- attributes(x$mmkin_orig[, i])
+
+ plot(mmkin_nlme[, i], main = main, legends = legends,
+ resplot = resplot, standardized = standardized,
+ show_errmin = FALSE, cex = cex,
+ rel.height.middle = rel.height.middle,
+ ymax = ymax, ...)
+
+}
diff --git a/_pkgdown.yml b/_pkgdown.yml
index 0cecdc30..2ede6857 100644
--- a/_pkgdown.yml
+++ b/_pkgdown.yml
@@ -33,6 +33,11 @@ reference:
- "`[.mmkin`"
- plot.mmkin
- AIC.mmkin
+ - title: Mixed models
+ desc: Create and work with nonlinear mixed models
+ contents:
+ - nlme.mmkin
+ - plot.nlme.mmkin
- nlme_function
- title: Datasets and known results
contents:
diff --git a/check.log b/check.log
index fc06bc0d..43cc5f64 100644
--- a/check.log
+++ b/check.log
@@ -41,14 +41,7 @@ Maintainer: ‘Johannes Ranke <jranke@uni-bremen.de>’
* checking S3 generic/method consistency ... OK
* checking replacement functions ... OK
* checking foreign function calls ... OK
-* checking R code for possible problems ... NOTE
-nlme.mmkin: no visible binding for global variable ‘na.fail’
-nlme.mmkin: no visible binding for global variable ‘f’
-Undefined global functions or variables:
- f na.fail
-Consider adding
- importFrom("stats", "na.fail")
-to your NAMESPACE file.
+* checking R code for possible problems ... OK
* checking Rd files ... OK
* checking Rd metadata ... OK
* checking Rd line widths ... OK
@@ -63,91 +56,11 @@ to your NAMESPACE file.
* checking data for ASCII and uncompressed saves ... OK
* checking installed files from ‘inst/doc’ ... OK
* checking files in ‘vignettes’ ... OK
-* checking examples ... ERROR
-Running examples in ‘mkin-Ex.R’ failed
-The error most likely occurred in:
-
-> base::assign(".ptime", proc.time(), pos = "CheckExEnv")
-> ### Name: nlme_function
-> ### Title: Estimation of parameter distributions from mmkin row objects
-> ### Aliases: nlme_function mean_degparms nlme_data
->
-> ### ** Examples
->
-> sampling_times = c(0, 1, 3, 7, 14, 28, 60, 90, 120)
-> m_SFO <- mkinmod(parent = mkinsub("SFO"))
-> d_SFO_1 <- mkinpredict(m_SFO,
-+ c(k_parent_sink = 0.1),
-+ c(parent = 98), sampling_times)
-> d_SFO_1_long <- mkin_wide_to_long(d_SFO_1, time = "time")
-> d_SFO_2 <- mkinpredict(m_SFO,
-+ c(k_parent_sink = 0.05),
-+ c(parent = 102), sampling_times)
-> d_SFO_2_long <- mkin_wide_to_long(d_SFO_2, time = "time")
-> d_SFO_3 <- mkinpredict(m_SFO,
-+ c(k_parent_sink = 0.02),
-+ c(parent = 103), sampling_times)
-> d_SFO_3_long <- mkin_wide_to_long(d_SFO_3, time = "time")
->
-> d1 <- add_err(d_SFO_1, function(value) 3, n = 1)
-> d2 <- add_err(d_SFO_2, function(value) 2, n = 1)
-> d3 <- add_err(d_SFO_3, function(value) 4, n = 1)
-> ds <- c(d1 = d1, d2 = d2, d3 = d3)
->
-> f <- mmkin("SFO", ds, cores = 1, quiet = TRUE)
-> mean_dp <- mean_degparms(f)
-> grouped_data <- nlme_data(f)
-> nlme_f <- nlme_function(f)
-> # These assignments are necessary for these objects to be
-> # visible to nlme and augPred when evaluation is done by
-> # pkgdown to generated the html docs.
-> assign("nlme_f", nlme_f, globalenv())
-> assign("grouped_data", grouped_data, globalenv())
->
-> library(nlme)
-> m_nlme <- nlme(value ~ nlme_f(name, time, parent_0, log_k_parent_sink),
-+ data = grouped_data,
-+ fixed = parent_0 + log_k_parent_sink ~ 1,
-+ random = pdDiag(parent_0 + log_k_parent_sink ~ 1),
-+ start = mean_dp)
-> summary(m_nlme)
-Nonlinear mixed-effects model fit by maximum likelihood
- Model: value ~ nlme_f(name, time, parent_0, log_k_parent_sink)
- Data: grouped_data
- AIC BIC logLik
- 253.6377 262.9937 -121.8188
-
-Random effects:
- Formula: list(parent_0 ~ 1, log_k_parent_sink ~ 1)
- Level: ds
- Structure: Diagonal
- parent_0 log_k_parent_sink Residual
-StdDev: 2.486822 0.6481355 2.368137
-
-Fixed effects: parent_0 + log_k_parent_sink ~ 1
- Value Std.Error DF t-value p-value
-parent_0 101.43096 1.5960157 44 63.55261 0
-log_k_parent_sink -3.07614 0.3827294 44 -8.03737 0
- Correlation:
- prnt_0
-log_k_parent_sink 0.011
-
-Standardized Within-Group Residuals:
- Min Q1 Med Q3 Max
--1.9643731 -0.5430765 0.1659516 0.6160408 1.8082871
-
-Number of Observations: 48
-Number of Groups: 3
-> plot(augPred(m_nlme, level = 0:1), layout = c(3, 1))
->
-> m_nlme <- nlme(nlme_formula,
-+ data = grouped_data,
-+ fixed = parent_0 + log_k_parent_sink ~ 1,
-+ random = pdDiag(parent_0 + log_k_parent_sink ~ 1),
-+ start = mean_dp)
-Error in nlme(nlme_formula, data = grouped_data, fixed = parent_0 + log_k_parent_sink ~ :
- object 'nlme_formula' not found
-Execution halted
+* checking examples ... NOTE
+Examples with CPU or elapsed time > 5s
+ user system elapsed
+nlme.mmkin 4.801 1.040 4.497
+plot.nlme.mmkin 4.751 0.285 4.680
* checking for unstated dependencies in ‘tests’ ... OK
* checking tests ... SKIPPED
* checking for unstated dependencies in vignettes ... OK
@@ -157,8 +70,9 @@ Execution halted
* checking for detritus in the temp directory ... OK
* DONE
-Status: 1 ERROR, 1 NOTE
+Status: 1 NOTE
See
‘/home/jranke/git/mkin/mkin.Rcheck/00check.log’
for details.
+
diff --git a/docs/news/index.html b/docs/news/index.html
index c8d7ce3d..5fd97344 100644
--- a/docs/news/index.html
+++ b/docs/news/index.html
@@ -134,6 +134,7 @@
<a href="#mkin-0-9-49-10-unreleased" class="anchor"></a>mkin 0.9.49.10 (unreleased)<small> Unreleased </small>
</h1>
<ul>
+<li><p>‘nlme.mmkin’: An nlme method for mmkin row objects and an associated class with plot method</p></li>
<li><p>‘mean_degparms, nlme_data, nlme_function’: Three new functions to facilitate building nlme models from mmkin row objects</p></li>
<li><p>‘endpoints’: Don’t return the SFORB list component if it’s empty. This reduces distraction and complies with the documentation</p></li>
<li><p>Article in compiled models: Add some platform specific code and suppress warnings about zero values being removed from the FOCUS D dataset</p></li>
diff --git a/docs/reference/index.html b/docs/reference/index.html
index 31f7678c..3c5f1b38 100644
--- a/docs/reference/index.html
+++ b/docs/reference/index.html
@@ -270,12 +270,32 @@ of an mmkin object</p></td>
<p><code><a href="AIC.mmkin.html">AIC(<i>&lt;mmkin&gt;</i>)</a></code> <code><a href="AIC.mmkin.html">BIC(<i>&lt;mmkin&gt;</i>)</a></code> </p>
</td>
<td><p>Calculate the AIC for a column of an mmkin object</p></td>
+ </tr>
+ </tbody><tbody>
+ <tr>
+ <th colspan="2">
+ <h2 id="section-mixed-models" class="hasAnchor"><a href="#section-mixed-models" class="anchor"></a>Mixed models</h2>
+ <p class="section-desc"><p>Create and work with nonlinear mixed models</p></p>
+ </th>
+ </tr>
+ <tr>
+
+ <td>
+ <p><code><a href="nlme.mmkin.html">nlme(<i>&lt;mmkin&gt;</i>)</a></code> </p>
+ </td>
+ <td><p>Create an nlme model for an mmkin row object</p></td>
+ </tr><tr>
+
+ <td>
+ <p><code><a href="plot.nlme.mmkin.html">plot(<i>&lt;nlme.mmkin&gt;</i>)</a></code> </p>
+ </td>
+ <td><p>Plot a fitted nonlinear mixed model obtained via an mmkin row object</p></td>
</tr><tr>
<td>
<p><code><a href="nlme.html">nlme_function()</a></code> <code><a href="nlme.html">mean_degparms()</a></code> <code><a href="nlme.html">nlme_data()</a></code> </p>
</td>
- <td><p>Estimation of parameter distributions from mmkin row objects</p></td>
+ <td><p>Helper functions to create nlme models from mmkin row objects</p></td>
</tr>
</tbody><tbody>
<tr>
@@ -576,6 +596,7 @@ kinetic models fitted with mkinfit</p></td>
<li><a href="#section-main-functions">Main functions</a></li>
<li><a href="#section-show-results">Show results</a></li>
<li><a href="#section-work-with-mmkin-objects">Work with mmkin objects</a></li>
+ <li><a href="#section-mixed-models">Mixed models</a></li>
<li><a href="#section-datasets-and-known-results">Datasets and known results</a></li>
<li><a href="#section-nafta-guidance">NAFTA guidance</a></li>
<li><a href="#section-helper-functions-mainly-used-internally">Helper functions mainly used internally</a></li>
diff --git a/docs/reference/nlme.html b/docs/reference/nlme.html
index 1b05f882..981845fe 100644
--- a/docs/reference/nlme.html
+++ b/docs/reference/nlme.html
@@ -6,7 +6,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<title>Estimation of parameter distributions from mmkin row objects — nlme_function • mkin</title>
+<title>Helper functions to create nlme models from mmkin row objects — nlme_function • mkin</title>
<!-- jquery -->
@@ -35,7 +35,7 @@
-<meta property="og:title" content="Estimation of parameter distributions from mmkin row objects — nlme_function" />
+<meta property="og:title" content="Helper functions to create nlme models from mmkin row objects — nlme_function" />
<meta property="og:description" content="These functions facilitate setting up a nonlinear mixed effects model for
an mmkin row object. An mmkin row object is essentially a list of mkinfit
objects that have been obtained by fitting the same model to a list of
@@ -130,7 +130,7 @@ datasets." />
<div class="row">
<div class="col-md-9 contents">
<div class="page-header">
- <h1>Estimation of parameter distributions from mmkin row objects</h1>
+ <h1>Helper functions to create nlme models from mmkin row objects</h1>
<div class="hidden name"><code>nlme.Rd</code></div>
</div>
@@ -255,37 +255,39 @@ datasets.</p>
<span class='no'>nlme_f_sfo_sfo</span> <span class='kw'>&lt;-</span> <span class='fu'>nlme_function</span>(<span class='no'>f_2</span>[<span class='st'>"SFO-SFO"</span>, ])
<span class='no'>nlme_f_sfo_sfo_ff</span> <span class='kw'>&lt;-</span> <span class='fu'>nlme_function</span>(<span class='no'>f_2</span>[<span class='st'>"SFO-SFO-ff"</span>, ])
<span class='no'>nlme_f_fomc_sfo</span> <span class='kw'>&lt;-</span> <span class='fu'>nlme_function</span>(<span class='no'>f_2</span>[<span class='st'>"FOMC-SFO"</span>, ])
+ <span class='fu'><a href='https://rdrr.io/r/base/assign.html'>assign</a></span>(<span class='st'>"nlme_f_sfo_sfo"</span>, <span class='no'>nlme_f_sfo_sfo</span>, <span class='fu'><a href='https://rdrr.io/r/base/environment.html'>globalenv</a></span>())
+ <span class='fu'><a href='https://rdrr.io/r/base/assign.html'>assign</a></span>(<span class='st'>"nlme_f_sfo_sfo_ff"</span>, <span class='no'>nlme_f_sfo_sfo_ff</span>, <span class='fu'><a href='https://rdrr.io/r/base/environment.html'>globalenv</a></span>())
+ <span class='fu'><a href='https://rdrr.io/r/base/assign.html'>assign</a></span>(<span class='st'>"nlme_f_fomc_sfo"</span>, <span class='no'>nlme_f_fomc_sfo</span>, <span class='fu'><a href='https://rdrr.io/r/base/environment.html'>globalenv</a></span>())
- <span class='co'># Allowing for correlations between random effects leads to non-convergence</span>
+ <span class='co'># Allowing for correlations between random effects (not shown)</span>
+ <span class='co'># leads to non-convergence</span>
<span class='no'>f_nlme_sfo_sfo</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>value</span> ~ <span class='fu'>nlme_f_sfo_sfo</span>(<span class='no'>name</span>, <span class='no'>time</span>,
<span class='no'>parent_0</span>, <span class='no'>log_k_parent_sink</span>, <span class='no'>log_k_parent_A1</span>, <span class='no'>log_k_A1_sink</span>),
<span class='kw'>data</span> <span class='kw'>=</span> <span class='no'>grouped_data_2</span>,
<span class='kw'>fixed</span> <span class='kw'>=</span> <span class='no'>parent_0</span> + <span class='no'>log_k_parent_sink</span> + <span class='no'>log_k_parent_A1</span> + <span class='no'>log_k_A1_sink</span> ~ <span class='fl'>1</span>,
<span class='kw'>random</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/pdDiag.html'>pdDiag</a></span>(<span class='no'>parent_0</span> + <span class='no'>log_k_parent_sink</span> + <span class='no'>log_k_parent_A1</span> + <span class='no'>log_k_A1_sink</span> ~ <span class='fl'>1</span>),
- <span class='kw'>start</span> <span class='kw'>=</span> <span class='no'>mean_dp_sfo_sfo</span>)</div><div class='output co'>#&gt; <span class='error'>Error in nlme_f_sfo_sfo(name, time, parent_0, log_k_parent_sink, log_k_parent_A1, log_k_A1_sink): konnte Funktion "nlme_f_sfo_sfo" nicht finden</span></div><div class='input'>
+ <span class='kw'>start</span> <span class='kw'>=</span> <span class='no'>mean_dp_sfo_sfo</span>)
+ <span class='co'># augPred does not see to work on this object, so no plot is shown</span>
+
<span class='co'># The same model fitted with transformed formation fractions does not converge</span>
<span class='no'>f_nlme_sfo_sfo_ff</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>value</span> ~ <span class='fu'>nlme_f_sfo_sfo_ff</span>(<span class='no'>name</span>, <span class='no'>time</span>,
<span class='no'>parent_0</span>, <span class='no'>log_k_parent</span>, <span class='no'>log_k_A1</span>, <span class='no'>f_parent_ilr_1</span>),
<span class='kw'>data</span> <span class='kw'>=</span> <span class='no'>grouped_data_2</span>,
<span class='kw'>fixed</span> <span class='kw'>=</span> <span class='no'>parent_0</span> + <span class='no'>log_k_parent</span> + <span class='no'>log_k_A1</span> + <span class='no'>f_parent_ilr_1</span> ~ <span class='fl'>1</span>,
<span class='kw'>random</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/pdDiag.html'>pdDiag</a></span>(<span class='no'>parent_0</span> + <span class='no'>log_k_parent</span> + <span class='no'>log_k_A1</span> + <span class='no'>f_parent_ilr_1</span> ~ <span class='fl'>1</span>),
- <span class='kw'>start</span> <span class='kw'>=</span> <span class='no'>mean_dp_sfo_sfo_ff</span>)</div><div class='output co'>#&gt; <span class='error'>Error in nlme_f_sfo_sfo_ff(name, time, parent_0, log_k_parent, log_k_A1, f_parent_ilr_1): konnte Funktion "nlme_f_sfo_sfo_ff" nicht finden</span></div><div class='input'>
- <span class='co'># It does converge with this version of reduced random effects</span>
- <span class='no'>f_nlme_sfo_sfo_ff</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>value</span> ~ <span class='fu'>nlme_f_sfo_sfo_ff</span>(<span class='no'>name</span>, <span class='no'>time</span>,
- <span class='no'>parent_0</span>, <span class='no'>log_k_parent</span>, <span class='no'>log_k_A1</span>, <span class='no'>f_parent_ilr_1</span>),
- <span class='kw'>data</span> <span class='kw'>=</span> <span class='no'>grouped_data_2</span>,
- <span class='kw'>fixed</span> <span class='kw'>=</span> <span class='no'>parent_0</span> + <span class='no'>log_k_parent</span> + <span class='no'>log_k_A1</span> + <span class='no'>f_parent_ilr_1</span> ~ <span class='fl'>1</span>,
- <span class='kw'>random</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/pdDiag.html'>pdDiag</a></span>(<span class='no'>parent_0</span> + <span class='no'>log_k_parent</span> ~ <span class='fl'>1</span>),
- <span class='kw'>start</span> <span class='kw'>=</span> <span class='no'>mean_dp_sfo_sfo_ff</span>)</div><div class='output co'>#&gt; <span class='error'>Error in nlme_f_sfo_sfo_ff(name, time, parent_0, log_k_parent, log_k_A1, f_parent_ilr_1): konnte Funktion "nlme_f_sfo_sfo_ff" nicht finden</span></div><div class='input'>
+ <span class='kw'>start</span> <span class='kw'>=</span> <span class='no'>mean_dp_sfo_sfo_ff</span>)</div><div class='output co'>#&gt; <span class='error'>Error in nlme.formula(value ~ nlme_f_sfo_sfo_ff(name, time, parent_0, log_k_parent, log_k_A1, f_parent_ilr_1), data = grouped_data_2, fixed = parent_0 + log_k_parent + log_k_A1 + f_parent_ilr_1 ~ 1, random = pdDiag(parent_0 + log_k_parent + log_k_A1 + f_parent_ilr_1 ~ 1), start = mean_dp_sfo_sfo_ff): step halving factor reduced below minimum in PNLS step</span></div><div class='input'>
<span class='no'>f_nlme_fomc_sfo</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>value</span> ~ <span class='fu'>nlme_f_fomc_sfo</span>(<span class='no'>name</span>, <span class='no'>time</span>,
<span class='no'>parent_0</span>, <span class='no'>log_alpha</span>, <span class='no'>log_beta</span>, <span class='no'>log_k_A1</span>, <span class='no'>f_parent_ilr_1</span>),
<span class='kw'>data</span> <span class='kw'>=</span> <span class='no'>grouped_data_2</span>,
<span class='kw'>fixed</span> <span class='kw'>=</span> <span class='no'>parent_0</span> + <span class='no'>log_alpha</span> + <span class='no'>log_beta</span> + <span class='no'>log_k_A1</span> + <span class='no'>f_parent_ilr_1</span> ~ <span class='fl'>1</span>,
<span class='kw'>random</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/pdDiag.html'>pdDiag</a></span>(<span class='no'>parent_0</span> + <span class='no'>log_alpha</span> + <span class='no'>log_beta</span> + <span class='no'>log_k_A1</span> + <span class='no'>f_parent_ilr_1</span> ~ <span class='fl'>1</span>),
- <span class='kw'>start</span> <span class='kw'>=</span> <span class='no'>mean_dp_fomc_sfo</span>)</div><div class='output co'>#&gt; <span class='error'>Error in nlme_f_fomc_sfo(name, time, parent_0, log_alpha, log_beta, log_k_A1, f_parent_ilr_1): konnte Funktion "nlme_f_fomc_sfo" nicht finden</span></div><div class='input'>
+ <span class='kw'>start</span> <span class='kw'>=</span> <span class='no'>mean_dp_fomc_sfo</span>)
+
<span class='co'># DFOP-SFO and SFORB-SFO did not converge with full random effects</span>
- <span class='fu'><a href='https://rdrr.io/r/stats/anova.html'>anova</a></span>(<span class='no'>f_nlme_fomc_sfo</span>, <span class='no'>f_nlme_sfo_sfo</span>)</div><div class='output co'>#&gt; <span class='error'>Error in anova(f_nlme_fomc_sfo, f_nlme_sfo_sfo): Objekt 'f_nlme_fomc_sfo' nicht gefunden</span></div><div class='input'># }
+ <span class='fu'><a href='https://rdrr.io/r/stats/anova.html'>anova</a></span>(<span class='no'>f_nlme_fomc_sfo</span>, <span class='no'>f_nlme_sfo_sfo</span>)</div><div class='output co'>#&gt; Model df AIC BIC logLik Test L.Ratio p-value
+#&gt; f_nlme_fomc_sfo 1 11 932.5817 967.0755 -455.2909
+#&gt; f_nlme_sfo_sfo 2 9 1089.2492 1117.4714 -535.6246 1 vs 2 160.6675 &lt;.0001</div><div class='input'># }
</div></pre>
</div>
<div class="col-md-3 hidden-xs hidden-sm" id="sidebar">
diff --git a/docs/reference/nlme.mmkin.html b/docs/reference/nlme.mmkin.html
new file mode 100644
index 00000000..e1b1ff77
--- /dev/null
+++ b/docs/reference/nlme.mmkin.html
@@ -0,0 +1,301 @@
+<!-- Generated by pkgdown: do not edit by hand -->
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<title>Create an nlme model for an mmkin row object — nlme.mmkin • mkin</title>
+
+
+<!-- jquery -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
+<!-- Bootstrap -->
+
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
+
+<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous"></script>
+
+<!-- Font Awesome icons -->
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.7.1/css/all.min.css" integrity="sha256-nAmazAk6vS34Xqo0BSrTb+abbtFlgsFK7NKSi6o7Y78=" crossorigin="anonymous" />
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.7.1/css/v4-shims.min.css" integrity="sha256-6qHlizsOWFskGlwVOKuns+D1nB6ssZrHQrNj1wGplHc=" crossorigin="anonymous" />
+
+<!-- clipboard.js -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js" integrity="sha256-FiZwavyI2V6+EXO1U+xzLG3IKldpiTFf3153ea9zikQ=" crossorigin="anonymous"></script>
+
+<!-- headroom.js -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.9.4/headroom.min.js" integrity="sha256-DJFC1kqIhelURkuza0AvYal5RxMtpzLjFhsnVIeuk+U=" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.9.4/jQuery.headroom.min.js" integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=" crossorigin="anonymous"></script>
+
+<!-- pkgdown -->
+<link href="../pkgdown.css" rel="stylesheet">
+<script src="../pkgdown.js"></script>
+
+
+
+
+<meta property="og:title" content="Create an nlme model for an mmkin row object — nlme.mmkin" />
+<meta property="og:description" content="This functions sets up a nonlinear mixed effects model for an mmkin row
+object. An mmkin row object is essentially a list of mkinfit objects that
+have been obtained by fitting the same model to a list of datasets." />
+<meta name="twitter:card" content="summary" />
+
+
+
+
+<!-- mathjax -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js" integrity="sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js" integrity="sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=" crossorigin="anonymous"></script>
+
+<!--[if lt IE 9]>
+<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
+<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+<![endif]-->
+
+
+
+ </head>
+
+ <body>
+ <div class="container template-reference-topic">
+ <header>
+ <div class="navbar navbar-default navbar-fixed-top" role="navigation">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <span class="navbar-brand">
+ <a class="navbar-link" href="../index.html">mkin</a>
+ <span class="version label label-default" data-toggle="tooltip" data-placement="bottom" title="Released version">0.9.49.10</span>
+ </span>
+ </div>
+
+ <div id="navbar" class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li>
+ <a href="../reference/index.html">Functions and data</a>
+</li>
+<li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
+ Articles
+
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li>
+ <a href="../articles/mkin.html">Introduction to mkin</a>
+ </li>
+ <li>
+ <a href="../articles/FOCUS_D.html">Example evaluation of FOCUS Example Dataset D</a>
+ </li>
+ <li>
+ <a href="../articles/FOCUS_L.html">Example evaluation of FOCUS Laboratory Data L1 to L3</a>
+ </li>
+ <li>
+ <a href="../articles/web_only/FOCUS_Z.html">Example evaluation of FOCUS Example Dataset Z</a>
+ </li>
+ <li>
+ <a href="../articles/web_only/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a>
+ </li>
+ <li>
+ <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a>
+ </li>
+ <li>
+ <a href="../articles/web_only/NAFTA_examples.html">Example evaluation of NAFTA SOP Attachment examples</a>
+ </li>
+ </ul>
+</li>
+<li>
+ <a href="../news/index.html">News</a>
+</li>
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+
+ </ul>
+
+ </div><!--/.nav-collapse -->
+ </div><!--/.container -->
+</div><!--/.navbar -->
+
+
+
+ </header>
+
+<div class="row">
+ <div class="col-md-9 contents">
+ <div class="page-header">
+ <h1>Create an nlme model for an mmkin row object</h1>
+
+ <div class="hidden name"><code>nlme.mmkin.Rd</code></div>
+ </div>
+
+ <div class="ref-description">
+ <p>This functions sets up a nonlinear mixed effects model for an mmkin row
+object. An mmkin row object is essentially a list of mkinfit objects that
+have been obtained by fitting the same model to a list of datasets.</p>
+ </div>
+
+ <pre class="usage"><span class='co'># S3 method for mmkin</span>
+<span class='fu'>nlme</span>(
+ <span class='no'>model</span>,
+ <span class='kw'>data</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/sys.parent.html'>sys.frame</a></span>(<span class='fu'><a href='https://rdrr.io/r/base/sys.parent.html'>sys.parent</a></span>()),
+ <span class='no'>fixed</span>,
+ <span class='kw'>random</span> <span class='kw'>=</span> <span class='no'>fixed</span>,
+ <span class='no'>groups</span>,
+ <span class='no'>start</span>,
+ <span class='kw'>correlation</span> <span class='kw'>=</span> <span class='kw'>NULL</span>,
+ <span class='kw'>weights</span> <span class='kw'>=</span> <span class='kw'>NULL</span>,
+ <span class='no'>subset</span>,
+ <span class='kw'>method</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span>(<span class='st'>"ML"</span>, <span class='st'>"REML"</span>),
+ <span class='kw'>na.action</span> <span class='kw'>=</span> <span class='no'>na.fail</span>,
+ <span class='no'>naPattern</span>,
+ <span class='kw'>control</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/list.html'>list</a></span>(),
+ <span class='kw'>verbose</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>
+)</pre>
+
+ <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a>Arguments</h2>
+ <table class="ref-arguments">
+ <colgroup><col class="name" /><col class="desc" /></colgroup>
+ <tr>
+ <th>model</th>
+ <td><p>An <code><a href='mmkin.html'>mmkin</a></code> row object.</p></td>
+ </tr>
+ <tr>
+ <th>data</th>
+ <td><p>Ignored, data are taken from the mmkin model</p></td>
+ </tr>
+ <tr>
+ <th>fixed</th>
+ <td><p>Ignored, all degradation parameters fitted in the
+mmkin model are used as fixed parameters</p></td>
+ </tr>
+ <tr>
+ <th>random</th>
+ <td><p>If not specified, all fixed effects are complemented
+with uncorrelated random effects</p></td>
+ </tr>
+ <tr>
+ <th>groups</th>
+ <td><p>See the documentation of nlme</p></td>
+ </tr>
+ <tr>
+ <th>start</th>
+ <td><p>If not specified, mean values of the fitted degradation
+parameters taken from the mmkin object are used</p></td>
+ </tr>
+ <tr>
+ <th>correlation</th>
+ <td><p>See the documentation of nlme</p></td>
+ </tr>
+ <tr>
+ <th>weights</th>
+ <td><p>passed to nlme</p></td>
+ </tr>
+ <tr>
+ <th>subset</th>
+ <td><p>passed to nlme</p></td>
+ </tr>
+ <tr>
+ <th>method</th>
+ <td><p>passed to nlme</p></td>
+ </tr>
+ <tr>
+ <th>na.action</th>
+ <td><p>passed to nlme</p></td>
+ </tr>
+ <tr>
+ <th>naPattern</th>
+ <td><p>passed to nlme</p></td>
+ </tr>
+ <tr>
+ <th>control</th>
+ <td><p>passed to nlme</p></td>
+ </tr>
+ <tr>
+ <th>verbose</th>
+ <td><p>passed to nlme</p></td>
+ </tr>
+ </table>
+
+ <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2>
+
+ <p>Upon success, a fitted nlme.mmkin object, which is an nlme object
+ with additional elements</p>
+ <h2 class="hasAnchor" id="see-also"><a class="anchor" href="#see-also"></a>See also</h2>
+
+ <div class='dont-index'><p><code><a href='nlme.html'>nlme_function</a></code></p></div>
+
+ <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2>
+ <pre class="examples"><div class='input'><span class='no'>ds</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/r/base/lapply.html'>lapply</a></span>(<span class='no'>experimental_data_for_UBA_2019</span>[<span class='fl'>6</span>:<span class='fl'>10</span>],
+ <span class='kw'>function</span>(<span class='no'>x</span>) <span class='fu'><a href='https://rdrr.io/r/base/subset.html'>subset</a></span>(<span class='no'>x</span>$<span class='no'>data</span>[<span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span>(<span class='st'>"name"</span>, <span class='st'>"time"</span>, <span class='st'>"value"</span>)], <span class='no'>name</span> <span class='kw'>==</span> <span class='st'>"parent"</span>))
+<span class='no'>f</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='mmkin.html'>mmkin</a></span>(<span class='st'>"SFO"</span>, <span class='no'>ds</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>cores</span> <span class='kw'>=</span> <span class='fl'>1</span>)
+<span class='fu'><a href='https://rdrr.io/r/base/library.html'>library</a></span>(<span class='no'>nlme</span>)
+<span class='no'>f_nlme</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>f</span>)
+<span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>f</span>, <span class='kw'>random</span> <span class='kw'>=</span> <span class='no'>parent_0</span> ~ <span class='fl'>1</span>)</div><div class='output co'>#&gt; Nonlinear mixed-effects model fit by maximum likelihood
+#&gt; Model: value ~ deg_func(name, time, parent_0, log_k_parent_sink)
+#&gt; Data: structure(list(ds = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("1", "2", "3", "4", "5"), class = c("ordered", "factor")), name = c("parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent"), time = c(0, 0, 3, 3, 6, 6, 10, 10, 20, 20, 34, 34, 55, 55, 90, 90, 112, 112, 132, 132, 0, 0, 3, 3, 7, 7, 14, 14, 30, 30, 60, 60, 90, 90, 120, 120, 180, 180, 0, 0, 1, 1, 3, 3, 8, 8, 14, 14, 27, 27, 48, 48, 70, 70, 0, 0, 1, 1, 3, 3, 8, 8, 14, 14, 27, 27, 48, 48, 70, 70, 91, 91, 120, 120, 0, 0, 8, 8, 14, 14, 21, 21, 41, 41, 63, 63, 91, 91, 120, 120), value = c(97.2, 96.4, 71.1, 69.2, 58.1, 56.6, 44.4, 43.4, 33.3, 29.2, 17.6, 18, 10.5, 9.3, 4.5, 4.7, 3, 3.4, 2.3, 2.7, 93.6, 92.3, 87, 82.2, 74, 73.9, 64.2, 69.5, 54, 54.6, 41.1, 38.4, 32.5, 35.5, 28.1, 29, 26.5, 27.6, 91.9, 90.8, 64.9, 66.2, 43.5, 44.1, 18.3, 18.1, 10.2, 10.8, 4.9, 3.3, 1.6, 1.5, 1.1, 0.9, 99.8, 98.3, 77.1, 77.2, 59, 58.1, 27.4, 29.2, 19.1, 29.6, 10.1, 18.2, 4.5, 9.1, 2.3, 2.9, 2, 1.8, 2, 2.2, 96.1, 94.3, 73.9, 73.9, 69.4, 73.1, 65.6, 65.3, 55.9, 54.4, 47, 49.3, 44.7, 46.7, 42.1, 41.3)), row.names = c(NA, -90L), class = c("nfnGroupedData", "nfGroupedData", "groupedData", "data.frame"), formula = value ~ time | ds, FUN = function (x) max(x, na.rm = TRUE), order.groups = FALSE)
+#&gt; Log-likelihood: -394.4901
+#&gt; Fixed: list(parent_0 ~ 1, log_k_parent_sink ~ 1)
+#&gt; parent_0 log_k_parent_sink
+#&gt; 73.985522 -3.869079
+#&gt;
+#&gt; Random effects:
+#&gt; Formula: parent_0 ~ 1 | ds
+#&gt; parent_0 Residual
+#&gt; StdDev: 18.6134 18.22029
+#&gt;
+#&gt; Number of Observations: 90
+#&gt; Number of Groups: 5 </div><div class='input'><span class='no'>f_nlme</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>f</span>, <span class='kw'>start</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span>(<span class='kw'>parent_0</span> <span class='kw'>=</span> <span class='fl'>100</span>, <span class='kw'>log_k_parent_sink</span> <span class='kw'>=</span> <span class='fl'>0.1</span>))
+<span class='fu'><a href='https://rdrr.io/r/stats/update.html'>update</a></span>(<span class='no'>f_nlme</span>, <span class='kw'>random</span> <span class='kw'>=</span> <span class='no'>parent_0</span> ~ <span class='fl'>1</span>)</div><div class='output co'>#&gt; Nonlinear mixed-effects model fit by maximum likelihood
+#&gt; Model: value ~ deg_func(name, time, parent_0, log_k_parent_sink)
+#&gt; Data: structure(list(ds = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("1", "2", "3", "4", "5"), class = c("ordered", "factor")), name = c("parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent", "parent"), time = c(0, 0, 3, 3, 6, 6, 10, 10, 20, 20, 34, 34, 55, 55, 90, 90, 112, 112, 132, 132, 0, 0, 3, 3, 7, 7, 14, 14, 30, 30, 60, 60, 90, 90, 120, 120, 180, 180, 0, 0, 1, 1, 3, 3, 8, 8, 14, 14, 27, 27, 48, 48, 70, 70, 0, 0, 1, 1, 3, 3, 8, 8, 14, 14, 27, 27, 48, 48, 70, 70, 91, 91, 120, 120, 0, 0, 8, 8, 14, 14, 21, 21, 41, 41, 63, 63, 91, 91, 120, 120), value = c(97.2, 96.4, 71.1, 69.2, 58.1, 56.6, 44.4, 43.4, 33.3, 29.2, 17.6, 18, 10.5, 9.3, 4.5, 4.7, 3, 3.4, 2.3, 2.7, 93.6, 92.3, 87, 82.2, 74, 73.9, 64.2, 69.5, 54, 54.6, 41.1, 38.4, 32.5, 35.5, 28.1, 29, 26.5, 27.6, 91.9, 90.8, 64.9, 66.2, 43.5, 44.1, 18.3, 18.1, 10.2, 10.8, 4.9, 3.3, 1.6, 1.5, 1.1, 0.9, 99.8, 98.3, 77.1, 77.2, 59, 58.1, 27.4, 29.2, 19.1, 29.6, 10.1, 18.2, 4.5, 9.1, 2.3, 2.9, 2, 1.8, 2, 2.2, 96.1, 94.3, 73.9, 73.9, 69.4, 73.1, 65.6, 65.3, 55.9, 54.4, 47, 49.3, 44.7, 46.7, 42.1, 41.3)), row.names = c(NA, -90L), class = c("nfnGroupedData", "nfGroupedData", "groupedData", "data.frame"), formula = value ~ time | ds, FUN = function (x) max(x, na.rm = TRUE), order.groups = FALSE)
+#&gt; Log-likelihood: -404.3729
+#&gt; Fixed: list(parent_0 ~ 1, log_k_parent_sink ~ 1)
+#&gt; parent_0 log_k_parent_sink
+#&gt; 75.933480 -3.555983
+#&gt;
+#&gt; Random effects:
+#&gt; Formula: parent_0 ~ 1 | ds
+#&gt; parent_0 Residual
+#&gt; StdDev: 0.002416792 21.63027
+#&gt;
+#&gt; Number of Observations: 90
+#&gt; Number of Groups: 5 </div></pre>
+ </div>
+ <div class="col-md-3 hidden-xs hidden-sm" id="sidebar">
+ <h2>Contents</h2>
+ <ul class="nav nav-pills nav-stacked">
+ <li><a href="#arguments">Arguments</a></li>
+ <li><a href="#value">Value</a></li>
+ <li><a href="#see-also">See also</a></li>
+ <li><a href="#examples">Examples</a></li>
+ </ul>
+
+ </div>
+</div>
+
+
+ <footer>
+ <div class="copyright">
+ <p>Developed by Johannes Ranke.</p>
+</div>
+
+<div class="pkgdown">
+ <p>Site built with <a href="https://pkgdown.r-lib.org/">pkgdown</a> 1.4.1.</p>
+</div>
+
+ </footer>
+ </div>
+
+
+
+
+ </body>
+</html>
+
+
diff --git a/docs/reference/plot.nlme.mmkin-1.png b/docs/reference/plot.nlme.mmkin-1.png
new file mode 100644
index 00000000..0717f30d
--- /dev/null
+++ b/docs/reference/plot.nlme.mmkin-1.png
Binary files differ
diff --git a/docs/reference/plot.nlme.mmkin.html b/docs/reference/plot.nlme.mmkin.html
new file mode 100644
index 00000000..d5b7c00c
--- /dev/null
+++ b/docs/reference/plot.nlme.mmkin.html
@@ -0,0 +1,252 @@
+<!-- Generated by pkgdown: do not edit by hand -->
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+<title>Plot a fitted nonlinear mixed model obtained via an mmkin row object — plot.nlme.mmkin • mkin</title>
+
+
+<!-- jquery -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
+<!-- Bootstrap -->
+
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
+
+<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous"></script>
+
+<!-- Font Awesome icons -->
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.7.1/css/all.min.css" integrity="sha256-nAmazAk6vS34Xqo0BSrTb+abbtFlgsFK7NKSi6o7Y78=" crossorigin="anonymous" />
+<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.7.1/css/v4-shims.min.css" integrity="sha256-6qHlizsOWFskGlwVOKuns+D1nB6ssZrHQrNj1wGplHc=" crossorigin="anonymous" />
+
+<!-- clipboard.js -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js" integrity="sha256-FiZwavyI2V6+EXO1U+xzLG3IKldpiTFf3153ea9zikQ=" crossorigin="anonymous"></script>
+
+<!-- headroom.js -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.9.4/headroom.min.js" integrity="sha256-DJFC1kqIhelURkuza0AvYal5RxMtpzLjFhsnVIeuk+U=" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.9.4/jQuery.headroom.min.js" integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=" crossorigin="anonymous"></script>
+
+<!-- pkgdown -->
+<link href="../pkgdown.css" rel="stylesheet">
+<script src="../pkgdown.js"></script>
+
+
+
+
+<meta property="og:title" content="Plot a fitted nonlinear mixed model obtained via an mmkin row object — plot.nlme.mmkin" />
+<meta property="og:description" content="Plot a fitted nonlinear mixed model obtained via an mmkin row object" />
+<meta name="twitter:card" content="summary" />
+
+
+
+
+<!-- mathjax -->
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js" integrity="sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=" crossorigin="anonymous"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js" integrity="sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=" crossorigin="anonymous"></script>
+
+<!--[if lt IE 9]>
+<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
+<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+<![endif]-->
+
+
+
+ </head>
+
+ <body>
+ <div class="container template-reference-topic">
+ <header>
+ <div class="navbar navbar-default navbar-fixed-top" role="navigation">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
+ <span class="sr-only">Toggle navigation</span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <span class="navbar-brand">
+ <a class="navbar-link" href="../index.html">mkin</a>
+ <span class="version label label-default" data-toggle="tooltip" data-placement="bottom" title="Released version">0.9.49.10</span>
+ </span>
+ </div>
+
+ <div id="navbar" class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li>
+ <a href="../reference/index.html">Functions and data</a>
+</li>
+<li class="dropdown">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
+ Articles
+
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li>
+ <a href="../articles/mkin.html">Introduction to mkin</a>
+ </li>
+ <li>
+ <a href="../articles/FOCUS_D.html">Example evaluation of FOCUS Example Dataset D</a>
+ </li>
+ <li>
+ <a href="../articles/FOCUS_L.html">Example evaluation of FOCUS Laboratory Data L1 to L3</a>
+ </li>
+ <li>
+ <a href="../articles/web_only/FOCUS_Z.html">Example evaluation of FOCUS Example Dataset Z</a>
+ </li>
+ <li>
+ <a href="../articles/web_only/compiled_models.html">Performance benefit by using compiled model definitions in mkin</a>
+ </li>
+ <li>
+ <a href="../articles/twa.html">Calculation of time weighted average concentrations with mkin</a>
+ </li>
+ <li>
+ <a href="../articles/web_only/NAFTA_examples.html">Example evaluation of NAFTA SOP Attachment examples</a>
+ </li>
+ </ul>
+</li>
+<li>
+ <a href="../news/index.html">News</a>
+</li>
+ </ul>
+ <ul class="nav navbar-nav navbar-right">
+
+ </ul>
+
+ </div><!--/.nav-collapse -->
+ </div><!--/.container -->
+</div><!--/.navbar -->
+
+
+
+ </header>
+
+<div class="row">
+ <div class="col-md-9 contents">
+ <div class="page-header">
+ <h1>Plot a fitted nonlinear mixed model obtained via an mmkin row object</h1>
+
+ <div class="hidden name"><code>plot.nlme.mmkin.Rd</code></div>
+ </div>
+
+ <div class="ref-description">
+ <p>Plot a fitted nonlinear mixed model obtained via an mmkin row object</p>
+ </div>
+
+ <pre class="usage"><span class='co'># S3 method for nlme.mmkin</span>
+<span class='fu'><a href='https://rdrr.io/r/graphics/plot.html'>plot</a></span>(
+ <span class='no'>x</span>,
+ <span class='kw'>i</span> <span class='kw'>=</span> <span class='fl'>1</span>:<span class='fu'><a href='https://rdrr.io/r/base/nrow.html'>ncol</a></span>(<span class='no'>x</span>$<span class='no'>mmkin_orig</span>),
+ <span class='kw'>main</span> <span class='kw'>=</span> <span class='st'>"auto"</span>,
+ <span class='kw'>legends</span> <span class='kw'>=</span> <span class='fl'>1</span>,
+ <span class='kw'>resplot</span> <span class='kw'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span>(<span class='st'>"time"</span>, <span class='st'>"errmod"</span>),
+ <span class='kw'>standardized</span> <span class='kw'>=</span> <span class='fl'>FALSE</span>,
+ <span class='kw'>cex</span> <span class='kw'>=</span> <span class='fl'>0.7</span>,
+ <span class='kw'>rel.height.middle</span> <span class='kw'>=</span> <span class='fl'>0.9</span>,
+ <span class='kw'>ymax</span> <span class='kw'>=</span> <span class='st'>"auto"</span>,
+ <span class='no'>...</span>
+)</pre>
+
+ <h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a>Arguments</h2>
+ <table class="ref-arguments">
+ <colgroup><col class="name" /><col class="desc" /></colgroup>
+ <tr>
+ <th>x</th>
+ <td><p>An object of class <code><a href='nlme.mmkin.html'>nlme.mmkin</a></code></p></td>
+ </tr>
+ <tr>
+ <th>i</th>
+ <td><p>A numeric index to select datasets for which to plot the nlme fit,
+in case plots get too large</p></td>
+ </tr>
+ <tr>
+ <th>main</th>
+ <td><p>The main title placed on the outer margin of the plot.</p></td>
+ </tr>
+ <tr>
+ <th>legends</th>
+ <td><p>An index for the fits for which legends should be shown.</p></td>
+ </tr>
+ <tr>
+ <th>resplot</th>
+ <td><p>Should the residuals plotted against time, using
+<code><a href='mkinresplot.html'>mkinresplot</a></code>, or as squared residuals against predicted
+values, with the error model, using <code><a href='mkinerrplot.html'>mkinerrplot</a></code>.</p></td>
+ </tr>
+ <tr>
+ <th>standardized</th>
+ <td><p>Should the residuals be standardized? This option
+is passed to <code><a href='mkinresplot.html'>mkinresplot</a></code>, it only takes effect if
+`resplot = "time"`.</p></td>
+ </tr>
+ <tr>
+ <th>cex</th>
+ <td><p>Passed to the plot functions and <code><a href='https://rdrr.io/r/graphics/mtext.html'>mtext</a></code>.</p></td>
+ </tr>
+ <tr>
+ <th>rel.height.middle</th>
+ <td><p>The relative height of the middle plot, if more
+than two rows of plots are shown.</p></td>
+ </tr>
+ <tr>
+ <th>ymax</th>
+ <td><p>Maximum y axis value for <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code>.</p></td>
+ </tr>
+ <tr>
+ <th>...</th>
+ <td><p>Further arguments passed to <code><a href='plot.mkinfit.html'>plot.mkinfit</a></code> and
+<code><a href='mkinresplot.html'>mkinresplot</a></code>.</p></td>
+ </tr>
+ </table>
+
+ <h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2>
+
+ <p>The function is called for its side effect.</p>
+
+ <h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2>
+ <pre class="examples"><div class='input'><span class='no'>ds</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/r/base/lapply.html'>lapply</a></span>(<span class='no'>experimental_data_for_UBA_2019</span>[<span class='fl'>6</span>:<span class='fl'>10</span>],
+ <span class='kw'>function</span>(<span class='no'>x</span>) <span class='fu'><a href='https://rdrr.io/r/base/subset.html'>subset</a></span>(<span class='no'>x</span>$<span class='no'>data</span>[<span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span>(<span class='st'>"name"</span>, <span class='st'>"time"</span>, <span class='st'>"value"</span>)], <span class='no'>name</span> <span class='kw'>==</span> <span class='st'>"parent"</span>))
+<span class='no'>f</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='mmkin.html'>mmkin</a></span>(<span class='st'>"SFO"</span>, <span class='no'>ds</span>, <span class='kw'>quiet</span> <span class='kw'>=</span> <span class='fl'>TRUE</span>, <span class='kw'>cores</span> <span class='kw'>=</span> <span class='fl'>1</span>)
+<span class='co'>#plot(f) # too many panels for pkgdown</span>
+<span class='fu'><a href='https://rdrr.io/r/base/library.html'>library</a></span>(<span class='no'>nlme</span>)
+<span class='no'>f_nlme</span> <span class='kw'>&lt;-</span> <span class='fu'><a href='https://rdrr.io/pkg/nlme/man/nlme.html'>nlme</a></span>(<span class='no'>f</span>)
+
+<span class='co'>#plot(f_nlme) # too many panels for pkgdown</span>
+<span class='fu'><a href='https://rdrr.io/r/graphics/plot.html'>plot</a></span>(<span class='no'>f_nlme</span>, <span class='fl'>1</span>:<span class='fl'>2</span>)</div><div class='img'><img src='plot.nlme.mmkin-1.png' alt='' width='700' height='433' /></div></pre>
+ </div>
+ <div class="col-md-3 hidden-xs hidden-sm" id="sidebar">
+ <h2>Contents</h2>
+ <ul class="nav nav-pills nav-stacked">
+ <li><a href="#arguments">Arguments</a></li>
+ <li><a href="#value">Value</a></li>
+ <li><a href="#examples">Examples</a></li>
+ </ul>
+
+ <h2>Author</h2>
+ <p>Johannes Ranke</p>
+ </div>
+</div>
+
+
+ <footer>
+ <div class="copyright">
+ <p>Developed by Johannes Ranke.</p>
+</div>
+
+<div class="pkgdown">
+ <p>Site built with <a href="https://pkgdown.r-lib.org/">pkgdown</a> 1.4.1.</p>
+</div>
+
+ </footer>
+ </div>
+
+
+
+
+ </body>
+</html>
+
+
diff --git a/docs/sitemap.xml b/docs/sitemap.xml
index 8ba032de..d1c86707 100644
--- a/docs/sitemap.xml
+++ b/docs/sitemap.xml
@@ -133,6 +133,9 @@
<loc>https://pkgdown.jrwb.de/mkin/reference/nlme.html</loc>
</url>
<url>
+ <loc>https://pkgdown.jrwb.de/mkin/reference/nlme.mmkin.html</loc>
+ </url>
+ <url>
<loc>https://pkgdown.jrwb.de/mkin/reference/nobs.mkinfit.html</loc>
</url>
<url>
@@ -148,6 +151,9 @@
<loc>https://pkgdown.jrwb.de/mkin/reference/plot.nafta.html</loc>
</url>
<url>
+ <loc>https://pkgdown.jrwb.de/mkin/reference/plot.nlme.mmkin.html</loc>
+ </url>
+ <url>
<loc>https://pkgdown.jrwb.de/mkin/reference/print.mkinds.html</loc>
</url>
<url>
diff --git a/man/nlme.Rd b/man/nlme.Rd
index 971ba3f5..f31c7a4f 100644
--- a/man/nlme.Rd
+++ b/man/nlme.Rd
@@ -4,7 +4,7 @@
\alias{nlme_function}
\alias{mean_degparms}
\alias{nlme_data}
-\title{Estimation of parameter distributions from mmkin row objects}
+\title{Helper functions to create nlme models from mmkin row objects}
\usage{
nlme_function(object)
diff --git a/man/nlme.mmkin.Rd b/man/nlme.mmkin.Rd
index 5f937488..1fecb5dd 100644
--- a/man/nlme.mmkin.Rd
+++ b/man/nlme.mmkin.Rd
@@ -54,11 +54,13 @@ parameters taken from the mmkin object are used}
\item{verbose}{passed to nlme}
}
\value{
-Upon success, a fitted nlme.mmkin object, which is
- an nlme object with additional elements
+Upon success, a fitted nlme.mmkin object, which is an nlme object
+ with additional elements
}
\description{
-Create an nlme model for an mmkin row object
+This functions sets up a nonlinear mixed effects model for an mmkin row
+object. An mmkin row object is essentially a list of mkinfit objects that
+have been obtained by fitting the same model to a list of datasets.
}
\examples{
ds <- lapply(experimental_data_for_UBA_2019[6:10],
@@ -70,3 +72,6 @@ nlme(f, random = parent_0 ~ 1)
f_nlme <- nlme(f, start = c(parent_0 = 100, log_k_parent_sink = 0.1))
update(f_nlme, random = parent_0 ~ 1)
}
+\seealso{
+\code{\link{nlme_function}}
+}
diff --git a/man/plot.nlme.mmkin.Rd b/man/plot.nlme.mmkin.Rd
new file mode 100644
index 00000000..c0e749aa
--- /dev/null
+++ b/man/plot.nlme.mmkin.Rd
@@ -0,0 +1,67 @@
+% Generated by roxygen2: do not edit by hand
+% Please edit documentation in R/plot.nlme.mmkin.R
+\name{plot.nlme.mmkin}
+\alias{plot.nlme.mmkin}
+\title{Plot a fitted nonlinear mixed model obtained via an mmkin row object}
+\usage{
+\method{plot}{nlme.mmkin}(
+ x,
+ i = 1:ncol(x$mmkin_orig),
+ main = "auto",
+ legends = 1,
+ resplot = c("time", "errmod"),
+ standardized = FALSE,
+ cex = 0.7,
+ rel.height.middle = 0.9,
+ ymax = "auto",
+ ...
+)
+}
+\arguments{
+\item{x}{An object of class \code{\link{nlme.mmkin}}}
+
+\item{i}{A numeric index to select datasets for which to plot the nlme fit,
+in case plots get too large}
+
+\item{main}{The main title placed on the outer margin of the plot.}
+
+\item{legends}{An index for the fits for which legends should be shown.}
+
+\item{resplot}{Should the residuals plotted against time, using
+\code{\link{mkinresplot}}, or as squared residuals against predicted
+values, with the error model, using \code{\link{mkinerrplot}}.}
+
+\item{standardized}{Should the residuals be standardized? This option
+is passed to \code{\link{mkinresplot}}, it only takes effect if
+`resplot = "time"`.}
+
+\item{cex}{Passed to the plot functions and \code{\link{mtext}}.}
+
+\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}}.}
+}
+\value{
+The function is called for its side effect.
+}
+\description{
+Plot a fitted nonlinear mixed model obtained via an mmkin row object
+}
+\examples{
+ds <- lapply(experimental_data_for_UBA_2019[6:10],
+ function(x) subset(x$data[c("name", "time", "value")], name == "parent"))
+f <- mmkin("SFO", ds, quiet = TRUE, cores = 1)
+#plot(f) # too many panels for pkgdown
+library(nlme)
+f_nlme <- nlme(f)
+
+#plot(f_nlme) # too many panels for pkgdown
+plot(f_nlme, 1:2)
+}
+\author{
+Johannes Ranke
+}

Contact - Imprint