理解statsmodels grangercausalitytests的输出结果

22

我对Granger因果关系不太了解,希望能得到关于理解/解释Python statsmodels结果的建议。我构建了两个数据集(带噪声的正弦函数移位)。enter image description here

我将它们放入一个“数据”矩阵中,其中信号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个点): enter image description here

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时它们才开始显示为非零。

感谢您所提供的任何帮助。


你能找到答案吗? - Brandon
3个回答

13

此处所述,为了进行格兰杰因果关系检验,您使用的时间序列必须是平稳的。 实现这一点的常见方法是通过获取每个序列的第一差分来转换两个时间序列:

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测试中都提供了显着的预测模型。这是因为您可以通过长期趋势很容易地将1个滞后的 x 值与 y 值进行负相关,另外(这是更多的猜测),我认为您看到的第25个滞后的F统计量非常低,与早期滞后相比,原因是 x 系列解释的许多变异性包含在自动相关性中,从滞后1-25开始,因为非平稳性赋予自相关更强的预测能力。


3
嗨@rsmith49,根据我所读和看到的,上述时间序列是带有一些噪声的正弦波,那么它们怎么可能是非平稳的呢? - rbonallo
2
说实话,这让我有些陷入了一个兔子洞里,因为我在时序方面的经验只有一门研究生课程和一些工作调查。但是从这里看来,严格意义上的平稳性将会排除正弦波加噪声。根据我的实验结果,我假设 Granger 因果关系测试需要严格意义上的平稳性。 - rsmith49

6
statsmodels.tsa.stattools.grangercausalitytests函数的注释中:

grangercausalitytests的零假设是第二列时间序列x2并没有导致第一列时间序列x1产生格兰杰因果关系。因果关系意味着x2的过去值对当前x1值具有统计显著影响,考虑到x1的过去值作为回归变量。如果p值小于测试所需的大小,则我们拒绝x2不会导致x1发生格兰杰因果关系的零假设。

所有四个测试的零假设是与第二个时间序列过去值对应的系数为零。

此测试完全按预期运行。

让我们为您的测试设定一个显著性水平,例如alpha = 5%或1%。重要的是在执行测试之前选择它。然后,您运行格兰杰(非)因果关系测试,其零假设是第二个时间序列不会在格兰杰意义上引起第一个时间序列,对于固定的滞后期。正如您发现的那样,lag = 1的p值高于您设定的阈值alpha,这意味着您可以拒绝零假设(即无因果关系)。对于lag > 25,p值下降到零,这意味着您应该拒绝零假设,即不存在因果关系。

由于构造方式,这与您提供的时间序列确实一致。


0

有人提到原问题的前提是错误的吗?

"结果显示,最佳滞后期(以最高F检验值为准)为1个滞后期。..."

...这种说法是不正确的。F值和卡方值来自不同的自由度。第一个滞后模型总是具有df=1。这会产生与df=25时不同的测试分数分布。

您不能比较不同自由度的F检验或卡方值,因为它们将具有不同的分布。相反,您应该比较p值,或者更好的方法是像@AstoundingJB所指出的那样,选择一个截止alpha并忽略p值,只看二进制决策小于还是大于alpha。或选择一系列alpha,如果p值在中间,则得出测试无法确定的结论。

@rsmith49 建议的方法是正确的:通过取第一阶差分来消除长期趋势。但是您应该检查(至少通过绘图)这是否使时间序列“平稳”。如果仍然存在趋势,请进行另一个差分或在原始数据中手动减去曲线拟合 - 但如果您发现必须这样做,则可以质疑 Granger 测试的实用性,您可能还想尝试 VAR 测试:(https://en.wikipedia.org/wiki/Vector_autoregression)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接