我是Granger Causality的新手,希望对理解/解释python statsmodels输出结果提供任何建议。我已经构造了两个数据集(正弦函数随时间变化并添加了噪声)
并将它们放在“数据”矩阵中,信号1作为第一列,信号2作为第二列。然后,我使用以下命令运行测试:
granger_test_result = sm.tsa.stattools.grangercausalitytests(data, maxlag=40, verbose=True)`
结果表明,最佳滞后(以最高的F检验值表示)滞后为1。
Granger Causality
('number of lags (no zero)', 1)
ssr based F test: F=96.6366 , p=0.0000 , df_denom=995, df_num=1
ssr based chi2 test: chi2=96.9280 , p=0.0000 , df=1
likelihood ratio test: chi2=92.5052 , p=0.0000 , df=1
parameter F test: F=96.6366 , p=0.0000 , df_denom=995, df_num=1
但是,似乎最能描述数据的最佳重叠的延迟约为25(在下图中,信号1已向右移动了25点):
Granger Causality
('number of lags (no zero)', 25)
ssr based F test: F=4.1891 , p=0.0000 , df_denom=923, df_num=25
ssr based chi2 test: chi2=110.5149, p=0.0000 , df=25
likelihood ratio test: chi2=104.6823, p=0.0000 , df=25
parameter F test: F=4.1891 , p=0.0000 , df_denom=923, df_num=25
我显然在这里误解了一些东西。为什么预测的滞后与数据的变化不匹配?
还有,谁能向我解释为什么p值如此之小以至于大多数滞后值都可以忽略不计?对于滞后大于30的情况,它们仅开始显示为非零。
感谢您提供的任何帮助。
答案 0 :(得分:4)
如here所述,为了运行格兰杰因果关系检验,您使用的时间序列'必须是固定的。一种常见的实现方法是通过取每个序列的第一个差异来变换两个序列:
x = np.diff(x)[1:]
y = np.diff(y)[1:]
这是我生成的相似数据集在滞后1和滞后25时格兰杰因果关系结果的比较:
不变
Granger Causality
number of lags (no zero) 1
ssr based F test: F=19.8998 , p=0.0000 , df_denom=221, df_num=1
ssr based chi2 test: chi2=20.1700 , p=0.0000 , df=1
likelihood ratio test: chi2=19.3129 , p=0.0000 , df=1
parameter F test: F=19.8998 , p=0.0000 , df_denom=221, df_num=1
Granger Causality
number of lags (no zero) 25
ssr based F test: F=6.9970 , p=0.0000 , df_denom=149, df_num=25
ssr based chi2 test: chi2=234.7975, p=0.0000 , df=25
likelihood ratio test: chi2=155.3126, p=0.0000 , df=25
parameter F test: F=6.9970 , p=0.0000 , df_denom=149, df_num=25
第一差异
Granger Causality
number of lags (no zero) 1
ssr based F test: F=0.1279 , p=0.7210 , df_denom=219, df_num=1
ssr based chi2 test: chi2=0.1297 , p=0.7188 , df=1
likelihood ratio test: chi2=0.1296 , p=0.7188 , df=1
parameter F test: F=0.1279 , p=0.7210 , df_denom=219, df_num=1
Granger Causality
number of lags (no zero) 25
ssr based F test: F=6.2471 , p=0.0000 , df_denom=147, df_num=25
ssr based chi2 test: chi2=210.3621, p=0.0000 , df=25
likelihood ratio test: chi2=143.3297, p=0.0000 , df=25
parameter F test: F=6.2471 , p=0.0000 , df_denom=147, df_num=25
我将尝试从概念上解释正在发生的事情。由于您所使用的序列具有均值的明显趋势,因此在1、2,...等处的早期滞后在F检验中均提供了重要的预测模型。这是因为由于长期趋势,您可以很容易地使x
值与y
值之间存在1负相关。另外(这更多是有根据的猜测),我认为您看到滞后25的F统计量与早期滞后相比非常低的原因是x
系列解释的许多方差包含在y
自滞后1到25的自相关,因为非平稳性使自相关具有更大的预测能力。
答案 1 :(得分:0)
根据statsmodels.tsa.stattools.grangercausalitytests function
的注释grangercausality检验的零假设是第二列x2中的时间序列不是Granger导致第一列x1中的时间序列。格兰奇因果关系意味着x2的过去值对x1的当前值具有统计上显着的影响,并将x1的过去值作为回归因子。如果p值小于测试的期望大小,我们拒绝x2不会格兰杰引起x1的原假设。
所有四个检验的零假设是与第二时间序列的过去值相对应的系数为零。
测试完全按预期进行。
让我们为测试修复significance level,例如alpha = 5%或1%。在执行测试之前选择它很重要。然后,您运行Granger(非因果关系)测试,其null hypothesis是第二个时间序列在固定的滞后下不会导致第一个时间序列(就Granger而言)。如您所见,滞后= 1的p值高于您固定的阈值alpha,这意味着您可以拒绝原假设(即无因果关系)。对于滞后> 25,p值会降为零,这意味着您应该拒绝原假设,即非因果关系。
这确实与您按构造提供的时间序列一致。