因果图模型基础:DAG、马尔可夫等价类与因果充分性
各位同学,咱们今天聊点硬核的。因果推断里,图模型是绕不开的基石。说白了,你要想从数据里挖出因果关系,就得先搞清楚这些图到底长什么样、有什么脾气。
我个人习惯把因果图模型比作一张「交通地图」。变量是城市,箭头是高速公路。但这条路上跑的不是车,是因果效应。嗯,咱们先从最基础的概念说起。
有向无环图(DAG)
DAG,全称 Directed Acyclic Graph。翻译过来就是「有方向、没环路的图」。为什么不能有环?你想想看,如果 A 导致 B,B 又导致 A,那到底谁先谁后?这在因果世界里是说不通的。时间不能倒流,原因必须在结果之前。
一个标准的 DAG 由两部分组成:
- 节点(Node):代表变量,比如 X、Y、Z
- 有向边(Directed Edge):箭头,表示因果方向,比如 X → Y
举个例子,我去年做过一个电商用户留存的项目。我们画了这么一张图:
# 一个简单的 DAG 示例
# 用户活跃度 → 购买频次 → 留存率
# ↑ ↑
# 推送次数 优惠券发放
# 用 Python 的 networkx 表示
import networkx as nx
dag = nx.DiGraph()
dag.add_edges_from([
('推送次数', '用户活跃度'),
('用户活跃度', '购买频次'),
('优惠券发放', '购买频次'),
('购买频次', '留存率')
])
这里要注意,DAG 不允许出现类似「推送次数 → 用户活跃度 → 推送次数」这样的闭环。一旦出现,你的因果推断就全乱了。
马尔可夫等价类
好,现在问题来了。你从数据里学到的 DAG,真的是唯一的吗?
答案是否定的。不同的 DAG 可能生成完全相同的概率分布。这些 DAG 就属于同一个「马尔可夫等价类」。说白了,光靠数据你分不清它们谁是谁。
举个例子,下面三个 DAG 在统计上是等价的:
# 三个马尔可夫等价的 DAG
# 1. X → Y → Z
# 2. X ← Y → Z
# 3. X ← Y ← Z
# 它们都编码了同一个条件独立性:
# X ⊥ Z | Y
为什么会这样?因为这三个图都表达了「给定 Y 时,X 和 Z 独立」。你从数据里只能学到这个独立性,但无法判断箭头的方向。
我记得有一次做基因调控网络分析,数据量很大,但跑出来的结果是一堆等价类。当时我对着屏幕发愁,后来加了干预数据才把方向定下来。嗯,这就是等价类的现实意义——它告诉你哪些方向是「不确定的」。
因果充分性假设
这个假设听起来有点绕,其实很简单:
你观测到的所有变量,已经包含了所有共同的因果原因。
换句话说,没有遗漏的混淆变量。如果漏了,你的因果图就是错的。
举个例子,假设你想研究「运动量」和「睡眠质量」的关系。你画了这么个 DAG:
# 不满足因果充分性的 DAG
# 运动量 → 睡眠质量
#
# 实际上,还有一个隐藏变量:
# 压力水平 → 运动量
# 压力水平 → 睡眠质量
#
# 如果你没观测到「压力水平」,那运动量和睡眠质量之间的相关性就是虚假的。
我在实际项目中遇到过这种情况。有一次做用户行为分析,发现「登录次数」和「付费金额」强相关。我差点就画了个箭头从登录到付费。后来仔细一想,其实有个隐藏变量「用户粘性」同时影响了这两个。这就是因果充分性被破坏的典型案例。
知识体系总览
下面这张图是我自己画的,把这三个概念串起来了。你一看就明白它们之间的关系:
三个概念的关系
你可能会问,这三个东西到底怎么串起来的?我简单总结一下:
- DAG 是因果图的基本形式。没有它,后面的所有分析都无从谈起。
- 马尔可夫等价类 是 DAG 的「模糊版本」。它告诉你哪些方向是数据无法区分的。
- 因果充分性假设 是因果发现的「入场券」。不满足这个假设,你画出来的 DAG 就是错的。
说白了,你要先假设「没有遗漏变量」,然后用数据去学 DAG,最后接受你只能学到等价类这个事实。嗯,这就是因果发现的现实。
好了,这一章的内容就到这里。下一章咱们聊聊因果发现算法的分类,看看哪些算法能帮你从数据里「挖」出这些图。