如果想知道一個序列是否對預測另一個序列有用,可以用Granger causality test(格蘭傑因果檢驗)。
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/34787362
python代碼
python的statsmodel包的grangercausalitytests函數中提供了很好的實現。
- 該方法接收一個包含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%,所以可以說月份對澳大利亞葯物銷售的預測有用,或者說葯物的銷售可能存在季節性。
原文作者: 程序員一一滌生(雲+社區)
