From 12934520d7ec3218ce1505787b6066334a24a562 Mon Sep 17 00:00:00 2001 From: jranke Date: Tue, 30 Mar 2010 19:49:44 +0000 Subject: Initial import of the kinfit package developed from 2008-07 to 2010-03 at Harlan Laboratories Ltd (former RCC Ltd). Supports fitting of parent data with the usual FOCUS kinetic models. git-svn-id: svn+ssh://svn.r-forge.r-project.org/svnroot/kinfit/pkg/kinfit@2 edb9625f-4e0d-4859-8d74-9fd3b1da38cb --- R/kinfit.R | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 R/kinfit.R (limited to 'R/kinfit.R') diff --git a/R/kinfit.R b/R/kinfit.R new file mode 100644 index 0000000..42a6520 --- /dev/null +++ b/R/kinfit.R @@ -0,0 +1,94 @@ +kinfit <- function(kindata, kinmodels = c("SFO"), + parent.0.user = NA, + start.SFO = list(parent.0 = NA, k = NA), + start.FOMC = list(parent.0 = NA, alpha = NA, beta = NA), + start.DFOP = list(parent.0 = NA, k1 = NA, k2 = NA, g = NA), + start.HS = list(parent.0 = NA, k1 = NA, k2 = NA, tb = NA), + algorithm = "port") +{ + kindata <- subset(kindata, !is.na(kindata$parent)) + kinfits <- list() + + if (!is.na(parent.0.user)) { + start.SFO$parent.0 = parent.0.user + start.FOMC$parent.0 = parent.0.user + } + + lmlogged = lm(log(parent) ~ t, data = kindata) + + for (kinmodel in kinmodels) + { + + if (kinmodel == "SFO") { + if (is.na(start.SFO$parent.0)) { + start.SFO$parent.0 = max(kindata$parent) + } + if (is.na(start.SFO$k)) { + start.SFO$k = - coef(lmlogged)[["t"]] + } + kinfits[[kinmodel]] = try( + nls(parent ~ SFO(t, parent.0, k), + data = kindata, model = TRUE, + start = start.SFO, + algorithm = algorithm), silent=TRUE) + } + k.est = ifelse(is.na(coef(kinfits$SFO)[["k"]]), + -coef(lmlogged)[["t"]], + coef(kinfits$SFO)[["k"]]) + if (kinmodel == "FOMC") { + if (is.na(start.FOMC$parent.0)) { + start.FOMC$parent.0 = max(kindata$parent) + } + if (is.na(start.FOMC$alpha)) { + start.FOMC$alpha = 1 + } + if (is.na(start.FOMC$beta)) { + start.FOMC$beta = start.FOMC$alpha / k.est + } + kinfits[[kinmodel]] = try( + nls(parent ~ FOMC(t, parent.0, alpha, beta), + data = kindata, model = TRUE, + start = start.FOMC, + algorithm = algorithm), silent=TRUE) + } + if (kinmodel == "DFOP") { + if (is.na(start.DFOP$parent.0)) { + start.DFOP$parent.0 = max(kindata$parent) + } + if (is.na(start.DFOP$k1)) { + start.DFOP$k1 = k.est * 2 + } + if (is.na(start.DFOP$k2)) { + start.DFOP$k2 = k.est / 2 + } + if (is.na(start.DFOP$g)) { + start.DFOP$g = 0.5 + } + kinfits[[kinmodel]] = try( + nls(parent ~ DFOP(t, parent.0, k1, k2, g), + data = kindata, model = TRUE, + start = start.DFOP, + algorithm = algorithm), silent=TRUE) + } + if (kinmodel == "HS") { + if (is.na(start.HS$parent.0)) { + start.HS$parent.0 = max(kindata$parent) + } + if (is.na(start.HS$k1)) { + start.HS$k1 = k.est + } + if (is.na(start.HS$k2)) { + start.HS$k2 = k.est / 10 + } + if (is.na(start.HS$tb)) { + start.HS$tb = 0.05 * max(kindata$t) + } + kinfits[[kinmodel]] = try( + nls(parent ~ HS(t, parent.0, k1, k2, tb), + data = kindata, model = TRUE, + start = start.HS, + algorithm = algorithm), silent=TRUE) + } + } + return(kinfits) +} -- cgit v1.2.1