若是想知道一個序列是否對預測另外一個序列有用,能夠用Granger causality test(格蘭傑因果檢驗)。python
若是使用時間序列X和Y的歷史值來預測Y的當前值,比僅經過Y的歷史值來預測Y的當前值獲得的偏差更小,而且經過了F檢驗,卡方檢驗,則X對Y的預測是有必定幫助的。
瞭解了Granger causality test的思想以後會發現,其實Granger causality test最多能推斷出X對Y的預測是有必定幫助的,至因而否能說X和Y是因果關係,則不必定。
進一步瞭解能夠去這裏:https://www.zhihu.com/question/34787362git
python的statsmodel包的grangercausalitytests函數中提供了很好的實現。github
- 該方法接收一個包含2列的2維的數組做爲主要參數:
第一列是當前要預測將來值的序列A,第二列是另外一個序列B,該方法就是看B對A的預測是否有幫助。該方法的零假設是:B對A沒有幫助。若是全部檢驗下的P-Values都小於顯著水平0.05,則能夠拒絕零假設,並推斷出B確實對A的預測有用。- 第二個參數maxlag是設定測試用的lags的最大值。
- 咱們使用關於澳大利亞藥物銷售的數據集作預測,並利用Granger causality檢測‘月份’這個序列是否對數據集的預測用。
from statsmodels.tsa.stattools import grangercausalitytests df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date']) df['month'] = df.date.dt.month grangercausalitytests(df[['value', 'month']], maxlag=2)
- 輸出結果:
Granger Causality
number of lags (no zero) 1
ssr based F test: F=54.7797 , p=0.0000 , df_denom=200, df_num=1
ssr based chi2 test: chi2=55.6014 , p=0.0000 , df=1
likelihood ratio test: chi2=49.1426 , p=0.0000 , df=1
parameter F test: F=54.7797 , p=0.0000 , df_denom=200, df_num=1
Granger Causality
number of lags (no zero) 2
ssr based F test: F=162.6989, p=0.0000 , df_denom=197, df_num=2
ssr based chi2 test: chi2=333.6567, p=0.0000 , df=2
likelihood ratio test: chi2=196.9956, p=0.0000 , df=2
parameter F test: F=162.6989, p=0.0000 , df_denom=197, df_num=2
每一個檢驗的p值都小於5%,因此能夠說月份對澳大利亞藥物銷售的預測有用,或者說藥物的銷售可能存在季節性。數組
ok,本篇就這麼多內容啦~,下一篇將介紹時間序列預測經常使用的模型ARIMA,感謝閱讀O(∩_∩)O。函數