第2章:因果图模型基础——有向无环图(DAG)

好,咱们进入因果推断的核心工具——因果图。说白了,因果图就是一张“谁影响了谁”的地图。我个人习惯用有向无环图(DAG)来画这张地图。为什么叫“有向无环”?因为因果关系是有方向的,而且不能循环——你不能既是因又是果,那逻辑就乱了。

2.1 节点与边的含义

在DAG里,每个节点代表一个变量。比如“是否吃药”、“是否康复”。边就是箭头,从原因指向结果。举个例子:

# 一个简单的DAG示例
# 吃药 → 康复
# 年龄 → 康复
# 年龄 → 吃药

这里“吃药”和“年龄”是父节点,“康复”是子节点。我在项目中遇到过一个问题:有人把“是否住院”也加进来,结果发现“住院”和“康复”之间既有箭头又有反向箭头——这就成环了,DAG不认。

核心要点:

  • 节点:变量,可以是连续型(如年龄)或离散型(如是否吸烟)
  • 有向边:箭头,表示因果关系方向
  • 无环:不能有A→B→C→A这样的循环

2.2 父子节点与后门路径

父节点就是直接指向某个节点的节点。子节点就是被指向的节点。比如在“吸烟→肺癌→死亡”这个链条里,“吸烟”是“肺癌”的父节点,“肺癌”是“死亡”的父节点。

后门路径是什么?我刚开始学的时候也觉得这名字怪。其实就是从原因到结果,中间有一条“非因果”的路径,但这条路径上混入了共同原因。比如:

# 后门路径示例
# 吸烟 → 肺癌
# 吸烟 ← 基因 → 肺癌

这里“吸烟”和“肺癌”之间有一条后门路径:吸烟 ← 基因 → 肺癌。基因同时影响吸烟行为和肺癌风险,这就产生了混杂偏倚。

避坑指南:我曾经在分析一个药物效果时,没注意“年龄”这个后门路径。结果发现药物效果被严重低估了——因为老年人更可能吃药,但老年人本身康复率低。后来我控制了年龄,效果才正常。

2.3 d-分离与条件独立性

d-分离是判断两个变量是否条件独立的核心工具。说白了,就是看两个节点之间的所有路径是否都被“阻断”了。

有三种阻断情况:

  1. 链式结构:A → B → C。如果控制B,A和C就独立了。
  2. 叉式结构:A ← B → C。如果控制B,A和C就独立了。
  3. 对撞结构:A → B ← C。如果不控制B,A和C独立;一旦控制B,A和C反而可能相关。

你想想看,第三种情况是不是很反直觉?我刚开始做项目时就被这个坑过。当时分析“运动”和“健康”的关系,发现控制“住院”后,运动和健康反而负相关了——因为住院的人往往身体更差,但住院前可能运动更多。

实用技巧:判断d-分离时,我习惯先画出所有路径,然后逐个检查每条路径是否被阻断。如果所有路径都被阻断,那这两个变量就是条件独立的。

2.4 知识体系总览

下面这张图是我自己总结的DAG知识体系,你可以把它当作学习地图:

因果图模型(DAG)知识体系 有向无环图(DAG) 节点与边 父子节点关系 后门路径 变量表示 因果关系方向 无环约束 父节点定义 子节点定义 祖先与后代 混杂路径识别 后门准则 前门路径 d-分离与条件独立性

2.5 实战:用DAG识别混杂变量

咱们来一个真实案例。假设你想研究“喝咖啡”对“心脏病”的影响。你收集了数据,发现喝咖啡的人心脏病发病率更低。但等等,是不是有其他因素在捣乱?

画个DAG看看:

# 可能的DAG结构
# 年龄 → 喝咖啡
# 年龄 → 心脏病
# 喝咖啡 → 心脏病
# 吸烟 → 心脏病
# 吸烟 → 喝咖啡

这里“年龄”和“吸烟”都是后门路径上的节点。如果不控制它们,你看到的“喝咖啡→心脏病”的效果就是有偏的。

d-分离判断:

  • 喝咖啡和心脏病之间有一条直接路径(喝咖啡→心脏病)
  • 还有两条后门路径:喝咖啡 ← 年龄 → 心脏病,喝咖啡 ← 吸烟 → 心脏病
  • 要阻断后门路径,需要控制年龄和吸烟
  • 控制后,喝咖啡和心脏病就条件独立了——这时估计的才是因果效应

嗯,这里要注意:控制变量不是越多越好。我曾经犯过一个错误,把“运动量”也控制了——结果发现运动量是喝咖啡影响心脏病的中间变量,控制它反而把因果效应的一部分给“控掉”了。

我的经验:画DAG时,先列出所有你认为相关的变量,然后逐个判断它们的位置。是混杂变量?是中间变量?还是对撞变量?位置不同,处理方式完全不同。

2.6 总结

DAG是因果推断的“地图”。没有地图,你就是在黑箱里瞎猜。有了DAG,你至少知道哪些变量该控制,哪些不该控制。我每次做因果分析,第一件事就是画DAG——哪怕只是草稿,也能帮我理清思路。

记住三个核心:节点代表变量,箭头代表因果方向,d-分离帮你判断独立性。把这三点吃透了,后面的因果效应估计就顺了。


公众号:蓝海资料掘金营,微信deep3321