cmdstanr
has also be surfaced. By @jamesmbaazam in #753 and reviewed by @seabbs.{cli}
R package to signal errors, warnings, and messages. By @jamesmbaazam in #762 and reviewed by @seabbs.epinow()
now returns the "timing" output in a "time difference"" format that is easier to understand and work with. By @jamesmbaazam in #688 and reviewed by @sbfnk.tolerance
argumentgp_opts()
function has gained three more options, "periodic", "ou", and "se", to specify periodic and linear kernels respectively. By @seabbs in #742 and reviewed by @jamesmbaazam.sd
of phi
in obs_opts()
from 1 to 0.25. By @seabbs in #742 and reviewed by @jamesmbaazam.list(adapt_delta = 0.95, max_treedepth = 15)
to list(adapt_delta = 0.9, max_treedepth = 12)
due to improved performance and to reduce the runtime of the default parameterisations. By @seabbs in #742 and reviewed by @jamesmbaazam.forecast_secondary()
did not work with fixed delays. By @sbfnk in #717 and reviewed by @seabbs.stan_sampling_opts()
to add that the dots are passed to cmdstanr::sample()
. By @jamesmbaazam in #699 and reviewed by @sbfnk.generation_time_opts()
has been shortened to gt_opts()
to make it easier to specify. Calls to both functions are equivalent. By @jamesmbaazam in #698 and reviewed by @seabbs and @sbfnk .update_rt()
. By @seabbs in #747 and reviewed by @jamesmbaazam.A patch release to further fix an issue with the date in the package citation. This has now been addressed by removing inst/CITATION
.
A patch release to fix an issue with the date in the package citation.
This release comes with a change of maintainer, from @seabbs to @sbfnk. This is to reflect who will handle the upcoming CRAN submission, but is not expected to lead to a change in workflows.
dist_spec()
users now specify distributions using functions that represent the available distributions, i.e. LogNormal()
, Gamma()
and Fixed()
. See ?EpiNow2::Distributions
. Uncertainty is specified using calls of the same nature, to Normal()
. More information on the underlying design can be found in inst/dev/design_dist.md
By @sbfnk in #504 and reviewed by @seabbs.sample_approx_dist()
, report_cases()
, and adjust_infection_reports()
have been deprecated as the functionality they provide can now be achieved with simulate_secondary()
. See #597 by @jamesmbaazam and reviewed by @sbfnk.update_list()
has been deprecated in favour of utils::modifyList()
because it comes with an installation of R. By @jamesmbaazam in #491 and reviewed by @seabbs.fixed
argument to dist_spec
has been deprecated and replaced by a fix_dist()
function. By @sbfnk in #503 and reviewed by @seabbs.get_dist()
, get_generation_time()
, get_incubation_period()
have been deprecated and replaced with examples. By @sbfnk in #481 and reviewed by @seabbs.init_cumulative_fit()
has been deprecated. By @jamesmbaazam in #541 and reviewed by @sbfnk.weigh_delay_priors
argument has been deprecated in favour of delay-specific prior weighting using weight_priors
. See generation_time_opts()
, delay_opts()
, and trunc_opts()
. By @sbfnk in #630 and reviewed by @jamesmbaazam.data
argument to pass data. The existing reported_cases
, reports
, and obs
arguments are deprecated and will be removed in v2.0.0. By @jamesmbaazam in #638 and reviewed by @sbfnk.estimate_infections()
so that rather than imputing missing data, it now skips these data points in the likelihood. This is a breaking change as it alters the behaviour of the model when dates are missing from a time series but are known to be zero. We recommend that users check their results when updating to this version but expect this to in most cases improve performance. By @seabbs in #528 and reviewed by @sbfnk.simulate_infections
has been renamed to forecast_infections
in line with simulate_secondary
and forecast_secondary
. The terminology is: a forecast is done from a fit to existing data, a simulation from first principles. By @sbfnk in #544 and reviewed by @seabbs.simulate_infections
function has been added that can be used to simulate from the model from given initial conditions and parameters. By @sbfnk in #557 and reviewed by @jamesmbaazam.init_cumulative_fit()
has been deprecated. By @jamesmbaazam in #541 and reviewed by @sbfnk.dist_spec()
users now specify distributions using functions that represent the available distributions, i.e. LogNormal()
, Gamma()
and Fixed()
. Uncertainty is specified using calls of the same nature, to Normal()
. More information on the underlying design can be found in inst/dev/design_dist.md
By @sbfnk in #504 and reviewed by @seabbs.get_parameters()
, get_pmf()
, and get_distribution()
have been added to extract elements of a <dist_spec> object. By @sbfnk in #646 and reviewed by @jamesmbaazam.sample_approx_dist()
, report_cases()
, and adjust_infection_reports()
have been deprecated as the functionality they provide can now be achieved with simulate_secondary()
. See #597 by @jamesmbaazam and reviewed by @sbfnk.forecast_infections
function. By @sbfnk in #460 and reviewed by @seabbs.inst/CITATION
and added a GitHub Actions workflow to auto-generate citation.cff
so that the two citation files are always in sync with DESCRIPTION
. By @jamesmbazam in #467, with contributions from @Bisaloo, and reviewed by @seabbs and @sbfnk.data
argument in estimate_infections()
and confirm
column in the obs
argument of estimate_truncation()
to allow numeric
types, not just integer
. See #594, by @jamesmbaazam, and reviewed by @sbfnk.epinow()
, regional_epinow()
, and estimate_infections()
using the truncation
argument. By @jamesmbaazam in #644 and reviewed by @sbnfk.purrr::transpose()
with purrr::list_transpose()
because the former is superseded. By @jamesmbaazam in #524 and reviewed by @seabbs.estimate_infections()
, estimate_secondary()
, estimate_truncation()
, simulate_infections()
, and epinow()
. check_reports_valid()
has been added to validate the reports dataset passed to these functions. Tests are added to check check_reports_valid()
. As part of input validation, the various *_opts()
functions now return subclasses of the same name as the functions and are tested against passed arguments to ensure the right *_opts()
is passed to the right argument. For example, the obs
argument in estimate_secondary()
is expected to only receive arguments passed through obs_opts()
and will error otherwise. By @jamesmbaazam in #476 and reviewed by @sbfnk and @seabbs.estimate_truncation()
has been simplified. The package now ships with a dataset example_truncated
, which is used in the estimate_truncation()
example and tests. The steps for creating the example_truncated
is stored in ./data-raw/estimate-truncation.R
. By @jamesmbaazam in #584 and reviewed by @seabbs and @sbfnk.simulate_secondary()
was added to simulate from parameters of the estimate_secondary
model. A function of the same name that was previously based on a reimplementation of that model in R with potentially time-varying scalings and delays has been renamed to convolve_and_scale()
. By @sbfnk in #591 and reviewed by @seabbs.simulate_infections()
gained the argument seeding_time
to change the seeding time. Additionally, the documentation was improved. By @sbfnk in #627 and reviewed by @jamesmbaazam.cmdstanr
backend has been added. By @sbfnk in #537 and #642 and reviewed by @seabbs.phi
to be phi = 1 / sqrt_phi ^ 2
rather than the previous parameterisation phi = 1 / sqrt(sqrt_phi)
based on the suggested prior here and the performance benefits seen in the epinowcast
package (see here). By @seabbs in #487 and reviewed by @sbfnk.na
argument to obs_opts()
that allows the user to specify whether NA values in the data should be interpreted as missing or accumulated in the next non-NA data point. By @sbfnk in #534 and reviewed by @seabbs.log I(t) - log I(t - 1)
. Originally by @seabbs in #213, finished by @sbfnk in #610 and reviewed by @seabbs.filter_leading_zeros
and zero_threshold
to estimate_secondary()
and estimate_truncation()
to allow the user to specify whether to filter leading zeros in the data and the threshold for replacing zero cases. These arguments were already used in estimate_infections()
, epinow()
, and regional_epinow()
. See ?estimate_secondary
and ?estimate_truncation
for more details. By @jamesmbaazam in #608 and reviewed by @sbfnk.This release contains some bug fixes, minor new features, and the initial stages of some broader improvement to future handling of delay distributions.
dist_spec()
function. This comes with a range of benefits, including optimising model fitting when static delays are used (by convolving when first defined vs in stan), easy printing (using print()
), and easy plotting (using plot()
). It also makes it possible to use all supported distributions everywhere (i.e, as a generation time or reporting delay). However, while for now backwards compatibility has been ensured this update will break most users' code eventually as the interface has changed. See the documentation for dist_spec()
for more details. By @sbfnk in #363 and reviewed by @seabbs.ifelse()
and data.table::fifelse()
in the code base with data.table::fcase()
. By @jamesmbaazam in #383 and reviewed by @seabbs.calc_backcalc_data()
to call calc_backcalc_data()
instead of create_gp_data()
. By @jamesmbaazam in #388 and reviewed by @seabbs.tune_inv_gamma()
. By @sbfnk in #394 and reviewed by @seabbs.remotes::install_github("epiforecasts/EpiNow2")
if pak
fails and if both fail, raise an issue.dist_fit()
's samples
argument now takes a default value of 1000 instead of NULL. If a supplied samples
is less than 1000, it is changed to 1000 and a warning is thrown to indicate the change. By @jamesmbazam in #389 and reviewed by @seabbs.estimate_truncation
to allow it to be applied to time series that are shorter than the truncation max. By @sbfnk in #438 and reviewed by @seabbs.estimate_truncation
to use the dist_spec
interface, deprecating existing options max_trunc
and trunc_dist
. By @sbfnk in #448 and #452 and reviewed by @seabbs.weigh_delay_priors
argument to the main functions, allowing the users to choose whether to weigh delay priors by the number of data points or not. By @sbfnk in #450 and reviewed by @seabbs.EpiNow2
to the case studies vignette. By @seabbs in #441 and reviewed by @sbfnk.This is a minor release to resolve issues with the recent CRAN requirement to make use of a C++ 17 compiler which has been causing issues with the rstantools
package.
This release focusses on bug fixes and package infrastructure updates along with a few quality of life improvements such as enabling the use of fixed delays and generation times.
Thanks to @seabbs, and @sbfnk and for the South African Centre for Epidemiological Modelling and Analysis (SACEMA) for hosting @seabbs whilst some of the development work on this release was being done.
trunc_opts()
now takes a single argument (dist
) which defines the truncation delay rather than a arbitrary list of arguments (which was previously used to define the distribution).frac_obs
parameter has restricted with an upper bound of 1 to reflect its name and description. This may impact a small number of edge case uses with the majority being models fit using estimate_secondary()
. By @sbfnk in #340.simulate_secondary()
for simulating secondary observations under the generative process model assumed by estimate_secondary
. Unlike forecast_secondary()
which uses a stan
model to simulate secondary cases (which shares code with the estimate_secondary
model) this new function is implemented entirely in R and is therefore useful to sense check any results from the stan
implementation.seq_along()
rather than 1:length()
in all package code.regional_runtimes()
.rstan
and rstantools
.pkgnet
for package dependency visualisation.styler
.RcppParallel
.report_cases
to work with the new delay_opts
helper function.report_cases
though note this function will likely be deprecated in future releases.linewidth
in plot_CrIs
rather than size
to avoid issues with ggplot2
3.4.0.get_
distribution functions to return the distribution as well as summary
parameters.touchstone
.estimate_infections()
.simulate_infections()
where passing a custom number of samples would cause the input vector of R values to be replicated in a column-wise fashion meaning that the intended R trajectory was not simulated.estimate_infections()
deconvolution model where the generation time was not correctly being reversed.This release adds a range of new minor features, squashes bugs, enhances documentation, expands unit testing, implements some minor run-time optimisations, and removes some obsolete features.
Thanks to @Bisaloo, @hsbadr, @LloydChapman, @medewitt, and @sbfnk for contributing to this release.
Thanks to @sbfnk, @pearsonca, and @nicholasdavies for regression testing this release against 1.3.2
.
simulate_infections
so that a data.frame
of R samples can be passed in instead of a vector of R values. By @seabbs.estimate_infections
. By @seabbs.zero_threshold
to users allowing for control over when zeros or NAs in count data are treated as true zeros versus as reporting errors that require some smoothing. By @seabbs.obs_opts()
). This allows, for example, fitting to data with cases only reported every 3 days. By @seabbs.plot_estimates()
and higher level functions to choose which estimate type to plot. By @seabbs.plot
) to regional_summary
to allow plotting to be optional. Closes #250. By @seabbs in #317obs_opts()
). This allows, for example, fitting to data with cases only reported every 3 days.target
likelihood definition approach when required and in the use of fmax
and fmin
over using if statements. By @seabbs.phi
argument of obs_opts
with the default of a normal distribution with mean 0 and standard deviation of 1 truncated at 0 remaining unchanged. By @seabbs.estimate_truncation
model to deal with zeroes. By @sbfnk.epinowcast
by Adrian Lison and Sam Abbott. By @seabbs in #320.contributing.md
to guide contributors and added pre-commit
support to check new contributions styling. By @seabbs.cowplot::theme_cowplot()
to ggplot2::theme_bw()
. This allows the removal of cowplot
as a dependency as well making plots visible for users saving as pngs and using a dark theme. By @seabbs.epinow
and downstream functions remove leading zeros. Now this is optional with the new filter_leading_zeros
option. Thanks to @LloydChapman in #285.estimate_secondary()
, forecast_secondary()
, and estimate_truncation()
. By @seabbs in #315.adjust_infection_to_report
. By @seabbs in #316.rstantools
to manage compiler flags.future::multisession()
from future::multiprocess()
as the latter is being depreciated in the future
package. By @seabbs and @sbfnk.simulate_cases()
and simulate_infections()
have been deprecated and have been removed. These functions depend on EpiSoon
which itself is archived and near equivalent functionality is available within EpiNow2
and in other packages (@seabbs).simulate_infections()
(i.e in `epinow())
have been removed along with the arguments that supported them (@seabbs).global_map()
, country_map()
, and theme_map()
have all been deprecated and have been removed. These functions were used to support reporting of reproduction number
estimates and are considered out of scope for EpiNow2
. If finding useful contacting the
EpiNow2
developers (@seabbs).simulate_infections
and forecast_secondary
which meant that a Poisson observation model used for estimation would lead to a error. By @seabbs.use_rt = FALSE
did not properly cancel user settings. By @sbfnk.estimate_truncation
where phi was not initialised. By @sbfnk.zero_threshold
was being ignored and so no post-processing was happening. To maintain backwards compatibility the default has been changed to Inf
(i.e. no zero threshold). By @LloydChapman in #285.obs_opts(return_likelihood = TRUE)
fails. By @sbfnk in #333.In this release model run times have been reduced using a combination of code optimisation and testing to reduce the likelihood of long running edge cases. Model flexibility has also been increased, particularly for the back calculation approach which now supports an increased range of prior choices. A significant development in this release is the edition of the experimental estimate_secondary
model (and supporting forecast
and plot
functions). This allows a downstream target to be forecast from an observation. Example use cases include forecasting deaths from test positive cases and hospital bed usage from hospital admissions. This approach is intended to provide an alternative to models in which multiple targets are estimated jointly.
prior
, to backcalc_opts()
. This allows the use of different priors for the
underlying latent infections when estimating using deconvolution/back-calculation rather than the package
default of using a generated Rt model (enable this option by setting rt = NULL
). The default prior
remains smoothed mean delay shifted reported cases but optionally no prior can now also be used (for
scenarios when the data is very untrustworthy but likely to perform extremely poorly in real time).In addition,
the previously estimated infections can be used (i.e infections[t] = infections[t-1] * exp(GP)) with this being
an approximate version of the generative Rt model that does not weight previous infections using the generation
time.prior = "reports"
to be a partial centred moving average rather than a right aligned moving average.
This choice means that increasing the prior
window does not alter the location of epidemic peaks as when using a right alighted moving average.init_fit
to stan_opts()
that enables the user to pass in a stanfit
to use to initialise a model fit in estimate_infections()
. Optionally init_fit = "cumulative"
can also be passed which first fits to cumulative data and then uses the result to initialise the full fit on incidence data. This approach is based on the approach used in epidemia authored by James Scott. Currently stan
warnings from this initial fit are broadcast to the user and may cause concern as the short run time and approximate settings often lead to poor convergence.estimate_secondary
and forecast_secondary
along with a plot
method and a new option function (secondary_opts()
). These functions implement a generic model for forecasting a secondary observation (such as hospital bed usage, deaths in hospital) that entirely depends on a primary observation (such as hospital admissions) via a combination of convolving over a delay and adding/subtracting current observations. They share the same observation model and optional features used by estimate_infections
and so support data truncation, scaling (between primary and secondary observations), multiple log normal delays, a day of the week effect, and various error models. stationary_opts()
allows for easy specification of the most common use cases (incidence and prevalence variables). See the documentation and examples for model details.discretised_gamma_pmf
(discretised truncated Gamma PMF) and discretised_lognormal_pmf
(discretised truncated lognormal PMF) to limit/clip the values of the parameters by prespecified lower and upper bounds.estimate_infections
by reducing all standard deviations used by a scaling factor of 0.1 in create_initial_conditions
.gt_mean
(the mean of the generation time) to reject samples with a mean greater than gt_max
(the maximum allowed generation time). Adds boundary checking to reject standard deviations that are negative. Adds a boundary check on R values to reject them if 10 times greater than the mean of the initial prior. In some scenarios this will require users to supply a prior not is not completely misspecified (i.e if the prior has a mean of 1 and the posterior has a mean of 50).update_rt
(an internal stan
function found in inst/stan/functions/rt.stan
) to be vectorised. This change reduces run times by approximately 1- ~ 20% (though only tested on a small subset of examples) and opens the way for future model extensions (such as additive rather than multiplicative random walks, and introducing covariates).This release focusses on model stability, with a functional rewrite of the model implementation, finalising the interface across the package, and introducing additional tooling. The additional tooling includes: support for adjusting for and estimating data truncation, multiple approaches for estimating Rt (including the default generative Rt approach, de-convolution coupled with Rt calculation, and EpiEstim
like estimation on observed cases but with a robust observation model), optional scaling of observed data, and optional adjustment of future forecasts based on population susceptibility. The examples have also been expanded with links out to Covid-19 specific work flows that may be of interest to users. The implementation and model options are now considered to be maturing with the next release planned to contain documentation on the underlying approach, case studies, validation, evaluation the various supported options, and tools for dealing with secondary reports that are dependent on a primary report (i.e hospital admissions and hospital bed usage). If interested in contributing to any of these features please contact the package authors or submit a PR. User contributions are warmly welcomed.
estimate_infections
to be divided into calls to _opts()
functions. Options are now divided by type for delays (delay_opts()
), Rt (rt_opts()
), backcalculation (backcalc_opts()
), the Gaussian process (gp_opts()
), and stan arguments (stan_opts()
). This has resulted in a larger number of the arguments from estimate_infections
being folded into the related _opts()
function. Please see the function documentation and examples for details._opts()
function in regional_epinow
using the helper functions opts_list
and update_list
or alternatively by constructing a named list with an entry for each region to be estimated.{EpiEstim}
(here with a default window of 1 but this can be updated using backcalc_opts(rt_window))
but this approaches incorporates uncertainty from all inputs in a single estimate.epinow
and estimate_infections
.simulate_infections
function from @sbfnk which allows the simulation of different Rt traces when combined with estimates as produced by estimate_infections
. This function is likely to form the basis for moving all forecasting out of estimate_infections
which may improve model stability.gp_opts()
. The length scale is now defined using a log normal truncated prior with a mean of 21 days and a standard deviation of 7 days truncated at 3 days and the length of the data by default. This prior is an area of active research and so may change in future releases.1 / sqrt(half_normal(0, rho_prior))
based on this advice and as the over dispersion being measured is in reports and not infections and hence a priori there is not strong evidence for over dispersion (which may be the case for infections) so the previous prior was overly weighted towards this.obs_opts()
. This removes week_effect
and family
from the main argument list which will allow for future extensions. Also adds a new argument scale
which controls the uncertain fraction of cases that are eventually observed (defined as normally distributed). Setting this parameter will not
impact Rt estimates.rt
, using rt_opts()
, this includes the initial prior,use_breakpoints
, and future
. Adds a new helper argument rw
which enables easy parameterisation of a fixed length random walk. These changes also help make it clear that these arguments only impact the Rt generative model and not the back calculation model.{epidemia}
when Rt is fixed into the future (set by passing a population to rt_opts(pop = initial susceptible population)
. Note this only impacts case forecasts and not output Rt estimates and only impacts estimates at all beyond the forecast horizon as those based on data already account for population susceptibility by definition. The impact of this assumption can be explored using simulate_infections
(by updating est$arg$pop
in the example).truncation
as a new argument to estimate_infections
and higher level functions. This takes output from trunc_opts()
and allows for internally adjusting observed cases for truncation. A new method estimate_truncation
has also been added to support estimating a log normal truncation distribution from archived versions of the same data set though this method is currently experimental.estimate_delay
as a user friendly wrapper around bootstrapped_dist_fit
.epinow
and in regional_epinow
for large batch runs.regional_epinow
) to be based on whether or not usage is interactive.burn_in
argument of estimate_infections
as updates to model initialisation mean that this feature is likely no longer needed. Please contact the developers if you feel you have a use case for this argument.convert_to_logmean
and convert_to_logsd
).expose_stan_fns
that exposes the internal stan functions into R. The enables unit testing, exploration of the stan functionality and potentially within R use cases for these functions.warmup
to be 250 samples and the default adapt_delta
to be 0.98.{lifecycle}
badges to all functions to indicate development stage.This release introduces multiple breaking interface changes. Please see the README for examples of the new interface. It adds a range of quality of life improvements including updating the stan
interface to support fitting each chain independently and offering variational inference as an alternative, experimental, fitting option. Notably it also adds support for nesting logging and a parallel enabled progress bar via the progressr
package. Minor bugs have been fixed in the core model implementation focussing on stability and several already implemented features have been extended. Major model developments are planned for the next release of EpiNow2
.
method = "exact"
) or Variational inference (method = "approximate"
).get_dist
, get_generation_time
, get_incubation_period
based on ideas from @pearsonca. (This leads to breaking changes with the removal of covid_generation_times
and covid_incubation_periods
).setup_logging
to enable users to specify the level and location of logging (wrapping functionality from futile.logger
). Also added setup_default_logging
to give users sensible defaults and embedded this
function in regional_epinow
and epinow
.setup_future
to making using nested futures easier (required when using future = TRUE
).progressr
.regional_epinow
regional_epinow
regional_runtimes
that summarises the run time across regions.estimate_infections
interface and expanded the range of options for the future_rt
argument. Users can now choose to set Rt from any time point referenced to the forecast date.plot_summary
.discretised_gamma_pmf
(discretised truncated Gamma PMF) to constrain gamma shape and (inverse) scale parameters to be positive and finite (alpha > 0
and beta > 0
).readLines
incomplete final line warnings.fit_chain
function where an interaction between rstan
and timing out may have introduced an exception that caused whole regions to fail. This did not show on current unit tests or exploration using examples indicating a gap in testing.create_stan_args
with the option to override using stan_args
. This leads to breaking changes - see the examples for details of the new interface.samples
argument to get_regional_results
to make loading in samples optional. This also allows samples to be dropped when using regional_epinow
which reduces RAM usage.global_map
and country_map
expanded by @ellispglobal_map
from @ellispregional_summary
now saves input reported cases data reported_cases.csv
.