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
相关产品推荐
相关产品推荐

