ptpi {fastbeta} | R Documentation |
Peak to Peak Iteration
Description
Approximates the state of an SEIR model at a reference time from an
equally spaced, T
-periodic incidence time series and other data.
The algorithm relies on a strong assumption: that the incidence time
series was generated by the asymptotic dynamics of an SEIR model
admitting a locally stable, T
-periodic attractor. Hence do
interpret with care.
Usage
ptpi(series, sigma = gamma, gamma = 1, delta = 0,
init, m = length(init) - n - 2L, n = 1L,
start = tsp(series)[1L], end = tsp(series)[2L],
tol = 1e-03, iter.max = 32L,
backcalc = FALSE, complete = FALSE, ...)
Arguments
series |
a “multiple time series” object, inheriting from class
|
sigma , gamma , delta |
non-negative numbers. |
init |
a numeric vector of length |
m |
a non-negative integer indicating a number of latent stages. |
n |
a positive integer indicating a number of infectious stages. |
start , end |
start and end times for the iteration, whose difference should be approximately equal to an integer number of periods. One often chooses the time of the first peak in the incidence time series and the time of the last peak in phase with the first. |
tol |
a tolerance indicating a stopping condition; see ‘Details’. |
iter.max |
the maximum number of iterations. |
backcalc |
a logical indicating if the state at time |
complete |
a logical indicating if intermediate states should be recorded in an array. Useful mainly for didactic or diagnostic purposes. |
... |
optional arguments passed to |
Details
ptpi
can be understood as an iterative application of
fastbeta
to a subset of series
. The basic
algorithm can be expressed in R code as:
w <- window(series, start, end); i <- nrow(s); j <- seq_along(init) diff <- Inf; iter <- 0L while (diff > tol && iter < iter.max) { init. <- init init <- fastbeta(w, sigma, gamma, delta, init, m, n)[i, j] diff <- sqrt(sum((init - init.)^2) / sum(init.^2)) iter <- iter + 1L } value <- init
Back-calculation involves solving a linear system of equations; the back-calculated result can mislead if the system is ill-conditioned.
Value
A list with elements:
value |
an approximation of the state at time |
diff |
the relative difference between the last two approximations. |
iter |
the number of iterations performed. |
x |
if |
References
Jagan, M., deJonge, M. S., Krylova, O., & Earn, D. J. D. (2020). Fast estimation of time-varying infectious disease transmission rates. PLOS Computational Biology, 16(9), Article e1008124, 1-39. doi:10.1371/journal.pcbi.1008124
Examples
if (requireNamespace("deSolve")) withAutoprint({
data(seir.ts01, package = "fastbeta")
a <- attributes(seir.ts01); p <- length(a[["init"]])
str(seir.ts01)
plot(seir.ts01)
## We suppose that we have perfect knowledge of incidence,
## births, and the data-generating parameters, except for
## the initial state, which we "guess"
series <- cbind(seir.ts01[, c("Z", "B")], mu = a[["mu"]](0))
colnames(series) <- c("Z", "B", "mu") # FIXME: stats:::cbind.ts mangles dimnames
plot(series[, "Z"])
start <- 23; end <- 231
abline(v = c(start, end), lty = 2)
set.seed(0L)
args <- c(list(series = series),
a[c("sigma", "gamma", "delta", "init", "m", "n")],
list(start = start, end = end, complete = TRUE))
init <- seir.ts01[which.min(abs(time(seir.ts01) - start)), seq_len(p)]
args[["init"]] <- init * rlnorm(p, 0, 0.1)
str(args)
L <- do.call(ptpi, args)
str(L)
S <- L[["x"]][, "S", ]
plot(S, plot.type = "single")
lines(seir.ts01[, "S"], col = "red", lwd = 4) # the "truth"
abline(h = L[["value"]]["S"], v = start, col = "blue", lwd = 4, lty = 2)
## Relative error
L[["value"]] / init - 1
})