AutoReg模型根与ArmaProcess生成参数不匹配及系数异常问题咨询
问题描述
使用AutoReg模型拟合ArmaProcess生成的时间序列时,遇到两个异常:
np.poly(model.roots)返回的最后一个系数与np.flip(model.params)/model.params[-1]的最后一个系数不匹配;- 拟合得到的
AutoReg模型系数与生成数据的ArmaProcess真实系数相差甚远。
最小可复现示例
from statsmodels.tsa.arima_process import ArmaProcess from statsmodels.tsa.ar_model import AutoReg import numpy as np roots= 1/np.array([0.1, 0.5, -0.3, 0.9, 0.18, 0.1+0.3j, 0.1-0.3j, -0.5+0.1j, -0.5-0.1j,-0.8]) proc = ArmaProcess.from_roots([],roots) y = proc.generate_sample(150) model = AutoReg(y,10).fit() print(np.poly(model.roots)) print(np.flip(model.params)/model.params[-1]) print(np.poly(roots)/np.poly(roots)[0])
原因分析
1. 系数不匹配的根源
AutoReg的参数结构和根对应的特征方程不匹配:
AutoReg的参数包含截距项(model.params[0])和自回归系数(model.params[1:]),模型公式为:
$y_t = \alpha + \phi_1 y_{t-1} + \phi_2 y_{t-2} + ... + \phi_{10} y_{t-10} + \epsilon_t$model.roots对应的是自回归部分的特征方程:$1 - \phi_1 L - \phi_2 L^2 - ... - \phi_{10} L^{10} = 0$,和截距项完全无关。- 你用
np.flip(model.params)把截距项也包含进了多项式计算,自然和np.poly(model.roots)的结果不匹配。正确的做法是只取自回归系数部分,计算对应多项式:
这样两者的系数就会完全匹配。# 正确的系数对比方式 ar_coeffs = model.params[1:] # 构造特征多项式:1 - phi1*x - phi2*x^2 - ... - phi10*x^10 poly_from_params = np.concatenate([[1], -ar_coeffs]) # 归一化后和np.poly(model.roots)对比 print(poly_from_params / poly_from_params[0]) print(np.poly(model.roots) / np.poly(model.roots)[0])
2. 拟合系数与真实值偏差大的原因
- 样本量不足:150个样本要拟合10阶自回归模型(含截距共11个参数),样本量相对参数数量来说太少。高阶时间序列模型需要更多样本才能让估计值收敛到真实参数,样本量不足会导致估计方差急剧增大,偏差明显。
- 根的位置导致估计不稳定:你设置的根中有模接近1的(比如对应原系数0.9的根是1/0.9≈1.11),这类接近单位根的平稳过程,参数估计的方差会非常大,哪怕小的样本波动也会让估计值偏离真实值很远。
- 随机样本的固有波动:
generate_sample生成的是带随机噪声的样本,单次样本的随机性会放大估计偏差,尤其是在高阶模型和接近单位根的场景下,这种波动影响更显著。
内容的提问来源于stack exchange,提问作者user1999728
相关产品推荐
相关产品推荐

