經典的時間序列預測方法都是假設若是一個時間序列有顯著的自相關性,那麼歷史值對預測當前值會頗有幫助,可是究竟取多少階的歷史值,就須要經過分析相關函數圖和偏相關函數圖來獲得。本文介紹如何什麼是相關函數圖和偏相關函數圖,另外還會介紹一下滯後圖。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階滯後下的偏自相關值。
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