The EpiNow2 package contains functionality to run
estimate_infections()
in production mode, i.e. with full
logging and saving all relevant outputs and plots to dedicated folders
in the hard drive. This is done with the epinow()
function,
that takes the same options as estimate_infections()
with
some additional options that determine, for example, where output gets
stored and what output exactly. The function can be a useful option
when, e.g., running the model daily with updated data on a
high-performance computing server to feed into a dashboard. For more
detail on the various model options available, see the Examples vignette, for more
on the general modelling approach the Workflow, and for
theoretical background the Model
definitions vignette
Running the model on a single region
To run the model in production mode for a single region, set the
parameters up in the same way as for estimate_infections()
(see the Workflow
vignette). Here we use the example delay and generation time
distributions that come with the package. This should be replaced with
parameters relevant to the system that is being studied.
library("EpiNow2")
#>
#> Attaching package: 'EpiNow2'
#> The following object is masked from 'package:stats':
#>
#> Gamma
options(mc.cores = 4)
reported_cases <- example_confirmed[1:60]
reporting_delay <- LogNormal(mean = 2, sd = 1, max = 10)
delay <- example_incubation_period + reporting_delay
rt_prior <- list(mean = 2, sd = 0.1)
We can then run the epinow()
function with the same
arguments as estimate_infections()
.
res <- epinow(reported_cases,
generation_time = generation_time_opts(example_generation_time),
delays = delay_opts(delay),
rt = rt_opts(prior = rt_prior)
)
#> Logging threshold set at INFO for the name logger
#> Writing EpiNow2 logs to the console and:
#> '/tmp/RtmpLVW5Qb/regional-epinow/2020-04-21.log'.
#> Logging threshold set at INFO for the name logger
#> Writing EpiNow2.epinow logs to the console and:
#> '/tmp/RtmpLVW5Qb/epinow/2020-04-21.log'.
#> WARN [2024-11-01 00:31:23] epinow: There were 10 divergent transitions after warmup. See
#> https://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup
#> to find out why this is a problem and how to eliminate them. -
#> WARN [2024-11-01 00:31:23] epinow: Examine the pairs() plot to diagnose sampling problems
#> -
res$plots$R
The initial messages here indicate where log files can be found. If
you want summarised results and plots to be written out where they can
be accessed later you can use the target_folder
argument.
Running the model simultaneously on multiple regions
The package also contains functionality to conduct inference
contemporaneously (if separately) in production mode on multiple time
series, e.g. to run the model on multiple regions. This is done with the
regional_epinow()
function.
Say, for example, we construct a dataset containing two regions,
testland
and realland
(in this simple example
both containing the same case data).
cases <- example_confirmed[1:60]
cases <- data.table::rbindlist(list(
data.table::copy(cases)[, region := "testland"],
cases[, region := "realland"]
))
To then run this on multiple regions using the default options above, we could use
region_rt <- regional_epinow(
data = cases,
generation_time = generation_time_opts(example_generation_time),
delays = delay_opts(delay),
rt = rt_opts(prior = rt_prior),
)
#> INFO [2024-11-01 00:31:26] Producing following optional outputs: regions, summary, samples, plots, latest
#> Logging threshold set at INFO for the name logger
#> Writing EpiNow2 logs to the console and:
#> '/tmp/RtmpLVW5Qb/regional-epinow/2020-04-21.log'.
#> Logging threshold set at INFO for the name logger
#> Writing EpiNow2.epinow logs to: '/tmp/RtmpLVW5Qb/epinow/2020-04-21.log'.
#> INFO [2024-11-01 00:31:26] Reporting estimates using data up to: 2020-04-21
#> INFO [2024-11-01 00:31:26] No target directory specified so returning output
#> INFO [2024-11-01 00:31:26] Producing estimates for: testland, realland
#> INFO [2024-11-01 00:31:26] Regions excluded: none
#> INFO [2024-11-01 00:32:52] Completed estimates for: testland
#> INFO [2024-11-01 00:36:49] Completed estimates for: realland
#> INFO [2024-11-01 00:36:49] Completed regional estimates
#> INFO [2024-11-01 00:36:49] Regions with estimates: 2
#> INFO [2024-11-01 00:36:49] Regions with runtime errors: 0
#> INFO [2024-11-01 00:36:49] Producing summary
#> INFO [2024-11-01 00:36:49] No summary directory specified so returning summary output
#> INFO [2024-11-01 00:36:50] No target directory specified so returning timings
## summary
region_rt$summary$summarised_results$table
#> Region New infections per day Expected change in daily reports
#> <char> <char> <fctr>
#> 1: realland 2201 (1055 -- 4557) Likely decreasing
#> 2: testland 2302 (1117 -- 4754) Likely decreasing
#> Effective reproduction no. Rate of growth
#> <char> <char>
#> 1: 0.88 (0.61 -- 1.2) -0.033 (-0.14 -- 0.066)
#> 2: 0.9 (0.63 -- 1.2) -0.028 (-0.13 -- 0.076)
#> Doubling/halving time (days)
#> <char>
#> 1: -21 (11 -- -4.9)
#> 2: -25 (9.1 -- -5.3)
## plot
region_rt$summary$plots$R
If instead, we wanted to use the Gaussian Process for
testland
and a weekly random walk for realland
we could specify these separately using the opts_list()
function from the package and modifyList()
from
R
.
gp <- opts_list(gp_opts(), cases)
gp <- modifyList(gp, list(realland = NULL), keep.null = TRUE)
rt <- opts_list(rt_opts(), cases, realland = rt_opts(rw = 7))
region_separate_rt <- regional_epinow(
data = cases,
generation_time = generation_time_opts(example_generation_time),
delays = delay_opts(delay),
rt = rt, gp = gp,
)
#> INFO [2024-11-01 00:36:50] Producing following optional outputs: regions, summary, samples, plots, latest
#> Logging threshold set at INFO for the name logger
#> Writing EpiNow2 logs to the console and:
#> '/tmp/RtmpLVW5Qb/regional-epinow/2020-04-21.log'.
#> Logging threshold set at INFO for the name logger
#> Writing EpiNow2.epinow logs to: '/tmp/RtmpLVW5Qb/epinow/2020-04-21.log'.
#> INFO [2024-11-01 00:36:50] Reporting estimates using data up to: 2020-04-21
#> INFO [2024-11-01 00:36:50] No target directory specified so returning output
#> INFO [2024-11-01 00:36:50] Producing estimates for: testland, realland
#> INFO [2024-11-01 00:36:50] Regions excluded: none
#> INFO [2024-11-01 00:38:30] Completed estimates for: testland
#> INFO [2024-11-01 00:39:02] Completed estimates for: realland
#> INFO [2024-11-01 00:39:02] Completed regional estimates
#> INFO [2024-11-01 00:39:02] Regions with estimates: 2
#> INFO [2024-11-01 00:39:02] Regions with runtime errors: 0
#> INFO [2024-11-01 00:39:02] Producing summary
#> INFO [2024-11-01 00:39:02] No summary directory specified so returning summary output
#> INFO [2024-11-01 00:39:03] No target directory specified so returning timings
## summary
region_separate_rt$summary$summarised_results$table
#> Region New infections per day Expected change in daily reports
#> <char> <char> <fctr>
#> 1: realland 2077 (1045 -- 4285) Likely decreasing
#> 2: testland 2217 (1007 -- 4591) Likely decreasing
#> Effective reproduction no. Rate of growth
#> <char> <char>
#> 1: 0.85 (0.61 -- 1.2) -0.039 (-0.11 -- 0.044)
#> 2: 0.88 (0.58 -- 1.2) -0.03 (-0.15 -- 0.072)
#> Doubling/halving time (days)
#> <char>
#> 1: -18 (16 -- -6.5)
#> 2: -23 (9.7 -- -4.8)
## plot
region_separate_rt$summary$plots$R