From 234c9059a95e104917e488a6ddd2313234a96cdc Mon Sep 17 00:00:00 2001 From: Johannes Ranke Date: Mon, 11 May 2020 05:15:19 +0200 Subject: Avoid merge() and data.frame() in cost function also for deSolve and eigenvalue based solutions. This noticeably increases performance for these methods, see test.log and benchmark vignette. --- docs/reference/mkinpredict.html | 253 ++++++++++++++++++++-------------------- 1 file changed, 126 insertions(+), 127 deletions(-) (limited to 'docs/reference/mkinpredict.html') diff --git a/docs/reference/mkinpredict.html b/docs/reference/mkinpredict.html index 21c13156..e48a0cdb 100644 --- a/docs/reference/mkinpredict.html +++ b/docs/reference/mkinpredict.html @@ -251,7 +251,8 @@ is 1e-10, much lower than in lsoda.

map_output

Boolean to specify if the output should list values for the observed variables (default) or for all state variables (if set to -FALSE).

+FALSE). Setting this to FALSE has no effect for analytical solutions, +as these always return mapped output.

... @@ -262,7 +263,7 @@ solver is used.

Value

-

A matrix in the same format as the output of ode.

+

A matrix with the numeric solution in wide format

Examples

@@ -270,149 +271,147 @@ solver is used.

# Compare solution types mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = "analytical")
#> time degradinol -#> 1 0 100.0000000 -#> 2 1 74.0818221 -#> 3 2 54.8811636 -#> 4 3 40.6569660 -#> 5 4 30.1194212 -#> 6 5 22.3130160 -#> 7 6 16.5298888 -#> 8 7 12.2456428 -#> 9 8 9.0717953 -#> 10 9 6.7205513 -#> 11 10 4.9787068 -#> 12 11 3.6883167 -#> 13 12 2.7323722 -#> 14 13 2.0241911 -#> 15 14 1.4995577 -#> 16 15 1.1108997 -#> 17 16 0.8229747 -#> 18 17 0.6096747 -#> 19 18 0.4516581 -#> 20 19 0.3345965 -#> 21 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, +#> 0 0 100.0000000 +#> 1 1 74.0818221 +#> 2 2 54.8811636 +#> 3 3 40.6569660 +#> 4 4 30.1194212 +#> 5 5 22.3130160 +#> 6 6 16.5298888 +#> 7 7 12.2456428 +#> 8 8 9.0717953 +#> 9 9 6.7205513 +#> 10 10 4.9787068 +#> 11 11 3.6883167 +#> 12 12 2.7323722 +#> 13 13 2.0241911 +#> 14 14 1.4995577 +#> 15 15 1.1108997 +#> 16 16 0.8229747 +#> 17 17 0.6096747 +#> 18 18 0.4516581 +#> 19 19 0.3345965 +#> 20 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = "deSolve")
#> time degradinol -#> 1 0 100.0000000 -#> 2 1 74.0818221 -#> 3 2 54.8811636 -#> 4 3 40.6569660 -#> 5 4 30.1194212 -#> 6 5 22.3130160 -#> 7 6 16.5298888 -#> 8 7 12.2456428 -#> 9 8 9.0717953 -#> 10 9 6.7205513 -#> 11 10 4.9787068 -#> 12 11 3.6883167 -#> 13 12 2.7323722 -#> 14 13 2.0241911 -#> 15 14 1.4995577 -#> 16 15 1.1108996 -#> 17 16 0.8229747 -#> 18 17 0.6096747 -#> 19 18 0.4516581 -#> 20 19 0.3345965 -#> 21 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, +#> 0 0 100.0000000 +#> 1 1 74.0818221 +#> 2 2 54.8811636 +#> 3 3 40.6569660 +#> 4 4 30.1194212 +#> 5 5 22.3130160 +#> 6 6 16.5298888 +#> 7 7 12.2456428 +#> 8 8 9.0717953 +#> 9 9 6.7205513 +#> 10 10 4.9787068 +#> 11 11 3.6883167 +#> 12 12 2.7323722 +#> 13 13 2.0241911 +#> 14 14 1.4995577 +#> 15 15 1.1108996 +#> 16 16 0.8229747 +#> 17 17 0.6096747 +#> 18 18 0.4516581 +#> 19 19 0.3345965 +#> 20 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = "deSolve", use_compiled = FALSE)
#> time degradinol -#> 1 0 100.0000000 -#> 2 1 74.0818221 -#> 3 2 54.8811636 -#> 4 3 40.6569660 -#> 5 4 30.1194212 -#> 6 5 22.3130160 -#> 7 6 16.5298888 -#> 8 7 12.2456428 -#> 9 8 9.0717953 -#> 10 9 6.7205513 -#> 11 10 4.9787068 -#> 12 11 3.6883167 -#> 13 12 2.7323722 -#> 14 13 2.0241911 -#> 15 14 1.4995577 -#> 16 15 1.1108996 -#> 17 16 0.8229747 -#> 18 17 0.6096747 -#> 19 18 0.4516581 -#> 20 19 0.3345965 -#> 21 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, +#> 0 0 100.0000000 +#> 1 1 74.0818221 +#> 2 2 54.8811636 +#> 3 3 40.6569660 +#> 4 4 30.1194212 +#> 5 5 22.3130160 +#> 6 6 16.5298888 +#> 7 7 12.2456428 +#> 8 8 9.0717953 +#> 9 9 6.7205513 +#> 10 10 4.9787068 +#> 11 11 3.6883167 +#> 12 12 2.7323722 +#> 13 13 2.0241911 +#> 14 14 1.4995577 +#> 15 15 1.1108996 +#> 16 16 0.8229747 +#> 17 17 0.6096747 +#> 18 18 0.4516581 +#> 19 19 0.3345965 +#> 20 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, solution_type = "eigen")
#> time degradinol -#> 1 0 100.0000000 -#> 2 1 74.0818221 -#> 3 2 54.8811636 -#> 4 3 40.6569660 -#> 5 4 30.1194212 -#> 6 5 22.3130160 -#> 7 6 16.5298888 -#> 8 7 12.2456428 -#> 9 8 9.0717953 -#> 10 9 6.7205513 -#> 11 10 4.9787068 -#> 12 11 3.6883167 -#> 13 12 2.7323722 -#> 14 13 2.0241911 -#> 15 14 1.4995577 -#> 16 15 1.1108997 -#> 17 16 0.8229747 -#> 18 17 0.6096747 -#> 19 18 0.4516581 -#> 20 19 0.3345965 -#> 21 20 0.2478752
+#> 0 0 100.0000000 +#> 1 1 74.0818221 +#> 2 2 54.8811636 +#> 3 3 40.6569660 +#> 4 4 30.1194212 +#> 5 5 22.3130160 +#> 6 6 16.5298888 +#> 7 7 12.2456428 +#> 8 8 9.0717953 +#> 9 9 6.7205513 +#> 10 10 4.9787068 +#> 11 11 3.6883167 +#> 12 12 2.7323722 +#> 13 13 2.0241911 +#> 14 14 1.4995577 +#> 15 15 1.1108997 +#> 16 16 0.8229747 +#> 17 17 0.6096747 +#> 18 18 0.4516581 +#> 19 19 0.3345965 +#> 20 20 0.2478752
# Compare integration methods to analytical solution mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, - solution_type = "analytical")[21,]
#> time degradinol -#> 21 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, - method = "lsoda")[21,]
#> time degradinol -#> 21 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, - method = "ode45")[21,]
#> time degradinol -#> 21 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, - method = "rk4")[21,]
#> time degradinol -#> 21 20 0.2480043
# rk4 is not as precise here + solution_type = "analytical")[21,]
#> time degradinol +#> 20.0000000 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, + method = "lsoda")[21,]
#> time degradinol +#> 20.0000000 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, + method = "ode45")[21,]
#> time degradinol +#> 20.0000000 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), 0:20, + method = "rk4")[21,]
#> time degradinol +#> 20.0000000 0.2480043
# rk4 is not as precise here # The number of output times used to make a lot of difference until the # default for atol was adjusted mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), - seq(0, 20, by = 0.1))[201,]
#> time degradinol -#> 201 20 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), - seq(0, 20, by = 0.01))[2001,]
#> time degradinol -#> 2001 20 0.2478752
-# Check compiled model versions - they are faster than the eigenvalue based solutions! + seq(0, 20, by = 0.1))[201,]
#> time degradinol +#> 20.0000000 0.2478752
mkinpredict(SFO, c(k_degradinol = 0.3), c(degradinol = 100), + seq(0, 20, by = 0.01))[2001,]
#> time degradinol +#> 20.0000000 0.2478752
+# Comparison of the performance of solution types SFO_SFO = mkinmod(parent = list(type = "SFO", to = "m1"), - m1 = list(type = "SFO"), use_of_ff = "min")
#> Successfully compiled differential equation model from auto-generated C code.
if(require(rbenchmark)) { - benchmark( - eigen = mkinpredict(SFO_SFO, c(k_parent_m1 = 0.05, k_parent_sink = 0.1, k_m1_sink = 0.01), + m1 = list(type = "SFO"), use_of_ff = "max")
#> Successfully compiled differential equation model from auto-generated C code.
if(require(rbenchmark)) { + benchmark(replications = 10, order = "relative", columns = c("test", "relative", "elapsed"), + eigen = mkinpredict(SFO_SFO, + c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), solution_type = "eigen")[201,], deSolve_compiled = mkinpredict(SFO_SFO, - c(k_parent_m1 = 0.05, k_parent_sink = 0.1, k_m1_sink = 0.01), + c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), solution_type = "deSolve")[201,], - deSolve = mkinpredict(SFO_SFO, c(k_parent_m1 = 0.05, k_parent_sink = 0.1, k_m1_sink = 0.01), - c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), - solution_type = "deSolve", use_compiled = FALSE)[201,], - replications = 10) -}
#> Lade nötiges Paket: rbenchmark
#> test replications elapsed relative user.self sys.self user.child -#> 3 deSolve 10 0.229 28.625 0.229 0 0 -#> 2 deSolve_compiled 10 0.008 1.000 0.008 0 0 -#> 1 eigen 10 0.026 3.250 0.025 0 0 -#> sys.child -#> 3 0 -#> 2 0 -#> 1 0
-# Since mkin 0.9.49.11 we also have analytical solutions for some models, including SFO-SFO -# deSolve = mkinpredict(SFO_SFO, c(k_parent_m1 = 0.05, k_parent_sink = 0.1, k_m1_sink = 0.01), -# c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), -# solution_type = "analytical", use_compiled = FALSE)[201,], - + deSolve = mkinpredict(SFO_SFO, + c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), + c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), + solution_type = "deSolve", use_compiled = FALSE)[201,], + analytical = mkinpredict(SFO_SFO, + c(k_parent = 0.15, f_parent_to_m1 = 0.5, k_m1 = 0.01), + c(parent = 100, m1 = 0), seq(0, 20, by = 0.1), + solution_type = "analytical", use_compiled = FALSE)[201,]) +}
#> test relative elapsed +#> 4 analytical 1.00 0.004 +#> 2 deSolve_compiled 1.25 0.005 +#> 1 eigen 5.00 0.020 +#> 3 deSolve 54.25 0.217
# \dontrun{ # Predict from a fitted model f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE) - head(mkinpredict(f))
#> time parent m1 -#> 1 0.0 82.49216 0.000000 -#> 2 0.1 80.00563 1.179963 -#> 3 0.2 77.59404 2.312596 -#> 4 0.3 75.25515 3.399443 -#> 5 0.4 72.98675 4.442000 -#> 6 0.5 70.78673 5.441717
# } + f <- mkinfit(SFO_SFO, FOCUS_2006_C, quiet = TRUE, solution_type = "deSolve") + head(mkinpredict(f))
#> time parent m1 +#> 0 0.0 82.49216 0.000000 +#> 0.1 0.1 80.00562 1.236198 +#> 0.2 0.2 77.59404 2.422818 +#> 0.3 0.3 75.25514 3.561476 +#> 0.4 0.4 72.98675 4.653740 +#> 0.5 0.5 70.78673 5.701130
# }
-- cgit v1.2.1