# NOT RUN {
#set number of cores to use
options(mc.cores = ifelse(interactive(), 4, 1))
#' # load data.table for manipulation
library(data.table)
# load lubridate for dates
library(lubridate)
#### Incidence data example ####
# make some example secondary incidence data
cases <- example_confirmed
cases <- as.data.table(cases)
# apply a convolution of a log normal to a vector of observations
weight_cmf <- function(x, ...) {
set.seed(x[1])
meanlog <- rnorm(1, 1.6, 0.2)
sdlog <- rnorm(1, 0.8, 0.1)
cmf <- cumsum(dlnorm(1:length(x), meanlog, sdlog)) -
cumsum(dlnorm(0:(length(x) - 1), meanlog, sdlog))
conv <- sum(x * rev(cmf), na.rm = TRUE)
conv <- round(conv, 0)
return(conv)
}
# roll over observed cases to produce a convolution
cases <- cases[, .(date, primary = confirm, secondary = confirm)]
cases <- cases[, secondary := frollapply(secondary, 15, weight_cmf, align = "right")]
cases <- cases[!is.na(secondary)]
# add a day of the week effect and scale secondary observations at 40% of primary
cases <- cases[lubridate::wday(date) == 1, secondary := round(0.5 * secondary, 0)]
cases <- cases[, secondary := round(secondary * rnorm(.N, 0.4, 0.025), 0)]
cases <- cases[secondary < 0, secondary := 0]
# fit model to example data assuming only a given fraction of primary observations
# become secondary observations
inc <- estimate_secondary(cases[1:60],
obs = obs_opts(scale = list(mean = 0.2, sd = 0.2)))
plot(inc, primary = TRUE)
# forecast future secondary cases from primary
inc_preds <- forecast_secondary(inc, cases[61:.N][, value := primary])
plot(inc_preds, new_obs = cases, from = "2020-05-01")
#### Prevalence data example ####
# make some example prevalence data
cases <- example_confirmed
cases <- as.data.table(cases)
cases <- cases[, .(date, primary = confirm,
scaled_primary = confirm * rnorm(.N, 0.4, 0.05))]
cases$secondary <- 0
cases$secondary[1] <- as.integer(cases$scaled_primary[1])
for (i in 2:nrow(cases)) {
meanlog <- rnorm(1, 1.6, 0.1)
sdlog <- rnorm(1, 0.8, 0.05)
cmf <- cumsum(dlnorm(1:min(i-1,40), meanlog, sdlog)) -
cumsum(dlnorm(0:min(39,i-2), meanlog, sdlog))
reducing_cases <- sum(cases$scaled_primary[(i-1):max(1,i-20)] * cmf)
reducing_cases <- ifelse(cases$secondary[i - 1] < reducing_cases,
cases$secondary[i - 1], reducing_cases)
cases$secondary[i] <- as.integer(
cases$secondary[i - 1] + cases$scaled_primary[i] - reducing_cases
)
cases$secondary[i] <- ifelse(cases$secondary[i] < 0, 0,
cases$secondary[i])
}
# fit model to example prevalence data
prev <- estimate_secondary(cases[1:100], secondary = secondary_opts(type = "prevalence"),
obs = obs_opts(week_effect = FALSE,
scale = list(mean = 0.3, sd = 0.1)))
plot(prev, primary = TRUE)
# forecast future secondary cases from primary
prev_preds <- forecast_secondary(prev, cases[101:.N][, value := primary])
plot(prev_preds, new_obs = cases, from = "2020-06-01")
# }
Run the code above in your browser using DataLab