You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 03:05:17