PCMCI方法 (Peterson & Clark MCI)
定位: PCMCI是一种专为时间序列设计的因果发现算法,结合条件独立检验和滞后结构,能够同时识别滞后因果关系和同期因果关系,对时间滞后具有 agnostic 性质。
前置知识: PC算法、条件独立检验、时序因果图、Granger因果
核心直觉
核心直觉: 传统因果发现方法在时间序列上面临两大挑战:(1)时间顺序导致统计不稳定;(2)同期因果难以识别。PCMCI通过两阶段程序(条件搜索+条件独立检验)解决这些问题,同时允许时间滞后的灵活识别。
PCMCI的核心思想是将”发现条件集”和”因果检验”分离:第一阶段使用PC1算法发现最小条件集,第二阶段使用MCI进行精确的条件独立检验。这种分离提高了统计功效并减少了多重检验问题。
数学推导
1. PCMCI框架
PCMCI基于时序因果图模型:
- 节点:
- 边:
, 其中 表示同期因果
时间优先性约束: 原因必须先于结果。
2. 条件独立框架
定义时序父节点:
时序条件独立:
其中
的滞后(过去) - 可能的其他变量
3. PC1算法 (Conditioning Search)
PC1用于发现每个变量的候选条件集:
输入: 时序数据
输出: 父节点和子节点的估计集合
步骤:
对于每个变量 X_i:
初始化: PC1_i = {所有其他变量在所有滞后的并集}
对于 lag = 1 to tau_max:
对于每个候选条件 X_j(t-lag):
测试 X_i(t) ⊥ X_j(t-lag) | PC1_i \ {X_j(t-lag)}
若条件独立: 从PC1_i中移除X_j(t-lag)
PC1不直接定向边,而是给出条件集。
4. MCI算法 (Momentary Conditional Independence)
MCI进行精确的条件独立检验:
MCI统计量 (高斯数据):
其中
标准MCI (
同期MCI (
5. 条件集选择的关键创新
PCMCI使用超时条件集:
加上PC1发现的共父节点。
目的: 确保条件集不包含正在检验的因果效应的中介变量,避免过度控制。
6. p-value计算
MCI使用条件独立性检验:
对于高斯数据,偏相关系数:
对于非高斯数据,使用GPDC(Gaussian Process Django Regression)或CMI(条件互信息):
7. 时间滞后选择
PCMCI对时间滞后具有agnostic性,即不预设因果滞后期:
边际检验(不指定滞后期):
训练与估计
参数设置
| 参数 | 建议值 | 说明 |
|---|---|---|
| 5-10 | 最大滞后期 | |
| 0.01-0.05 | 显著性水平 | |
| pc_alpha | 0.01-0.05 | PC1条件集搜索的显著性水平 |
| sel_splits | 10 | 条件集选择的验证集分割数 |
数值稳定计算
def partial_correlation(x, y, z, data):
"""计算偏相关系数"""
from sklearn.linear_model import LinearRegression
# Residualize x and y on z
x_res = residualize(x, z, data)
y_res = residualize(y, z, data)
r, _ = pearsonr(x_res, y_res)
n = len(x_res)
t_stat = r * np.sqrt(n - len(z) - 2)
p_value = 2 * (1 - t_dist.cdf(abs(t_stat), df=n-len(z)-2))
return r, p_value计算复杂度
- PC1阶段:
- MCI阶段:
- 总体复杂度约为
推理/干预/反事实
从PCMCI结果进行推理
PCMCI输出时序CPDAG:
- 边标注为
,表示从 到 的因果 - 同期边(
)可能双向
干预效应计算
给定时序结构,do演算:
Granger因果与PCMCI关系
PCMCI是Granger因果的约束式推广:
- 若
对 有Granger因果,则PCMCI应检测到 - PCMCI允许非线性关系和条件依赖
优点与局限
优点
- 时间滞后agnostic: 不预设滞后期,自动发现因果滞后
- 同期因果识别: 可识别
的同期因果 - 统计功效高: PC1+MCI两阶段设计提高检验功效
- 处理复杂依赖: 使用条件集避免虚假因果
- 理论保证: 在忠诚性假设下一致估计
局限
- 计算复杂度: 随
和 指数增长 - 样本需求: 需要足够的时序样本(建议
) - 平稳性假设: 要求时间序列平稳(或差分后平稳)
- 参数敏感:
, 选择影响结果 - 只能处理有限滞后:
外的因果关系无法检测
与其他笔记的连接
- 前置: 时序因果图 → 本笔记PCMCI算法
- 对比: PC算法 → PCMCI时序扩展
- 基础: PC算法条件独立概念 → PCMCI中MCI
- 评测: 因果发现评测指标用于验证PCMCI性能
- 数据: 合成数据与基准用于测试PCMCI
可复现性说明
关键实现参数
def pcmci(data, tau_max=5, alpha=0.01, pc_alpha=0.01):
"""
PCMCI算法实现
参数:
- data: shape (T, p) 的时序数据
- tau_max: 最大滞后期
- alpha: MCI检验显著性水平
- pc_alpha: PC1条件集搜索水平
"""
T, p = data.shape
# 阶段1: PC1 - 条件集搜索
pc1_sets = pc1_conditioning_search(data, tau_max, pc_alpha)
# 阶段2: MCI - 条件独立检验
graph = {} # 存储边和滞后期
for i in range(p):
for j in range(p):
for tau in range(1, tau_max + 1):
# MCI检验
cond_set = get_mci_condition_set(i, j, tau, pc1_sets)
_, p_value = partial_correlation_test(
data[:, j], data[:, i], cond_set, data, tau
)
if p_value < alpha:
graph[(j, i, tau)] = {'causal': True, 'p_value': p_value}
# 同期因果检验
cond_set_0 = get_contemporaneous_condition_set(i, j, pc1_sets)
_, p_value = partial_correlation_test(
data[:, j], data[:, i], cond_set_0, data, 0
)
if p_value < alpha:
graph[(j, i, 0)] = {'causal': True, 'p_value': p_value}
return graph收敛性判断
- PC1阶段收敛: 连续两轮无变量被移除
- MCI阶段收敛: p-value分布稳定
章节总结
- PCMCI是专门为时间序列因果发现设计的约束式算法
- PC1阶段发现每个变量的候选条件集,MCI阶段进行精确的条件独立检验
- MCI检验使用偏相关系数(高斯)或条件互信息(非参数)
- 对时间滞后具有agnostic性,不预设因果滞后期
- 可识别同期因果(
),扩展了Granger因果 - 关键创新是”超时条件集”,避免过度控制中介变量
- 样本量需求较高(
),对非平稳数据需预处理 - 计算复杂度随
和条件集大小指数增长 - 输出时序CPDAG,支持干预分析和脉冲响应计算
- 是时序因果发现的主流方法之一,与其他方法(SLM, GCF)相比更通用
关键词: PCMCI, PC1, MCI, 时序因果, 条件独立, 同期因果, 时间滞后agnostic, Granger因果