如何在 python 中执行格兰杰因果关系检验
格兰杰因果检验用于确定一个时间序列是否有助于预测另一个时间序列。
该检验使用以下原假设和备择假设:
原假设 (H 0 ):时间序列x不会导致时间序列y发生格兰杰分布
备择假设 ( HA ):时间序列x格兰杰原因时间序列y
术语“格兰杰原因”是指知道具有一定滞后性的时间序列x的值对于预测稍后时间序列y的值是有用的。
此检验生成具有相应p 值的 F 检验统计量。如果 p 值低于一定的显着性水平(即 α = 0.05),那么我们可以拒绝原假设并得出结论:我们有足够的证据来断言时间序列x Granger 导致时间序列 y。
我们可以使用 statsmodels 包中的grangercausalitytests()函数在 Python 中执行格兰杰因果检验:
from statsmodels. tsa . stattools import grangercausalitytests #perform Granger-Causality test grangercausalitytests(df[[' column1 ', ' column2 ']], maxlag=[ 3 ])
请注意, maxlag指定第一个时间序列中使用的滞后数。
以下分步示例展示了如何在实践中使用此功能。
第 1 步:加载数据
在此示例中,我们将使用一个数据集,其中包含 1930 年至 1983 年美国的鸡蛋数量和鸡数量值:
import pandas as pd #define URL where dataset is located url = "https://raw.githubusercontent.com/Statorials/Miscellaneous/main/chicken_egg.txt" #read in dataset as pandas DataFrame df = pd. read_csv (url, sep=" ") #view first five rows of DataFrame df. head () year chicken egg 0 1930 468491 3581 1 1931 449743 3532 2 1932 436815 3327 3 1933 444523 3255 4 1934 433937 3156
步骤 2:执行格兰杰因果关系检验
接下来,我们将使用grangercausalitytests ()函数进行格兰杰因果关系检验,看看所产鸡蛋的数量是否可以预测未来母鸡的数量。我们将使用三个偏移量运行测试:
from statsmodels. tsa . stattools import grangercausalitytests #perform Granger-Causality test grangercausalitytests(df[[' chicken ', ' egg ']], maxlag=[ 3 ]) Granger Causality number of lags (no zero) 3 ssr based F test: F=5.4050, p=0.0030, df_denom=44, df_num=3 ssr based chi2 test: chi2=18.7946, p=0.0003, df=3 likelihood ratio test: chi2=16.0003, p=0.0011, df=3 parameter F test: F=5.4050, p=0.0030, df_denom=44, df_num=3
F 检验统计量结果为5.405 ,相应的 p 值为0.0030 。
由于 p 值小于 0.05,我们可以拒绝检验的原假设,并得出结论:知道鸡蛋的数量有助于预测未来母鸡的数量。
步骤 3:反向执行格兰杰因果关系检验
尽管我们拒绝了检验的原假设,但实际上有可能发生反向因果关系的情况。换句话说,母鸡的数量有可能导致鸡蛋数量的变化。
为了排除这种可能性,我们需要反向执行格兰杰因果检验,使用鸡作为预测变量,鸡蛋作为响应变量:
from statsmodels. tsa . stattools import grangercausalitytests #perform Granger-Causality test grangercausalitytests(df[[' egg ', ' chicken ']], maxlag=[ 3 ]) Granger Causality number of lags (no zero) 3 ssr based F test: F=0.5916, p=0.6238, df_denom=44, df_num=3 ssr based chi2 test: chi2=2.0572, p=0.5606, df=3 likelihood ratio test: chi2=2.0168, p=0.5689, df=3 parameter F test: F=0.5916, p=0.6238, df_denom=44, df_num=3
F 检验统计量结果为0.5916 ,相应的 p 值为0.6238 。
由于 p 值不小于 0.05,因此我们不能拒绝原假设。换句话说,母鸡的数量并不能预测未来鸡蛋的数量。
因此,我们可以得出结论,知道鸡蛋的数量有助于预测未来母鸡的数量。
其他资源
以下教程解释了如何在 Python 中使用时间序列执行其他常见任务: