用python作时间序列预测六:相关函数图、偏相关函数图、滞后图

经典的时间序列预测方法都是假设若是一个时间序列有显著的自相关性,那么历史值对预测当前值会颇有帮助,可是究竟取多少阶的历史值,就须要经过分析相关函数图和偏相关函数图来获得。本文介绍如何什么是相关函数图和偏相关函数图,另外还会介绍一下滞后图。python

什么是自相关和偏自相关函数?

  • 先来解释下滞后阶数n,若是当前值和前2期的值有关,则n=2,那么能够用时间序列和它的2阶滞后序列来训练一个自回归模型,预测将来的值。
  • 自相关函数(ACF)表达了时间序列和n阶滞后序列之间的相关性(考虑了中间时刻的值的影响,好比t-3对t的影响中,就同时考虑了t-2,t-1对t的影响)。
  • 偏自相关函数(PACF)表达了时间序列和n阶滞后序列之间的纯相关性(不考虑中间时刻的值的影响,好比t-3对t的影响中,不会考虑t-2,t-1对t的影响)。若是用自回归方程来预测t时刻的值,则各滞后阶数的系数就是各滞后阶数下的偏自相关值,好比下面方程的α1,α2,α3,分别是1阶滞后,2阶滞后,3阶滞后下的偏自相关值。

ACF 和 PACF 可视化

from statsmodels.tsa.stattools import acf, pacf
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')
# Calculate ACF and PACF upto 50 lags# acf_50 = acf(df.value, nlags=50)# pacf_50 = pacf(df.value, nlags=50)
# Draw Plot
fig, axes = plt.subplots(1,2,figsize=(16,3), dpi= 100)
plot_acf(df.value.tolist(), lags=50, ax=axes[0])
plot_pacf(df.value.tolist(), lags=50, ax=axes[1])

  • 若是ACF表现为长拖尾(如上左图),说明带有趋势,须要作差分。
  • 若是ACF的1阶滞后就截尾,则多是过分差分了(差分会下降相关性)。
  • 若是ACF拖尾一点点,而后截尾的状况下,选择的差分阶数是比较合适的。此时能够用前n个历史时刻的值作自回归来预测当前值,关于n的取值则能够参考PACF的截尾处,假设上右图是差分后的pacf图,在第2个滞后阶数后(从第0开始,0阶滞后下就是原序列和原序列相比,相关性为1)就骤然降到了相关性置信区间内,则表示95%的几率不具备相关性,因此该序列能够作2阶滞后自回归。

什么是相关性置信区间?

对于白噪声序列,按理说不会有任何自相关性,咱们指望的自相关性为0,可是因为随机扰动的存在,自相关性不会为0,而一般假设随机扰动符合标准正态分布(均值为0,标准差为1),那么这个随机扰动的95%置信区间(通常都取95%,固然也能够调整这个几率)能够经过以下算式计算

标准正态分布的z分数表示距离均值有几个标准差,σ除以根号T表示有偏样本标准差,
这里95%置信度下z分数=1.96,标准差σ=1,T是序列长度,则置信区间计算以下:

表示对于白噪声序列,95%的自相关性落在这个置信区间内。
而这个置信区间就是上面acf和pacf图中的相关性区间了,也就是说若是滞后阶数与原序列的相关性落在这个区间内,就表示不相关。git

滞后图

滞后图是用时间序列和相应的滞后阶数序列作出的散点图。能够用于观测自相关性。github

from pandas.plotting import lag_plot
plt.rcParams.update({'ytick.left' : False, 'axes.titlepad':10})

# Import
ss = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/sunspotarea.csv')
a10 = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')

# Plot
fig, axes = plt.subplots(1, 4, figsize=(10,3), sharex=True, sharey=True, dpi=100)for i, ax in enumerate(axes.flatten()[:4]):
    lag_plot(ss, lag=i+1, ax=ax, c='firebrick')
    ax.set_title('Lag ' + str(i+1))

fig.suptitle('Lag Plots of Sun Spots Area \n(Points get wide and scattered with increasing lag -> lesser correlation)\n', y=1.15)    

fig, axes = plt.subplots(1, 4, figsize=(10,3), sharex=True, sharey=True, dpi=100)for i, ax in enumerate(axes.flatten()[:4]):
    lag_plot(a10, lag=i+1, ax=ax, c='firebrick')
    ax.set_title('Lag ' + str(i+1))

fig.suptitle('Lag Plots of Drug Sales', y=1.05)    
plt.show()


ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。less

相关文章
相关标签/搜索