Surveillance for Count Time Series Using the Classic Farrington Method
algo.farrington.RdImplements the procedure of Farrington et al. (1996).
At each time point of the specified range, a GLM is fitted to
predict the counts. This is then compared to the observed
counts. If the observation is above a specific quantile of
the prediction interval, then an alarm is raised.
Usage
# original interface for a single "disProg" time series
algo.farrington(disProgObj, control=list(
range=NULL, b=5, w=3, reweight=TRUE, verbose=FALSE, plot=FALSE,
alpha=0.05, trend=TRUE, limit54=c(5,4), powertrans="2/3",
fitFun="algo.farrington.fitGLM.fast"))
# wrapper for "sts" data, possibly multivariate
farrington(sts, control=list(
range=NULL, b=5, w=3, reweight=TRUE, verbose=FALSE,
alpha=0.05), ...)Arguments
- disProgObj
an object of class
"disProg"(a list includingobservedandstatetime series).- control
list of control parameters
rangeSpecifies the index of all timepoints which should be tested. If range is
NULLthe maximum number of possible weeks is used (i.e. as many weeks as possible while still having enough reference values).bhow many years back in time to include when forming the base counts.
wwindows size, i.e. number of weeks to include before and after the current week
reweightBoolean specifying whether to perform reweight step
trendIf
TRUEa trend is included and kept in case the conditions documented in Farrington et al. (1996) are met (see the results). IfFALSEthen NO trend is fit.verboseBoolean indicating whether to show extra debugging information.
plotBoolean specifying whether to show the final GLM model fit graphically (use History|Recording to see all pictures).
powertransPower transformation to apply to the data. Use either "2/3" for skewness correction (Default), "1/2" for variance stabilizing transformation or "none" for no transformation.
alphaAn approximate (two-sided) \((1-\alpha)\) prediction interval is calculated.
limit54To avoid alarms in cases where the time series only has about 0-2 cases the algorithm uses the following heuristic criterion (see Section 3.8 of the Farrington paper) to protect against low counts: no alarm is sounded if fewer than \(cases=5\) reports were received in the past \(period=4\) weeks.
limit54=c(cases,period)is a vector allowing the user to change these numbers. Note: As of version 0.9-7 the term "last" period of weeks includes the current week - otherwise no alarm is sounded for horrible large numbers if the four weeks before that are too low.fitFunString containing the name of the fit function to be used for fitting the GLM. The options are
algo.farrington.fitGLM.fast(default) andalgo.farrington.fitGLMoralgo.farrington.fitGLM.populationOffset. See details ofalgo.farrington.fitGLMfor more information.
- sts
an object of class
"sts".- ...
arguments for
wrap.algo, e.g.,verbose=FALSE.
Details
The following steps are performed according to the Farrington et al. (1996) paper.
fit of the initial model and initial estimation of mean and overdispersion.
calculation of the weights omega (correction for past outbreaks)
refitting of the model
revised estimation of overdispersion
rescaled model
omission of the trend, if it is not significant
repetition of the whole procedure
calculation of the threshold value
computation of exceedance score
Value
For algo.farrington, a list object of class "survRes"
with elements alarm, upperbound, trend,
disProgObj, and control.
For farrington, the input "sts" object with updated
alarm, upperbound and control slots, and subsetted
to control$range.
See also
algo.farrington.fitGLM,
algo.farrington.threshold
An improved Farrington algorithm is available as function
farringtonFlexible.
References
A statistical algorithm for the early detection of outbreaks of infectious disease, Farrington, C.P., Andrews, N.J, Beale A.D. and Catchpole, M.A. (1996), J. R. Statist. Soc. A, 159, 547-563.
Examples
#load "disProg" data
data("salmonella.agona")
#Do surveillance for the last 42 weeks
n <- length(salmonella.agona$observed)
control <- list(b=4,w=3,range=(n-42):n,reweight=TRUE, verbose=FALSE,alpha=0.01)
res <- algo.farrington(salmonella.agona,control=control)
plot(res)
#Generate Poisson counts and create an "sts" object
set.seed(123)
x <- rpois(520,lambda=1)
stsObj <- sts(observed=x, frequency=52)
if (surveillance.options("allExamples")) {
#Compare timing of the two possible fitters for algo.farrington
range <- 312:520
system.time( sts1 <- farrington(stsObj, control=list(range=range,
fitFun="algo.farrington.fitGLM.fast"), verbose=FALSE))
system.time( sts2 <- farrington(stsObj, control=list(range=range,
fitFun="algo.farrington.fitGLM"), verbose=FALSE))
#Check if results are the same
stopifnot(upperbound(sts1) == upperbound(sts2))
}