可以如下所示拟合具有问题中给出的等式中定义的干预的 AR(1) 模型。注意参数transfer
是如何定义的;xtransf
对于每一项干预措施(脉搏和暂时变化),您还需要一个指标变量:
require(TSA)
cds <- structure(c(2580L, 2263L, 3679L, 3461L, 3645L, 3716L, 3955L, 3362L,
2637L, 2524L, 2084L, 2031L, 2256L, 2401L, 3253L, 2881L,
2555L, 2585L, 3015L, 2608L, 3676L, 5763L, 4626L, 3848L,
4523L, 4186L, 4070L, 4000L, 3498L),
.Dim = c(29L, 1L),
.Dimnames = list(NULL, "CD"),
.Tsp = c(2012, 2014.33333333333, 12),
class = "ts")
fit <- arimax(log(cds), order = c(1, 0, 0),
xtransf = data.frame(Oct13a = 1 * (seq_along(cds) == 22),
Oct13b = 1 * (seq_along(cds) == 22)),
transfer = list(c(0, 0), c(1, 0)))
fit
# Coefficients:
# ar1 intercept Oct13a-MA0 Oct13b-AR1 Oct13b-MA0
# 0.5599 7.9643 0.1251 0.9231 0.4332
# s.e. 0.1563 0.0684 0.1911 0.1146 0.2168
# sigma^2 estimated as 0.02131: log likelihood = 14.47, aic = -18.94
您可以通过查看系数的 t 统计量来测试每种干预措施的显着性ω0和ω1. 为方便起见,您可以使用该功能coeftest
。
require(lmtest)
coeftest(fit)
# Estimate Std. Error z value Pr(>|z|)
# ar1 0.559855 0.156334 3.5811 0.0003421 ***
# intercept 7.964324 0.068369 116.4896 < 2.2e-16 ***
# Oct13a-MA0 0.125059 0.191067 0.6545 0.5127720
# Oct13b-AR1 0.923112 0.114581 8.0564 7.858e-16 ***
# Oct13b-MA0 0.433213 0.216835 1.9979 0.0457281 *
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
在这种情况下,脉冲在5%显着性水平。它的影响可能已经被暂时的变化捕捉到了。
干预效果可以量化如下:
intv.effect <- 1 * (seq_along(cds) == 22)
intv.effect <- ts(
intv.effect * 0.1251 +
filter(intv.effect, filter = 0.9231, method = "rec", sides = 1) * 0.4332)
intv.effect <- exp(intv.effect)
tsp(intv.effect) <- tsp(cds)
您可以绘制干预的效果,如下所示:
plot(100 * (intv.effect - 1), type = "h", main = "Total intervention effect")

效果相对持久,因为ω2接近1(如果ω2等于1我们会观察到永久的电平偏移)。
从数值上看,这些是 2013 年 10 月干预导致的每个时间点量化的估计增长:
window(100 * (intv.effect - 1), start = c(2013, 10))
# Jan Feb Mar Apr May Jun Jul Aug Sep Oct
# 2013 74.76989
# 2014 40.60004 36.96366 33.69046 30.73844 28.07132
# Nov Dec
# 2013 49.16560 44.64838
干预使 2013 年 10 月的观测变量值增加了大约 175%. 在随后的时期,效果仍然存在,但权重下降。
我们还可以手动创建干预并将它们stats::arima
作为外部回归器传递给它们。干预措施是脉冲加上参数的短暂变化0.9231并且可以如下构建。
xreg <- cbind(
I1 = 1 * (seq_along(cds) == 22),
I2 = filter(1 * (seq_along(cds) == 22), filter = 0.9231, method = "rec",
sides = 1))
arima(log(cds), order = c(1, 0, 0), xreg = xreg)
# Coefficients:
# ar1 intercept I1 I2
# 0.5598 7.9643 0.1251 0.4332
# s.e. 0.1562 0.0671 0.1563 0.1620
# sigma^2 estimated as 0.02131: log likelihood = 14.47, aic = -20.94
获得了与上述相同的系数估计值。在这里我们固定ω2到0.9231. 矩阵xreg
是一种虚拟变量,您可能需要尝试不同的场景。您还可以为ω2并比较其效果。
这些干预相当于包中定义的附加异常值 (AO) 和临时变化 (TC) tsoutliers
。您可以使用此包来检测这些影响,如@forecaster 的答案所示,或者构建之前使用的回归器。例如,在这种情况下:
require(tsoutliers)
mo <- outliers(c("AO", "TC"), c(22, 22))
oe <- outliers.effects(mo, length(cds), delta = 0.9231)
arima(log(cds), order = c(1, 0, 0), xreg = oe)
# Coefficients:
# ar1 intercept AO22 TC22
# 0.5598 7.9643 0.1251 0.4332
# s.e. 0.1562 0.0671 0.1563 0.1620
# sigma^2 estimated as 0.02131: log likelihood=14.47
# AIC=-20.94 AICc=-18.33 BIC=-14.1
编辑 1
我已经看到您给出的方程式可以重写为:
(ω0+ω1)−ω0ω2B1−ω2BPt
并且可以像使用transfer=list(c(1, 1))
.
如下所示,在这种情况下,这种参数化导致参数估计与之前的参数化相比具有不同的效果。它提醒我创新异常值的影响,而不是脉冲加上短暂的变化。
fit2 <- arimax(log(cds), order=c(1, 0, 0), include.mean = TRUE,
xtransf=data.frame(Oct13 = 1 * (seq(cds) == 22)), transfer = list(c(1, 1)))
fit2
# ARIMA(1,0,0) with non-zero mean
# Coefficients:
# ar1 intercept Oct13-AR1 Oct13-MA0 Oct13-MA1
# 0.7619 8.0345 -0.4429 0.4261 0.3567
# s.e. 0.1206 0.1090 0.3993 0.1340 0.1557
# sigma^2 estimated as 0.02289: log likelihood=12.71
# AIC=-15.42 AICc=-11.61 BIC=-7.22
我对 package 的表示法不是很熟悉,TSA
但我认为干预的效果现在可以量化如下:
intv.effect <- 1 * (seq_along(cds) == 22)
intv.effect <- ts(intv.effect * 0.4261 +
filter(intv.effect, filter = -0.4429, method = "rec", sides = 1) * 0.3567)
tsp(intv.effect) <- tsp(cds)
window(100 * (exp(intv.effect) - 1), start = c(2013, 10))
# Jan Feb Mar Apr May Jun Jul Aug
# 2014 -3.0514633 1.3820052 -0.6060551 0.2696013 -0.1191747
# Sep Oct Nov Dec
# 2013 118.7588947 -14.6135216 7.2476455
plot(100 * (exp(intv.effect) - 1), type = "h",
main = "Intervention effect (parameterization 2)")

现在可以将这种影响描述为 2013 年 10 月的急剧上升,然后是相反方向的下降;然后干预的效果迅速消失,体重下降的正面和负面影响交替出现。
这种效果有些特殊,但在实际数据中可能是可能的。在这一点上,我会查看您的数据的上下文以及可能影响数据的事件。例如,是否有政策变化、营销活动、发现……可以解释 2013 年 10 月的干预。如果是这样,该事件对数据的影响是否更合理,如前所述或我们发现与初始参数化?
根据 AIC,初始模型将是首选,因为它较低 (−18.94反对−15.42)。原始系列的图与第二个干预变量的测量所涉及的急剧变化没有明显的匹配。
在不知道数据上下文的情况下,我会说 AR(1) 模型具有随参数的短暂变化0.9适合对数据进行建模和衡量干预措施。
编辑 2
的价值ω2决定干预效果衰减到零的速度,因此这是模型中的关键参数。我们可以通过为模型拟合一系列值来检查这一点ω2. 下面,为这些模型中的每一个存储了 AIC。
omegas <- seq(0.5, 1, by = 0.01)
aics <- rep(NA, length(omegas))
for (i in seq(along = omegas)) {
tc <- filter(1 * (seq_along(cds) == 22), filter = omegas[i], method = "rec",
sides = 1)
tc <- ts(tc, start = start(cds), frequency = frequency(cds))
fit <- arima(log(cds), order = c(1, 0, 0), xreg = tc)
aics[i] <- AIC(fit)
}
omegas[which.min(aics)]
# [1] 0.88
plot(omegas, aics, main = "AIC for different values of the TC parameter")

找到最低的 AICω2=0.88(与之前估计的值一致)。该参数涉及相对持久但短暂的影响。我们可以得出结论,这种影响是暂时的,因为值高于0.9AIC 增加(请记住,在限制中,ω2=1,干预变成永久性的电平转换)。
干预应包括在预测中。获得已经观察到的时期的预测是评估预测绩效的有用练习。下面的代码假设该系列在 2013 年 10 月结束。然后获得预测,包括带有参数的干预ω2=0.9.
首先,我们将 AR(1) 模型与干预作为回归量(带有参数ω2=0.9):
tc <- filter(1 * (seq.int(length(cds) + 12) == 22), filter = 0.9, method = "rec",
sides = 1)
tc <- ts(tc, start = start(cds), frequency = frequency(cds))
fit <- arima(window(log(cds), end = c(2013, 10)), order = c(1, 0, 0),
xreg = window(tc, end = c(2013, 10)))
可以按如下方式获取和显示预测:
p <- predict(fit, n.ahead = 19, newxreg = window(tc, start = c(2013, 11)))
plot(cbind(window(cds, end = c(2013, 10)), exp(p$pred)), plot.type = "single",
ylab = "", type = "n")
lines(window(cds, end = c(2013, 10)), type = "b")
lines(window(cds, start = c(2013, 10)), col = "gray", lty = 2, type = "b")
lines(exp(p$pred), type = "b", col = "blue")
legend("topleft",
legend = c("observed before the intervention",
"observed after the intervention", "forecasts"),
lty = rep(1, 3), col = c("black", "gray", "blue"), bty = "n")

第一个预测与观察值(灰色虚线)相对较好。其余预测显示该系列将如何继续通往原始平均值的路径。置信区间仍然很大,反映了不确定性。因此,我们应该谨慎并在记录新数据时修改模型。
95%置信区间可以添加到上一个图中,如下所示:
lines(exp(p$pred + 1.96 * p$se), lty = 2, col = "red")
lines(exp(p$pred - 1.96 * p$se), lty = 2, col = "red")