鸡生蛋还是蛋生鸡? 基于python的CCM因果关系计算
文章目录
- 前言
- 一、安装
- 二、代码
-
- 1.全部代码
- 2.结果展示
- 总结
前言
因果推断在科学研究中起着重要的作用,尤其是在复杂系统中,例如生态学、气候学、经济学等领域。在这些领域中,了解变量之间的因果关系可以帮助我们更好地理解系统的动态行为和相互作用。传统的相关性分析并不足以揭示因果性,因为相关性不代表因果关系。为了有效地解决这一问题,Convergent Cross Mapping (CCM) 被提出作为一种基于非线性动力学理论的因果推断方法。CCM 可以用来识别时间序列数据之间的因果关系,特别是在动态复杂系统中,其中变量之间可能存在交互作用或反馈机制。
本代码使用了 causal-ccm Python 库,旨在通过模拟混沌系统来验证和可视化 X 和 Y 两个时间序列之间的因果关系。通过调整不同的时间窗口长度(L)、时间滞后值(τ)和嵌入维度(E),我们可以深入探讨如何使用 CCM 检测系统中潜在的因果关系,并通过可视化图表展现因果性随时间窗口变化的收敛过程。
一、安装
安装
pip install causal-ccm
使用
假设我们想要检查X是否驱动y。我们首先使用:ccm定义
X和时间序列dataY
时差(如果我们得到我们的影子流形嵌入Tau =1[t, t-1, t-2…])
E -阴影歧管的嵌入维度(默认=2)
L -要考虑的时间范围,默认为时间序列长度X
我们导入包
从causal_ccm。Causal_ccm import CCM
我们定义:ccm
ccm1 = ccm(X, Y, tau, E, L) #用X, Y时间序列定义ccm
我们检查因果关系的强度,即预测与真实的相关性(见Sugihara(2012))。
ccm1.causality ()
我们可以想象X和Y的流形之间的交叉映射
ccm1.visualize_cross_mapping ()
我们将X- >y的相关性可视化
相关性越强=因果关系越强
ccm1.plot_ccm_correls ()
最后,我们可以通过计算具有不同L值的定义来检查预测(相关性)的收敛性
二、代码
1.全部代码
from causal_ccm.causal_ccm import ccm # 导入 causal-ccm 包中的 ccm 类,用于因果推断
import pandas as pd # 导入 pandas,用于数据处理
import matplotlib.pyplot as plt # 导入 matplotlib,用于绘制图形
from tqdm import tqdm # 导入 tqdm,用于在循环中显示进度条
import numpy as np # 导入 numpy,用于数值计算
# 定义一个混沌系统函数,模拟 X 和 Y 之间的动态交互
# A 是 X 或 Y,B 是 Y 或 X,r 是系统参数,beta 是交互影响系数
def chaotic_func(A, B, r, beta):
return A * (r - r * A - beta * B)
# 可视化并进行因果推断分析的函数
def viz_ccm(func, X, Y, L_range, tau, E):
Xhat_My, Yhat_Mx = [], [] # 初始化两个列表,用于存储每个 L 对应的相关性(因果强度)
# 遍历不同的 L 值,L 是时间窗口长度
for L in tqdm(L_range): # tqdm 提供进度条
ccm_XY = func(X, Y, tau, E, L) # 创建 ccm 对象,进行 X -> Y 的因果推断
ccm_YX = func