在R中使用rollapply带截距预测AR模型时预测值偏移问题排查
AR(3)模型拟合值偏移问题排查与解决
我模拟了一组截距为3的AR(3)数据:
set.seed(247) library(astsa) sim1 = 3+arima.sim(list(order=c(3,0,0), ar=c(-0.1,-0.3,-0.5)), n=60) pacf(sim1)
使用arima()函数能正确估计系数:
est.1 = arima(x = sim1, order = c(3, 0, 0)) est.1
输出结果:
Coefficients: ar1 ar2 ar3 intercept -0.0614 -0.5098 -0.4286 2.9811
但使用zoo包的rollapply计算预测值时,结果与forecast包的拟合值存在偏移:
library(zoo) library(forecast) # 用于对比 f1 = rollapply(zoo(sim1), 4, function(w) {sum(c(1,w[1:3])*rev(est.1$coef))}, align = "right", partial = T) plot(sim1,type="l") lines(f1, col = 2, lwd = 2) ## rollapply计算的结果 lines(fitted(est.1), col = 3, lwd = 2) ## forecast包的拟合值 legend(0.1, 6, legend=c("rollapply", "forecast fitted"), fill = c(2,3))

问题原因
AR模型参数定义理解偏差:
R的arima()函数默认采用中心化建模逻辑,模型表达式为:
[
(X_t - \mu) = \phi_1(X_{t-1} - \mu) + \phi_2(X_{t-2} - \mu) + \phi_3(X_{t-3} - \mu) + \epsilon_t
]
对应的拟合值计算公式应为:
[
\hat{X}t = \mu + \phi_1(X{t-1} - \mu) + \phi_2(X_{t-2} - \mu) + \phi_3(X_{t-3} - \mu)
]
但代码中直接用sum(c(1,w[1:3])*rev(est.1$coef)),错误地将截距(\mu)与原始观测值直接加权求和,完全忽略了中心化的建模逻辑。窗口与系数索引匹配错误:
- 使用
align="right"且窗口大小设为4时,窗口w包含[t-3, t-2, t-1, t]四个元素,但计算(\hat{X}_t)只需要前三个滞后项,窗口大小设为3即可满足需求。 rev(est.1$coef)反转了系数顺序:est.1$coef的默认顺序是ar1, ar2, ar3, intercept,反转后变成intercept, ar3, ar2, ar1,导致加权时系数与滞后项完全不对应。
- 使用
修正后的代码
library(zoo) library(forecast) # 遵循中心化AR模型公式计算拟合值 f1_correct = rollapply(zoo(sim1), 3, function(w) { mu = est.1$coef["intercept"] phi = est.1$coef[c("ar1", "ar2", "ar3")] mu + sum(phi * (w - mu)) }, align = "right", partial = TRUE) # 绘图对比验证 plot(sim1, type="l") lines(f1_correct, col = 2, lwd = 2) # 修正后的rollapply结果 lines(fitted(est.1), col = 3, lwd = 2) # forecast拟合值 legend(0.1, 6, legend=c("修正后rollapply", "forecast fitted"), fill = c(2,3))
验证说明
修正后,rollapply计算的拟合值会和fitted(est.1)完全重合(前3个初始值因partial=TRUE处理逻辑略有差异,但整体趋势和数值完全匹配)。核心是严格遵循arima()函数的中心化建模逻辑,避免系数顺序和窗口索引的错误匹配。
内容的提问来源于stack exchange,提问作者Maverick Meerkat
相关产品推荐
相关产品推荐

