如何用系数重构ARIMA预测?回归ARIMA误差模型拟合值复现
问题根源:混淆了拟合值(平滑值)与一步预测值,且初始条件处理错误
带ARIMA误差的回归模型核心结构为:
[ y_t = X_t\beta + n_t ]
其中 ( n_t = \phi n_{t-1} + \epsilon_t )(即你用的AR(1)误差项)。
R中arima()函数返回的fitted值是基于Kalman平滑的整体拟合值——用全部数据对每个时刻的 ( n_t ) 做最优估计,而非仅用前t-1个数据的一步预测。你自定义的fitted2大概率是用递推方式计算的一步预测值,两者逻辑完全不同,结果自然存在差异。
另外,即便你想计算一步预测,初始条件处理也可能有误:
- 错误将第一个时刻的 ( n_1 ) 设为0,正确的初始一步预测应使用第一个观测的残差作为初始噪声项,或模型估计的初始状态(AR(1)的无条件均值)。
- 递推逻辑误用了实际值减回归项,而非前一时刻的残差(( e_t = y_t - \hat{y}_t ))来计算当前噪声预测。
正确复现R中fitted值的方法
要在Excel中复现R的fitted结果,需遵循Kalman平滑逻辑,或直接从R模型提取平滑状态。具体步骤如下:
1. 提取模型参数
假设你用arima()拟合模型:
mod <- arima(y, xreg = x, order = c(1, 0, 0)) beta <- coef(mod)[!names(coef(mod)) %in% "ar1"] phi <- coef(mod)["ar1"]
2. 计算回归部分
[ \text{reg}_t = X_t \cdot \beta ]
3. 提取平滑后的噪声项
直接从R模型中获取Kalman平滑后的噪声项,再计算拟合值:
library(forecast) # 重新用forecast包的Arima拟合,方便提取状态 ss <- Arima(y, xreg = x, order = c(1,0,0)) n_smoothed <- ss$model$states[,1] # 拟合值 = 回归部分 + 平滑后的噪声项 fitted_r <- reg_part + n_smoothed
这个结果会和fitted(mod)完全一致。
4. 如果需要递推计算一步预测值(适合Excel实现)
若你要的是一步预测值(而非R的平滑拟合值),正确递推逻辑为:
reg_part <- x %*% beta fitted一步预测 <- numeric(length(y)) # 第一个时刻无前置数据,预测值为回归项 fitted一步预测[1] <- reg_part[1] resid <- y - fitted一步预测 for(t in 2:length(y)){ fitted一步预测[t] <- reg_part[t] + phi * resid[t-1] resid[t] <- y[t] - fitted一步预测[t] }
该结果与forecast(mod)$fitted一致,但和fitted(mod)不同——前者是一步预测,后者是全数据平滑拟合。
总结
你的核心错误是:
- 把R中基于全数据的平滑拟合值当成一步预测值进行递推计算
- 初始条件处理不符合模型的估计逻辑
若要在Excel中复现R的fitted结果,要么直接从R导出拟合值,要么实现Kalman平滑逻辑;若仅需递推计算,就用上述一步预测的递推公式。
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

