时序因果图 (Temporal Causal Graphs)
定位: 时序因果图是因果发现方法在时间序列数据上的扩展,通过将时间滞后信息编码为图节点,利用Granger因果检验或结构方程模型来识别变量间的时序因果关系。
前置知识: 因果发现基础(PC/GES)、时间序列分析(VAR)、条件概率、条件独立
核心直觉
核心直觉: 在时间序列中,“因果”意味着过去的事件可以帮助预测未来的事件。将时间滞后嵌入变量可以自然地将时序问题转化为静态因果发现问题,但需要特别处理时间优先性和同期因果关系。
Granger因果的核心思想是:若变量
数学推导
1. 滞后嵌入 (Lag Embedding)
将时间序列扩展为滞后变量向量:
其中:
: 原始变量数 : 最大滞后期 - 嵌入后维度:
时间因果图结构:
表示 在 时刻影响 在 时刻 - 时间优先性约束: 只允许
, 即过去不能依赖未来
2. Granger因果定义
二元Granger因果:
变量
其中:
: 的过去信息集 : 给定 和 时 的预测误差方差 : 仅给定 时 的预测误差方差
条件Granger因果:
控制其他变量
其中
3. 向量自回归(VAR)模型
VAR模型是时序因果发现的基础框架:
其中:
: 时刻的变量向量 : 滞后 的系数矩阵 : 白噪声
系数矩阵解释:
: 控制其他滞后变量后, 对 的直接影响 暗示时序因果关系
4. 滞后结构矩阵
定义滞后结构矩阵
: 存在 的时序因果路径 : 不存在 的直接时序因果
5. 同期因果 (Contemporaneous Causation)
在时间序列中,同期因果(
识别条件:
其中
同期边的定向问题:
在同一时间步,方向不确定- 需要额外假设(如时间优先性在样本内不可区分)
6. 时序DAG的性质
时序因果图必须满足时间优先性:
即过去节点不能有指向未来节点的边。
训练与估计
VAR模型估计
最小二乘法(OLS):
Granger因果检验
F检验:
检验统计量:
其中:
: 仅用 的过去预测 : 用 和 的过去预测
计算复杂度
- VAR估计:
- Granger检验:
- 时序PC算法:
推理/干预/反事实
脉冲响应函数
时序因果图允许计算脉冲响应:
累积脉冲响应:
干预分析
时序DAG中的do演算:
优点与局限
优点
- 时间优先性: 自然的因果先后顺序
- 可解释性: 滞后结构有明确的时间含义
- 与静态方法统一: 可转化为滞后变量的静态问题
局限
- 维度爆炸:
增大会导致维度大幅增加 - 平稳性假设: VAR要求时间序列平稳
- 同期因果不定向:
方向不确定 - 计算复杂度: 随滞后期指数增长
与其他笔记的连接
- 前置: 因果发现基础 → 本笔记时序扩展
- 方法: PCMCI是处理时序因果的专门算法
- 延伸: 时序因果图可进一步扩展到功能因果发现
- 评测: 因果发现评测指标用于评估时序因果发现性能
可复现性说明
关键参数
| 参数 | 建议值 | 说明 |
|---|---|---|
| 3-10 | 最大滞后期,平衡复杂度与信息 | |
| 平稳性检验 | ADF/KPSS | 确保VAR适用性 |
| 显著性水平 | 0.05 | Granger因果检验水平 |
| 模型选择 | BIC/AIC | VAR滞后阶数选择 |
Python实现
import numpy as np
from statsmodels.tsa.api import VAR
def granger_causality(y, x, max_lag=5):
"""检验X是否Granger-导致Y"""
model = VAR(np.hstack([y, x]))
# 无限制模型: Y ~ past(Y), past(X)
res_unrestricted = model.fit(maxlags=max_lag, verbose=False)
# 限制模型: Y ~ past(Y)
y_only = y
model_restricted = VAR(y_only)
res_restricted = model_restricted.fit(maxlags=max_lag, verbose=False)
# F检验
ssr_unres = res_unrestricted.ssr
ssr_res = res_restricted.ssr
n = len(y)
k = x.shape[1]
F = ((ssr_res - ssr_unres) / k) / (ssr_unres / (n - max_lag * (y.shape[1] + x.shape[1]) - 1))
from scipy.stats import f
p_value = 1 - f.cdf(F, k, n - max_lag * (y.shape[1] + x.shape[1]) - 1)
return F, p_value
def build_temporal_graph(data, tau_max=3, alpha=0.05):
"""构建时序因果图"""
n_vars = data.shape[1]
temporal_adj = np.zeros((n_vars * (tau_max + 1), n_vars * (tau_max + 1)))
for i in range(n_vars):
for j in range(n_vars):
if i != j:
F, p = granger_causality(data[:, i], data[:, j], max_lag=tau_max)
if p < alpha:
# j Granger-导致 i
temporal_adj[j, i] = 1
return temporal_adj章节总结
- 时序因果图通过滞后嵌入将时间序列转化为扩展变量集,应用静态因果发现方法
- Granger因果定义: X Granger-导致Y若X的过去有助于预测Y的未来,超过Y自身过去的贡献
- VAR模型是时序因果的基础框架,系数矩阵
编码滞后因果关系 - 时间优先性约束确保因果方向与时间顺序一致
- 同期因果(
时刻)需要特殊处理,因为在样本内无法区分方向 - 滞后结构矩阵
综合了多滞后的因果效应 - VAR要求时间序列平稳,非平稳需差分或使用协整模型
- 最大滞后期
选择是关键:太小遗漏信息,太大维度爆炸 - F检验用于Granger因果显著性判断,是时序条件独立检验的特例
- 与PCMCI结合可处理更复杂的时序因果结构
关键词: 时序因果图, Granger因果, VAR模型, 滞后嵌入, 同期因果, 时间优先性, 脉冲响应