Arima()与glm()拟合含外生变量AR(1)模型结果差异原因及解决方法
为什么
Arima()和glm()拟合含外生变量的AR(1)模型结果差异巨大? 核心原因解析
1. 拟合样本量不一致
glm()中使用lag(df$x)会生成首项为NA的向量,函数自动丢弃包含NA的第一行观测,实际仅用99个样本(t=2到t=100)拟合。forecast::Arima()默认处理AR模型的初始条件(比如采用条件似然估计,将第一个观测的滞后项视为已知输入),因此会使用全部100个样本拟合。
2. 截距项的定义完全不同
forecast::Arima()的include.mean=TRUE参数,本质是对序列做中心化处理后拟合AR模型,其输出的intercept对应的是平稳序列的均值,而非你模型中的$\alpha_0$:
- Arima拟合的隐式模型为:$x_t - \mu = \alpha_1(x_{t-1} - \mu) + \beta_1 z_t + \epsilon_t$
- 展开后:$x_t = \mu(1-\alpha_1) + \alpha_1 x_{t-1} + \beta_1 z_t + \epsilon_t$
这里的$\mu(1-\alpha_1)$才对应你模型中的$\alpha_0$,但Arima直接输出的intercept是$\mu$,和glm()直接拟合的$\alpha_0$不是同一个参数。
3. 外生变量的联合建模逻辑差异
Arima()会将外生变量与AR项结合,同时考虑时间序列的自相关结构;glm()仅把滞后项当作普通自变量处理,没有额外适配时间序列的特性,样本量和截距定义的差异进一步放大了结果差距。
解决办法:让两个模型结果对齐
方法1:统一拟合样本量
手动对齐两个模型的样本范围,确保都使用99个观测(和glm()默认逻辑一致):
# 生成匹配样本:去掉第一行,和glm的拟合数据一致 df_matched <- df[-1, ] df_matched$x_lag <- df$x[-nrow(df)] # glm拟合 fit_glm_matched <- glm(x ~ x_lag + z, data = df_matched) # Arima拟合相同样本 fit_arima_matched <- Arima(df_matched$x, order = c(1, 0, 0), include.mean = TRUE, xreg = df_matched$z)
此时对比两个模型的系数和标准误,会发现结果基本一致(差异仅来自MLE数值优化的细微差别)。
方法2:调整Arima的模型定义,匹配glm的截距形式
如果要让Arima直接输出你模型中的$\alpha_0$,可以关闭include.mean,将截距项作为外生变量加入xreg:
# 构造包含截距项的外生变量矩阵 xreg_mat <- cbind(intercept = rep(1, nrow(df)), z = df$z) # 拟合不含均值的AR(1),外生变量包含截距和z fit_arima_exact <- Arima(df$x, order = c(1, 0, 0), include.mean = FALSE, xreg = xreg_mat) # 对应的glm拟合(手动处理滞后项,使用全部有效样本) df_full <- df %>% mutate(x_lag = lag(x)) %>% drop_na() fit_glm_full <- glm(x ~ x_lag + z, data = df_full)
此时两个模型的拟合结果会高度一致。
内容的提问来源于stack exchange,提问作者Leonardo19
相关产品推荐
相关产品推荐

