如何在Statsmodels SARIMAX中实现SAS Proc ARIMA的条件最小二乘估计
在Statsmodels中实现条件最小二乘估计以匹配SAS Proc ARIMA的ARIMAX结果
SAS Proc ARIMA默认对AR(p)类模型使用**条件最小二乘(CLS)**估计,而Statsmodels的SARIMAX仅支持最大似然估计(MLE),这是两者系数差异的核心原因。要得到和SAS一致的结果,可通过以下两种方式实现条件最小二乘:
方法1:手动实现条件最小二乘(适用于ARIMAX或纯ARIMA)
条件最小二乘的核心逻辑是固定初始观测值,对剩余样本做OLS回归。以你提供的AR(1)带常数项模型为例,模型形式为:
$y_t = c + \phi y_{t-1} + \epsilon_t$
我们需要从第2个观测值开始,将$y_t$作为因变量,常数项和$y_{t-1}$作为自变量做OLS:
import pandas as pd import numpy as np import statsmodels.api as sm # 准备数据 AIR = pd.DataFrame({'air': [112, 118, 132, 129, 121, 135, 148, 148, 136, 119, 104, 118, 115, 126, 141, 135, 125, 149, 170, 170, 158, 133, 114, 140, 145, 150, 178, 163, 172, 178, 199, 199, 184, 162, 146, 166]}) AIR.index = pd.date_range(start='1949/1/1', periods=AIR.shape[0], freq='M') # 构造滞后变量和常数项 AIR['y_lag1'] = AIR['air'].shift(1) AIR['const'] = 1 # 移除第一行缺失值(滞后1期导致) cls_data = AIR.dropna() # 执行条件最小二乘回归 X = cls_data[['const', 'y_lag1']] y = cls_data['air'] cls_results = sm.OLS(y, X).fit() # 输出系数,与SAS结果一致 print(cls_results.params)
运行后会得到:const≈119.1686,y_lag1≈0.9361,和SAS输出完全匹配。
方法2:使用Statsmodels ARIMA类的CSS选项(适用于纯ARIMA模型)
如果你没有额外的外生变量(仅常数项/趋势项),Statsmodels的ARIMA类直接支持method='css'参数,无需手动构造变量:
# 使用ARIMA类+条件最小二乘 mod = sm.tsa.ARIMA(AIR['air'], order=(1,0,0), trend='c') results = mod.fit(method='css') # 输出系数 print(results.params)
该方法的结果同样会和SAS Proc ARIMA的输出一致。
注意事项
Statsmodels的SARIMAX类基于状态空间框架,仅支持MLE估计,没有CLS选项。如果你的模型包含额外外生变量(真正的ARIMAX),请使用方法1手动实现条件最小二乘:
- 构造所有AR滞后项和外生变量矩阵;
- 移除前p行(p为AR阶数)的缺失值;
- 对剩余样本执行OLS回归。
内容的提问来源于stack exchange,提问作者monkey
相关产品推荐
相关产品推荐

