时间序列中的格兰杰因果关系——用鸡和蛋问题解释

源节点: 1052089

介绍

格兰杰因果关系 2

图片来源:https://www.wallpaperflare.com

时间序列分析可以洞察时间序列数据的模式或特征。 时间序列数据可以分解为三个组成部分:

  • 趋势 – 这显示了数据在很长一段时间内的趋势,可能是向上、向下或稳定的。
  • 季节性 – 以周期性方式发生并每年重复的变化。
  • 噪声或随机 – 不稳定的数据波动。
格兰杰因果关系 2

图片来源:https://www.researchgate.net

预测未来特定时间的数据称为时间序列预测。 它是在金融、天气预报、卫生部门、环境研究、商业、零售等领域广泛使用的强大机器学习模型之一,可用于制定战略决策。

在实时中,大部分数据由多个变量组成,其中自变量可能依赖于其他自变量,这些关系会对预测或预测产生影响。 大多数情况下,人们通常会被误导并在这种情况下构建多线性回归模型。 高 R 平方值将进一步误导并做出糟糕的预测。

虚假回归

线性回归可能表明两个或多个变量之间存在很强的相关性,但这些变量在现实中可能完全不相关。 当涉及领域知识时,预测失败,这种情况被称为虚假回归。

在下图中,鸡肉消费和原油出口之间存在很强的相关性,即使它们无关。

虚假回归格兰杰因果关系
资料来源:http://www.tylervigen.com/spurious-correlations

在虚假回归中观察到强趋势/非平稳和更高的 R 平方。 在构建模型时必须消除虚假回归,因为它们不相关且没有因果关系。

多元线性回归利用相关矩阵来检查所有自变量之间的依赖性。 如果两个变量之间的相关系数值很高,则保留一个变量而丢弃另一个变量以消除相关性。 在时间为混杂因素多元线性回归失败的数据集中,用于消除变量的相关系数没有时间限制,而只是给出了两个变量之间的相关性。

趋势格兰杰因果关系
图片来源:https://en.wikipedia.org/wiki/Granger_causality 

考虑上面的时间序列图,变量 X 对变量 Y 有直接影响,但 X 和 Y 之间存在 5 的滞后,在这种情况下我们不能使用相关矩阵。 例如。 城市中冠状病毒阳性病例的增加和住院人数的增加。 为了更好的预测,这里我们想知道是否存在因果关系。

图片来源:https://clock.software/blog/solve-the-chicken-and-egg-problem/ 

格兰杰因果关系来拯救

2003 年诺贝尔经济学奖获得者 Clive WJ Granger 教授提出了因果关系的概念,以提高预测的性能。

它基本上是一种计量经济学假设检验,用于验证一个变量在具有特定滞后的多变量时间序列数据中预测另一个变量的使用。

执行 Granger 因果关系检验的先决条件是数据必须是平稳的,即它应该具有恒定的均值、恒定的方差且没有季节性成分。 通过对非平稳数据进行差分(一阶或二阶差分)将非平稳数据转换为平稳数据。 如果二阶差分后数据不是平稳的,则不要继续进行格兰杰因果检验。

让我们考虑三个变量 Xt , YtWt 预设在时间序列数据中。

案例 1:预测 XT + 1 基于过去的值 Xt

案例 2:预测 XT + 1 基于过去的价值 Xt 和Y.t. 

案例3:预测 XT + 1 基于过去的价值 Xt ,Yt ,Wt, 其中变量 Yt 直接依赖于变量 Wt.

这里的案例 1 是单变量时间序列,也称为自回归模型,其中只有一个变量,预测是基于由 p 阶滞后的相同变量完成的。

p 阶自回归模型的方程 (RESTRICTED MODEL, RM)

Xt = α + 𝛾1 X𝑡−1 + 𝛾2X𝑡−2 +⋯+𝛾𝑝X𝑡−𝑝      

其中要估计的 p 参数(自由度)。

在案例 2 中,过去的值 Y 包含预测信息 XT + 1。 Ÿt 据说是“格兰杰事业” XT + 1 提供 Yt 发生在 XT + 1  它包含用于预测的数据 XT + 1.

使用预测变量 Y 的方程t (不受限制的模型,嗯)

Xt =α+𝛾1 X𝑡−1 + 𝛾2X𝑡−2 +⋯+𝛾𝑝X𝑡−𝑝  1YT-1+ ⋯ + α𝑝 Ytp 

要估计的 2p 参数(自由度)。

如果是t 原因 Xt,那么 Y 必须在 X 之前,这意味着:

  • Y 的滞后值应该与 X 显着相关。
  • X 的滞后值不应与 Y 显着相关。

情况 3 不能用于发现格兰杰因果关系,因为变量 Yt 受变量 W 的影响t.

假设检验

零假设(H0): Yt 不是“格兰杰事业” Xt+1 即𝛼1 =𝛼2 =⋯=𝛼𝑝 = 0

替代假设(HA): Yt 做“格兰杰事业” Xt+1,即 Y 的至少一个滞后是显着的。

计算 f 统计量 

Fp,n-2𝑝−1 =(𝐸𝑠𝑡𝑖𝑚𝑎𝑡𝑒𝑜𝑓𝐸𝑥𝑝𝑙𝑎𝑖𝑛𝑒𝑑𝑉𝑎𝑟𝑖𝑎𝑛𝑐𝑒)/(𝐸𝑠𝑡𝑖𝑚𝑎𝑡𝑒𝑜𝑓𝑈𝑛𝑒𝑥𝑝𝑙𝑎𝑖𝑛𝑒𝑑𝑉𝑎𝑟𝑖𝑎𝑛𝑐𝑒)

 Fp,n-2𝑝−1 = ( (𝑆𝑆𝐸𝑅𝑀−𝑆𝑆𝐸𝑈𝑀) /𝑝) /(𝑆𝑆𝐸𝑈𝑀 /𝑛−2𝑝−1) 

其中 n 是观察次数和
SSE 是平方误差的总和。

如果 p 值小于至少一个滞后的显着性水平 (0.05),则拒绝原假设。

对两个方向 X 进行测试t-> 是t 和Y.t-> Xt.

尝试不同的滞后 (p)。 可以使用 AIC 确定最佳滞后。

局限性

  • Granger 因果关系不提供有关变量之间关系的任何见解,因此与“因果关系”分析不同,它不是真正的因果关系。
  • 当两个或多个变量之间存在相互依赖性时(如案例 3 中所述),格兰杰因果关系无法预测。
  • 不能对非平稳数据进行格兰杰因果检验。

解决鸡和蛋问题

让我们应用格兰杰因果关系来检查是先有鸡蛋还是先有鸡。

导入库

将 matplotlib.pyplot 作为 plt 导入 seaborn 作为 sns 将 numpy 作为 np 导入 pandas 作为 pd

加载数据集

数据来自美国农业部。 它由 1930 年到 1983 年的两个时间序列变量组成,一个是美国鸡蛋产量,另一个是估计的美国鸡群。

df = pd.read_csv('chickegg.csv')

探索数据集

df.head()
df.dtypes
df.形状

(53,3)

df.描述()

检查数据是否静止,如果不是,则使其静止以继续。

# 绘制绘图 def plot_df(df, x, y, title="", xlabel='Date', ylabel='Value', dpi=100): plt.figure(figsize=(16,5), dpi=dpi) plt.plot(x, y, color='tab:red') plt.gca().set(title=title, xlabel=xlabel, ylabel=ylabel) plt.show() plot_df(df, x=df.Year , y=df.chicken, title='美国各地鸡的数量') plot_df(df, x=df.Year, y=df.egg, title='鸡蛋生产')

通过目视检查,鸡肉和鸡蛋数据都不是静止的。 让我们通过运行增强测试(ADF 测试)来确认这一点。

(ADF 测试)

ADF 检验是一种流行的统计检验,用于检查时间序列是否平稳,它基于单位根检验工作。 序列中存在的单位根数表示使其平稳所需的差分运算次数

考虑假设检验,其中:

零假设(H0):级数有单位根且非平稳。

替代假设(HA):级数没有单位根,是平稳的。

from statsmodels.tsa.stattools import adfuller result = adfuller(df['chicken']) print(f'Test Statistics: {result[0]}') print(f'p-value: {result[1]}')打印(f'critical_values:{result[4]}')
if result[1] > 0.05: print("系列不是固定的") else: print("系列是固定的")
结果 = adfuller(df['egg'])
print(f'Test Statistics: {result[0]}') print(f'p-value: {result[1]}') print(f'critical_values: {result[4]}') if result[1] > 0.05: print("系列不是固定的") else: print("系列是固定的")

鸡蛋和鸡肉变量的 p 值都大于显着值 (0.05),零假设有效且序列不是平稳的。

数据转换

格兰杰因果检验仅对平稳数据进行,因此我们需要通过对数据进行差分来转换数据以使其平稳。 让我们对鸡肉和鸡蛋数据进行一阶差分。

df_transformed = df.diff().dropna() df = df.iloc[1:] 打印(df.shape)df_transformed.shape
df_transformed.head()
格兰杰因果关系蛋
plot_df(df_transformed, x=df.Year, y=df_transformed.chicken, title='美国各地鸡的数量') plot_df(df_transformed, x=df.Year, y=df_transformed.egg, title='鸡蛋生产')

对差异数据再次重复 ADF 测试以检查平稳性。

result = adfuller(df_transformed['chicken']) print(f'Test Statistics: {result[0]}') print(f'p-value: {result[1]}') print(f'critical_values: {result [4]}') if result[1] > 0.05: print("系列不是固定的") else: print("系列是固定的")
result = adfuller(df_transformed['egg']) print(f'Test Statistics: {result[0]}') print(f'p-value: {result[1]}') print(f'critical_values: {result [4]}') if result[1] > 0.05: print("系列不是固定的") else: print("系列是固定的")

转换后的鸡和蛋数据是固定的,因此不需要进行二阶差分。 

检验格兰杰因果关系

有几种方法可以找到最佳滞后,但为简单起见,我们现在考虑第四个滞后。 

鸡蛋格兰杰会导致鸡吗?

 零假设(H0) : 鸡蛋不会导致鸡。

替代假设(HA) : 鸡蛋格兰杰导致鸡。

从 statsmodels.tsa.stattools 导入 grangercausalitytests
grangercausalitytests(df_transformed[['chicken','egg']],maxlag=4)

p 值非常低,零假设被拒绝,因此鸡蛋是导致鸡的格兰杰。

这意味着先有鸡蛋。

现在在相反的方向重复格兰杰因果关系检验。

鸡格兰杰会在延迟 4 时产蛋吗?

零假设(H0) : 鸡肉不会引起鸡蛋。

替代假设(HA) : 鸡格兰杰导致鸡蛋。

grangercausalitytests(df_transformed[['egg','chicken']],maxlag=4)
格兰杰因果检验

p 值相当高,因此鸡不会引起鸡蛋。

上述分析得出的结论是先有鸡蛋而不是先有鸡。

分析完成后,下一步是开始使用时间序列预测模型进行预测。

的EndNote

每当您遇到具有多个变量的限时数据时,请怀疑高 R2 和可能的虚假回归。 利用时间序列预测获得更好的性能。 在继续使用预测技术之前,检查每个变量之间的双向格兰杰因果关系并根据测试结果消除变量。 我希望您喜欢这篇文章并深入了解格兰杰因果关系概念。 请在评论部分留下您的建议或疑问。

谢谢你的阅读!

作者简介

你好,来自 Mangalore 的 Pallavi Padav 拥有 INSOFE 的数据科学 PG 学位。 热衷于参加数据科学黑客马拉松、博客马拉松和研讨会。

很想抓住你 LinkedIn. 给我发邮件 此处 任何疑问。

本文中显示的媒体不归 Analytics Vidhya 所有,由作者自行决定使用。

资料来源:https://www.analyticsvidhya.com/blog/2021/08/granger-causality-in-time-series-explained-using-chicken-and-egg-problem/

时间戳记:

更多来自 分析维迪亚