經典的時間序列預測方法都是假設如果一個時間序列有顯著的自相關性,那麼歷史值對預測當前值會很有幫助,但是究竟取多少階的歷史值,就需要通過分析相關函數圖和偏相關函數圖來得到。本文介紹如何什麼是相關函數圖和偏相關函數圖,另外還會介紹一下滯後圖。
什麼是自相關和偏自相關函數?先來解釋下滯後階數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階滯後下的偏自相關值。from statsmodels.tsa.stattools import acf, pacffrom statsmodels.graphics.tsaplots import plot_acf, plot_pacfdf = 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 Plotfig, 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圖中的相關性區間了,也就是說如果滯後階數與原序列的相關性落在這個區間內,就表示不相關。滯後圖是用時間序列和相應的滯後階數序列做出的散點圖。可以用於觀測自相關性。
from pandas.plotting import lag_plotplt.rcParams.update({'ytick.left' : False, 'axes.titlepad':10})# Importss = 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')# Plotfig, 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。