diff options
-rw-r--r-- | NAMESPACE | 5 | ||||
-rw-r--r-- | R/saemix.R | 114 | ||||
-rw-r--r-- | man/saemix.Rd | 53 |
3 files changed, 113 insertions, 59 deletions
@@ -28,6 +28,7 @@ S3method(print,nlme.mmkin) S3method(print,summary.mkinfit) S3method(print,summary.nlme.mmkin) S3method(residuals,mkinfit) +S3method(saemix,mmkin) S3method(summary,mkinfit) S3method(summary,nlme.mmkin) S3method(update,mkinfit) @@ -76,6 +77,7 @@ export(parms) export(plot_err) export(plot_res) export(plot_sep) +export(saemix) export(saemix_data) export(saemix_model) export(sigma_twocomp) @@ -94,8 +96,6 @@ importFrom(parallel,mclapply) importFrom(parallel,parLapply) importFrom(pkgbuild,has_compiler) importFrom(purrr,map_dfr) -importFrom(saemix,saemixData) -importFrom(saemix,saemixModel) importFrom(stats,AIC) importFrom(stats,BIC) importFrom(stats,aggregate) @@ -123,6 +123,5 @@ importFrom(stats,residuals) importFrom(stats,rnorm) importFrom(stats,shapiro.test) importFrom(stats,update) -importFrom(stats,var) importFrom(utils,getFromNamespace) importFrom(utils,write.table) @@ -1,63 +1,91 @@ -#' Create saemix models from mmkin row objects +#' Create saemix models #' -#' This function sets up a nonlinear mixed effects model for an mmkin row -#' object for use with the saemix package. An mmkin row object is essentially a -#' list of mkinfit objects that have been obtained by fitting the same model to +#' The saemix function defined in this package is an S3 generic function +#' using [saemix::saemix()] as its method for [saemix::SaemixModel] objects. +#' +#' The method for mmkin row objects sets up a nonlinear mixed effects model for +#' use with the saemix package. 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. #' #' Starting values for the fixed effects (population mean parameters, argument psi0 of #' [saemix::saemixModel()] are the mean values of the parameters found using -#' mmkin. Starting variances of the random effects (argument omega.init) are the -#' variances of the deviations of the parameters from these mean values. +#' [mmkin]. #' -#' @param object An mmkin row object containing several fits of the same model -#' to different datasets -#' @param cores The number of cores to be used for multicore processing using -#' [parallel::mclapply()]. Using more than 1 core is experimental and may -#' lead to uncontrolled forking, apparently depending on the BLAS version -#' used. -#' @rdname saemix -#' @importFrom saemix saemixData saemixModel -#' @importFrom stats var +#' @param model For the default method, this is an [saemix::saemixModel] object. +#' If this is an [mmkin] row object, the [saemix::saemixModel] is created +#' internally from the [mmkin] object. +#' @param object An [mmkin] row object containing several fits of the same +#' [mkinmod] model to different datasets +#' @param verbose Should we print information about created objects? +#' @param \dots Further parameters passed to [saemix::saemixData] +#' and [saemix::saemixModel]. +#' @return An [saemix::SaemixObject]. #' @examples #' \dontrun{ -#' library(saemix) +#' # We do not load the saemix package, as this would override our saemix +#' # generic #' ds <- lapply(experimental_data_for_UBA_2019[6:10], #' function(x) subset(x$data[c("name", "time", "value")])) #' names(ds) <- paste("Dataset", 6:10) #' f_mmkin_parent_p0_fixed <- mmkin("FOMC", ds, cores = 1, #' state.ini = c(parent = 100), fixed_initials = "parent", quiet = TRUE) -#' m_saemix_p0_fixed <- saemix_model(f_mmkin_parent_p0_fixed["FOMC", ]) -#' d_saemix_parent <- saemix_data(f_mmkin_parent_p0_fixed) -#' saemix_options <- list(seed = 123456, displayProgress = FALSE, -#' save = FALSE, save.graphs = FALSE, nbiter.saemix = c(200, 80)) -#' f_saemix_p0_fixed <- saemix(m_saemix_p0_fixed, d_saemix_parent, saemix_options) +#' f_saemix_p0_fixed <- saemix(f_mmkin_parent_p0_fixed) #' #' f_mmkin_parent <- mmkin(c("SFO", "FOMC", "DFOP"), ds, quiet = TRUE) -#' m_saemix_sfo <- saemix_model(f_mmkin_parent["SFO", ]) -#' m_saemix_fomc <- saemix_model(f_mmkin_parent["FOMC", ]) -#' m_saemix_dfop <- saemix_model(f_mmkin_parent["DFOP", ]) -#' d_saemix_parent <- saemix_data(f_mmkin_parent["SFO", ]) -#' f_saemix_sfo <- saemix(m_saemix_sfo, d_saemix_parent, saemix_options) -#' f_saemix_fomc <- saemix(m_saemix_fomc, d_saemix_parent, saemix_options) -#' f_saemix_dfop <- saemix(m_saemix_dfop, d_saemix_parent, saemix_options) -#' compare.saemix(list(f_saemix_sfo, f_saemix_fomc, f_saemix_dfop)) +#' f_saemix_sfo <- saemix(f_mmkin_parent["SFO", ]) +#' f_saemix_fomc <- saemix(f_mmkin_parent["FOMC", ]) +#' f_saemix_dfop <- saemix(f_mmkin_parent["DFOP", ]) +#' +#' # We can use functions from the saemix package by prepending saemix:: +#' saemix::compare.saemix(list(f_saemix_sfo, f_saemix_fomc, f_saemix_dfop)) +#' #' f_mmkin_parent_tc <- update(f_mmkin_parent, error_model = "tc") -#' m_saemix_fomc_tc <- saemix_model(f_mmkin_parent_tc["FOMC", ]) -#' f_saemix_fomc_tc <- saemix(m_saemix_fomc_tc, d_saemix_parent, saemix_options) -#' compare.saemix(list(f_saemix_fomc, f_saemix_fomc_tc)) +#' f_saemix_fomc_tc <- saemix(f_mmkin_parent_tc["FOMC", ]) +#' saemix::compare.saemix(list(f_saemix_fomc, f_saemix_fomc_tc)) #' #' dfop_sfo <- mkinmod(parent = mkinsub("DFOP", "A1"), #' A1 = mkinsub("SFO")) #' f_mmkin <- mmkin(list("DFOP-SFO" = dfop_sfo), ds, quiet = TRUE) -#' m_saemix <- saemix_model(f_mmkin) -#' d_saemix <- saemix_data(f_mmkin) -#' f_saemix <- saemix(m_saemix, d_saemix, saemix_options) +#' f_saemix <- saemix(f_mmkin) #' #' } +#' @export +saemix <- function(model, data, control, ...) UseMethod("saemix") + +#' @rdname saemix +#' @export +saemix.mmkin <- function(model, data, + control = list(displayProgress = FALSE, print = FALSE, + save = FALSE, save.graphs = FALSE), + verbose = FALSE, suppressPlot = TRUE, ...) +{ + m_saemix <- saemix_model(model, verbose = verbose) + d_saemix <- saemix_data(model, verbose = verbose) + if (suppressPlot) { + # We suppress the log-likelihood curve that saemix currently + # produces at the end of the fit by plotting to a file + # that we discard afterwards + tmp <- tempfile() + png(tmp) + } + result <- saemix::saemix(m_saemix, d_saemix, control) + if (suppressPlot) { + dev.off() + unlink(tmp) + } + class(result) <- c("saemix.mmkin", "saemix") + return(result) +} + +#' @rdname saemix +#' @param cores The number of cores to be used for multicore processing using +#' [parallel::mclapply()]. Using more than 1 core is experimental and may +#' lead to uncontrolled forking, apparently depending on the BLAS version +#' used. #' @return An [saemix::SaemixModel] object. #' @export -saemix_model <- function(object, cores = 1) { +saemix_model <- function(object, cores = 1, verbose = FALSE, ...) { if (nrow(object) > 1) stop("Only row objects allowed") mkin_model <- object[[1]]$mkinmod @@ -205,21 +233,21 @@ saemix_model <- function(object, cores = 1) { psi0_matrix <- matrix(degparms_optim, nrow = 1) colnames(psi0_matrix) <- names(degparms_optim) - res <- saemixModel(model_function, + res <- saemix::saemixModel(model_function, psi0 = psi0_matrix, "Mixed model generated from mmkin object", transform.par = transform.par, error.model = error.model, - error.init = error.init + error.init = error.init, + verbose = verbose ) return(res) } #' @rdname saemix -#' @param \dots Further parameters passed to [saemix::saemixData] #' @return An [saemix::SaemixData] object. #' @export -saemix_data <- function(object, ...) { +saemix_data <- function(object, verbose = FALSE, ...) { if (nrow(object) > 1) stop("Only row objects allowed") ds_names <- colnames(object) @@ -232,9 +260,11 @@ saemix_data <- function(object, ...) { value = ds_saemix_all$observed, stringsAsFactors = FALSE) - res <- saemixData(ds_saemix, + res <- saemix::saemixData(ds_saemix, name.group = "ds", name.predictors = c("time", "name"), - name.response = "value", ...) + name.response = "value", + verbose = verbose, + ...) return(res) } diff --git a/man/saemix.Rd b/man/saemix.Rd index d4a8d0a4..1959817a 100644 --- a/man/saemix.Rd +++ b/man/saemix.Rd @@ -1,41 +1,65 @@ % Generated by roxygen2: do not edit by hand % Please edit documentation in R/saemix.R -\name{saemix_model} +\name{saemix} +\alias{saemix} +\alias{saemix.mmkin} \alias{saemix_model} \alias{saemix_data} -\title{Create saemix models from mmkin row objects} +\title{Create saemix models} \usage{ -saemix_model(object, cores = 1) +saemix(model, data, control, ...) -saemix_data(object, ...) +\method{saemix}{mmkin}( + model, + data, + control = list(displayProgress = FALSE, print = FALSE, save = FALSE, save.graphs = + FALSE), + verbose = FALSE, + ... +) + +saemix_model(object, cores = 1, verbose = FALSE, ...) + +saemix_data(object, verbose = FALSE, ...) } \arguments{ -\item{object}{An mmkin row object containing several fits of the same model -to different datasets} +\item{model}{For the default method, this is an \link[saemix:saemixModel]{saemix::saemixModel} object. +If this is an \link{mmkin} row object, the \link[saemix:saemixModel]{saemix::saemixModel} is created +internally from the \link{mmkin} object.} + +\item{\dots}{Further parameters passed to \link[saemix:saemixData]{saemix::saemixData} +and \link[saemix:saemixModel]{saemix::saemixModel}.} + +\item{verbose}{Should we print information about created objects?} + +\item{object}{An \link{mmkin} row object containing several fits of the same +\link{mkinmod} model to different datasets} \item{cores}{The number of cores to be used for multicore processing using \code{\link[parallel:mclapply]{parallel::mclapply()}}. Using more than 1 core is experimental and may lead to uncontrolled forking, apparently depending on the BLAS version used.} - -\item{\dots}{Further parameters passed to \link[saemix:saemixData]{saemix::saemixData}} } \value{ +An \link[saemix:SaemixObject-class]{saemix::SaemixObject}. + An \link[saemix:SaemixModel-class]{saemix::SaemixModel} object. An \link[saemix:SaemixData-class]{saemix::SaemixData} object. } \description{ -This function sets up a nonlinear mixed effects model for an mmkin row -object for use with the saemix package. 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. +The saemix function defined in this package is an S3 generic function +using \code{\link[saemix:saemix]{saemix::saemix()}} as its method for \link[saemix:SaemixModel-class]{saemix::SaemixModel} objects. } \details{ +The method for mmkin row objects sets up a nonlinear mixed effects model for +use with the saemix package. 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. + Starting values for the fixed effects (population mean parameters, argument psi0 of \code{\link[saemix:saemixModel]{saemix::saemixModel()}} are the mean values of the parameters found using -mmkin. Starting variances of the random effects (argument omega.init) are the -variances of the deviations of the parameters from these mean values. +\link{mmkin}. } \examples{ \dontrun{ @@ -45,6 +69,7 @@ ds <- lapply(experimental_data_for_UBA_2019[6:10], names(ds) <- paste("Dataset", 6:10) f_mmkin_parent_p0_fixed <- mmkin("FOMC", ds, cores = 1, state.ini = c(parent = 100), fixed_initials = "parent", quiet = TRUE) +f_saemix_p0_fixed <- saemix(f_mmkin_parent_p0_fixed) m_saemix_p0_fixed <- saemix_model(f_mmkin_parent_p0_fixed["FOMC", ]) d_saemix_parent <- saemix_data(f_mmkin_parent_p0_fixed) saemix_options <- list(seed = 123456, displayProgress = FALSE, |