From 77ea5722081b59ac7d0fc4b3dc5113e5b98ac26a Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Thu, 22 May 2025 21:42:01 -0400 Subject: [PATCH 01/17] euler time steps draft --- DESCRIPTION | 2 +- R/change_models.R | 4 ++- R/formula_list_generators.R | 49 +++++++++++++++++++++---------------- R/mp_tmb_model_spec.R | 16 +++++++++--- R/tmb_model_editors.R | 3 +++ man/mp_tmb_model_spec.Rd | 3 ++- man/state_updates.Rd | 15 +++++++----- 7 files changed, 59 insertions(+), 33 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index eff03fd2d..bb5cdf297 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: macpan2 Title: Fast and Flexible Compartmental Modelling -Version: 2.1.0 +Version: 2.2.0 Authors@R: c( person("Steve Walker", email="swalk@mcmaster.ca", role=c("cre", "aut")), person("Weiguang Guan", role="aut"), diff --git a/R/change_models.R b/R/change_models.R index 25cb11aa6..f3d78bfb4 100644 --- a/R/change_models.R +++ b/R/change_models.R @@ -1,7 +1,9 @@ -ChangeModelDefaults = function() { +ChangeModelDefaults = function(delta_t) { self = ChangeModel() + self$delta_t = delta_t + self$change_list = list() self$flow_frame = function() { diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index b30fa750d..6d0171129 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -111,6 +111,8 @@ only_iterable = function(expr_list, states, is_first = FALSE) { ChangeModel = function() { self = Base() + self$delta_t = 1 + # lists of formula expressions to be added to a `before` list self$before_loop = function() list() @@ -238,8 +240,8 @@ ChangeComponent = function() { ##' si$during() ##' ##' @noRd -SimpleChangeModel = function(before = list(), during = list(), after = list()) { - self = ChangeModelDefaults() +SimpleChangeModel = function(before = list(), during = list(), after = list(), delta_t) { + self = ChangeModelDefaults(delta_t) self$before = before self$during = during @@ -384,6 +386,8 @@ MockChangeModel = function() { ##' ##' @param model Object with quantities that have been explicitly ##' marked as state variables. +##' @param delta_t Number giving the amount of time that passes during a +##' single time-step. ##' ##' @examples ##' sir = mp_tmb_library("starter_models", "sir", package = "macpan2") @@ -401,7 +405,7 @@ NULL ##' \code{\link{mp_tmb_model_spec}}, but this default can be changed using ##' the functions described below. ##' @export -mp_euler = function(model) UseMethod("mp_euler") +mp_euler = function(model, delta_t) UseMethod("mp_euler") ##' @describeIn state_updates ODE solver using Runge-Kutta 4. Any formulas that ##' appear before model flows in the `during` list will only be updated @@ -424,19 +428,19 @@ mp_euler = function(model) UseMethod("mp_euler") ##' be confused. We therefore require that all state variable updates are set ##' explicitly (e.g., with \code{\link{mp_per_capita_flow}}). ##' @export -mp_rk4 = function(model) UseMethod("mp_rk4") +mp_rk4 = function(model, delta_t) UseMethod("mp_rk4") ##' @describeIn state_updates Old version of `mp_rk4` that doesn't keep track ##' of absolute flows through each time-step. As a result this version is ##' more efficient but makes it more difficult to compute things like ##' incidence over a time scale. ##' @export -mp_rk4_old = function(model) UseMethod("mp_rk4_old") +mp_rk4_old = function(model, delta_t) UseMethod("mp_rk4_old") ##' @describeIn state_updates Original and deprecated name for ##' `mp_discrete_stoch`. In all new projects please use `mp_discrete_stoch`. ##' @export -mp_euler_multinomial = function(model) UseMethod("mp_euler_multinomial") +mp_euler_multinomial = function(model, delta_t) UseMethod("mp_euler_multinomial") ##' @describeIn state_updates Update state such that the probability of moving ##' from box `i` to box `j` in one time step is given by @@ -447,33 +451,31 @@ mp_euler_multinomial = function(model) UseMethod("mp_euler_multinomial") ##' distribution that determines how many individuals go to each `j` box and ##' how many stay in `i`. ##' @export -mp_discrete_stoch = function(model) UseMethod("mp_discrete_stoch") +mp_discrete_stoch = function(model, delta_t) UseMethod("mp_discrete_stoch") ##' @describeIn state_updates Update state with hazard steps, which is equivalent ##' to taking the step given by the expected value of the Euler-multinomial ##' distribution. ##' @export -mp_hazard = function(model) UseMethod("mp_hazard") +mp_hazard = function(model, delta_t) UseMethod("mp_hazard") ##' @export -mp_euler.TMBModelSpec = function(model) model$change_update_method("euler") +mp_euler.TMBModelSpec = function(model, delta_t) model$change_update_method("euler", delta_t) ##' @export -mp_rk4.TMBModelSpec = function(model) model$change_update_method("rk4") +mp_rk4.TMBModelSpec = function(model, delta_t) model$change_update_method("rk4", delta_t) ##' @export -mp_rk4_old.TMBModelSpec = function(model) model$change_update_method("rk4_old") - +mp_rk4_old.TMBModelSpec = function(model, delta_t) model$change_update_method("rk4_old", delta_t) ##' @export -mp_euler_multinomial.TMBModelSpec = function(model) model$change_update_method("euler_multinomial") +mp_euler_multinomial.TMBModelSpec = function(model, delta_t) model$change_update_method("euler_multinomial", delta_t) ##' @export -mp_discrete_stoch.TMBModelSpec = function(model) model$change_update_method("discrete_stoch") - +mp_discrete_stoch.TMBModelSpec = function(model, delta_t) model$change_update_method("discrete_stoch", delta_t) ##' @export -mp_hazard.TMBModelSpec = function(model) model$change_update_method("hazard") +mp_hazard.TMBModelSpec = function(model, delta_t) model$change_update_method("hazard", delta_t) #' Expand Model @@ -505,8 +507,10 @@ to_exogenous_inputs = function(flow_frame) { frame = flow_frame[flow_frame$size == "", , drop = FALSE] sprintf("%s ~ %s", frame$change, frame$abs_rate) |> lapply(as.formula) } -flow_frame_to_absolute_flows = function(flow_frame) { - char_vec = with(flow_frame, sprintf("%s ~ %s", change, abs_rate)) +flow_frame_to_absolute_flows = function(flow_frame, delta_t = 1) { + delta_t_str = "" + if (delta_t != 1) delta_t_str = sprintf("%s * ", delta_t) + char_vec = with(flow_frame, sprintf("%s ~ %s%s", change, delta_t_str, abs_rate)) lapply(char_vec, as.formula) } to_absolute_flows = function(per_capita_flows) { @@ -534,13 +538,13 @@ get_state_update_method = function(state_update, change_model) { if (state_update == "rk4_old") cls_nm = "RK4OldUpdateMethod" get(cls_nm)(change_model) } -get_change_model = function(before, during, after) { +get_change_model = function(before, during, after, delta_t = 1) { valid_before = all(vapply(before, is_two_sided, logical(1L))) if (!valid_before) stop("The before argument must be all two-sided formulas.") valid_after = all(vapply(after, is_two_sided, logical(1L))) if (!valid_after) stop("The after argument must be all two-sided formulas.") any_change_components = any(vapply(during, inherits, logical(1L), "ChangeComponent")) - if (any_change_components) return(SimpleChangeModel(before, during, after)) + if (any_change_components) return(SimpleChangeModel(before, during, after, delta_t)) AllFormulaChangeModel(before, during, after) } force_expr_list = function(x) { @@ -589,7 +593,10 @@ EulerUpdateMethod = function(change_model, existing_global_names = character()) self$before = function() self$change_model$before_loop() self$during = function() { before_components = self$change_model$before_flows() - components = flow_frame_to_absolute_flows(self$change_model$flow_frame()) + components = flow_frame_to_absolute_flows( + self$change_model$flow_frame() + , self$change_model$delta_t + ) before_update = self$change_model$before_state() update = self$change_model$update_state() diff --git a/R/mp_tmb_model_spec.R b/R/mp_tmb_model_spec.R index 8943ba340..df6388712 100644 --- a/R/mp_tmb_model_spec.R +++ b/R/mp_tmb_model_spec.R @@ -16,6 +16,7 @@ TMBModelSpec = function( , "rk4_old" , "euler_multinomial" ) + , delta_t = 1 ) { default = c(default, inits) must_not_save = handle_saving_conflicts(must_save, must_not_save) @@ -24,10 +25,11 @@ TMBModelSpec = function( before = force_expr_list(before) during = force_expr_list(during) after = force_expr_list(after) - self$change_model = get_change_model(before, during, after) + self$change_model = get_change_model(before, during, after, delta_t) self$state_update = get_state_update_type(match.arg(state_update), self$change_model) self$update_method = get_state_update_method(self$state_update, self$change_model) self$change_components = function() self$change_model$change_list + self$delta_t = delta_t self$before = before self$during = during self$after = after @@ -119,10 +121,15 @@ TMBModelSpec = function( , must_save = self$must_save, must_not_save = self$must_not_save , sim_exprs = self$sim_exprs , state_update = self$state_update + , delta_t = self$delta_t ) } self$change_update_method = function( - state_update = c("euler", "rk4", "discrete_stoch", "hazard", "rk4_old", "euler_multinomial") + state_update = c( + "euler", "rk4", "discrete_stoch", "hazard" + , "rk4_old", "euler_multinomial" + ), + delta_t = 1 ) { if (self$state_update == "no") { @@ -137,7 +144,9 @@ TMBModelSpec = function( before = self$before, during = self$during, after = self$after , default = self$default, integers = self$integers , must_save = self$must_save, must_not_save = self$must_not_save - , sim_exprs = self$sim_exprs, state_update = state_update + , sim_exprs = self$sim_exprs + , state_update = state_update + , delta_t = delta_t ) } self$expand = function() { @@ -151,6 +160,7 @@ TMBModelSpec = function( , must_not_save = self$must_not_save , sim_exprs = self$sim_exprs , state_update = self$state_update + , delta_t = self$delta_t ) } self$name_map = function(local_names) { diff --git a/R/tmb_model_editors.R b/R/tmb_model_editors.R index 1e9c266de..94c86f438 100644 --- a/R/tmb_model_editors.R +++ b/R/tmb_model_editors.R @@ -112,6 +112,7 @@ mp_tmb_insert = function(model , must_not_save = model$must_not_save , sim_exprs = model$sim_exprs , state_update = model$state_update + , delta_t = model$delta_t ) } @@ -155,6 +156,7 @@ mp_tmb_update = function(model , must_not_save = model$must_not_save , sim_exprs = model$sim_exprs , state_update = model$state_update + , delta_t = model$delta_t ) } @@ -193,6 +195,7 @@ mp_tmb_delete = function(model , must_not_save = model$must_not_save , sim_exprs = model$sim_exprs , state_update = model$state_update + , delta_t = model$delta_t ) } diff --git a/man/mp_tmb_model_spec.Rd b/man/mp_tmb_model_spec.Rd index 01b311b15..5b7f6896e 100644 --- a/man/mp_tmb_model_spec.Rd +++ b/man/mp_tmb_model_spec.Rd @@ -15,7 +15,8 @@ mp_tmb_model_spec( must_not_save = character(), sim_exprs = character(), state_update = c("euler", "rk4", "discrete_stoch", "hazard", "rk4_old", - "euler_multinomial") + "euler_multinomial"), + delta_t = 1 ) } \arguments{ diff --git a/man/state_updates.Rd b/man/state_updates.Rd index 64097a97c..20f30306a 100644 --- a/man/state_updates.Rd +++ b/man/state_updates.Rd @@ -10,21 +10,24 @@ \alias{mp_hazard} \title{Change How State Variables are Updated} \usage{ -mp_euler(model) +mp_euler(model, delta_t) -mp_rk4(model) +mp_rk4(model, delta_t) -mp_rk4_old(model) +mp_rk4_old(model, delta_t) -mp_euler_multinomial(model) +mp_euler_multinomial(model, delta_t) -mp_discrete_stoch(model) +mp_discrete_stoch(model, delta_t) -mp_hazard(model) +mp_hazard(model, delta_t) } \arguments{ \item{model}{Object with quantities that have been explicitly marked as state variables.} + +\item{delta_t}{Number giving the amount of time that passes during a +single time-step.} } \description{ These functions return a modified version of a model specification, such From b37801de01a416b25945c7db5bac023b4cdc919e Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Fri, 23 May 2025 09:01:27 -0400 Subject: [PATCH 02/17] default delta_t = 1 --- R/formula_list_generators.R | 26 +++++++++++++------------- man/state_updates.Rd | 12 ++++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index 6d0171129..405965aa0 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -310,7 +310,7 @@ SimpleChangeModel = function(before = list(), during = list(), after = list(), d } AllFormulaChangeModel = function(before = list(), during = list(), after = list()) { - self = ChangeModelDefaults() + self = ChangeModelDefaults(delta_t = 1) self$before = before self$during = during self$after = after @@ -405,7 +405,7 @@ NULL ##' \code{\link{mp_tmb_model_spec}}, but this default can be changed using ##' the functions described below. ##' @export -mp_euler = function(model, delta_t) UseMethod("mp_euler") +mp_euler = function(model, delta_t = 1) UseMethod("mp_euler") ##' @describeIn state_updates ODE solver using Runge-Kutta 4. Any formulas that ##' appear before model flows in the `during` list will only be updated @@ -428,19 +428,19 @@ mp_euler = function(model, delta_t) UseMethod("mp_euler") ##' be confused. We therefore require that all state variable updates are set ##' explicitly (e.g., with \code{\link{mp_per_capita_flow}}). ##' @export -mp_rk4 = function(model, delta_t) UseMethod("mp_rk4") +mp_rk4 = function(model, delta_t = 1) UseMethod("mp_rk4") ##' @describeIn state_updates Old version of `mp_rk4` that doesn't keep track ##' of absolute flows through each time-step. As a result this version is ##' more efficient but makes it more difficult to compute things like ##' incidence over a time scale. ##' @export -mp_rk4_old = function(model, delta_t) UseMethod("mp_rk4_old") +mp_rk4_old = function(model, delta_t = 1) UseMethod("mp_rk4_old") ##' @describeIn state_updates Original and deprecated name for ##' `mp_discrete_stoch`. In all new projects please use `mp_discrete_stoch`. ##' @export -mp_euler_multinomial = function(model, delta_t) UseMethod("mp_euler_multinomial") +mp_euler_multinomial = function(model, delta_t = 1) UseMethod("mp_euler_multinomial") ##' @describeIn state_updates Update state such that the probability of moving ##' from box `i` to box `j` in one time step is given by @@ -451,31 +451,31 @@ mp_euler_multinomial = function(model, delta_t) UseMethod("mp_euler_multinomial" ##' distribution that determines how many individuals go to each `j` box and ##' how many stay in `i`. ##' @export -mp_discrete_stoch = function(model, delta_t) UseMethod("mp_discrete_stoch") +mp_discrete_stoch = function(model, delta_t = 1) UseMethod("mp_discrete_stoch") ##' @describeIn state_updates Update state with hazard steps, which is equivalent ##' to taking the step given by the expected value of the Euler-multinomial ##' distribution. ##' @export -mp_hazard = function(model, delta_t) UseMethod("mp_hazard") +mp_hazard = function(model, delta_t = 1) UseMethod("mp_hazard") ##' @export -mp_euler.TMBModelSpec = function(model, delta_t) model$change_update_method("euler", delta_t) +mp_euler.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("euler", delta_t) ##' @export -mp_rk4.TMBModelSpec = function(model, delta_t) model$change_update_method("rk4", delta_t) +mp_rk4.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("rk4", delta_t) ##' @export -mp_rk4_old.TMBModelSpec = function(model, delta_t) model$change_update_method("rk4_old", delta_t) +mp_rk4_old.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("rk4_old", delta_t) ##' @export -mp_euler_multinomial.TMBModelSpec = function(model, delta_t) model$change_update_method("euler_multinomial", delta_t) +mp_euler_multinomial.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("euler_multinomial", delta_t) ##' @export -mp_discrete_stoch.TMBModelSpec = function(model, delta_t) model$change_update_method("discrete_stoch", delta_t) +mp_discrete_stoch.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("discrete_stoch", delta_t) ##' @export -mp_hazard.TMBModelSpec = function(model, delta_t) model$change_update_method("hazard", delta_t) +mp_hazard.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("hazard", delta_t) #' Expand Model diff --git a/man/state_updates.Rd b/man/state_updates.Rd index 20f30306a..e6a89e65f 100644 --- a/man/state_updates.Rd +++ b/man/state_updates.Rd @@ -10,17 +10,17 @@ \alias{mp_hazard} \title{Change How State Variables are Updated} \usage{ -mp_euler(model, delta_t) +mp_euler(model, delta_t = 1) -mp_rk4(model, delta_t) +mp_rk4(model, delta_t = 1) -mp_rk4_old(model, delta_t) +mp_rk4_old(model, delta_t = 1) -mp_euler_multinomial(model, delta_t) +mp_euler_multinomial(model, delta_t = 1) -mp_discrete_stoch(model, delta_t) +mp_discrete_stoch(model, delta_t = 1) -mp_hazard(model, delta_t) +mp_hazard(model, delta_t = 1) } \arguments{ \item{model}{Object with quantities that have been explicitly From 24352f34a9b148b88332a6c8ab01c6f3befc3dd2 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Fri, 23 May 2025 11:00:58 -0400 Subject: [PATCH 03/17] docs --- R/mp_tmb_model_spec.R | 2 ++ man/mp_tmb_model_spec.Rd | 3 +++ 2 files changed, 5 insertions(+) diff --git a/R/mp_tmb_model_spec.R b/R/mp_tmb_model_spec.R index df6388712..abd50e996 100644 --- a/R/mp_tmb_model_spec.R +++ b/R/mp_tmb_model_spec.R @@ -336,6 +336,8 @@ must_save_time_args = function(formulas) { #' @param state_update Optional character vector for how to update the state #' variables when it is relevant. Options include `"euler"` (the default), #' `"rk4"`, and `"discrete_stoch"`. +#' @param delta_t Number giving the amount of time that passes during a +#' single time-step. #' #' @details #' Expressions in the `before`, `during`, and `after` lists can be standard diff --git a/man/mp_tmb_model_spec.Rd b/man/mp_tmb_model_spec.Rd index 5b7f6896e..317992983 100644 --- a/man/mp_tmb_model_spec.Rd +++ b/man/mp_tmb_model_spec.Rd @@ -73,6 +73,9 @@ continuous.} \item{state_update}{Optional character vector for how to update the state variables when it is relevant. Options include \code{"euler"} (the default), \code{"rk4"}, and \code{"discrete_stoch"}.} + +\item{delta_t}{Number giving the amount of time that passes during a +single time-step.} } \description{ Specify a simulation model in the TMB engine. A detailed explanation of this From 0fcf87bea2e922699e30a0b509d4b49cef90b8a8 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Sun, 25 May 2025 20:43:55 -0400 Subject: [PATCH 04/17] delta_t for rk4 --- R/formula_list_generators.R | 52 +++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index 405965aa0..a67e94459 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -685,9 +685,9 @@ RK4UpdateMethod = function(change_model) { self$before = function() self$change_model$before_loop() self$during = function() { - ## abbr func nms unlst = function(x) unlist(x, recursive = FALSE, use.names = FALSE) as_forms = function(x) lapply(x, as.formula) + dt = self$change_model$delta_t before_components = self$change_model$before_flows() flow_frame = self$change_model$flow_frame() @@ -730,33 +730,57 @@ RK4UpdateMethod = function(change_model) { } ## rk4 step 1 - flow_replacements = sprintf("%s ~ %s", flows, flow_step_names$k1) |> as_forms() + flow_replacements = sprintf("%s ~ %s" + , flows, flow_step_names$k1 + ) |> as_forms() k1_new_before = make_before("k1") k1_new_update = update_formulas(rate_formulas, flow_replacements) ## rk4 step 2 - state_replacements = sprintf("%s ~ (%s + (%s / 2))", states, states, state_step_names$k1) |> as_forms() - flow_replacements = sprintf("%s ~ %s", flows, flow_step_names$k2) |> as_forms() + state_replacements = sprintf("%s ~ (%s + (%s * %s / 2))" + , states, states, dt, state_step_names$k1 + ) |> as_forms() + flow_replacements = sprintf("%s ~ %s" + , flows, flow_step_names$k2 + ) |> as_forms() k2_new_before = update_formulas(make_before("k2"), state_replacements) - k2_new_update = sprintf("%s ~ %s", state_step_names$k2, rates) |> as_forms() |> update_formulas(flow_replacements) + k2_new_update = sprintf("%s ~ %s" + , state_step_names$k2, rates + ) |> as_forms() |> update_formulas(flow_replacements) ## rk4 step 3 - state_replacements = sprintf("%s ~ (%s + (%s / 2))", states, states, state_step_names$k2) |> as_forms() - flow_replacements = sprintf("%s ~ %s", flows, flow_step_names$k3) |> as_forms() + state_replacements = sprintf("%s ~ (%s + (%s * %s / 2))" + , states, states, dt, state_step_names$k2 + ) |> as_forms() + flow_replacements = sprintf("%s ~ %s" + , flows, flow_step_names$k3 + ) |> as_forms() k3_new_before = update_formulas(make_before("k3"), state_replacements) - k3_new_update = sprintf("%s ~ %s", state_step_names$k3, rates) |> as_forms() |> update_formulas(flow_replacements) + k3_new_update = sprintf("%s ~ %s" + , state_step_names$k3, rates + ) |> as_forms() |> update_formulas(flow_replacements) ## rk4 step 4 - state_replacements = sprintf("%s ~ (%s + %s)", states, states, state_step_names$k3) |> as_forms() - flow_replacements = sprintf("%s ~ %s", flows, flow_step_names$k4) |> as_forms() + state_replacements = sprintf("%s ~ (%s + %s * %s)" + , states, states, dt, state_step_names$k3 + ) |> as_forms() + flow_replacements = sprintf("%s ~ %s" + , flows, flow_step_names$k4 + ) |> as_forms() k4_new_before = update_formulas(make_before("k4"), state_replacements) - k4_new_update = sprintf("%s ~ %s", state_step_names$k4, rates) |> as_forms() |> update_formulas(flow_replacements) + k4_new_update = sprintf("%s ~ %s" + , state_step_names$k4, rates + ) |> as_forms() |> update_formulas(flow_replacements) ## final update step - final_flow_update = sprintf("%s ~ (%s + 2 * %s + 2 * %s + %s)/6" - , flows, flow_step_names$k1, flow_step_names$k2, flow_step_names$k3, flow_step_names$k4 + final_flow_update = sprintf("%s ~ (%s + 2 * %s + 2 * %s + %s) * %s/6" + , flows + , flow_step_names$k1, flow_step_names$k2 + , flow_step_names$k3, flow_step_names$k4, dt ) |> as_forms() - final_state_update = sprintf("%s ~ %s %s", states, states, rates) |> as_forms() |> setNames(states) + final_state_update = sprintf("%s ~ %s %s" + , states, states, rates + ) |> as_forms() |> setNames(states) after_components = self$change_model$after_state() c( k1_new_before, k1_new_update From 6dd69cb4e7e8b4052f8077c57219b096930a0538 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Mon, 26 May 2025 15:05:05 -0400 Subject: [PATCH 05/17] dt for rk4/euler_multinomial/hazard --- R/formula_list_generators.R | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index a67e94459..bc9b53e87 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -688,6 +688,7 @@ RK4UpdateMethod = function(change_model) { unlst = function(x) unlist(x, recursive = FALSE, use.names = FALSE) as_forms = function(x) lapply(x, as.formula) dt = self$change_model$delta_t + if (dt == 1) dt = "" before_components = self$change_model$before_flows() flow_frame = self$change_model$flow_frame() @@ -737,7 +738,7 @@ RK4UpdateMethod = function(change_model) { k1_new_update = update_formulas(rate_formulas, flow_replacements) ## rk4 step 2 - state_replacements = sprintf("%s ~ (%s + (%s * %s / 2))" + state_replacements = sprintf("%s ~ (%s + (%s%s / 2))" , states, states, dt, state_step_names$k1 ) |> as_forms() flow_replacements = sprintf("%s ~ %s" @@ -749,7 +750,7 @@ RK4UpdateMethod = function(change_model) { ) |> as_forms() |> update_formulas(flow_replacements) ## rk4 step 3 - state_replacements = sprintf("%s ~ (%s + (%s * %s / 2))" + state_replacements = sprintf("%s ~ (%s + (%s%s / 2))" , states, states, dt, state_step_names$k2 ) |> as_forms() flow_replacements = sprintf("%s ~ %s" @@ -761,7 +762,7 @@ RK4UpdateMethod = function(change_model) { ) |> as_forms() |> update_formulas(flow_replacements) ## rk4 step 4 - state_replacements = sprintf("%s ~ (%s + %s * %s)" + state_replacements = sprintf("%s ~ (%s + %s%s)" , states, states, dt, state_step_names$k3 ) |> as_forms() flow_replacements = sprintf("%s ~ %s" @@ -773,7 +774,7 @@ RK4UpdateMethod = function(change_model) { ) |> as_forms() |> update_formulas(flow_replacements) ## final update step - final_flow_update = sprintf("%s ~ (%s + 2 * %s + 2 * %s + %s) * %s/6" + final_flow_update = sprintf("%s ~ (%s + 2 * %s + 2 * %s + %s)%s/6" , flows , flow_step_names$k1, flow_step_names$k2 , flow_step_names$k3, flow_step_names$k4, dt @@ -803,11 +804,14 @@ DiscreteStochUpdateMethod = function(change_model) { EulerMultinomialUpdateMethod = function(change_model) { self = Base() self$change_model = change_model + dt = self$change_model$delta_t self$vec = function(expr_list, char_fun) { vec = vapply(expr_list, char_fun, character(1L)) - # simple expressions are any non-formula strings (names of variables or state flows) - # expressions that are not simple contain math symbols (ex. +,-,*,/, etc.) + # - simple expressions are any non-formula strings + # (names of variables or state flows) + # - expressions that are not simple contain math symbols + # (e.g., +,-,*,/, etc.) simple_expr = all(grepl("^[a-zA-Z0-9._]+$", vec)) scalar_expr = length(vec) == 1L @@ -823,6 +827,11 @@ EulerMultinomialUpdateMethod = function(change_model) { self$before = function() self$change_model$before_loop() self$during = function() { + if (dt == 1) { + dt = "" + } else { + dt = sprintf(", %s", self$change_model$delta_t) + } before_components = c( self$change_model$before_flows() , to_exogenous_inputs(self$change_model$flow_frame()) @@ -830,10 +839,11 @@ EulerMultinomialUpdateMethod = function(change_model) { flow_list = self$change_model$update_flows() components = list() for (size_var in names(flow_list)) { - components[[size_var]] = sprintf("%s ~ reulermultinom(%s, %s)" + components[[size_var]] = sprintf("%s ~ reulermultinom(%s, %s%s)" , self$vec(flow_list[[size_var]], lhs_char) , size_var , self$vec(flow_list[[size_var]], rhs_char) + , dt ) } new_flow = lapply(components, as.formula) @@ -860,13 +870,20 @@ HazardUpdateMethod = function(change_model) { , to_exogenous_inputs(self$change_model$flow_frame()) ) before_state = self$change_model$before_state() + if (dt == 1) { + dt = "" + } else { + dt = sprintf("%s * ", self$change_model$delta_t) + } flow_list = self$change_model$update_flows() components = list() for (size_var in names(flow_list)) { - components[[size_var]] = sprintf("%s ~ %s * (1 - exp(-sum(%s))) * proportions(%s, 0, %s)" + components[[size_var]] = sprintf( + "%s ~ %s * (1 - exp(-%ssum(%s))) * proportions(%s, 0, %s)" , self$vec(flow_list[[size_var]], lhs_char) , size_var + , dt , self$vec(flow_list[[size_var]], rhs_char) , self$vec(flow_list[[size_var]], rhs_char) , getOption("macpan2_tol_hazard_div") From 40b9bff42c6b719c93422c05a5fb4f75ee5a0825 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Mon, 26 May 2025 15:08:40 -0400 Subject: [PATCH 06/17] style --- R/formula_list_generators.R | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index bc9b53e87..6380af794 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -827,11 +827,9 @@ EulerMultinomialUpdateMethod = function(change_model) { self$before = function() self$change_model$before_loop() self$during = function() { - if (dt == 1) { - dt = "" - } else { - dt = sprintf(", %s", self$change_model$delta_t) - } + dt = self$change_model$delta_t + dt = if (dt == 1) "" else sprintf(", %s", dt) + before_components = c( self$change_model$before_flows() , to_exogenous_inputs(self$change_model$flow_frame()) @@ -870,11 +868,8 @@ HazardUpdateMethod = function(change_model) { , to_exogenous_inputs(self$change_model$flow_frame()) ) before_state = self$change_model$before_state() - if (dt == 1) { - dt = "" - } else { - dt = sprintf("%s * ", self$change_model$delta_t) - } + dt = self$change_model$delta_t + dt = if (dt == 1) "" else sprintf("%s * ", dt) flow_list = self$change_model$update_flows() components = list() From 596ca189ece4c73559451bd58d74fffadb0499e8 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Tue, 3 Jun 2025 13:18:09 -0400 Subject: [PATCH 07/17] rk4 with delta_t --- R/formula_list_generators.R | 8 ++++---- man/mp_per_capita_flow.Rd | 2 +- tests/testthat/test-absolute.R | 10 ++-------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index 62afca210..c65aa57c6 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -695,7 +695,7 @@ RK4UpdateMethod = function(change_model) { unlst = function(x) unlist(x, recursive = FALSE, use.names = FALSE) as_forms = function(x) lapply(x, as.formula) dt = self$change_model$delta_t - if (dt == 1) dt = "" + dt = if (dt == 1) "" else sprintf(" * %s", dt) before_components = self$change_model$before_flows() flow_frame = self$change_model$flow_frame() @@ -746,7 +746,7 @@ RK4UpdateMethod = function(change_model) { ## rk4 step 2 state_replacements = sprintf("%s ~ (%s + (%s%s / 2))" - , states, states, dt, state_step_names$k1 + , states, states, state_step_names$k1, dt ) |> as_forms() flow_replacements = sprintf("%s ~ %s" , flows, flow_step_names$k2 @@ -758,7 +758,7 @@ RK4UpdateMethod = function(change_model) { ## rk4 step 3 state_replacements = sprintf("%s ~ (%s + (%s%s / 2))" - , states, states, dt, state_step_names$k2 + , states, states, state_step_names$k2, dt ) |> as_forms() flow_replacements = sprintf("%s ~ %s" , flows, flow_step_names$k3 @@ -770,7 +770,7 @@ RK4UpdateMethod = function(change_model) { ## rk4 step 4 state_replacements = sprintf("%s ~ (%s + %s%s)" - , states, states, dt, state_step_names$k3 + , states, states, state_step_names$k3, dt ) |> as_forms() flow_replacements = sprintf("%s ~ %s" , flows, flow_step_names$k4 diff --git a/man/mp_per_capita_flow.Rd b/man/mp_per_capita_flow.Rd index a43add870..116e8dde0 100644 --- a/man/mp_per_capita_flow.Rd +++ b/man/mp_per_capita_flow.Rd @@ -105,7 +105,7 @@ mp_per_capita_outflow("R", "mu", "death_R") mp_per_capita_flow("S", "V", "((a * S)/(b + S))/S", "vaccination") # importation -# mp_inflow("I", "delta", "importation") +mp_inflow("I", "delta", "importation") } \seealso{ diff --git a/tests/testthat/test-absolute.R b/tests/testthat/test-absolute.R index 93b1c47e6..01675806b 100644 --- a/tests/testthat/test-absolute.R +++ b/tests/testthat/test-absolute.R @@ -1,15 +1,9 @@ test_that("absolute inflow definition and ode trajectory", { ## exponential decay - s1 <- mp_tmb_model_spec( - during = list( - mp_inflow("N", "r", "birth") - , mp_per_capita_outflow("N", "d", "death") - ) - , default = list(N = 0, r = 0.3, d = 0.2) - ) + s1 = test_cache_read("SPEC-one_box.rds") expect_equal(mp_state_vars(s1), "N") - expect_equal(mp_flow_vars(s1), c("birth", "death")) + expect_equal(mp_flow_vars(s1), c("importation", "death")) steps = 50 From f310cd770a3d2fac351f8d502a751972be65bb25 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Tue, 3 Jun 2025 15:37:46 -0400 Subject: [PATCH 08/17] one-box example model --- inst/starter_models/one_box/README.Rmd | 83 ++++++++++++++++++ inst/starter_models/one_box/README.md | 78 ++++++++++++++++ .../one_box/figures/simulation-1.png | Bin 0 -> 182572 bytes inst/starter_models/one_box/tmb.R | 8 ++ 4 files changed, 169 insertions(+) create mode 100644 inst/starter_models/one_box/README.Rmd create mode 100644 inst/starter_models/one_box/README.md create mode 100644 inst/starter_models/one_box/figures/simulation-1.png create mode 100644 inst/starter_models/one_box/tmb.R diff --git a/inst/starter_models/one_box/README.Rmd b/inst/starter_models/one_box/README.Rmd new file mode 100644 index 000000000..039a04b65 --- /dev/null +++ b/inst/starter_models/one_box/README.Rmd @@ -0,0 +1,83 @@ +--- +title: "One Box" +index_entry: "A compartmental model with a single compartment" +bibliography: ../../references.bib +link-citations: TRUE +author: Steve Walker +output: + github_document: + toc: true +editor_options: + chunk_output_type: console +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>", + fig.path = "./figures/" +) +``` + +This is a very simple model of importation with exponential decay due to mortality. + +The code in this article uses the following packages. + +```{r packages, message=FALSE, warning=FALSE} +library(macpan2) +library(ggplot2) +library(dplyr) +``` + +# States + +| variable | description | +| -------- | --------------------- | +| N | Number of individuals | + +# Parameters + +| variable | description | +| -------- | ---------------------------- | +| $r$ | absolute rate of importation | +| $d$ | per capita death rate | + +# Dynamics + +If we interpret this model as an ODE, we have the following dynamics. + +$$ +\frac{dN}{dt} = r - (d \times N) \\ +$$ + + +# Model Specification + +This model has been specified in the `one_box` directory [here](https://github.com/canmod/macpan2/blob/main/inst/starter_models/one_box/tmb.R) and is accessible from the `macpan2` model library (see [Example Models](https://canmod.github.io/macpan2/articles/example_models.html) for details). + +# Simulation + +Simulation of this and other models depends on the kind of [state update](https://canmod.github.io/macpan2/reference/mp_euler) that you use. Here use the discrete-stochastic method. + +```{r simulation} +spec = mp_tmb_library("starter_models" + , "one_box" + , package = "macpan2" +) +set.seed(1) +(spec + |> mp_rk4(delta_t = 0.1) + |> mp_simulator(50 / 0.1, "N") + |> mp_trajectory(include_initial = TRUE) + |> rename(prevalence = value) + |> ggplot() + + geom_line(aes(time, prevalence)) + + ## asymptotic equilibrium population size + + geom_hline(yintercept = with(spec$default, r / d) + , colour = "red" + , linetype = "dashed" + ) + + theme_bw() +) +``` diff --git a/inst/starter_models/one_box/README.md b/inst/starter_models/one_box/README.md new file mode 100644 index 000000000..161e8c7cd --- /dev/null +++ b/inst/starter_models/one_box/README.md @@ -0,0 +1,78 @@ +One Box +================ +Steve Walker + +- [States](#states) +- [Parameters](#parameters) +- [Dynamics](#dynamics) +- [Model Specification](#model-specification) +- [Simulation](#simulation) + +This is a very simple model of importation with exponential decay due to +mortality. + +The code in this article uses the following packages. + +``` r +library(macpan2) +library(ggplot2) +library(dplyr) +``` + +# States + +| variable | description | +|----------|-----------------------| +| N | Number of individuals | + +# Parameters + +| variable | description | +|----------|------------------------------| +| $r$ | absolute rate of importation | +| $d$ | per capita death rate | + +# Dynamics + +If we interpret this model as an ODE, we have the following dynamics. + +$$ +\frac{dN}{dt} = r - (d \times N) \\ +$$ + +We can also interpret this model as a discrete-time stochastic model, as +we show below in the [Simulation](#simulation) section. + +# Model Specification + +This model has been specified in the `one_box` directory +[here](https://github.com/canmod/macpan2/blob/main/inst/starter_models/one_box/tmb.R) +and is accessible from the `macpan2` model library (see [Example +Models](https://canmod.github.io/macpan2/articles/example_models.html) +for details). + +# Simulation + +Simulation of this and other models depends on the kind of [state +update](https://canmod.github.io/macpan2/reference/mp_euler) that you +use. Here use the discrete-stochastic method. + +``` r +specs = mp_tmb_library("starter_models" + , "one_box" + , package = "macpan2" +) +set.seed(1) +(specs + |> mp_discrete_stoch() + |> mp_simulator(75, "N") + |> mp_trajectory_replicate(n = 100) + |> bind_rows(.id = "replicate") + |> rename(prevalence = value) + |> ggplot() + + geom_line(aes(time, prevalence, group = replicate), alpha = 0.2) + + theme_bw() +) +``` + +![](./figures/simulation-1.png) diff --git a/inst/starter_models/one_box/figures/simulation-1.png b/inst/starter_models/one_box/figures/simulation-1.png new file mode 100644 index 0000000000000000000000000000000000000000..96efb8983539d120d0b76cce2a6e36030bd5aa6d GIT binary patch literal 182572 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 z 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 Date: Tue, 3 Jun 2025 15:38:17 -0400 Subject: [PATCH 09/17] rpois with delta_t and test --- R/formula_list_generators.R | 23 ++++++++++++----------- R/tmb_model.R | 5 +++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index c65aa57c6..16b719df5 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -503,14 +503,13 @@ mp_expand.TMBModelSpec = function(model) model$expand() ## Utilities -to_exogenous = function(flow_frame, rand_fn = NULL) { +to_exogenous = function(flow_frame, rand_fn = NULL, dt = "") { frame = flow_frame[flow_frame$size == "", , drop = FALSE] if (is.null(rand_fn)) { - template = "%s ~ %s" + template = sprintf("%%s ~ %%s%s", dt) } else { - template = sprintf("%%s ~ %s(%%s)", rand_fn) + template = sprintf("%%s ~ %s(%%s%s)", rand_fn, dt) } - sprintf(template, frame$change, frame$abs_rate) |> lapply(as.formula) } to_exogenous_inputs = to_exogenous ## back-compat @@ -841,11 +840,12 @@ EulerMultinomialUpdateMethod = function(change_model) { self$before = function() self$change_model$before_loop() self$during = function() { dt = self$change_model$delta_t - dt = if (dt == 1) "" else sprintf(", %s", dt) + dt_emult = if (dt == 1) "" else sprintf(", %s", dt) + dt_pois = if (dt == 1) "" else sprintf(" * %s", dt) before_components = c( self$change_model$before_flows() - , to_exogenous(self$change_model$flow_frame(), rand_fn = "rpois") + , to_exogenous(self$change_model$flow_frame(), rand_fn = "rpois", dt = dt_pois) ) flow_list = self$change_model$update_flows() components = list() @@ -854,7 +854,7 @@ EulerMultinomialUpdateMethod = function(change_model) { , self$vec(flow_list[[size_var]], lhs_char) , size_var , self$vec(flow_list[[size_var]], rhs_char) - , dt + , dt_emult ) } ## BMB: add absolute flows here @@ -877,13 +877,14 @@ EulerMultinomialUpdateMethod = function(change_model) { HazardUpdateMethod = function(change_model) { self = EulerMultinomialUpdateMethod(change_model) self$during = function() { + dt = self$change_model$delta_t + dt_flow = if (dt == 1) "" else sprintf("%s * ", dt) + dt_exog = if (dt == 1) "" else sprintf("/%s", dt) before_components = c( self$change_model$before_flows() - , to_exogenous(self$change_model$flow_frame()) + , to_exogenous(self$change_model$flow_frame(), dt = dt_exog) ) before_state = self$change_model$before_state() - dt = self$change_model$delta_t - dt = if (dt == 1) "" else sprintf("%s * ", dt) flow_list = self$change_model$update_flows() components = list() @@ -892,7 +893,7 @@ HazardUpdateMethod = function(change_model) { "%s ~ %s * (1 - exp(-%ssum(%s))) * proportions(%s, 0, %s)" , self$vec(flow_list[[size_var]], lhs_char) , size_var - , dt + , dt_flow , self$vec(flow_list[[size_var]], rhs_char) , self$vec(flow_list[[size_var]], rhs_char) , getOption("macpan2_tol_hazard_div") diff --git a/R/tmb_model.R b/R/tmb_model.R index c2d3d64e0..fae0e858d 100644 --- a/R/tmb_model.R +++ b/R/tmb_model.R @@ -867,10 +867,11 @@ mp_trajectory_sim.TMBSimulator = function(model, n, probs = c(0.025, 0.25, 0.5, r = r[, names(r) != "value", drop = FALSE] rr = (n |> replicate(model$simulate_values()) - |> apply(1, quantile, probs, na.rm = TRUE) + |> apply(1, quantile, probs, na.rm = TRUE, simplify = FALSE) + |> simplify2array(except = 0L) |> t() ) - names(rr) = sprintf("value_%s", names(rr)) + colnames(rr) = sprintf("value_%s", colnames(rr)) cbind(r, rr) } From 956b05824f6846dcf5214c2bf7c7a9d64bd63baf Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Tue, 3 Jun 2025 16:25:27 -0400 Subject: [PATCH 10/17] code for dt example in article --- vignettes/state_updaters.Rmd | 61 ++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/vignettes/state_updaters.Rmd b/vignettes/state_updaters.Rmd index 910af284b..4dd2eea3f 100644 --- a/vignettes/state_updaters.Rmd +++ b/vignettes/state_updaters.Rmd @@ -56,8 +56,8 @@ si_rk4 = (si_explicit |> mp_rk4() |> mp_simulator(time_steps = 50, outputs = "infection") ) -si_euler_multinomial = (si_explicit - |> mp_euler_multinomial() +si_discrete_stoch = (si_explicit + |> mp_discrete_stoch() |> mp_simulator(time_steps = 50, outputs = "infection") ) ``` @@ -68,7 +68,7 @@ library(dplyr) trajectory_comparison = list( euler = mp_trajectory(si_euler) , rk4 = mp_trajectory(si_rk4) - , euler_multinomial = mp_trajectory(si_euler_multinomial) + , discrete_stoch = mp_trajectory(si_discrete_stoch) ) |> bind_rows(.id = "update_method") print(head(trajectory_comparison)) ``` @@ -79,13 +79,14 @@ library(ggplot2) |> rename(`Time Step` = time, Incidence = value) |> ggplot() + geom_line(aes(`Time Step`, Incidence, colour = update_method)) + + theme_bw() ) ``` The incidence trajectory is different for the three update methods, even though the initial values of the state variables were identical in all three cases. ```{r} mp_initial(si_euler) -mp_initial(si_euler_multinomial) +mp_initial(si_discrete_stoch) mp_initial(si_rk4) ``` @@ -108,11 +109,45 @@ print(siv) ```{r} (siv - |> mp_euler_multinomial() + |> mp_discrete_stoch() |> mp_simulator(50, "infection") |> mp_trajectory() |> ggplot() + geom_line(aes(time, value)) + + theme_bw() +) +``` + + +## Time Steps + +```{r sir_prevalence, fig.height = 4, fig.width = 7} +library(tidyr); library(dplyr) +delta_t = c(0.1, 0.5, 1) +time = 50 +sir = mp_tmb_library("starter_models", "sir", package = "macpan2") +sims = list() +run = function(model) { + (model + |> mp_simulator(time/dt, "I") + |> mp_trajectory() + |> mutate(time = time * dt) + ) +} +for (dt in delta_t) { + sims[[sprintf("euler_%s" , dt)]] = sir |> mp_euler(dt) |> run() + sims[[sprintf("hazard_%s", dt)]] = sir |> mp_hazard(dt) |> run() + sims[[sprintf("rk4_%s" , dt)]] = sir |> mp_rk4(dt) |> run() +} +(sims + |> bind_rows(.id = "dt") + |> separate(dt, c("method", "dt"), "_") + |> mutate(method = factor(method, levels = c("rk4", "euler", "hazard"))) + |> mutate(dt = factor(dt, levels = c("1", "0.5", "0.1"))) + |> rename(prevalence = value) + |> ggplot() + + geom_line(aes(time, prevalence, colour = dt, linetype = method)) + + theme_bw() ) ``` @@ -120,7 +155,7 @@ print(siv) ## Internal Design ```{r} -sir = mp_tmb_model_spec( +spec = mp_tmb_model_spec( during = list( N ~ S + I + R , mp_per_capita_flow("S", "I", "beta * I / N", "infection") @@ -141,7 +176,7 @@ The simplest way to define these lists is using two-sided R formulas. But in the The list of change components, which is just the `during` field but ensuring that all elements are valid `ChangeComponent` objects, can be obtained using the `change_components()` method in a model spec object. ```{r} -cc = sir$change_components() +cc = spec$change_components() print(cc) ``` @@ -220,12 +255,12 @@ The `update_state()` method makes use of this `flow_frame()` to produce the ```{r} -si = mp_tmb_library("starter_models", "sir", package = "macpan2") -si$change_model -si$change_model$flow_frame() -si$change_model$change_frame() -si$change_model$update_state() -si$change_model$update_flows() +sir = mp_tmb_library("starter_models", "sir", package = "macpan2") +sir$change_model +sir$change_model$flow_frame() +sir$change_model$change_frame() +sir$change_model$update_state() +sir$change_model$update_flows() ``` ```{r} spec = mp_tmb_model_spec( From 5339f5564fd5d9310e7ad46febdbf527c4f68bf9 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Wed, 4 Jun 2025 11:18:19 -0400 Subject: [PATCH 11/17] vignette work --- vignettes/state_updaters.Rmd | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/vignettes/state_updaters.Rmd b/vignettes/state_updaters.Rmd index 4dd2eea3f..1749a28e5 100644 --- a/vignettes/state_updaters.Rmd +++ b/vignettes/state_updaters.Rmd @@ -1,6 +1,8 @@ --- title: "ODE Solvers, Process Error, and Difference Equations" -output: rmarkdown::html_vignette +output: + rmarkdown::html_vignette: + toc: true vignette: > %\VignetteIndexEntry{ODE Solvers, Process Error, and Difference Equations} %\VignetteEngine{knitr::rmarkdown} @@ -17,6 +19,8 @@ set.seed(12L) [![status](https://img.shields.io/badge/status-working%20draft-red)](https://canmod.github.io/macpan2/articles/vignette-status#working-draft) +## Introduction + The `McMasterPandemic` project has focused on using discrete time difference equations to solve the dynamical system. Here we describe experimental features that allow one to update the data differently. In particular, it is now possible to use a Runge-Kutta 4 ODE solver (to approximate the solution to the continuous time analogue) as well as the Euler Multinomial distribution to generate process error. These features have in principle been available for most of the life of `macpan2`, but only recently have they been given a more convenient interface. In order to use this interface, models must be rewritten using explicit declarations of state updates. By explicitly declaring what expressions correspond to state updates, `macpan2` is able to modify the method of updating without further user input. This makes it easier to compare difference equations (i.e. Euler steps), ODEs (i.e. Runge-Kutta), and process error (i.e. Euler Multinomial) runs for the same underlying dynamical model. @@ -92,6 +96,7 @@ mp_initial(si_rk4) The incidence is different, even during the first time step, because each state update method causes different numbers of susceptible individuals to become infectious at each time step. Further, incidence here is defined for a single time step and so this number of new infectious individuals is exactly the incidence. + ## Branching Flows and Process Error ```{r} @@ -280,14 +285,17 @@ The constructors of these `UpdateMethod` classes often have a field of class `Ch -## Relationship to Ordinary Differential Equation Solvers +## Mathematical Description It is instructive to view these state update methods as approximate solutions to ordinary differential equations (ODEs). We consider ODEs of the following form. $$ -\frac{dx_i}{dt} = \underbrace{\sum_j x_j r_{ji}}_{\text{inflow}} - \underbrace{\sum_j x_i r_{ij}}_{\text{outflow}} +\frac{dx_i}{dt} = + \underbrace{\sum_j x_j r_{ji}}_{\text{inflow}} - + \underbrace{\sum_j x_i r_{ij}}_{\text{outflow}} + + \underbrace{\sum_j \rho_i}_{\text{exogenous}} $$ -Where the per-capita rate of flowing from compartment $i$ to compartment $j$ is $r_{ij}$, and $x_i$ is the number of individuals in the $i$th compartment. We allow each $r_{ij}$ to depend on any number of state variables and time-varying parameters. For example, for an SIR model we have $x_S, x_I, x_R$ (for readability we use $S, I, R$). In this case $r_{SI} = \beta I / N$, $r_{IR} = \gamma$, and all other values of $r_{ij}$ are zero. Here the force of infection, $r_{SI}$, depends on a state variable $I$. +Where the per-capita rate of flowing from compartment $i$ to compartment $j$ is $r_{ij}$, the rate of exogeneous change of compartment $i$ is $\rho_i$, and $x_i$ is the number of individuals in the $i$th compartment. We allow each $r_{ij}$ to depend on any number of state variables and time-varying parameters. For example, for an SIR model we have $x_S, x_I, x_R$ (for readability we use $S, I, R$). In this case $r_{SI} = \beta I / N$, $r_{IR} = \gamma$, and all other values of $r_{ij}$ are zero. Here the force of infection, $r_{SI}$, depends on a state variable $I$. Although each state-update method presented below can be thought of as an approximate solution to this ODE, they can also be thought of as dynamical models in their own right. For example, the Euler-multinomial model is a useful model of process error. From b986a35814cadd3ca49e493c65c5fe065a308472 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Wed, 4 Jun 2025 11:57:23 -0400 Subject: [PATCH 12/17] tests --- tests/testthat/test-delta-t.R | 61 +++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 tests/testthat/test-delta-t.R diff --git a/tests/testthat/test-delta-t.R b/tests/testthat/test-delta-t.R new file mode 100644 index 000000000..238450a3b --- /dev/null +++ b/tests/testthat/test-delta-t.R @@ -0,0 +1,61 @@ +test_that("rk4 time-steps work with the si model", { + delta_t = 0.1 + time = 50 + si = test_cache_read("SPEC-si.rds") |> mp_rk4(delta_t) + solution = si |> mp_simulator(time/delta_t, "I") |> mp_trajectory() + state = si$default["I"] + params = si$default[c("beta", "N")] + reference_solution <- ode( + y = unlist(state) + , times = seq(from = 0, to = time, by = delta_t) + , func = \(t, state, params) with(c(params, state), list((N - I) * (beta * I/N))) + , parms = params + , method = "rk4" + ) + expect_equal(solution$value, reference_solution[-1, "I"]) +}) + +test_that("rk4 time-steps work with absolute inflows", { + delta_t = 0.1 + time = 50 + one_box = test_cache_read("SPEC-one_box.rds") |> mp_rk4(delta_t) + solution = one_box |> mp_simulator(time/delta_t, "N") |> mp_trajectory() + state = one_box$default["N"] + params = one_box$default[c("r", "d")] + reference_solution <- ode( + y = unlist(state) + , times = seq(from = 0, to = time, by = delta_t) + , func = \(t, state, params) with(c(params, state), list(r - d * N)) + , parms = params + , method = "rk4" + ) + expect_equal(solution$value, reference_solution[-1, "N"]) +}) + +test_that("stochastic absolute importation with a time step is plausible", { + spec = mp_tmb_model_spec( + during = list( + N ~ S + I + , mp_per_capita_flow("S", "I", "beta * I / N", "infection") + , mp_inflow("I", "mu", "importation") + ) + , default = list(S = 100, I = 0, beta = 0.8, mu = 0.1) + ) + time = 10 + delta_t = 0.1 + set.seed(1L) + traj = (spec + |> mp_discrete_stoch(delta_t) + |> mp_simulator(time / delta_t, "I") + |> mp_trajectory_sim(10, probs = 0.5) + |> mutate(time = delta_t * time) + |> filter(time == round(time)) + ) + answer = structure(list(matrix = c("I", "I", "I", "I", "I", "I", "I", + "I", "I", "I"), time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), row = c(0, + 0, 0, 0, 0, 0, 0, 0, 0, 0), col = c(0, 0, 0, 0, 0, 0, 0, 0, 0, + 0), `value_50%` = c(0, 0, 0, 0, 0, 0, 0, 0, 2, 3)), class = "data.frame", + row.names = c(NA, -10L)) + + expect_equal(traj, answer) +}) From 548a03e8bc77ecbccaf6531d2c2c287e86c3106c Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Wed, 4 Jun 2025 13:03:39 -0400 Subject: [PATCH 13/17] fixing tests --- tests/testthat/test-absolute.R | 1 - tests/testthat/test-delta-t.R | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-absolute.R b/tests/testthat/test-absolute.R index ca50333d2..89e788663 100644 --- a/tests/testthat/test-absolute.R +++ b/tests/testthat/test-absolute.R @@ -75,5 +75,4 @@ test_that("equivalent absolute and per-capita flows are consistent", { } expect_equal(sim_fn(sir_pc), sim_fn(sir_ab)) expect_equal(sim_fn(sir_pc, mp_rk4), sim_fn(sir_ab, mp_rk4)) - ## expect_equal(sim_fn(sir_pc, mp_hazard), sim_fn(sir_ab2, mp_hazard)) ## -- failing because hazard is behaving like euler with absolute flows }) diff --git a/tests/testthat/test-delta-t.R b/tests/testthat/test-delta-t.R index 238450a3b..f15f45d73 100644 --- a/tests/testthat/test-delta-t.R +++ b/tests/testthat/test-delta-t.R @@ -1,3 +1,5 @@ +# library(macpan2); library(testthat); library(dplyr); library(tidyr); library(ggplot2); library(deSolve) +# source("tests/testthat/setup.R") test_that("rk4 time-steps work with the si model", { delta_t = 0.1 time = 50 @@ -51,11 +53,12 @@ test_that("stochastic absolute importation with a time step is plausible", { |> mutate(time = delta_t * time) |> filter(time == round(time)) ) + row.names(traj) = 1:10 ## seems this is needed for testthat -- not sure why answer = structure(list(matrix = c("I", "I", "I", "I", "I", "I", "I", "I", "I", "I"), time = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), row = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), col = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), `value_50%` = c(0, 0, 0, 0, 0, 0, 0, 0, 2, 3)), class = "data.frame", - row.names = c(NA, -10L)) + row.names = 1:10) expect_equal(traj, answer) }) From b9a5ca926e179b834ce9fb24b3e7f97bda1e4df5 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Thu, 5 Jun 2025 14:08:46 -0400 Subject: [PATCH 14/17] docs and keep existing delta_t by default --- R/change_components.R | 16 ++--- R/change_models.R | 4 +- R/formula_list_generators.R | 94 +++++++++++------------------- R/mp_tmb_calibrator.R | 8 ++- R/mp_tmb_model_spec.R | 19 ++++-- man/mp_absolute_flow.Rd | 32 ---------- man/mp_optimized_spec.Rd | 3 +- man/mp_per_capita_flow.Rd | 9 ++- man/mp_tmb_calibrator.Rd | 5 ++ man/mp_tmb_model_spec.Rd | 2 +- man/state_updates.Rd | 18 +++--- tests/testthat/test-absolute.R | 14 +++++ tests/testthat/test-change-model.R | 2 - vignettes/FAQs.Rmd | 2 +- vignettes/state_updaters.Rmd | 48 ++++++++++++--- 15 files changed, 148 insertions(+), 128 deletions(-) delete mode 100644 man/mp_absolute_flow.Rd diff --git a/R/change_components.R b/R/change_components.R index 720515c34..51fc8891d 100644 --- a/R/change_components.R +++ b/R/change_components.R @@ -21,20 +21,20 @@ print_flow_vec = function(vec) { #' @export print.PerCapitaFlow = function(x, ...) { c( - From = x$from + `Flow name` = lhs_char(x$rate) + , From = x$from , To = x$to , `Per-capita rate expression` = rhs_char(x$rate) - , `Absolute rate symbol` = lhs_char(x$rate) ) |> print_flow_vec() } #' @export print.AbsoluteFlow = function(x, ...) { c( - From = x$from + `Flow name` = lhs_char(x$rate) + , From = x$from , To = x$to , `Absolute rate expression` = rhs_char(x$rate) - , `Absolute rate symbol` = lhs_char(x$rate) ) |> print_flow_vec() } @@ -42,18 +42,18 @@ print.AbsoluteFlow = function(x, ...) { #' @export print.AbsoluteInFlow = function(x, ...) { c( - To = x$to + `Flow name` = lhs_char(x$rate) + , To = x$to , `Absolute rate expression` = rhs_char(x$rate) - , `Absolute rate symbol` = lhs_char(x$rate) ) |> print_flow_vec() } #' @export print.AbsoluteOutFlow = function(x, ...) { c( - From = x$from + `Flow name` = lhs_char(x$rate) + , From = x$from , `Absolute rate expression` = rhs_char(x$rate) - , `Absolute rate symbol` = lhs_char(x$rate) ) |> print_flow_vec() } diff --git a/R/change_models.R b/R/change_models.R index 999113583..08d2a93fb 100644 --- a/R/change_models.R +++ b/R/change_models.R @@ -1,8 +1,8 @@ -ChangeModelDefaults = function(delta_t) { +ChangeModelDefaults = function(delta_t = NULL) { self = ChangeModel() - self$delta_t = delta_t + self$delta_t = handle_delta_t(delta_t) self$change_list = list() diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index cec2ac78e..70215c478 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -111,7 +111,7 @@ only_iterable = function(expr_list, states, is_first = FALSE) { ChangeModel = function() { self = Base() - self$delta_t = 1 + self$delta_t = NULL # lists of formula expressions to be added to a `before` list self$before_loop = function() list() @@ -198,7 +198,8 @@ ChangeComponent = function() { ## column - change: unsigned absolute flow rate name. ## column - rate: per-capita flow rates (variables or expressions that ## sometimes involve state variables). - ## column - abs_rate: absolute flow rate expression + ## column - abs_rate: absolute flow rate expression (per-cqpita flow rate + ## multiplied by the size variable) ## example: ## size, change, rate, abs_rate ## S, infection, beta * I / N, S * (beta * I / N) @@ -240,7 +241,7 @@ ChangeComponent = function() { ##' si$during() ##' ##' @noRd -SimpleChangeModel = function(before = list(), during = list(), after = list(), delta_t) { +SimpleChangeModel = function(before = list(), during = list(), after = list(), delta_t = NULL) { self = ChangeModelDefaults(delta_t) self$before = before @@ -310,7 +311,7 @@ SimpleChangeModel = function(before = list(), during = list(), after = list(), d } AllFormulaChangeModel = function(before = list(), during = list(), after = list()) { - self = ChangeModelDefaults(delta_t = 1) + self = ChangeModelDefaults(delta_t = NULL) self$before = before self$during = during self$after = after @@ -385,9 +386,11 @@ MockChangeModel = function() { ##' steps. ##' ##' @param model Object with quantities that have been explicitly -##' marked as state variables. +##' marked as state variables. Currently the only valid model object +##' is a model specification (e.g., \code{\link{mp_tmb_model_spec}}). ##' @param delta_t Number giving the amount of time that passes during a -##' single time-step. +##' single time-step. The default, `NULL`, is equivalent to the value +##' for `delta_t` that already exists in the `model`. ##' ##' @examples ##' sir = mp_tmb_library("starter_models", "sir", package = "macpan2") @@ -405,7 +408,7 @@ NULL ##' \code{\link{mp_tmb_model_spec}}, but this default can be changed using ##' the functions described below. ##' @export -mp_euler = function(model, delta_t = 1) UseMethod("mp_euler") +mp_euler = function(model, delta_t = NULL) UseMethod("mp_euler") ##' @describeIn state_updates ODE solver using Runge-Kutta 4. Any formulas that ##' appear before model flows in the `during` list will only be updated @@ -428,19 +431,19 @@ mp_euler = function(model, delta_t = 1) UseMethod("mp_euler") ##' be confused. We therefore require that all state variable updates are set ##' explicitly (e.g., with \code{\link{mp_per_capita_flow}}). ##' @export -mp_rk4 = function(model, delta_t = 1) UseMethod("mp_rk4") +mp_rk4 = function(model, delta_t = NULL) UseMethod("mp_rk4") ##' @describeIn state_updates Old version of `mp_rk4` that doesn't keep track ##' of absolute flows through each time-step. As a result this version is ##' more efficient but makes it more difficult to compute things like ##' incidence over a time scale. ##' @export -mp_rk4_old = function(model, delta_t = 1) UseMethod("mp_rk4_old") +mp_rk4_old = function(model, delta_t = NULL) UseMethod("mp_rk4_old") ##' @describeIn state_updates Original and deprecated name for ##' `mp_discrete_stoch`. In all new projects please use `mp_discrete_stoch`. ##' @export -mp_euler_multinomial = function(model, delta_t = 1) UseMethod("mp_euler_multinomial") +mp_euler_multinomial = function(model, delta_t = NULL) UseMethod("mp_euler_multinomial") ##' @describeIn state_updates Update state such that the probability of moving ##' from box `i` to box `j` in one time step is given by @@ -451,31 +454,31 @@ mp_euler_multinomial = function(model, delta_t = 1) UseMethod("mp_euler_multinom ##' distribution that determines how many individuals go to each `j` box and ##' how many stay in `i`. ##' @export -mp_discrete_stoch = function(model, delta_t = 1) UseMethod("mp_discrete_stoch") +mp_discrete_stoch = function(model, delta_t = NULL) UseMethod("mp_discrete_stoch") ##' @describeIn state_updates Update state with hazard steps, which is equivalent ##' to taking the step given by the expected value of the Euler-multinomial ##' distribution. ##' @export -mp_hazard = function(model, delta_t = 1) UseMethod("mp_hazard") +mp_hazard = function(model, delta_t = NULL) UseMethod("mp_hazard") ##' @export -mp_euler.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("euler", delta_t) +mp_euler.TMBModelSpec = function(model, delta_t = NULL) model$change_update_method("euler", delta_t) ##' @export -mp_rk4.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("rk4", delta_t) +mp_rk4.TMBModelSpec = function(model, delta_t = NULL) model$change_update_method("rk4", delta_t) ##' @export -mp_rk4_old.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("rk4_old", delta_t) +mp_rk4_old.TMBModelSpec = function(model, delta_t = NULL) model$change_update_method("rk4_old", delta_t) ##' @export -mp_euler_multinomial.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("euler_multinomial", delta_t) +mp_euler_multinomial.TMBModelSpec = function(model, delta_t = NULL) model$change_update_method("euler_multinomial", delta_t) ##' @export -mp_discrete_stoch.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("discrete_stoch", delta_t) +mp_discrete_stoch.TMBModelSpec = function(model, delta_t = NULL) model$change_update_method("discrete_stoch", delta_t) ##' @export -mp_hazard.TMBModelSpec = function(model, delta_t = 1) model$change_update_method("hazard", delta_t) +mp_hazard.TMBModelSpec = function(model, delta_t = NULL) model$change_update_method("hazard", delta_t) #' Expand Model @@ -514,6 +517,7 @@ to_exogenous = function(flow_frame, rand_fn = NULL, dt = "") { } to_exogenous_inputs = to_exogenous ## back-compat flow_frame_to_absolute_flows = function(flow_frame, delta_t = 1) { + delta_t = handle_delta_t(delta_t) delta_t_str = "" if (delta_t != 1) delta_t_str = sprintf("%s * ", delta_t) char_vec = with(flow_frame, sprintf("%s ~ %s%s", change, delta_t_str, abs_rate)) @@ -544,7 +548,7 @@ get_state_update_method = function(state_update, change_model) { if (state_update == "rk4_old") cls_nm = "RK4OldUpdateMethod" get(cls_nm)(change_model) } -get_change_model = function(before, during, after, delta_t = 1) { +get_change_model = function(before, during, after, delta_t = NULL) { valid_before = all(vapply(before, is_two_sided, logical(1L))) if (!valid_before) stop("The before argument must be all two-sided formulas.") valid_after = all(vapply(after, is_two_sided, logical(1L))) @@ -932,7 +936,7 @@ HazardUpdateMethod = function(change_model) { #' originates. #' @param to String giving the name of the compartment to which the flow is #' going. -#' @param rate String giving the expression for the per-capita +#' @param rate String giving the expression for the per-capita or absolute #' flow rate. Alternatively, and for back compatibility, #' a two-sided formula with the left-hand-side giving the name of the absolute #' flow rate per time-step and the right-hand-side giving an expression for @@ -1014,6 +1018,16 @@ mp_per_capita_outflow = function(from, rate, flow_name = NULL, abs_rate = NULL) PerCapitaOutflow(from, rate, call_string) } +#' @describeIn mp_per_capita_flow Alternative to `mp_per_capita_flow` that +#' allowing specification of flows using absolute rates instead of per-capita +#' rates. +#' @export +mp_absolute_flow = function(from, to, rate, flow_name = NULL, rate_name = NULL) { + call_string = deparse(match.call()) + rate = handle_abs_rate_args(rate, rate_name, flow_name) + AbsoluteFlow(from, to, rate, call_string) +} + #' @describeIn mp_per_capita_flow Only flow into the `to` compartment. #' For adding a birth or immigration process. #' @param flow_name String giving the name of the flow @@ -1040,34 +1054,6 @@ mp_outflow = function(from, rate, flow_name = NULL, abs_rate = NULL) { } - - -#' Specify Absolute Flow Between Compartments (Experimental) -#' -#' An experimental alternative to \code{\link{mp_per_capita_flow}} that -#' allows users to specify flows using absolute rates instead of -#' per-capita rates. -#' -#' @param from String giving the name of the compartment from which the flow -#' originates. -#' @param to String giving the name of the compartment to which the flow is -#' going. -#' @param rate String giving the expression for the absolute -#' flow rate per time-step. -#' @param flow_name String giving the name for the variable that -#' will store the `rate`. -#' @param rate_name Deprecated synonym for `flow_name`. Please use `flow_name` -#' in all future work. -#' -#' @seealso [mp_per_capita_flow()] -#' -#' @export -mp_absolute_flow = function(from, to, rate, flow_name = NULL, rate_name = NULL) { - call_string = deparse(match.call()) - rate = handle_abs_rate_args(rate, rate_name, flow_name) - AbsoluteFlow(from, to, rate, call_string) -} - PerCapitaOutflow = function(from, rate, call_string) { self = PerCapitaFlow(from, NULL, rate, call_string) self$change_frame = function() { @@ -1129,18 +1115,8 @@ AbsoluteFlow = function(from, to, rate, call_string) { self$flow_frame = function() { abs_rate = rhs_char(self$rate) data.frame( - ## BMB: not sure if this is right? there is no 'size' - size = "" ## self$from %||% "" + size = "" ## absolute flows are coming from 'nowhere' and so there is no 'size' , change = lhs_char(self$rate) - - ## this is the main problem with absolute flows, because it has a - ## `size` variable (e.g., a `from` variable) in the denominator. - ## this issue should only arise for update methods that are more - ## naturally expressed for per-capita flows (e.g., Euler-multinomial - ## and hazard) - ## BMB: why does there need to be a 'from' involved here at all? - ## is this only an issue because we need a Poisson-type stochastic - ## flow to go with the Euler-multinomial? , rate = sprintf("%s", abs_rate) , abs_rate = abs_rate ) diff --git a/R/mp_tmb_calibrator.R b/R/mp_tmb_calibrator.R index eb5ba6e48..305f96598 100644 --- a/R/mp_tmb_calibrator.R +++ b/R/mp_tmb_calibrator.R @@ -82,6 +82,11 @@ #' if (suppressPackageStartupMessages(require(broom.mixed))) { #' print(mp_tmb_coef(cal)) #' } +#' (cal +#' |> mp_optimized_spec() +#' |> mp_default_list() +#' |> getElement("beta") +#' ) #' @concept create-model-calibrator #' @export mp_tmb_calibrator = function(spec @@ -698,7 +703,8 @@ mp_optimizer_output.TMBCalibrator = function(model, what = c("latest", "all")) { #' Optimized Model Specification #' #' Create a new model specification using parameter values that have been -#' optimized. +#' optimized. See the examples in the help page for +#' \code{\link{mp_tmb_calibrator}}. #' #' @param model A model object that can be optimized/calibrated. Currently, #' only models produced by \code{\link{mp_tmb_calibrator}} are valid. diff --git a/R/mp_tmb_model_spec.R b/R/mp_tmb_model_spec.R index 95c6852bd..35381f8e5 100644 --- a/R/mp_tmb_model_spec.R +++ b/R/mp_tmb_model_spec.R @@ -16,7 +16,7 @@ TMBModelSpec = function( , "rk4_old" , "euler_multinomial" ) - , delta_t = 1 + , delta_t = NULL ) { default = c(default, inits) must_not_save = handle_saving_conflicts(must_save, must_not_save) @@ -25,11 +25,11 @@ TMBModelSpec = function( before = force_expr_list(before) during = force_expr_list(during) after = force_expr_list(after) - self$change_model = get_change_model(before, during, after, delta_t) + self$delta_t = handle_delta_t(delta_t) + self$change_model = get_change_model(before, during, after, self$delta_t) self$state_update = get_state_update_type(match.arg(state_update), self$change_model) self$update_method = get_state_update_method(self$state_update, self$change_model) self$change_components = function() self$change_model$change_list - self$delta_t = delta_t self$before = before self$during = during self$after = after @@ -129,7 +129,7 @@ TMBModelSpec = function( "euler", "rk4", "discrete_stoch", "hazard" , "rk4_old", "euler_multinomial" ), - delta_t = 1 + delta_t = NULL ) { if (self$state_update == "no") { @@ -146,7 +146,7 @@ TMBModelSpec = function( , must_save = self$must_save, must_not_save = self$must_not_save , sim_exprs = self$sim_exprs , state_update = state_update - , delta_t = delta_t + , delta_t = handle_delta_t(delta_t, self$delta_t) ) } self$expand = function() { @@ -212,6 +212,12 @@ TMBModelSpec = function( return_object(self, "TMBModelSpec") } +handle_delta_t = function(delta_t_new = NULL, delta_t_old = NULL) { + if (!is.null(delta_t_new)) return(delta_t_new) + if (!is.null(delta_t_old)) return(delta_t_old) + return(1) +} + handle_saving_conflicts = function(must_save, must_not_save) { ## must_save takes precedence over must_not_save problems = intersect(must_save, must_not_save) @@ -444,6 +450,7 @@ mp_print_before = function(model) { model$before , c(length(model$before), 0L, 0L) ) + invisible(model$before) } #' @describeIn mp_print_spec Print just the expressions executed during each @@ -454,6 +461,7 @@ mp_print_during = function(model) { model$during , c(0L, length(model$during), 0L) ) + invisible(model$during) } #' @describeIn mp_print_spec Print just the expressions executed after the @@ -464,6 +472,7 @@ mp_print_after = function(model) { model$after , c(0L, 0L, length(model$after)) ) + invisible(model$after) } #' Version Update diff --git a/man/mp_absolute_flow.Rd b/man/mp_absolute_flow.Rd deleted file mode 100644 index 445c27157..000000000 --- a/man/mp_absolute_flow.Rd +++ /dev/null @@ -1,32 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/formula_list_generators.R -\name{mp_absolute_flow} -\alias{mp_absolute_flow} -\title{Specify Absolute Flow Between Compartments (Experimental)} -\usage{ -mp_absolute_flow(from, to, rate, flow_name = NULL, rate_name = NULL) -} -\arguments{ -\item{from}{String giving the name of the compartment from which the flow -originates.} - -\item{to}{String giving the name of the compartment to which the flow is -going.} - -\item{rate}{String giving the expression for the absolute -flow rate per time-step.} - -\item{flow_name}{String giving the name for the variable that -will store the \code{rate}.} - -\item{rate_name}{Deprecated synonym for \code{flow_name}. Please use \code{flow_name} -in all future work.} -} -\description{ -An experimental alternative to \code{\link{mp_per_capita_flow}} that -allows users to specify flows using absolute rates instead of -per-capita rates. -} -\seealso{ -\code{\link[=mp_per_capita_flow]{mp_per_capita_flow()}} -} diff --git a/man/mp_optimized_spec.Rd b/man/mp_optimized_spec.Rd index 49e64924f..c119c8c31 100644 --- a/man/mp_optimized_spec.Rd +++ b/man/mp_optimized_spec.Rd @@ -22,7 +22,8 @@ model, with calibrated default values. } \description{ Create a new model specification using parameter values that have been -optimized. +optimized. See the examples in the help page for +\code{\link{mp_tmb_calibrator}}. } \details{ The following is a list of additional model specification structure that was diff --git a/man/mp_per_capita_flow.Rd b/man/mp_per_capita_flow.Rd index 116e8dde0..0e1c29cf8 100644 --- a/man/mp_per_capita_flow.Rd +++ b/man/mp_per_capita_flow.Rd @@ -4,6 +4,7 @@ \alias{mp_per_capita_flow} \alias{mp_per_capita_inflow} \alias{mp_per_capita_outflow} +\alias{mp_absolute_flow} \alias{mp_inflow} \alias{mp_outflow} \title{Specify Flow Into, Out Of, and Between Compartments} @@ -14,6 +15,8 @@ mp_per_capita_inflow(from, to, rate, flow_name = NULL, abs_rate = NULL) mp_per_capita_outflow(from, rate, flow_name = NULL, abs_rate = NULL) +mp_absolute_flow(from, to, rate, flow_name = NULL, rate_name = NULL) + mp_inflow(to, rate, flow_name = NULL, abs_rate = NULL) mp_outflow(from, rate, flow_name = NULL, abs_rate = NULL) @@ -25,7 +28,7 @@ originates.} \item{to}{String giving the name of the compartment to which the flow is going.} -\item{rate}{String giving the expression for the per-capita +\item{rate}{String giving the expression for the per-capita or absolute flow rate. Alternatively, and for back compatibility, a two-sided formula with the left-hand-side giving the name of the absolute flow rate per time-step and the right-hand-side giving an expression for @@ -62,6 +65,10 @@ system (e.g., death). To keep track of the total number of dead individuals one can use \code{mp_per_capita_flow} and set \code{to} to be a compartment for these individuals (e.g., \code{to = "D"}). +\item \code{mp_absolute_flow()}: Alternative to \code{mp_per_capita_flow} that +allowing specification of flows using absolute rates instead of per-capita +rates. + \item \code{mp_inflow()}: Only flow into the \code{to} compartment. For adding a birth or immigration process. diff --git a/man/mp_tmb_calibrator.Rd b/man/mp_tmb_calibrator.Rd index 4d5e5cf15..f20307d82 100644 --- a/man/mp_tmb_calibrator.Rd +++ b/man/mp_tmb_calibrator.Rd @@ -110,5 +110,10 @@ mp_optimize(cal) if (suppressPackageStartupMessages(require(broom.mixed))) { print(mp_tmb_coef(cal)) } +(cal + |> mp_optimized_spec() + |> mp_default_list() + |> getElement("beta") +) } \concept{create-model-calibrator} diff --git a/man/mp_tmb_model_spec.Rd b/man/mp_tmb_model_spec.Rd index 317992983..f99328ded 100644 --- a/man/mp_tmb_model_spec.Rd +++ b/man/mp_tmb_model_spec.Rd @@ -16,7 +16,7 @@ mp_tmb_model_spec( sim_exprs = character(), state_update = c("euler", "rk4", "discrete_stoch", "hazard", "rk4_old", "euler_multinomial"), - delta_t = 1 + delta_t = NULL ) } \arguments{ diff --git a/man/state_updates.Rd b/man/state_updates.Rd index e6a89e65f..8aba5bd6b 100644 --- a/man/state_updates.Rd +++ b/man/state_updates.Rd @@ -10,24 +10,26 @@ \alias{mp_hazard} \title{Change How State Variables are Updated} \usage{ -mp_euler(model, delta_t = 1) +mp_euler(model, delta_t = NULL) -mp_rk4(model, delta_t = 1) +mp_rk4(model, delta_t = NULL) -mp_rk4_old(model, delta_t = 1) +mp_rk4_old(model, delta_t = NULL) -mp_euler_multinomial(model, delta_t = 1) +mp_euler_multinomial(model, delta_t = NULL) -mp_discrete_stoch(model, delta_t = 1) +mp_discrete_stoch(model, delta_t = NULL) -mp_hazard(model, delta_t = 1) +mp_hazard(model, delta_t = NULL) } \arguments{ \item{model}{Object with quantities that have been explicitly -marked as state variables.} +marked as state variables. Currently the only valid model object +is a model specification (e.g., \code{\link{mp_tmb_model_spec}}).} \item{delta_t}{Number giving the amount of time that passes during a -single time-step.} +single time-step. The default, \code{NULL}, is equivalent to the value +for \code{delta_t} that already exists in the \code{model}.} } \description{ These functions return a modified version of a model specification, such diff --git a/tests/testthat/test-absolute.R b/tests/testthat/test-absolute.R index 89e788663..19ae8690c 100644 --- a/tests/testthat/test-absolute.R +++ b/tests/testthat/test-absolute.R @@ -76,3 +76,17 @@ test_that("equivalent absolute and per-capita flows are consistent", { expect_equal(sim_fn(sir_pc), sim_fn(sir_ab)) expect_equal(sim_fn(sir_pc, mp_rk4), sim_fn(sir_ab, mp_rk4)) }) + +sir = mp_tmb_model_spec( + during = list( + mp_per_capita_flow("S", "I", "beta * I / N", "infection") + , mp_inflow("R", "gamma", "recovery") + , mp_absolute_flow("I", "R", "2 * gamma", "recovery2") + ) + , default = list( + beta = 0.2, gamma = 0.1 + , S = 99, I = 1, R = 0, N = 100 + ) +) +sir |> mp_expand() +sir |> mp_discrete_stoch() |> mp_expand() diff --git a/tests/testthat/test-change-model.R b/tests/testthat/test-change-model.R index ec11d26cc..33bf5d5b3 100644 --- a/tests/testthat/test-change-model.R +++ b/tests/testthat/test-change-model.R @@ -70,5 +70,3 @@ em = (macpan_base |> mp_trajectory() ) el = mp_simulator(macpan_base, 20L, "S.E") |> mp_trajectory() - - diff --git a/vignettes/FAQs.Rmd b/vignettes/FAQs.Rmd index a5f12e46d..abfbe84e4 100644 --- a/vignettes/FAQs.Rmd +++ b/vignettes/FAQs.Rmd @@ -115,7 +115,7 @@ You are free to declare any value in the model to be a trajectory or parameter. ### Can I get a new model specification with fitted parameters as defaults, from a calibrated calibrator object? -Coming soon! +[Yes](https://canmod.github.io/macpan2/reference/mp_optimized_spec). [Here](https://canmod.github.io/macpan2/reference/mp_tmb_calibrator.html#ref-examples) is a simple example. ## Plotting Simulated Trajectories diff --git a/vignettes/state_updaters.Rmd b/vignettes/state_updaters.Rmd index 1749a28e5..39413b039 100644 --- a/vignettes/state_updaters.Rmd +++ b/vignettes/state_updaters.Rmd @@ -21,9 +21,9 @@ set.seed(12L) ## Introduction -The `McMasterPandemic` project has focused on using discrete time difference equations to solve the dynamical system. Here we describe experimental features that allow one to update the data differently. In particular, it is now possible to use a Runge-Kutta 4 ODE solver (to approximate the solution to the continuous time analogue) as well as the Euler Multinomial distribution to generate process error. These features have in principle been available for most of the life of `macpan2`, but only recently have they been given a more convenient interface. +The `McMasterPandemic` project has focused on using discrete time difference equations to solve the dynamical system. Here we describe experimental features that allow one to update the data differently. In particular, it is now possible to use a Runge-Kutta 4 Ordinary Differential Equation (ODE) solver (to approximate the solution to the continuous time analogue) as well as the Euler Multinomial distribution to generate process error. These features have in principle been available for most of the life of `macpan2`, but only recently have they been given a more convenient interface. -In order to use this interface, models must be rewritten using explicit declarations of state updates. By explicitly declaring what expressions correspond to state updates, `macpan2` is able to modify the method of updating without further user input. This makes it easier to compare difference equations (i.e. Euler steps), ODEs (i.e. Runge-Kutta), and process error (i.e. Euler Multinomial) runs for the same underlying dynamical model. +In order to use this interface, models must be rewritten using explicit declarations of state updates. By explicitly declaring what expressions correspond to state updates, `macpan2` is able to modify the method of updating without further user input. This makes it easier to compare runs using difference equations (i.e. Euler steps), ODEs (i.e. Runge-Kutta), and stochastic difference equations for the same underlying dynamical model. To declare a state update one replaces formulas in the `during` argument of a model spec to include calls to the `mp_per_capita_flow()` function. As an example we will modify the SI model to include explicit state updates. The original form of the model looks like this. ```{r} @@ -44,7 +44,7 @@ The modified version looks like this. ```{r} si_explicit = mp_tmb_model_spec( before = list(S ~ N - I) - , during = list(mp_per_capita_flow("S", "I", infection ~ beta * I / N)) + , during = list(mp_per_capita_flow("S", "I", "beta * I / N", "infection")) , default = list(I = 1, N = 100, beta = 0.25) ) print(si_explicit) @@ -157,6 +157,22 @@ for (dt in delta_t) { ``` +$$ +t_n = \delta_t n +$$ + +$$ +t_{n + 1} = t_n \delta_t +$$ + +$$ +t_{n + 1} = \delta_t (n + 1) +$$ + +$$ +t_n + \frac{\delta_t}{2} = \delta_t n + \frac{\delta_t}{2} = \delta_t \left(n + \frac{1}{2}\right) +$$ + ## Internal Design ```{r} @@ -166,6 +182,7 @@ spec = mp_tmb_model_spec( , mp_per_capita_flow("S", "I", "beta * I / N", "infection") , mp_per_capita_flow("I", "R", "(1 - p) * gamma", "recovery") , mp_per_capita_flow("I", "D", "p * gamma", "death") + , mp_inflow("I", "mu", "importation") ) ) ``` @@ -287,15 +304,32 @@ The constructors of these `UpdateMethod` classes often have a field of class `Ch ## Mathematical Description +We distinguish four kinds of flows that differ in how they are parameterized and how they affect state variables. + +### Per-capita Flow Between Two Compartments + +This is the most common kind of flow. It is characterized by two compartments and the per-capita rate of flow from one of them to the other. We use the symbol $r$ to indicate per-capita flow, and subscripts to indicate the source and sink compartments. For example, in the standard SIR model there are two flows and both are per-capita flows. The infection flow is from S to I at per-capita rate $r_{SI} = \frac{\beta I}{N}$ and the recovery flow is from `I` to `R` at per-capita rate $r_{IR} = gamma$. + +The per-capita flow between two compartemnts is given by + +How S, I, and R are updated in this SIR model depends on the state update method, but the simplest approach is to use differential equations. + +$$ +\begin{align} +\frac{dS}{dt} = \ +\end{align} +$$ + + It is instructive to view these state update methods as approximate solutions to ordinary differential equations (ODEs). We consider ODEs of the following form. $$ \frac{dx_i}{dt} = - \underbrace{\sum_j x_j r_{ji}}_{\text{inflow}} - - \underbrace{\sum_j x_i r_{ij}}_{\text{outflow}} + - \underbrace{\sum_j \rho_i}_{\text{exogenous}} + \underbrace{\omega_i}_{\text{exogenous change}} + + \underbrace{\sum_j (x_j r_{ji} + \rho_{ji})}_{\text{inflow}} - + \underbrace{\sum_j (x_i r_{ij} + \rho_{ij})}_{\text{outflow}} $$ -Where the per-capita rate of flowing from compartment $i$ to compartment $j$ is $r_{ij}$, the rate of exogeneous change of compartment $i$ is $\rho_i$, and $x_i$ is the number of individuals in the $i$th compartment. We allow each $r_{ij}$ to depend on any number of state variables and time-varying parameters. For example, for an SIR model we have $x_S, x_I, x_R$ (for readability we use $S, I, R$). In this case $r_{SI} = \beta I / N$, $r_{IR} = \gamma$, and all other values of $r_{ij}$ are zero. Here the force of infection, $r_{SI}$, depends on a state variable $I$. +Where the per-capita rate of flowing from compartment $i$ to compartment $j$ is $r_{ij}$, the associated the rate of exogeneous change of compartment $i$ is $\rho_i$, and $x_i$ is the number of individuals in the $i$th compartment. We allow each $r_{ij}$ to depend on any number of state variables and time-varying parameters. For example, for an SIR model we have $x_S, x_I, x_R$ (for readability we use $S, I, R$). In this case $r_{SI} = \beta I / N$, $r_{IR} = \gamma$, and all other values of $r_{ij}$ are zero. Here the force of infection, $r_{SI}$, depends on a state variable $I$. Although each state-update method presented below can be thought of as an approximate solution to this ODE, they can also be thought of as dynamical models in their own right. For example, the Euler-multinomial model is a useful model of process error. From 788eb98cd5dcbc859a95d4c2edac1b008368b165 Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Fri, 27 Jun 2025 09:03:39 -0400 Subject: [PATCH 15/17] [skip ci] update toc --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f887b0c2..a9a1ef4c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -13,6 +13,8 @@ Developers can see [here](https://canmod.github.io/macpan2/articles/index.html#d - [Adding Engine Functions](#adding-engine-functions) - [Developer Installation on Windows](#developer-installation-on-windows) - [Test Suite](#test-suite) +- [Changelog Management](#changelog-management) +- [Log Files](#log-files) ## Developer Installation From 5ed757bb1c0af6e67c3e0c0b69d05bafa8541dee Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Fri, 27 Jun 2025 09:54:36 -0400 Subject: [PATCH 16/17] docs --- R/formula_list_generators.R | 2 ++ man/mp_per_capita_flow.Rd | 3 +++ 2 files changed, 5 insertions(+) diff --git a/R/formula_list_generators.R b/R/formula_list_generators.R index e05048c22..733dafe7f 100644 --- a/R/formula_list_generators.R +++ b/R/formula_list_generators.R @@ -1021,6 +1021,8 @@ mp_per_capita_outflow = function(from, rate, flow_name = NULL, abs_rate = NULL) #' @describeIn mp_per_capita_flow Alternative to `mp_per_capita_flow` that #' allowing specification of flows using absolute rates instead of per-capita #' rates. +#' @param rate_name Deprecated synonym for `flow_name` when using +#' `mp_absolute_flow`. Please use `flow_name` in all future work. #' @export mp_absolute_flow = function(from, to, rate, flow_name = NULL, rate_name = NULL) { call_string = deparse(match.call()) diff --git a/man/mp_per_capita_flow.Rd b/man/mp_per_capita_flow.Rd index a7ea1c838..ec4aef32d 100644 --- a/man/mp_per_capita_flow.Rd +++ b/man/mp_per_capita_flow.Rd @@ -38,6 +38,9 @@ the per-capita rate of flow from \code{from} to \code{to}.} \item{abs_rate}{Deprecated synonym for \code{flow_name}. Please use \code{flow_name} in all future work.} + +\item{rate_name}{Deprecated synonym for \code{flow_name} when using +\code{mp_absolute_flow}. Please use \code{flow_name} in all future work.} } \description{ Specify different kinds of flows into, out of, and between compartments. From 152ca03cbff4ff7efda14bdba967f0e780a1804f Mon Sep 17 00:00:00 2001 From: stevencarlislewalker Date: Fri, 27 Jun 2025 09:59:48 -0400 Subject: [PATCH 17/17] [skip ci] test cleanup --- tests/testthat/test-delta-t.R | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/testthat/test-delta-t.R b/tests/testthat/test-delta-t.R index f15f45d73..e484a8072 100644 --- a/tests/testthat/test-delta-t.R +++ b/tests/testthat/test-delta-t.R @@ -1,5 +1,7 @@ -# library(macpan2); library(testthat); library(dplyr); library(tidyr); library(ggplot2); library(deSolve) -# source("tests/testthat/setup.R") +if (interactive()) { + library(macpan2); library(testthat); library(deSolve) + source("tests/testthat/setup.R") +} test_that("rk4 time-steps work with the si model", { delta_t = 0.1 time = 50