因果图模型入门:有向无环图(DAG)、节点与边、父子节点、后门路径与前门路径
说实话,因果推断入门最让我头疼的,就是这些图。但后来我发现,只要搞懂了这张图,整个因果推断的骨架就立起来了。今天咱们就来聊聊因果图模型——说白了,就是用一张图把变量之间的因果关系画出来。
为什么需要因果图?
我记得刚做数据分析那会儿,老板问我:「用户点击广告后购买商品,是不是广告的功劳?」我盯着数据表看了半天,相关性0.8,但直觉告诉我没那么简单。后来学了因果图,才明白这里面藏着混淆变量——比如用户本身就有购买意愿。
因果图的好处在于:
- 把复杂的因果关系可视化
- 帮我们识别哪些变量需要控制
- 避免「相关性不等于因果性」的坑
核心思想:因果图不是数据驱动的,而是基于领域知识构建的。你画错了图,后面的分析全是错的。
有向无环图(DAG)是什么?
DAG,全称Directed Acyclic Graph。翻译成人话就是:箭头有方向,且不能绕圈子的图。
我习惯把DAG想象成一个家族谱系图。爷爷生爸爸,爸爸生儿子,箭头从长辈指向晚辈。你不能说儿子生爸爸,对吧?这就是「无环」的含义——因果关系不能循环。
举个例子:
# 一个简单的DAG结构
# 天气 → 冰淇淋销量
# 天气 → 游泳人数
# 冰淇淋销量 → 溺水事件
# 游泳人数 → 溺水事件
这个图里,天气影响冰淇淋销量和游泳人数,两者又共同影响溺水事件。箭头都是单向的,没有回路。
注意:我曾经在项目里画了一个带环的图,结果模型怎么跑都不收敛。后来发现是变量定义出了问题——把「收入」和「消费」画成了互相影响,但实际上应该引入时间维度来打破循环。
节点与边:图的基本元素
节点(Node)就是变量,边(Edge)就是因果关系。就这么简单。
节点通常用圆圈表示,里面写上变量名。边用箭头表示,从原因指向结果。
我习惯把节点分成三类:
- 暴露变量:我们关心的原因(比如是否吃药)
- 结局变量:我们关心的结果(比如是否康复)
- 协变量:其他所有变量(比如年龄、性别)
边只有一种——有向边。但要注意,没有边的两个节点,意味着它们之间没有直接因果关系。这不代表它们不相关,只是没有直接因果。
小技巧:画图时,先把所有你认为可能有因果关系的变量列出来,然后逐一问自己:「X变了,Y会变吗?」如果会,就画箭头。如果不会,就不画。
父子节点:家族关系
在DAG里,父子节点的概念很直观:
- 父节点:指向某个节点的节点
- 子节点:被某个节点指向的节点
- 祖先节点:父节点的父节点……
- 后代节点:子节点的子节点……
举个例子:
# 节点关系示例
# 教育水平 → 收入 → 消费水平
# 教育水平是收入的父节点
# 收入是教育水平的子节点
# 教育水平是消费水平的祖先节点
# 消费水平是教育水平的后代节点
为什么要区分父子节点?因为后面我们要做「条件调整」——控制某些变量来估计因果效应。控制父节点和子节点,效果完全不同。
关键点:控制父节点可以阻断混杂偏倚,控制子节点反而会引入选择偏倚。这个坑我踩过,后面会细说。
后门路径与前门路径
这两个概念是因果推断的核心。说白了,它们描述了从原因到结果的两类路径。
后门路径
后门路径是指从原因到结果,但箭头指向原因(即从原因「背后」绕过去的路径)。
举个例子:
# 后门路径示例
# 年龄 → 吸烟 ← 基因
# 年龄 → 肺癌
# 从「吸烟」到「肺癌」有一条后门路径:
# 吸烟 ← 基因 → 肺癌
# 注意箭头方向:从吸烟出发,箭头指向吸烟(←),然后经过基因,再指向肺癌
后门路径会引入混杂偏倚。怎么处理?控制路径上的节点(比如基因)。这就是后门准则——通过控制足够多的变量来阻断所有后门路径。
避坑指南:我曾经以为控制越多变量越好,结果把后门路径上的中介变量也控制了,导致估计偏差。记住:只控制混淆变量,不要控制中介变量。
前门路径
前门路径是指从原因到结果,箭头指向结果(即从原因「前面」走的路径)。
举个例子:
# 前门路径示例
# 吸烟 → 焦油沉积 → 肺癌
# 从「吸烟」到「肺癌」有一条前门路径:
# 吸烟 → 焦油沉积 → 肺癌
# 箭头方向一致,从原因指向结果
前门路径通常是我们关心的因果路径。但有时候,前门路径上存在未观测的混淆变量,导致我们无法直接估计因果效应。这时候就需要前门准则——通过中介变量来间接估计。
个人经验:前门准则在实际项目中用得不多,因为需要满足很强的假设。我一般优先考虑后门准则,实在不行才用前门。
知识体系总览
下面这张图总结了本章的核心内容:
实战:如何画一个DAG?
说了这么多,咱们来动手画一个。假设我们要研究「运动对睡眠质量的影响」。
第一步:列出所有相关变量
- 运动量(暴露变量)
- 睡眠质量(结局变量)
- 年龄(协变量)
- 压力水平(协变量)
- 咖啡摄入量(协变量)
- 工作时间(协变量)
第二步:画出因果关系
# 运动对睡眠质量的DAG
# 年龄 → 运动量
# 年龄 → 睡眠质量
# 压力 → 运动量
# 压力 → 睡眠质量
# 咖啡 → 睡眠质量
# 工作时间 → 压力
# 运动量 → 睡眠质量(这是我们关心的因果效应)
第三步:识别后门路径
从「运动量」到「睡眠质量」的后门路径有:
- 运动量 ← 年龄 → 睡眠质量
- 运动量 ← 压力 → 睡眠质量
要估计运动对睡眠的因果效应,我们需要控制年龄和压力。咖啡和工作时间不需要控制,因为它们不是后门路径上的节点。
关键结论:控制年龄和压力后,运动对睡眠的因果效应就可以通过回归或匹配等方法估计了。
常见误区
我总结几个自己踩过的坑:
- 过度控制:把中介变量也控制了,导致估计偏差
- 遗漏混淆:没控制后门路径上的节点,导致混杂偏倚
- 方向画反:箭头方向画反了,整个图就废了
- 忽略对撞:对撞节点(两个箭头指向同一个节点)控制后反而引入偏倚
特别提醒:对撞节点是个大坑。我曾经控制了一个对撞节点,结果相关性符号都反了。记住:对撞节点不要控制,除非你有特殊理由。
好了,因果图模型入门就聊到这儿。画图是基本功,多练几次就熟了。下一章咱们聊聊如何用DAG做因果效应估计——那才是真正出活的地方。
练习建议:找一篇你感兴趣的因果推断论文,尝试画出它的DAG,然后识别后门路径。这是最好的学习方法。