用python作時間序列預測八:Granger causality test(格蘭傑因果檢驗)

若是想知道一個序列是否對預測另外一個序列有用,能夠用Granger causality test(格蘭傑因果檢驗)。python

Granger causality test的思想

若是使用時間序列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代碼

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。函數

相關文章
相關標籤/搜索