PCMCI方法 (Peterson & Clark MCI)

定位: PCMCI是一种专为时间序列设计的因果发现算法,结合条件独立检验和滞后结构,能够同时识别滞后因果关系和同期因果关系,对时间滞后具有 agnostic 性质。

前置知识: PC算法、条件独立检验、时序因果图、Granger因果


核心直觉

核心直觉: 传统因果发现方法在时间序列上面临两大挑战:(1)时间顺序导致统计不稳定;(2)同期因果难以识别。PCMCI通过两阶段程序(条件搜索+条件独立检验)解决这些问题,同时允许时间滞后的灵活识别。

PCMCI的核心思想是将”发现条件集”和”因果检验”分离:第一阶段使用PC1算法发现最小条件集,第二阶段使用MCI进行精确的条件独立检验。这种分离提高了统计功效并减少了多重检验问题。


数学推导

1. PCMCI框架

PCMCI基于时序因果图模型:

  • 节点:
  • 边: , 其中
  • 表示同期因果

时间优先性约束: 原因必须先于结果。

2. 条件独立框架

定义时序父节点:

时序条件独立:

其中为条件集,包含:

  • 的滞后(过去)
  • 可能的其他变量

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_alpha0.01-0.05PC1条件集搜索的显著性水平
sel_splits10条件集选择的验证集分割数

数值稳定计算

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允许非线性关系和条件依赖

优点与局限

优点

  1. 时间滞后agnostic: 不预设滞后期,自动发现因果滞后
  2. 同期因果识别: 可识别的同期因果
  3. 统计功效高: PC1+MCI两阶段设计提高检验功效
  4. 处理复杂依赖: 使用条件集避免虚假因果
  5. 理论保证: 在忠诚性假设下一致估计

局限

  1. 计算复杂度: 随指数增长
  2. 样本需求: 需要足够的时序样本(建议)
  3. 平稳性假设: 要求时间序列平稳(或差分后平稳)
  4. 参数敏感: , 选择影响结果
  5. 只能处理有限滞后: 外的因果关系无法检测

与其他笔记的连接

  • 前置: 时序因果图 → 本笔记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因果