用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。函数

相关文章
相关标签/搜索