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

Python中SARIMAX残差选择疑问:含季节差分模型的诊断困惑

SARIMAX残差诊断:选择完整残差还是截断后的残差?

我之前在使用带季节差分的SARIMAX模型时,也遇到过完全一样的问题!这其实是季节差分操作导致的初始残差无效问题,必须截断后才能用于诊断检验。

核心原因:季节差分的初始观测值无有效残差

你的模型设置了seasonal_order=(1, 1, 0, 12),其中第二个参数1代表1阶季节差分——模型会用y_t - y_{t-12}的差分序列来拟合。这意味着前12个观测值(t=1到t=12)没有对应的y_{t-12}历史数据,模型无法为这些观测值计算有效的拟合残差。你看到的完整残差里前12个值,其实是模型为了对齐索引填充的无效值,完全不符合模型对残差的假设性质。

正确选择:使用截断后的残差

你已经发现,截断前12个观测值后的残差(model_results2.resid.iloc[12:])和plot_diagnostics的结果完全一致,这就是你应该用来做诊断检验的残差:

  • plot_diagnostics函数内部会自动忽略这些无效的初始残差,展示的是真实有效的残差分布
  • 只有这些残差才满足SARIMAX模型对残差的假设(独立、无自相关、正态分布等),用它们做Ljung-Box检验、ARCH效应检验才能得到可靠的结果

实操验证与建议

  • 你可以直接查看完整残差的前12个值,会发现它们和后面的残差数值差异极大,这也能证明它们是无效的
  • 以后使用带差分(包括非季节差分d和季节差分D)的SARIMAX模型时,都需要跳过对应数量的初始残差:
    • 非季节差分d=k:跳过前k个残差
    • 季节差分D=k、周期s:跳过前k*s个残差
    • 两者都有:跳过前max(d, D*s)个残差(或者直接用model_results.resid.dropna(),部分场景下模型会把无效残差设为NaN)

对应你的代码示例

正确的诊断检验代码应该使用截断后的残差:

# Ljung-Box自相关检验
name = ['Statistic', 'p-value']
lzip(name, acorr_ljungbox(model_results2.resid.iloc[12:], lags = 12))

# ARCH效应检验
name = ['Lagrange multiplier statistic', 'p-value', 'F-TEST', 'F-p-value']
diag = het_arch(model_results2.resid.iloc[12:], maxlag=12)
lzip(name, diag)

这样得到的结果才是反映模型拟合质量的真实指标。

内容的提问来源于stack exchange,提问作者Petr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:50:19