## ----opts, echo = FALSE, message = FALSE-------------------------------------- library("knitr") #knitr::opts_chunk$set(eval = FALSE) ## ----eval=TRUE, echo=FALSE, results="hide"------------------------------------ suppressMessages(require("growthrates")) #require("growthrates") ## ----eval=FALSE--------------------------------------------------------------- # library("growthrates") ## ----------------------------------------------------------------------------- grow_logistic_yshift <- function(time, parms) { with(as.list(parms), { y <- (K * y0) / (y0 + (K - y0) * exp(-mumax * time)) + y_shift as.matrix(data.frame(time = time, y = y)) }) } ## ----fig.width=5, fig.height=4------------------------------------------------ time <- 1:10 out <- grow_logistic_yshift(time, parms = list(y0 = 1, mumax = 0.5, K = 10, y_shift = 2)) plot(time, out[, "y"], type = "b") ## ----fig.width=5, fig.height=4------------------------------------------------ x <- seq(5, 100, 5) y <- c(2.1, 2.3, 5, 4.7, 4.3, 6.9, 8.2, 11.5, 8.8, 10.2, 14.5, 12.5, 13.6, 12.7, 14.2, 12.5, 13.8, 15.1, 12.7, 14.9) fit <- fit_growthmodel(grow_logistic_yshift, p = c(y0 = 1, mumax = 0.1, K = 10, K = 10, y_shift = 1), time = x, y = y) plot(fit) summary(fit) ## ----------------------------------------------------------------------------- ode_K_linear <- function (time, init, parms, ...) { with(as.list(c(parms, init)), { dy <- mumax * y * (1 - y/K) dK <- dK list(c(dy, dK)) }) } grow_K_linear <- function(time, parms, ...) { init <- parms[c("y0", "K")] # initial values names(init) <- c("y", "K") # force names of state variables odeparms <- parms[c("mumax", "dK")] # the parms of the ODE model out <- ode(init, time, ode_K_linear, parms = odeparms) out } ## ----------------------------------------------------------------------------- grow_K_linear <- growthmodel(grow_K_linear, pnames = c("y0", "K", "mumax", "deltaK")) head(grow_K_linear(time = 1:10, c(y0 = .1, K = 1, mumax = 0.1, dK = 0.5))) ## ----fig.width=4, fig.height=3------------------------------------------------ x <- seq(5, 100, 5) y <- c(0.1, 2.2, 3.1, 1.5, 8.9, 8, 8.4, 9.8, 9.3, 10.6, 12, 13.6, 13.1, 13.3, 11.6, 14.7, 12.6, 13.9, 16.9, 14.4) fit <- fit_growthmodel(grow_K_linear, p = c(y0 = 0.1, mumax = 0.2, K = 10, dK = .1), time = x, y = y) plot(fit) summary(fit) ## ----eval=FALSE--------------------------------------------------------------- # ## The following example shows how to use compiled growth models # ## from inline code, by using the 'cOde' package of Daniel Kaschek # ## Note: This example needs the R development tools. # ## - suitable compilers on Linux and Mac # ## - Rtools on Windows from https://cran.r-project.org/bin/windows/Rtools/ # # library("growthrates") # library("cOde") # # ## define a system of ODEs and compile it -------------------------------------- # ode_K_linear <- funC(c( # y = "mumax * y * (1-y/K)", # K = "dK" # )) # # yini <- c(y = 1, K = 10) # parms = c(mumax = 0.1, dK = 0.05) # # ## run the model # out1 <- odeC(yini, times = 0:100, ode_K_linear, parms = parms) # # ## generate artificial test data with normal distributed noise # x <- seq(5, 100, 5) # y <- odeC(yini, x, ode_K_linear, parms)[, "y"] + rnorm(x) # # # ## create a "growthmodel" with interfaces compatible to package growthrates # ## It is essential to use consistent names for parameters and initial values! # # grow_K_linear <- function(time, parms, ...) { # init <- parms[c("y0", "K")] # initial values # names(init) <- c("y", "K") # force names # out <- odeC(init, time, ode_K_linear, parms) # out # } # # ## convert this to an object, (maybe needed by future extensions) # grow_K_linear <- growthmodel(grow_K_linear, pnames = c("y0", "mumax", "K", "dK")) # # ## Test the growthmodel # ## Columns with names 'time' and 'y' are mandatory. # head(grow_K_linear(time = x, c(y0 = 1, mumax = 0.1, K = 10, dK = 0.1))) # # # ## Fit the model --------------------------------------------------------------- # fit <- fit_growthmodel(grow_K_linear, # p = c(y0 = 1, mumax = 0.1, K = 10, dK = 0.1), time = x, y = y) # plot(fit) # summary(fit) # # ## Unload DLL and cleanup ------------------------------------------------------ # ## DLL creation should ideally be directed to a temporary directory. # dll <- paste(ode_K_linear, .Platform$dynlib.ext, sep = "") # dyn.unload(dll) # unlink(dll) # unlink(paste(ode_K_linear, ".c", sep = "")) # unlink(paste(ode_K_linear, ".o", sep = ""))