如何确定ARIMA模型中参数p、d、q

栏目: R语言 · 发布时间: 5年前

内容简介:在先前学习的使用ARIMA预测时间序列的文章中,对于如何确定参数p、d、q还是存在一些疑问,今天学习的这篇文章主要讲解的是如何确定p、d、q参数。实验数据:链接: https://pan.baidu.com/s/14Nt8aU3NbgzBt2lA_jmB6Q 提取码: 8rbt

在先前学习的使用ARIMA预测时间序列的文章中,对于如何确定参数p、d、q还是存在一些疑问,今天学习的这篇文章主要讲解的是如何确定p、d、q参数。

实验数据:链接: https://pan.baidu.com/s/14Nt8aU3NbgzBt2lA_jmB6Q 提取码: 8rbt

读取并观察数据

import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
 
data = pd.read_csv("arima-demo.csv",parse_dates=['date'],index_col='date')
print(data.head())
data.plot(figsize=(12,6))

如何确定ARIMA模型中参数p、d、q

从上图可知,存在一定的增长趋势。

时间序列的差分d

ARIMA 模型对时间序列的要求是平稳型。因此,当你得到一个非平稳的时间序列时,首先要做的即是做时间序列的差分,直到得到一个平稳时间序列。如果你对时间序列做d次差分才能得到一个平稳序列,那么可以使用ARIMA(p,d,q)模型,其中d是差分次数。

1阶差分:

diff1 = data.diff(1)
diff1.plot(figsize=(12,6))

如何确定ARIMA模型中参数p、d、q

目测已经平稳,再来看看2阶差分的效果:

diff2 = data.diff(2)
diff2.plot(figsize=(12,6))

如何确定ARIMA模型中参数p、d、q

可以看到二阶差分侯差异不大,所以这里d设置为1即可。

阶层 p 和阶数 q

现在我们已经得到一个平稳的时间序列,接来下就是选择合适的ARIMA模型,即ARIMA模型中合适的p,q。

第一步我们要先检查平稳时间序列的自相关图和偏自相关图。

diff1.dropna(inplace=True)
fig = plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(diff1,lags=40,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(diff1,lags=40,ax=ax2)

如何确定ARIMA模型中参数p、d、q

其中lags 表示滞后的阶数,以上分别得到acf 图和pacf 图。通过两图观察得到:

  • 自相关图显示滞后有3(4)个阶超出了置信边界
  • 偏相关图显示在滞后1至7阶(lags 1,2,…,7)时的偏自相关系数超出了置信边界,从lag 7之后偏自相关系数值缩小至0

则有以下模型可以供选择:

  • ARMA(0,1)模型:即自相关图在滞后1阶之后缩小为0,且偏自相关缩小至0,则是一个阶数q=1的移动平均模型;
  • ARMA(7,0)模型:即偏自相关图在滞后7阶之后缩小为0,且自相关缩小至0,则是一个阶层p=3的自回归模型;
  • ARMA(7,1)模型:即使得自相关和偏自相关都缩小至零。则是一个混合模型。

为了确定哪个模型最合适,可以采用如下准则进行判定:

  • AIC=-2 ln(L) + 2 k 中文名字:赤池信息量 akaike information criterion
  • BIC=-2 ln(L) + ln(n)*k 中文名字:贝叶斯信息量 bayesian information criterion
  • HQ=-2 ln(L) + ln(ln(n))*k hannan-quinn criterion
arma_mod70 = sm.tsa.ARMA(diff1,(7,0)).fit()
print("arma_mod70:",arma_mod70.aic,arma_mod70.bic,arma_mod70.hqic)
arma_mod01 = sm.tsa.ARMA(diff1,(0,1)).fit()
print("arma_mod01:",arma_mod01.aic,arma_mod01.bic,arma_mod01.hqic)
arma_mod71 = sm.tsa.ARMA(diff1,(7,1)).fit()
print("arma_mod71:",arma_mod71.aic,arma_mod71.bic,arma_mod71.hqic)
 
arma_mod70: 1579.7025547690232 1602.1002820966125 1588.7304359010805
arma_mod01: 1632.3203732818517 1639.7862823910482 1635.3296669925376
arma_mod71: 1581.0916055163707 1605.9779692136922 1591.12258455199

可以看到ARMA(7,0)的aic,bic,hqic均最小,因此是最佳模型。

模型校验

在指数平滑模型下,观察ARIMA模型的残差是否是平均值为0且方差为常数的正态分布(服从零均值、方差不变的正态分布),同时也要观察连续残差是否(自)相关。

残差的自相关一偏自相关

对ARMA(7,0)模型所产生的残差做自相关图:

resid = arma_mod70.resid#残差
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(resid, lags=40, ax=ax2)

如何确定ARIMA模型中参数p、d、q

看一看到大部分都在置信空间内,部分超出也只超出一点点。

D-W检验

Durbin-Watson检验 ,简称D-W检验,是目前检验自相关性最常用的方法,但它只使用于检验一阶自相关性。当DW值显著的接近于O或4时,则存在自相关性,而接近于2时,则不存在(一阶)自相关性。

print(sm.stats.durbin_watson(resid))
# 2.024244082702278

观察是否符合正态分布

这里使用 QQ图 ,它用于直观验证一组数据是否来自某个分布,或者验证某两组数据是否来自同一(族)分布。在教学和软件中常用的是检验数据是否来自于正态分布。

from statsmodels.graphics.api import qqplot
fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q', ax=ax, fit=True)

如何确定ARIMA模型中参数p、d、q

Ljung-Box检验

Ljung-Box test是对randomness的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。对于滞后相关的检验,我们常常采用的方法还包括计算ACF和PCAF并观察其图像,但是无论是ACF还是PACF都仅仅考虑是否存在某一特定滞后阶数的相关。LB检验则是基于一系列滞后阶数,判断序列总体的相关性或者说随机性是否存在。 时间序列中一个最基本的模型就是高斯白噪声序列。而对于ARIMA模型,其残差被假定为高斯白噪声序列,所以当我们用ARIMA模型去拟合数据时,拟合后我们要对残差的估计序列进行LB检验,判断其是否是高斯白噪声,如果不是,那么就说明ARIMA模型也许并不是一个适合样本的模型。

import numpy as np
r,q,p = sm.tsa.acf(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.014445   0.019203  0.889787
2.0  -0.047441   0.228719  0.891937
3.0   0.097778   1.129072  0.770061
4.0   0.047514   1.344178  0.853837
5.0   0.156219   3.697174  0.593785
6.0  -0.017855   3.728282  0.713391
7.0  -0.241230   9.475812  0.220274
8.0   0.068078   9.939217  0.269318
9.0  -0.012041   9.953895  0.354231
10.0 -0.256684  16.708543  0.081067
11.0 -0.085178  17.461885  0.094936
12.0 -0.063577  17.887029  0.119164
13.0 -0.096512  18.879634  0.126883
14.0  0.181119  22.422039  0.070348
15.0 -0.223097  27.869400  0.022401
16.0  0.012916  27.887910  0.032608
17.0  0.176769  31.402779  0.017833
18.0 -0.053140  31.724897  0.023694
19.0 -0.057704  32.110150  0.030374
20.0  0.037425  32.274556  0.040459
21.0  0.120519  34.004510  0.036199
22.0  0.102662  35.278536  0.036225
23.0 -0.007830  35.286058  0.048710
24.0 -0.148547  38.035517  0.034383
25.0  0.046254  38.306261  0.043173
26.0 -0.032621  38.443060  0.055055
27.0  0.032381  38.580025  0.069141
28.0  0.124968  40.653492  0.057760
29.0 -0.092711  41.813707  0.058361
30.0 -0.033602  41.968698  0.072016
31.0  0.011216  41.986264  0.090054
32.0 -0.016597  42.025405  0.110574
33.0 -0.047033  42.345328  0.127733
34.0  0.001922  42.345872  0.154137
35.0 -0.022258  42.420173  0.181558
36.0 -0.003481  42.422025  0.213721
37.0 -0.083009  43.495231  0.214345
38.0 -0.089174  44.758050  0.209260
39.0  0.005255  44.762523  0.242730
40.0 -0.065663  45.475168  0.254607

检验的结果就是看最后一列前十二行的检验概率(一般观察滞后1~12阶),如果检验概率小于给定的显著性水平,比如0.05就拒绝原假设,其原假设是相关系数为零。就结果来看,如果取显著性水平大于0.05,那么相关系数与零没有显著差异,即为白噪声序列。

参考链接:https://blog.csdn.net/u010414589/article/details/49622625


以上所述就是小编给大家介绍的《如何确定ARIMA模型中参数p、d、q》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

深入浅出程序设计(中文版)

深入浅出程序设计(中文版)

Paul Barry、David Griffiths / 蒋雁翔、童健 / 东南大学出版社 / 2012-1 / 98.00元

《深入浅出程序设计(中文版)》介绍了编写计算机程序的核心概念:变量、判断、循环、函数与对象——无论运用哪种编程语言,都能在动态且多用途的python语言中使用具体示例和练习来运用并巩固这些概念。学习基本的工具来开始编写你感兴趣的程序,而不是其他人认为你应该使用的通用软件,并对软件能做什么(不能做什么)有一个更好的了解。当你完成这些,你就拥有了必要的基础去使用任何一种你需要或想要学习的语言或软件项目......一起来看看 《深入浅出程序设计(中文版)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具