八、模型定阶
图解法识别
绘制差分后序列的自相关和偏自相关图,通过观察自相关和偏自相关图找出模型的最优参数
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(data_seasonal_first_difference.iloc[13:], lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(data_seasonal_first_difference.iloc[13:], lags=40, ax=ax2)
plt.show()
网格搜寻
p = d = q = range(0, 2)
pdq = list(itertools.product(p, d, q))
pdq_x_PDQs = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
a=[]
b=[]
c=[]
wf=pd.DataFrame()
for param in pdq:
for seasonal_param in pdq_x_PDQs:
try:
mod = sm.tsa.statespace.SARIMAX(data_seasonal_first_difference,order=param,seasonal_order=seasonal_param,enforce_stationarity=False,enforce_invertibility=False)
results = mod.fit()
print('ARIMA{}x{} - AIC:{}'.format(param, seasonal_param, results.aic))
a.append(param)
b.append(seasonal_param)
c.append(results.aic)
except:
continue
wf['pdq']=a
wf['pdq_x_PDQs']=b
wf['aic']=c
print(wf[wf['aic']==wf['aic'].min()])
九、模型的建立
通过网格搜索,得到了一组最优的参数组合SARIMAX(0,0,1)x(1,0,1,12),通过Python用SARIMAX(0,0,1)x(1,0,1,12)模型拟合天然气二氧化碳排放量的时间序列,即对原序列建立SARIMAX(0,0,1)x(1,0,1,12)模型
mod = sm.tsa.statespace.SARIMAX(data_seasonal_first_difference,
order=(0,0,1),
seasonal_order=(1,0,1,12),
enforce_stationarity=False,
enforce_invertibility=False)
results = mod.fit()
print(results.summary())
十、模型的检验
在拟合SARIMA模型时,模型诊断是非常重要的一步,通过模型诊断以确保模型所做的任何假设都没有被违反。模型检验中主要关心的问题是模型的残差是否相关,并且是否是零均值的正态分布。如果SARIMA模型残差是相关的,且不是零均值正态分布,则表明模型可以进一步改进,反之,模型拟合效果很好,可以认为模型充分提取了序列的信息。
#模型检验
#模型诊断
results.plot_diagnostics(figsize=(15, 12))
plt.show()
#LB检验
r,q,p = sm.tsa.acf(results.resid.values.squeeze(), qstat=True)
data = np.c_[range(1,41), r[1:], q, p]
table = pd.DataFrame(data, columns=['lag', "AC", "Q", "Prob(>Q)"])
print(table.set_index('lag'))
得到:
AC Q Prob(>Q)
lag
1.0 0.013837 0.034081 0.853534
2.0 -0.032016 0.217610 0.896905
3.0 -0.099138 1.987580 0.574989
4.0 0.019510 2.056526 0.725363
5.0 -0.061315 2.741537 0.739759
6.0 -0.030645 2.913659 0.819603
7.0 -0.049047 3.357193 0.850112
8.0 -0.112013 5.684391 0.682536
9.0 0.053955 6.227601 0.716941
10.0 0.017386 6.284345 0.790835
11.0 0.090168 7.819933 0.729337
12.0 -0.035384 8.057852 0.780593
13.0 -0.035316 8.296319 0.823774
14.0 -0.021137 8.382277 0.868475
15.0 -0.022020 8.476147 0.903279
16.0 0.092001 10.125063 0.860016
17.0 -0.025731 10.254862 0.892584
18.0 0.056418 10.882849 0.899262
19.0 0.029080 11.050753 0.922119
20.0 -0.051838 11.587760 0.929535
21.0 0.072889 12.656370 0.920183
22.0 -0.011745 12.684298 0.941594
23.0 -0.043936 13.077667 0.950286
24.0 -0.190534 20.524621 0.666585
25.0 0.053909 21.124741 0.685634
26.0 0.047988 21.603475 0.710184
27.0 -0.020272 21.689481 0.752984
28.0 -0.024637 21.817379 0.789675
29.0 -0.003402 21.819835 0.827572
30.0 0.048951 22.331703 0.841707
31.0 -0.012347 22.364498 0.871232
32.0 0.046704 22.836985 0.883369
33.0 -0.033564 23.082721 0.900752
34.0 0.074991 24.318115 0.889844
35.0 -0.059557 25.102892 0.891698
36.0 -0.043354 25.521739 0.903126
37.0 -0.082670 27.055752 0.884957
38.0 0.019746 27.143909 0.904919
39.0 -0.017990 27.217620 0.922332
40.0 0.032648 27.462185 0.933957
残差序列延迟1-12阶时,Q统计量的P值均大于0.05,所以在0.05的显著性水平下,不拒绝原假设,即残差为白噪声序列,说明残差序列的波动已经没有任何统计规律。因此,可以认为拟合的模型已经充分提取了时间序列中的信息。
残差的的时序图基本稳定,残差随着时间的波动并没有很大的波动。由右上角的正态分布图可知,模型的残差是正态分布的。红色的KDE线紧随着N(0,1)线。其中,N(0,1)是均值为0,标准差为1的标准正态分布。这很好地说明了残差是正态分布的。而图中左下角的正太Q—Q图也说明了残差服从正态分布。图中右下角残差的自相关图显示残差不存在自相关,说明残差序列是白噪声序列。到此模型建立完毕。