diff options
21 files changed, 35 insertions, 21 deletions
@@ -3,6 +3,8 @@ * R/mkinresplot.R: Make it possible to specify xlim
* R/geometric_mean.R, man/geometric_mean.Rd: Add geometric mean
function
+ * R/mkinfit.R, man/mkinfit.Rd: Calculate additional (pseudo)-DT50
+ values for FOMC, DFOP, HS and SFORB
2014-05-20 Johannes Ranke <jranke@uni-bremen.de> for mkin (0.9-28)
diff --git a/R/endpoints.R b/R/endpoints.R index c9a6a51f..18d8159b 100644 --- a/R/endpoints.R +++ b/R/endpoints.R @@ -1,6 +1,8 @@ -endpoints <- function(fit, pseudoDT50 = FALSE) {
+endpoints <- function(fit) {
# Calculate dissipation times DT50 and DT90 and, if necessary, formation
# fractions and SFORB eigenvalues from optimised parameters
+ # Additional DT50 values are calculated from the FOMC DT90 and k1 and k2 from HS and DFOP,
+ # as well as from Eigenvalues b1 and b2 of the SFORB model
ep <- list()
obs_vars <- fit$obs_vars
parms.all <- fit$bparms.ode
@@ -40,6 +42,8 @@ endpoints <- function(fit, pseudoDT50 = FALSE) { beta = parms.all["beta"]
DT50 = beta * (2^(1/alpha) - 1)
DT90 = beta * (10^(1/alpha) - 1)
+ DT50_back = DT90 / (log(10)/log(2)) # Backcalculated DT50 as recommended in FOCUS 2011
+ ep$distimes[obs_var, c("DT50back")] = DT50_back
}
if (type == "DFOP") {
k1 = parms.all["k1"]
@@ -54,6 +58,10 @@ endpoints <- function(fit, pseudoDT50 = FALSE) { DT50 = ifelse(DTmax - DT50.o < 0.1, NA, DT50.o)
DT90.o <- optimize(f, c(0.001, DTmax), x=90)$minimum
DT90 = ifelse(DTmax - DT90.o < 0.1, NA, DT90.o)
+ DT50_k1 = log(2)/k1
+ DT50_k2 = log(2)/k2
+ ep$distimes[obs_var, c("DT50_k1")] = DT50_k1
+ ep$distimes[obs_var, c("DT50_k2")] = DT50_k2
}
if (type == "HS") {
k1 = parms.all["k1"]
@@ -68,6 +76,10 @@ endpoints <- function(fit, pseudoDT50 = FALSE) { }
DT50 <- DTx(50)
DT90 <- DTx(90)
+ DT50_k1 = log(2)/k1
+ DT50_k2 = log(2)/k2
+ ep$distimes[obs_var, c("DT50_k1")] = DT50_k1
+ ep$distimes[obs_var, c("DT50_k2")] = DT50_k2
}
if (type == "SFORB") {
# FOCUS kinetics (2006), p. 60 f
@@ -98,11 +110,17 @@ endpoints <- function(fit, pseudoDT50 = FALSE) { ep$ff[[sub("k_", "", k_out_name)]] = parms.all[[k_out_name]] / k_1output
}
+ DT50_b1 = log(2)/b1
+ DT50_b2 = log(2)/b2
+
# Return the eigenvalues for comparison with DFOP rate constants
ep$SFORB[[paste(obs_var, "b1", sep="_")]] = b1
ep$SFORB[[paste(obs_var, "b2", sep="_")]] = b2
+
+ ep$distimes[obs_var, c("DT50_b1")] = DT50_b1
+ ep$distimes[obs_var, c("DT50_b2")] = DT50_b2
}
- ep$distimes[obs_var, ] = c(DT50, DT90)
+ ep$distimes[obs_var, c("DT50", "DT90")] = c(DT50, DT90)
}
return(ep)
}
@@ -3,7 +3,6 @@ TODO for version 1.0 - Support model definitions without pathway to sink in combination with formation fractions - Complete the main package vignette named mkin to include a method description -- Calculate pseudoDT50 values as recommended by FOCUS - Improve formatting of differential equations in the summary - Rename formation fractions during transformation and backtransformation as there is no one to one relationship @@ -13,4 +12,3 @@ Nice to have: parameter is involved - Calculate transformation only DT50 values (exclude pathways to sink) as additional information -- Calculate DT50 values from smaller rate constant/eigenvalue of DFOP, HS and SFORB models diff --git a/inst/unitTests/runit.mkinfit.R b/inst/unitTests/runit.mkinfit.R index 9a6bd722..61a0b303 100644 --- a/inst/unitTests/runit.mkinfit.R +++ b/inst/unitTests/runit.mkinfit.R @@ -66,7 +66,7 @@ test.FOCUS_2006_FOMC <- function() median.A.FOMC <- as.numeric(lapply(subset(FOCUS_2006_FOMC_ref_A_to_F, dataset == "A",
c(M0, alpha, beta, DT50, DT90)), "median"))
- fit.A.FOMC.r <- as.numeric(c(fit.A.FOMC$bparms.optim, endpoints(fit.A.FOMC)$distimes))
+ fit.A.FOMC.r <- as.numeric(c(fit.A.FOMC$bparms.optim, endpoints(fit.A.FOMC)$distimes[c("DT50", "DT90")]))
dev.A.FOMC <- abs(round(100 * ((median.A.FOMC - fit.A.FOMC.r)/median.A.FOMC), digits=1))
dev.A.FOMC <- dev.A.FOMC[c(1, 4, 5)]
checkIdentical(dev.A.FOMC < 1, rep(TRUE, length(dev.A.FOMC)))
@@ -77,7 +77,7 @@ test.FOCUS_2006_FOMC <- function() median.B.FOMC <- as.numeric(lapply(subset(FOCUS_2006_FOMC_ref_A_to_F, dataset == "B",
c(M0, alpha, beta, DT50, DT90)), "median"))
- fit.B.FOMC.r <- as.numeric(c(fit.B.FOMC$bparms.optim, endpoints(fit.B.FOMC)$distimes))
+ fit.B.FOMC.r <- as.numeric(c(fit.B.FOMC$bparms.optim, endpoints(fit.B.FOMC)$distimes[c("DT50", "DT90")]))
dev.B.FOMC <- abs(round(100 * ((median.B.FOMC - fit.B.FOMC.r)/median.B.FOMC), digits=1))
dev.B.FOMC <- dev.B.FOMC[c(1, 4, 5)]
checkIdentical(dev.B.FOMC < 1, rep(TRUE, length(dev.B.FOMC)))
@@ -88,7 +88,7 @@ test.FOCUS_2006_FOMC <- function() median.C.FOMC <- as.numeric(lapply(subset(FOCUS_2006_FOMC_ref_A_to_F, dataset == "C",
c(M0, alpha, beta, DT50, DT90)), "median"))
- fit.C.FOMC.r <- as.numeric(c(fit.C.FOMC$bparms.optim, endpoints(fit.C.FOMC)$distimes))
+ fit.C.FOMC.r <- as.numeric(c(fit.C.FOMC$bparms.optim, endpoints(fit.C.FOMC)$distimes[c("DT50", "DT90")]))
dev.C.FOMC <- abs(round(100 * ((median.C.FOMC - fit.C.FOMC.r)/median.C.FOMC), digits=1))
dev.C.FOMC <- dev.C.FOMC[c(1, 4, 5)]
checkIdentical(dev.C.FOMC < 1, rep(TRUE, length(dev.C.FOMC)))
@@ -105,7 +105,7 @@ test.FOCUS_2006_DFOP <- function() median.A.DFOP <- as.numeric(lapply(subset(FOCUS_2006_DFOP_ref_A_to_B, dataset == "A",
c(M0, k1, k2, f, DT50, DT90)), "median"))
- fit.A.DFOP.r <- as.numeric(c(fit.A.DFOP$bparms.optim, endpoints(fit.A.DFOP)$distimes))
+ fit.A.DFOP.r <- as.numeric(c(fit.A.DFOP$bparms.optim, endpoints(fit.A.DFOP)$distimes[c("DT50", "DT90")]))
dev.A.DFOP <- abs(round(100 * ((median.A.DFOP - fit.A.DFOP.r)/median.A.DFOP), digits=1))
# about 6.7% deviation for parameter f, the others are < 0.1%
checkIdentical(dev.A.DFOP < c(1, 1, 1, 10, 1, 1), rep(TRUE, length(dev.A.DFOP)))
@@ -116,7 +116,7 @@ test.FOCUS_2006_DFOP <- function() median.B.DFOP <- as.numeric(lapply(subset(FOCUS_2006_DFOP_ref_A_to_B, dataset == "B",
c(M0, k1, k2, f, DT50, DT90)), "median"))
- fit.B.DFOP.r <- as.numeric(c(fit.B.DFOP$bparms.optim, endpoints(fit.B.DFOP)$distimes))
+ fit.B.DFOP.r <- as.numeric(c(fit.B.DFOP$bparms.optim, endpoints(fit.B.DFOP)$distimes[c("DT50", "DT90")]))
dev.B.DFOP <- abs(round(100 * ((median.B.DFOP - fit.B.DFOP.r)/median.B.DFOP), digits=1))
# about 0.6% deviation for parameter f, the others are <= 0.1%
checkIdentical(dev.B.DFOP < 1, rep(TRUE, length(dev.B.DFOP)))
@@ -134,7 +134,7 @@ test.FOCUS_2006_HS <- function() median.A.HS <- as.numeric(lapply(subset(FOCUS_2006_HS_ref_A_to_F, dataset == "A",
c(M0, k1, k2, tb, DT50, DT90)), "median"))
- fit.A.HS.r <- as.numeric(c(fit.A.HS$bparms.optim, endpoints(fit.A.HS)$distimes))
+ fit.A.HS.r <- as.numeric(c(fit.A.HS$bparms.optim, endpoints(fit.A.HS)$distimes[c("DT50", "DT90")]))
dev.A.HS <- abs(round(100 * ((median.A.HS - fit.A.HS.r)/median.A.HS), digits=1))
# about 6.7% deviation for parameter f, the others are < 0.1%
checkIdentical(dev.A.HS < 1, rep(TRUE, length(dev.A.HS)))
@@ -145,7 +145,7 @@ test.FOCUS_2006_HS <- function() median.B.HS <- as.numeric(lapply(subset(FOCUS_2006_HS_ref_A_to_F, dataset == "B",
c(M0, k1, k2, tb, DT50, DT90)), "median"))
- fit.B.HS.r <- as.numeric(c(fit.B.HS$bparms.optim, endpoints(fit.B.HS)$distimes))
+ fit.B.HS.r <- as.numeric(c(fit.B.HS$bparms.optim, endpoints(fit.B.HS)$distimes[c("DT50", "DT90")]))
dev.B.HS <- abs(round(100 * ((median.B.HS - fit.B.HS.r)/median.B.HS), digits=1))
# < 10% deviation for M0, k1, DT50 and DT90, others are problematic
dev.B.HS <- dev.B.HS[c(1, 2, 5, 6)]
@@ -157,7 +157,7 @@ test.FOCUS_2006_HS <- function() median.C.HS <- as.numeric(lapply(subset(FOCUS_2006_HS_ref_A_to_F, dataset == "C",
c(M0, k1, k2, tb, DT50, DT90)), "median"))
- fit.A.HS.r <- as.numeric(c(fit.A.HS$bparms.optim, endpoints(fit.A.HS)$distimes))
+ fit.A.HS.r <- as.numeric(c(fit.A.HS$bparms.optim, endpoints(fit.A.HS)$distimes[c("DT50", "DT90")]))
dev.A.HS <- abs(round(100 * ((median.A.HS - fit.A.HS.r)/median.A.HS), digits=1))
# deviation <= 0.1%
checkIdentical(dev.A.HS < 1, rep(TRUE, length(dev.A.HS)))
@@ -179,7 +179,7 @@ test.FOCUS_2006_SFORB <- function() parent_0 = fit.A.SFORB.1$bparms.optim[[1]],
k1 = endpoints(fit.A.SFORB.1)$SFORB[[1]],
k2 = endpoints(fit.A.SFORB.1)$SFORB[[2]],
- endpoints(fit.A.SFORB.1)$distimes))
+ endpoints(fit.A.SFORB.1)$distimes[c("DT50", "DT90")]))
dev.A.SFORB.1 <- abs(round(100 * ((median.A.SFORB - fit.A.SFORB.1.r)/median.A.SFORB), digits=1))
# The first Eigenvalue is a lot different from k1 in the DFOP fit
# The explanation is that the dataset is simply SFO
@@ -190,7 +190,7 @@ test.FOCUS_2006_SFORB <- function() parent_0 = fit.A.SFORB.2$bparms.optim[[1]],
k1 = endpoints(fit.A.SFORB.2)$SFORB[[1]],
k2 = endpoints(fit.A.SFORB.2)$SFORB[[2]],
- endpoints(fit.A.SFORB.2)$distimes))
+ endpoints(fit.A.SFORB.2)$distimes[c("DT50", "DT90")]))
dev.A.SFORB.2 <- abs(round(100 * ((median.A.SFORB - fit.A.SFORB.2.r)/median.A.SFORB), digits=1))
# The first Eigenvalue is a lot different from k1 in the DFOP fit
# The explanation is that the dataset is simply SFO
@@ -208,7 +208,7 @@ test.FOCUS_2006_SFORB <- function() parent_0 = fit.B.SFORB.1$bparms.optim[[1]],
k1 = endpoints(fit.B.SFORB.1)$SFORB[[1]],
k2 = endpoints(fit.B.SFORB.1)$SFORB[[2]],
- endpoints(fit.B.SFORB.1)$distimes))
+ endpoints(fit.B.SFORB.1)$distimes[c("DT50", "DT90")]))
dev.B.SFORB.1 <- abs(round(100 * ((median.B.SFORB - fit.B.SFORB.1.r)/median.B.SFORB), digits=1))
checkIdentical(dev.B.SFORB.1 < 1, rep(TRUE, length(dev.B.SFORB.1)))
@@ -216,7 +216,7 @@ test.FOCUS_2006_SFORB <- function() parent_0 = fit.B.SFORB.2$bparms.optim[[1]],
k1 = endpoints(fit.B.SFORB.2)$SFORB[[1]],
k2 = endpoints(fit.B.SFORB.2)$SFORB[[2]],
- endpoints(fit.B.SFORB.2)$distimes))
+ endpoints(fit.B.SFORB.2)$distimes[c("DT50", "DT90")]))
dev.B.SFORB.2 <- abs(round(100 * ((median.B.SFORB - fit.B.SFORB.2.r)/median.B.SFORB), digits=1))
checkIdentical(dev.B.SFORB.2 < 1, rep(TRUE, length(dev.B.SFORB.2)))
} # }}}
diff --git a/man/endpoints.Rd b/man/endpoints.Rd index 21316cf2..0a8fd401 100644 --- a/man/endpoints.Rd +++ b/man/endpoints.Rd @@ -15,11 +15,7 @@ endpoints(fit, pseudoDT50 = FALSE) \arguments{ \item{fit}{ An object of class \code{\link{mkinfit}}. -} - \item{pseudoDT50}{ - Should pseudoDT50 values for FOMC, DFOP and SFORB models be reported, as - recommended by the FOCUS group? Currently not implemented. -} + } } \note{ The function is used internally by \code{\link{summary.mkinfit}}. diff --git a/vignettes/FOCUS_Z.pdf b/vignettes/FOCUS_Z.pdf Binary files differindex 41ee12ed..f99fd192 100644 --- a/vignettes/FOCUS_Z.pdf +++ b/vignettes/FOCUS_Z.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_1.pdf b/vignettes/figure/FOCUS_2006_Z_fits_1.pdf Binary files differindex caabcced..3aac23ca 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_1.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_1.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_10.pdf b/vignettes/figure/FOCUS_2006_Z_fits_10.pdf Binary files differindex 71df4e2c..ec4d4127 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_10.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_10.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_11.pdf b/vignettes/figure/FOCUS_2006_Z_fits_11.pdf Binary files differindex cace9970..8b544c5c 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_11.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_11.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_11b.pdf b/vignettes/figure/FOCUS_2006_Z_fits_11b.pdf Binary files differindex 19365bcc..4bf4bf5d 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_11b.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_11b.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_2.pdf b/vignettes/figure/FOCUS_2006_Z_fits_2.pdf Binary files differindex 149422f5..c65df21c 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_2.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_2.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_3.pdf b/vignettes/figure/FOCUS_2006_Z_fits_3.pdf Binary files differindex 149422f5..633b3d24 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_3.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_3.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_5.pdf b/vignettes/figure/FOCUS_2006_Z_fits_5.pdf Binary files differindex 963bcb79..6b5a5783 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_5.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_5.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_6.pdf b/vignettes/figure/FOCUS_2006_Z_fits_6.pdf Binary files differindex daf2e647..936ce669 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_6.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_6.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_6_ff.pdf b/vignettes/figure/FOCUS_2006_Z_fits_6_ff.pdf Binary files differindex 7a619ad7..09ea4bbf 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_6_ff.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_6_ff.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_7.pdf b/vignettes/figure/FOCUS_2006_Z_fits_7.pdf Binary files differindex e41ca0cc..25ea0c33 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_7.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_7.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_8.pdf b/vignettes/figure/FOCUS_2006_Z_fits_8.pdf Binary files differindex 42a4987f..f774c31a 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_8.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_8.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_fits_9.pdf b/vignettes/figure/FOCUS_2006_Z_fits_9.pdf Binary files differindex 391deb5c..c8498086 100644 --- a/vignettes/figure/FOCUS_2006_Z_fits_9.pdf +++ b/vignettes/figure/FOCUS_2006_Z_fits_9.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_residuals_11.pdf b/vignettes/figure/FOCUS_2006_Z_residuals_11.pdf Binary files differindex 50af3f41..cf228c0a 100644 --- a/vignettes/figure/FOCUS_2006_Z_residuals_11.pdf +++ b/vignettes/figure/FOCUS_2006_Z_residuals_11.pdf diff --git a/vignettes/figure/FOCUS_2006_Z_residuals_6.pdf b/vignettes/figure/FOCUS_2006_Z_residuals_6.pdf Binary files differindex ced69fb8..d7a55683 100644 --- a/vignettes/figure/FOCUS_2006_Z_residuals_6.pdf +++ b/vignettes/figure/FOCUS_2006_Z_residuals_6.pdf diff --git a/vignettes/mkin.pdf b/vignettes/mkin.pdf Binary files differindex ce81853c..2ed718f5 100644 --- a/vignettes/mkin.pdf +++ b/vignettes/mkin.pdf |