causal_inference_tutorial

第三章:图模型与因果图

学习目标

本章将系统介绍因果图这一强大的因果推断工具。通过学习本章,你将:

  1. 掌握有向无环图(DAG)的基本概念和性质
  2. 理解并能够应用d-分离准则判断条件独立性
  3. 学会使用后门准则和前门准则识别因果效应
  4. 掌握构建因果图的实用方法和原则
  5. 能够将因果图应用于实际问题的分析和解决

因果图为我们提供了一种直观而严格的方式来表示和推理因果关系。与纯粹的统计模型不同,因果图明确地编码了我们对数据生成过程的假设,使得因果推断变得透明和可验证。

1. 有向无环图(DAG)基础

1.1 图的基本概念

有向无环图(Directed Acyclic Graph, DAG)是因果推断中最重要的工具之一。一个DAG由以下元素组成:

重要性质:

1.2 因果关系的图形表示

在因果图中,每条有向边$X \rightarrow Y$表示$X$对$Y$有直接因果效应。这种表示基于以下假设:

马尔可夫假设:给定其父节点,每个节点独立于其非后代节点。数学表示为: \(X \perp\!\!\!\perp \text{NonDescendants}(X) \mid PA(X)\)

这个假设允许我们将联合分布分解为: \(P(X_1, X_2, ..., X_n) = \prod_{i=1}^{n} P(X_i \mid PA(X_i))\)

1.3 三种基本结构

因果图中有三种基本的三节点结构,理解这些结构是掌握d-分离的基础:

链结构(Chain)

X → Z → Y

叉结构(Fork)

X ← Z → Y

对撞结构(Collider/V-structure)

X → Z ← Y

对撞偏差示例: 考虑”才华”和”外貌”对”被录取”的影响。才华和外貌可能独立,但在被录取的人群中,才华和外貌往往呈负相关(如果才华不够,外貌可能更好,反之亦然)。

2. d-分离准则

2.1 路径阻断规则

d-分离(d-separation)是判断DAG中条件独立性的图形准则。给定条件集Z,从X到Y的路径被阻断当且仅当:

  1. 路径包含链结构或叉结构,且中间节点在Z中
  2. 路径包含对撞结构,且对撞节点及其所有后代都不在Z中

如果X到Y的所有路径都被Z阻断,则称X和Y被Z d-分离,记为: \(X \perp_d Y \mid Z\)

2.2 d-分离的形式化定义

定义:在DAG G中,节点集X和Y被节点集Z d-分离,当且仅当X中任意节点到Y中任意节点的所有路径都被Z阻断。

定理(全局马尔可夫性):如果X和Y被Z在DAG G中d-分离,则在任何与G兼容的分布P中,X和Y给定Z条件独立: \(X \perp_d Y \mid Z \text{ in } G \Rightarrow X \perp\!\!\!\perp Y \mid Z \text{ in } P\)

2.3 d-分离算法

判断X和Y是否被Z d-分离的算法:

  1. 构造祖先图:找出X、Y、Z的所有祖先节点
  2. 道义化:将所有指向同一节点的父节点两两连接(无向边)
  3. 删除方向:将所有有向边转为无向边
  4. 删除Z节点:从图中删除Z中的所有节点及其相连的边
  5. 检查连通性:如果X和Y在剩余图中不连通,则d-分离成立

2.4 实际应用示例

考虑以下医疗诊断场景:

吸烟 → 肺癌 → 呼吸困难
  ↓        ↑
基因 → 心脏病 → 胸痛

问题:给定肺癌,吸烟和呼吸困难是否独立?

3. 后门准则与前门准则

3.1 后门路径与混杂

后门路径:从处理变量T到结果变量Y的路径,其第一条边指向T(即以←开始的路径)。

后门路径产生混杂偏差,因为它们代表了T和Y之间的非因果关联。例如:

混杂因素Z
    ↙    ↘
   T  →   Y

这里,路径T ← Z → Y是一条后门路径,如果不控制Z,会产生混杂偏差。

3.2 后门准则(Backdoor Criterion)

定义:给定DAG G中的有序变量对(T, Y),变量集Z满足后门准则当且仅当:

  1. Z不包含T的后代节点
  2. Z阻断了T和Y之间的所有后门路径

后门调整公式:如果Z满足后门准则,则因果效应可以通过以下公式识别:

\[P(Y \mid do(T=t)) = \sum_z P(Y \mid T=t, Z=z) P(Z=z)\]

或对于连续变量:

\[P(Y \mid do(T=t)) = \int P(Y \mid T=t, Z=z) P(Z=z) dz\]

平均因果效应(ACE):

\[\text{ACE} = E[Y \mid do(T=1)] - E[Y \mid do(T=0)]\]

3.3 寻找有效调整集

并非所有变量集都适合调整。选择调整集的原则:

  1. 充分性:必须阻断所有后门路径
  2. 最小性:避免不必要的调整(降低效率)
  3. 避免坏控制
    • 不要控制T的后代(阻断因果路径)
    • 不要控制对撞节点(打开新的路径)
    • 不要控制中介变量(如果关注总效应)

示例

    U₁ → Z₁ → Y
     ↓    ↓    ↑
     T → Z₂ → Z₃

3.4 前门准则(Front-door Criterion)

当所有后门路径都包含不可观测变量时,后门准则失效。前门准则提供了另一种识别策略。

定义:变量集M满足(T, Y)的前门准则当且仅当:

  1. M截断所有从T到Y的有向路径
  2. T到M的所有后门路径被阻断
  3. M到Y的所有后门路径被T阻断

前门调整公式

\[P(Y \mid do(T=t)) = \sum_m P(M=m \mid T=t) \sum_{t'} P(Y \mid M=m, T=t') P(T=t')\]

经典示例:吸烟与肺癌

基因(U,不可观测)
    ↙        ↘
吸烟(T) → 焦油(M) → 肺癌(Y)

3.5 准则的比较与选择

特性 后门准则 前门准则
适用条件 存在可观测的阻断后门路径的变量 存在完全中介路径
所需变量 混杂因素 中介变量
识别公式复杂度 简单 复杂
实践应用 更常见 较少见
数据需求 较少 较多

4. 因果图的构建方法

4.1 基于领域知识的构建

构建因果图的第一步是利用领域专家知识:

  1. 识别关键变量:列出所有相关变量
  2. 确定时间顺序:后发生的事件不能导致先发生的事件
  3. 考虑直接因果:对每对变量,判断是否存在直接因果关系
  4. 识别共同原因:寻找可能同时影响多个变量的因素
  5. 检查完整性:考虑是否遗漏重要的混杂因素

4.2 时间顺序原则

时间顺序提供了因果方向的强约束:

时间t₁: 教育水平
    ↓
时间t₂: 工作经验
    ↓
时间t₃: 当前收入

注意事项:

4.3 迭代改进方法

因果图构建是迭代过程:

  1. 初始草图:基于领域知识绘制初始DAG
  2. 测试含义:列出DAG隐含的条件独立性
  3. 数据验证:用数据检验这些独立性
  4. 修正调整
    • 如果独立性不成立,考虑添加边
    • 如果发现意外独立性,考虑删除边
    • 考虑潜在混杂因素
  5. 敏感性分析:评估不同DAG结构对结论的影响

4.4 常见模式与结构

仪器变量模式

Z → T → Y
    ↑
    U(不可观测)

时变处理模式

L₁ → T₁ → L₂ → T₂ → Y
 ↘         ↗ ↘        ↗
   ↘     ↗     ↘    ↗
     ↘ ↗         ↘↗

选择偏差模式

T → Y
 ↘ ↗
  S(样本选择)

5. 行业案例:阿里巴巴广告归因模型的因果图设计

5.1 业务背景

阿里巴巴的广告系统需要准确评估不同广告渠道对最终转化的因果效应。挑战在于:

  1. 多触点归因:用户在购买前可能接触多个广告
  2. 选择偏差:不同用户群体倾向于使用不同渠道
  3. 时间动态:广告效果随时间衰减
  4. 溢出效应:一个渠道的广告可能影响其他渠道的效果

5.2 因果图构建

阿里巴巴的数据科学团队构建了如下因果图:

用户特征(U) → 搜索广告曝光(S) → 点击(C₁) → 加购物车(A)
    ↓           ↓                     ↓          ↓
历史行为(H) → 推荐广告曝光(R) → 点击(C₂) → 购买(Y)
    ↓           ↓                     ↓          ↑
    └──────→ 直通车广告(D) ────→ 点击(C₃) ───┘

关键变量:

5.3 因果识别策略

挑战1:用户特征的混杂

挑战2:历史行为的时变混杂

挑战3:广告间的竞争效应

5.4 实施方案

  1. 数据收集
    # 伪代码展示数据结构
    user_features = ['age', 'gender', 'tier_city', 'purchase_power']
    ad_exposures = ['search_ad', 'recommend_ad', 'p4p_ad']
    outcomes = ['click', 'add_cart', 'purchase']
    
  2. 因果效应估计
    • 使用倾向得分匹配控制用户特征
    • 应用工具变量处理未观测混杂
    • 时间序列方法评估动态效应
  3. 业务洞察
    • 搜索广告对高意向用户效果最好(直接效应强)
    • 推荐广告创造需求(通过影响浏览行为的间接效应)
    • 直通车广告的效果依赖于商品质量(异质性效应)

5.5 成果与影响

通过因果图分析,阿里巴巴实现了:

  1. 归因准确性提升30%:相比简单的最后点击归因
  2. ROI优化:识别真正有效的广告渠道
  3. 预算分配优化:基于因果效应而非相关性分配预算
  4. 个性化投放:针对不同用户群体的异质性效应优化

本章小结

本章介绍了因果图这一强大的因果推断工具。关键要点:

核心概念

  1. DAG基础:节点表示变量,有向边表示直接因果关系,无环性保证时间一致性
  2. 三种基本结构:链(间接效应)、叉(共同原因)、对撞(共同结果)
  3. d-分离准则:判断条件独立性的图形化方法

关键公式

实践要点

  1. 因果图使假设透明化,便于交流和验证
  2. 后门准则是最常用的识别策略
  3. 构建因果图需要领域知识和数据验证的结合
  4. 正确的因果图是有效因果推断的基础

练习题

练习3.1:基础概念理解

考虑以下因果图:

A → B → C
↓       ↑
D → E → F

判断以下条件独立性是否成立:

  1. A ⊥ C B
  2. A ⊥ F E
  3. B ⊥ E A
  4. C ⊥ D {B, E}

提示:对每个独立性声明,找出所有路径并检查是否被条件集阻断。

答案 1. A ⊥ C | B:**成立**。路径A→B→C被B阻断(链结构)。 2. A ⊥ F | E:**不成立**。路径A→D→E→F中,E只阻断E→F部分,A→D→E未被阻断。 3. B ⊥ E | A:**不成立**。路径B←A→D→E中,A是叉结构的中心,但D→E部分未被阻断。 4. C ⊥ D | {B, E}:**成立**。路径C←B←A→D被B阻断,路径C←E←D被E阻断。

练习3.2:d-分离应用

给定因果图:

    U(不可观测)
    ↙    ↘
   X  →  M  →  Y
    ↘        ↗
      Z ───┘

其中U是不可观测变量。判断X和Y是否可以通过以下变量集d-分离:

  1. Z = {M}
  2. Z = {Z}
  3. Z = {M, Z}
  4. Z = ∅

提示:注意U是不可观测的,不能被包含在条件集中。

答案 分析所有X到Y的路径: - 路径1:X → M → Y - 路径2:X → Z → Y - 路径3:X ← U → Y(后门路径) 1. Z = {M}:**不d-分离**。路径1被阻断,但路径2和3未被阻断。 2. Z = {Z}:**不d-分离**。路径2被阻断,但路径1和3未被阻断。 3. Z = {M, Z}:**不d-分离**。路径1和2被阻断,但路径3(X ← U → Y)无法阻断因为U不可观测。 4. Z = ∅:**不d-分离**。存在未阻断的路径。 结论:由于存在不可观测的混杂U,X和Y无法被任何可观测变量集d-分离。

练习3.3:后门准则识别

对于处理T和结果Y,考虑以下因果图:

L₁ → L₂ → Y
↓  ↗  ↓    ↑
T ──→ M ──┘

找出所有满足后门准则的最小调整集。

提示:首先识别所有后门路径,然后找出能阻断这些路径的最小变量集。

答案 后门路径分析: 1. T ← L₁ → L₂ → Y 2. T ← L₁ → L₂ → M → Y 检查可能的调整集: - {L₁}:阻断两条后门路径(在叉结构处),满足后门准则 - {L₂}:L₂是T的后代(通过T→M←L₂),不满足条件1 - {M}:M是T的后代,不满足条件1 - {L₁, L₂}:L₂是T的后代,不满足条件1 **最小满足后门准则的调整集:{L₁}**

练习3.4:前门准则应用(挑战题)

某研究想评估教育(E)对收入(I)的因果效应,但存在不可观测的能力(A)同时影响两者:

能力A(不可观测)
    ↙        ↘
教育E → 职业O → 收入I

假设职业O完全中介了教育对收入的影响。验证O是否满足前门准则,如果满足,写出识别公式。

提示:逐条检查前门准则的三个条件。

答案 检查前门准则的三个条件: 1. **O截断所有E到I的有向路径**: - 唯一有向路径:E → O → I - O在此路径上,满足✓ 2. **E到O的所有后门路径被阻断**: - 不存在E到O的后门路径(A不直接影响O) - 满足✓ 3. **O到I的所有后门路径被E阻断**: - 后门路径:O ← E ← A → I - 给定E,此路径被阻断(链结构) - 满足✓ **结论**:O满足前门准则。 识别公式: $$P(I \mid do(E=e)) = \sum_o P(O=o \mid E=e) \sum_{e'} P(I \mid O=o, E=e') P(E=e')$$

练习3.5:构建因果图(开放题)

为以下场景构建合理的因果图:

一个在线教育平台想评估”视频质量”对”完课率”的影响。已知因素包括:

构建因果图并识别评估”视频质量→完课率”因果效应时需要控制的变量。

提示:考虑时间顺序、直接/间接效应、可能的混杂因素。

参考答案 合理的因果图: ``` 学生特征 → 课程选择 ↓ ↓ ↓ 课程难度 ↓ ↙ ↘ 学习时长 视频质量 ↓ ↘ ↓ ↓ 完课率 ↓ ↓ └────→ 课程评分 ``` 分析: 1. **混杂因素**: - 课程难度(影响视频质量投入和完课率) - 学生特征(影响学习投入和完成能力) 2. **中介变量**: - 学习时长(部分中介视频质量的效果) 3. **后门路径**: - 视频质量 ← 课程难度 → 完课率 - 视频质量 ← 课程难度 ← 学生特征 → 学习时长 → 完课率 4. **调整策略**: - 如果关注总效应:控制{课程难度, 学生特征} - 如果关注直接效应:还需控制学习时长 注意:这只是一个可能的答案,实际因果图取决于领域知识和数据验证。

练习3.6:对撞偏差识别(挑战题)

某公司分析发现,在其高管群体中,技术能力和沟通能力呈负相关。给出可能的因果图解释,并说明这是否意味着提升技术能力会降低沟通能力。

提示:考虑选择偏差和对撞结构。

答案 因果图解释: ``` 技术能力 → 晋升为高管 ← 沟通能力 (T) (H) (C) ``` 这是典型的对撞偏差(选择偏差): 1. **机制**: - 技术能力和沟通能力可能本来独立 - 两者都能促进晋升为高管 - 在高管样本中观察,产生虚假负相关 2. **数学解释**: - P(T, C):总体中T和C独立 - P(T, C | H=1):给定是高管,T和C负相关 - 原因:如果某高管技术能力较弱,其沟通能力必须更强才能晋升 3. **因果推断**: - 这种负相关不是因果关系 - 提升技术能力不会降低沟通能力 - 这是条件在共同结果上导致的统计假象 4. **实践启示**: - 不能基于高管样本推断技术训练会损害沟通能力 - 评估训练效果需要实验或使用全员数据 - 注意样本选择导致的偏差

练习3.7:综合应用题

某电商平台有如下业务逻辑:

  1. 绘制因果图
  2. 识别”推荐算法→购买”的所有路径
  3. 确定评估推荐算法效果的识别策略

提示:注意区分总效应和直接效应。

答案 1. **因果图**: ``` 购买意图U(不可观测) ↓ ↓ 用户画像P → 推荐算法R → 商品曝光E → 点击C → 购买Y ↓ ↑ ↗ ↗ └─────────────────────────────────────→ 价格Pr ────────→ ``` 2. **R到Y的所有路径**: - 有向路径:R → E → C → Y(主要因果路径) - 后门路径1:R ← P → Y - 后门路径2:R ← P ← U → Y 3. **识别策略**: **总效应识别**: - 需要阻断后门路径 - 用户画像P满足后门准则(阻断两条后门路径) - 调整公式:E[Y|do(R=r)] = Σₚ P(Y|R=r,P=p)P(P=p) **直接效应识别**: - 如果还想分解为直接和间接效应 - 需要前门准则或中介分析 - 曝光E和点击C构成中介路径 **实践建议**: - A/B测试:随机分配推荐算法(打破R←P) - 倾向得分:基于用户画像匹配 - 工具变量:利用算法更新时间等外生变化

练习3.8:算法设计题(挑战题)

设计一个算法,给定DAG和两个节点集合X、Y以及条件集Z,判断X和Y是否被Z d-分离。写出伪代码。

提示:可以使用图的遍历算法,注意对撞节点的特殊处理。

答案 ```python def is_d_separated(dag, X, Y, Z): """ 判断在DAG中X和Y是否被Z d-分离 算法思路: 1. 构建道德图(moralized graph) 2. 删除Z中的节点 3. 检查X和Y的连通性 """ # Step 1: 找出祖先集合 ancestors = find_ancestors(dag, X ∪ Y ∪ Z) # Step 2: 构建祖先子图 ancestral_graph = induced_subgraph(dag, ancestors) # Step 3: 道德化(连接共同子节点的父节点) moral_graph = moralize(ancestral_graph) # Step 4: 转为无向图 undirected = make_undirected(moral_graph) # Step 5: 删除Z节点 remaining = remove_nodes(undirected, Z) # Step 6: 检查连通性 return not is_connected(remaining, X, Y) def find_ancestors(dag, nodes): """找出节点集的所有祖先""" ancestors = set(nodes) changed = True while changed: changed = False for node in list(ancestors): parents = dag.parents(node) for p in parents: if p not in ancestors: ancestors.add(p) changed = True return ancestors def moralize(dag): """道德化:连接共同子节点的父节点""" moral = dag.copy() for node in dag.nodes(): parents = dag.parents(node) # 将所有父节点两两连接 for p1 in parents: for p2 in parents: if p1 != p2: moral.add_edge(p1, p2) return moral # 时间复杂度:O(n³),其中n是节点数 # 空间复杂度:O(n²) ```

常见陷阱与错误

1. 混淆相关与因果

错误:观察到两个变量相关就假设存在因果关系。 示例:冰淇淋销量与溺水事件相关,但两者都是由温度(共同原因)导致。 正确做法:构建包含所有相关变量的因果图,识别真正的因果路径。

2. 对撞节点的错误处理

错误:不加区分地控制所有”可能的混杂因素”。 示例

才华 → 成功 ← 运气

控制”成功”会在”才华”和”运气”间产生虚假相关。 正确做法:识别对撞节点,避免不必要的条件化。

3. 忽视选择偏差

错误:基于特定样本得出普遍因果结论。 示例:只分析存活公司的成功因素(幸存者偏差)。 正确做法:检查样本选择机制,在因果图中明确表示选择过程。

4. 过度调整(Over-adjustment)

错误:控制处理变量的后代节点。 示例:评估教育对收入的影响时控制职业(中介变量)。 后果:阻断了部分或全部因果效应。 正确做法:区分总效应和直接效应,明确研究目标。

5. 调整不足(Under-adjustment)

错误:遗漏重要的混杂因素。 示例:评估药物效果时未控制患者病情严重程度。 后果:估计偏差,可能得出错误结论。 正确做法:仔细考虑所有可能的后门路径。

6. 错误的时间顺序

错误:让后发生的事件影响先发生的事件。 示例:让”治疗效果”影响”基线特征”。 正确做法:严格遵循时间顺序,使用动态因果模型处理反馈。

7. 混淆条件独立与边际独立

错误:认为边际独立的变量在任何条件下都独立。 示例:对撞结构中,X和Y边际独立但给定Z不独立。 正确做法:使用d-分离准则系统判断条件独立性。

8. 忽视未观测混杂

错误:假设所有混杂因素都可观测。 示例:遗传因素、个人能力等往往不可直接测量。 正确做法

9. 循环因果的处理不当

错误:在静态DAG中表示反馈循环。 示例:价格影响需求,需求又影响价格。 正确做法:使用时间索引展开循环,或使用动态因果模型。

10. 数据驱动的因果图构建

错误:完全基于数据相关性构建因果图。 问题:相关性无法确定因果方向。 正确做法:结合领域知识、时间顺序和数据验证。

最佳实践检查清单

因果图构建阶段

因果识别阶段

分析验证阶段

结果解释阶段

工具使用建议


通过本章的学习,你应该已经掌握了因果图这一强大工具。因果图不仅帮助我们清晰地表达因果假设,还提供了系统的方法来识别因果效应。在下一章中,我们将学习如何通过随机实验来验证这些因果关系。