上一章看到了一个事实:接受 RHC 的病人 180 天死亡率高出未接受组 6 个百分点。但这个差距几乎全部来自基线差异,病情重的人更容易被安排上导管,也更容易死亡。RHC 本身是否有害、有益、还是没有作用,光看原始数据分不清。本章要做的是搭建回答这个问题所需要的理论框架:什么叫"因果效应"、它跟数据里直接算出来的差距有什么区别、从观察数据里"识别"因果效应需要满足哪些条件。框架搭好之后,第 3 章开始一种方法接一种方法地在 RHC 数据上动手。
潜在结果:因果推断的语言
讨论因果效应之前要先解决一个语言问题:怎么在数学上把"如果这个病人没有接受 RHC,他会怎样"这件事写下来。
先看一个具体的人。张三今年 68 岁,因为感染性休克住进了 ICU,APACHE 评分 72 分,属于中度危重。医生决定给他插右心导管。180 天后,张三死亡了。这是观察到的事实。但如果当初医生没有给张三插管呢?也许他同样会死亡,也许他反而能活下来。问题是张三只走了"插管"这一条路,"不插管"那条路上会发生什么,永远不知道。
日常用语里说"如果当初没做 X,结果会不会不同",这是一个反事实的陈述,发生过的事情不能倒带重来。统计学需要一套符号把这种反事实的想法变成可以操作的对象,这套符号叫潜在结果框架,由 Rubin 在 1974 年系统提出,后来被 Holland 进一步阐述并命名为"Rubin 因果模型"。
对于个体 ,定义两个潜在结果: 是个体 接受处理时的结果, 是个体 不接受处理时的结果。在 RHC 的场景下, 是"这个病人如果被插了右心导管,180 天内是否死亡", 是"这个病人如果没有被插右心导管,180 天内是否死亡"。
(Rubin 1974)
停下来想一想。 回到张三:他插了管,180 天后死亡,所以他的 。但他的 是多少?如果不插管,他 180 天后是死还是活?这个数字永远不知道,因为张三已经走了"插管"这条路。
潜在结果这个词里最要紧的是"潜在"两个字。对任何一个真实的病人,只能观察到其中一个结果。如果他实际接受了 RHC,看到的是 ,而 永远观察不到;反过来也一样。Holland 把这件事叫做因果推断的根本问题,英文称 the fundamental problem of causal inference:个体层面的因果效应 永远无法直接计算,因为你只能看到等号右边两项中的一项。
这不是技术限制,是逻辑限制。就算有完美的测量工具、无限的样本量、最强的超级计算机,也没法让同一个病人在同一时刻既插管又不插管,然后比较两个结局。时间不能倒流,一个人只能走一条路,这是因果推断天然面对的约束。
因果推断的根本问题容易被轻描淡写带过,但它的含义非常深远:任何声称在个体层面做出了因果判断的方法,背后一定依赖了某种不可验证的假设来"填补"那个缺失的反事实。没有免费午餐,所有因果推断方法都是在假设的支撑下绕过根本问题,差别只在于假设的强弱和合理性。后面几章里你会反复看到这一点:每种方法的核心区别归根结底是假设不同。
ATE 与 ATT:两个不同的因果问题
个体因果效应 观察不到,但如果退一步,不追求每个人的效应,而是去估计群体的平均效应,事情就变得有可能了。
举个简单的数字例子。假设 ICU 里有 100 个病人,如果让他们全部插管,预期有 55 人在 180 天内死亡;如果让他们全部不插管,预期有 50 人死亡。那么插管的平均因果效应就是 55% 50% 5 个百分点,即平均而言插管增加了死亡风险。当然,这两个数字不可能同时观察到,因为每个人只能走一条路。但如果有办法分别估计这两个"假如全员接受同一处理"的平均结果,就能算出因果效应。这引出因果推断里最基本的两个估计量。
平均处理效应,英文 Average Treatment Effect,简称 ATE,定义为全体人群中潜在结果之差的期望:
ATE 回答的问题是:如果把整个人群全部送去接受处理,平均结果会比全部不接受好多少?
处理组平均处理效应,英文 Average Treatment Effect on the Treated,简称 ATT,定义为实际接受处理的人群中潜在结果之差的期望:
ATT 回答的问题更具体:对于那些实际接受了处理的人,他们接受处理比不接受好多少?
ATE 和 ATT 回答的是两个不同的政策问题。在 RHC 的场景下,ATE 问的是"如果所有 5,735 个 ICU 病人都插导管 vs. 都不插导管,平均死亡率差多少",这是一个关于全民政策的问题。ATT 问的是"对那 2,184 个实际被插了导管的病人来说,插导管 vs. 不插导管的死亡率差多少",这是一个关于当前临床决策质量的问题。
什么时候 ATE 和 ATT 相等?当处理效应在人群中是均匀的,即每个人的 都一样时,ATE 和 ATT 自然相等。但如果处理效应因人而异,比如 RHC 对极危重病人有救命作用、对轻症病人则增加并发症风险,那么接受 RHC 的那批人,通常是更重的,跟全体人群的平均效应就会不同,ATE ATT。第 9 章讨论处理效应异质性时会回到这个话题。
选 ATE 还是 ATT 作为估计量,取决于研究问题。如果你是卫生政策制定者,想知道"推广 RHC 到所有 ICU 病人值不值得",关心的是 ATE。如果你是临床质控人员,想知道"当前被选中使用 RHC 的那批病人是否从中获益了",关心的是 ATT。两个估计量都是合法的因果量,错的是不说清楚自己在估哪个就直接报结果。
有向无环图:把因果假设画出来
潜在结果框架告诉我们"想估什么",但没有告诉我们"观察数据里能不能估出来"。要回答后面这个问题,需要把对变量之间因果关系的假设显式地表达出来。Pearl 在 1995 年提出用有向无环图,英文 Directed Acyclic Graph,简称 DAG,作为表达因果假设的工具。这个工具后来成为流行病学和社会科学研究设计的标准语言。
DAG 的构成很简单。每个变量画一个节点,如果变量 对变量 有直接因果作用,就从 到 画一条有方向的箭头。"有向"指箭头有方向,"无环"指箭头不能形成闭合回路。在 RHC 研究里,关心的变量可以分成三类:处理变量 即是否接受 RHC、结局变量 即 180 天死亡、协变量 即所有基线特征的总称。
在 RHC 研究的 DAG 中,三组协变量分别代表人口学特征,包括年龄、性别、种族、保险类型;疾病严重程度指标,包括 APACHE 评分、血压、心率、呼吸频率;合并症,包括癌症、心血管病、肝病、肾病。每组协变量既影响医生是否决定给病人上 RHC,即 ,也影响病人 180 天的生死结局,即 。 则是要估计的因果路径。完整 DAG 图见 PDF 全文。
DAG 的价值在于,一旦画出来,"该控制哪些变量"就有了形式化的判断准则,不再靠研究者的直觉拍板。Pearl 的后门准则,英文 backdoor criterion,说:如果一组变量 能阻断所有从 到 的非因果路径,同时不包含 的后代,那么在 上条件化就能识别 的因果效应。在 RHC 的 DAG 中,从 到 的非因果路径就是 这条经过协变量的"后门路径"。控制 就能阻断它。
并非控制的变量越多越好。如果控制了一个碰撞因子,英文 collider,即一个同时被 和 影响的变量,反而会打开一条本来关闭的非因果路径,引入新的偏倚。在 RHC 的语境下,假如"ICU 住院天数"同时受 RHC 和病人本身严重程度的影响,盲目控制它可能扭曲估计。DAG 的规则能帮你识别哪些变量该控制、哪些不该碰。经验法则"能控制的都控制"在因果推断里是错误的。
三个识别假设
DAG 帮我们画清了因果结构,但从"结构"到"从数据里算出因果效应",中间还隔着三个数学假设。这三个假设是因果推断从观察数据中识别 ATE 的充分条件。三个假设缺少任何一个,ATE 都无法从数据中被唯一定出来。
可交换性:条件内的"准随机化"
上一章讲到 RCT 的核心承诺是"抛硬币让两组在所有变量上分布平衡"。观察研究里没有硬币,需要一个替代假设来近似达到同样的效果。
先用 RHC 的数据感受一下这个假设在说什么。假设只看 APACHE 评分在 70 到 75 分之间的那批病人,一共 200 人,其中 120 人上了导管、80 人没上。在这个小组里,上导管组的 180 天死亡率是 52%,没上导管组的死亡率是 48%。如果相信,在"APACHE 评分 70 到 75 分"这个条件下,谁上导管谁不上,跟他们本来会不会死没有关系,就好像在这个小组里做了一次随机分配,那么 52% 48% 4 个百分点这个差距就可以被解释为因果效应。
这个"条件内的准随机化"用数学写出来,就是下面的独立性条件。
给定协变量 ,潜在结果 与实际处理分配 独立:
也叫无未测量混杂,英文 no unmeasured confounding,或条件可忽略性,英文 conditional ignorability。
这条假设用大白话说就是:在协变量 取值相同的人群内部,谁接受处理谁不接受,跟他们的潜在结果没有关系。等价于说, 已经包含了所有影响处理分配的混杂因素,没有遗漏。在 的每一层里,处理分配近似于随机的。
"可交换性"这个名字来自一个直觉:在 条件化之后,处理组和对照组的人是"可以互换的",把对照组的人放到处理组的位置上,他们的潜在结果分布不会变。这正是 RCT 中随机化自动保证的性质,观察研究里则需要通过假设来获取。
停下来想一想。 回到刚才 APACHE 评分 70 到 75 分那个小组:可交换性要求的是,这个小组里上导管的 120 人和没上导管的 80 人,在"所有影响死亡的因素"上分布是一样的。如果这 120 人恰好合并症更多、血压更低,那即使 APACHE 评分相同,两组仍然不可交换,52% vs. 48% 的差距里仍然混着混杂。
在 RHC 数据里,可交换性要求测量并纳入了所有影响医生决定是否插导管、同时又影响病人 180 天死亡的变量。APACHE 评分是其中之一,因为评分高的病人既更可能被插管、也更可能死亡。血压、心率、肌酐、白蛋白、合并症诊断、DNR 状态都是同理。RHC 数据集的 49 个变量涵盖了丰富的基线信息,但可交换性要求的是所有混杂都被测到了,而"所有"这个词在观察研究里永远无法被验证。也许存在一个未记录在数据里的变量,比如主治医生的经验水平或医院的 ICU 编制情况,它同时影响了是否上 RHC 和病人的存活率,但无从知道。这就是可交换性假设最核心的脆弱点:它不可检验。第 8 章的敏感性分析会专门讨论"假如可交换性被违反了、结论还能撑多远"。
正值性:每种病人都有两种可能
光有可交换性还不够。就算相信在 的每一层里处理分配是准随机的,还需要保证每一层里确实有人同时出现在处理组和对照组,否则那一层的因果效应根本无法比较。
先看一个直观的例子。假设 RHC 数据里 APACHE 评分 100 分以上的病人有 30 人,这些都是极危重患者,现实中 30 人全部被插了导管,没有一个人不插。这意味着在这个子组里,根本没有"不插管"的对照。这 30 个人如果不插管会怎样?数据里找不到任何参照,因果效应在这一层无从比较。
这个要求写成数学语言就是下面的条件。
对于协变量 的每一个可能取值 ,接受处理和不接受处理的概率都严格大于零:
也叫重叠假设,英文 overlap assumption。
正值性在直觉上很好理解。用第 1 章的语言说,如果某一层里只有处理组没有对照组,那这一层里就没有"孪生兄弟"可以配对。
停下来想一想。 回到 RHC 数据:APACHE 评分 100 分以上的那 30 个人全部插了管,,正值性在这一层被违反了。反过来,DNR 状态明确的临终病人几乎全部没有插管, 接近于零,正值性同样岌岌可危。这两个极端层都是因果推断的盲区。
正值性违反在实务中很常见。ICU 里的临床实践往往有"绝对适应证"和"绝对禁忌证",APACHE 评分极高或血流动力学极不稳定的病人几乎一定会被上 RHC,而 DNR 状态明确的临终病人几乎一定不会被上 RHC。这些极端层的存在让正值性假设在边界上岌岌可危。
正值性违反有两种形式。一种是结构性违反:临床规则决定了某类病人 100% 接受处理或 100% 不接受处理,这种违反增加再多的样本量也无法修复,因为对照组根本不存在。另一种是随机性违反:理论上每层都有两种可能,但某些层的样本量太少,碰巧所有人都落在同一组。随机性违反可以通过增加样本量缓解,结构性违反则需要在定义目标人群时把那些极端层排除。第 5 章讲倾向得分时会手把手做正值性诊断:画出倾向得分分布图,看两组有没有重叠区域。
一致性:处理定义必须清晰
前面两个假设都是关于"数据里有没有足够信息"的。第三个假设更底层,它关心的是处理变量本身的定义是否没有歧义。
继续用张三来理解。张三的数据里记录着 ,即"接受了 RHC"。把他观察到的结局 等同于潜在结果 。但这里有一个隐含的前提:给张三插管这件事只有一种方式。如果张三的主治医生在入院 6 小时内就插了管,而李四的主治医生拖到了 36 小时后才插,两个人虽然都记录为 ,但他们经历的"插管"其实是不同版本的处理。如果插管时机本身影响了结局,那么""对应的 就不是一个确定的量,而是因版本而异的模糊概念。
一致性假设就是要排除这种模糊。
对于个体 ,如果实际接受的处理为 ,那么观察到的结果就等于对应的潜在结果:
这条假设包含两层含义:处理版本唯一,不存在"不同方式的 RHC"导致不同结果;以及个体之间不存在干扰,一个病人是否接受 RHC 不影响另一个病人的结局。后一层在经济学文献中常叫 SUTVA,全称 Stable Unit Treatment Value Assumption。
停下来想一想。 回到张三和李四:张三入院 6 小时插管,李四入院 36 小时插管,两人的 都记为 1。一致性要求这两种"插管"在结局层面没有系统性的差异,否则 就不是一个明确的数。Connors 1996 的研究把"入院 24 小时内是否使用 RHC"作为处理定义,在一定程度上锁定了时间窗口,减轻了版本模糊的问题。
实际操作中,不同医生插管的时机不同,导管型号不同,测量的血流动力学参数之后做出的治疗调整也不同。如果这些操作上的差异导致了不同的结局,那么""实际上对应了多个不同版本的处理, 就不是一个明确的量了。
干扰假设在 ICU 场景里相对容易满足:一个病人是否插管,通常不会改变另一个病人的 180 天结局。但如果换成疫苗研究、社交网络传播、或者课堂教学实验,干扰假设就很难成立,需要专门的方法来处理。
一致性假设在很多论文里被一笔带过,但它在定义模糊的处理变量下经常失败。典型的例子是"运动对健康的因果效应": 是"运动",但运动包括跑步、游泳、举重、每周三次还是五次、每次半小时还是两小时。不同版本的"运动"可能有截然不同的效应,把它们合成一个二分变量会模糊因果含义。在 RHC 研究里这个问题相对轻微,因为"24 小时内是否插管"的操作定义比较明确,但读者在自己的研究中遇到处理变量定义模糊时,应该在分析之前先想清楚一致性是否成立。
从假设到识别公式
三个假设各自解决一个问题:可交换性保证比较是公平的,正值性保证比较是可行的,一致性保证比较的对象是明确的。三者同时成立时,可以用观察到的数据写出 ATE 的识别公式。
在写公式之前,先用一个简化到极致的数字例子把逻辑走一遍。假设只按 APACHE 评分把 5,735 个病人分成三层:低危、中危、高危。
首先看每一层内部的情况。低危层有 2,000 人,其中 400 人插管、1,600 人没插管,插管组死亡率 30%、未插管组死亡率 25%。中危层有 2,500 人,其中 1,000 人插管、1,500 人没插管,插管组死亡率 55%、未插管组死亡率 50%。高危层有 1,235 人,其中 784 人插管、451 人没插管,插管组死亡率 75%、未插管组死亡率 68%。
其次把各层的结果按人群比例加权平均。低危层占全体的 ,中危层占 ,高危层占 。那么"假如全员插管"的平均死亡率是 。"假如全员不插管"的平均死亡率是 。ATE 就是 个百分点。
这个"先在每一层里算处理组和对照组的结果,再按全体人群的层比例加权"的两步操作,就是下面这个公式在做的事:
等号左边的 是全体人群在潜在结果 上的期望,这个量本身不能从数据里直接算。等号右边做了一个关键的替换:先在 的每一层里,用处理组的平均结果 代替潜在结果 ,这一步靠的是可交换性,即同一 层内处理组能代表全体的潜在结果分布,加上一致性,即处理组观察到的 就是 。然后再按 的边际分布把各层的条件期望加权平均,得到全体的 ,这一步靠的是正值性,即每一层里确实有处理组的人可以算条件均值。
这个公式叫 G 公式,英文 G-formula,也叫标准化公式,英文 standardization formula,是 Robins 在 1986 年系统提出的。它是因果推断最基本的识别等式,后面几章会看到,回归调整、G 计算、AIPW、TMLE 等方法都是这个公式的不同实现方式。
理解这个公式的关键在于"两步走"的结构。内层的 是在每一个协变量组合 内部看处理组的平均结果,这一步回答的是"这一层里处理的效果是什么"。外层的 是按 在全体人群中的分布做加权平均,把各层的局部效果汇总成全体的 ATE。如果你只做内层不做外层,得到的是条件效应;如果你跳过内层直接看全体均值差,得到的是上一章说的边际关联,混杂没有被去除。G 公式的精髓在于把这两步合在一起。
停下来对照一下。 刚才那个三层数字例子里,内层就是"低危层插管组死亡率 30%、未插管组 25%"这些数字,外层就是"按 34.9%、43.6%、21.5% 加权"这一步。公式里的 就是这个加权平均的数学写法。
上面这个等式是一个识别结果,它把不可观测的 跟可观测的条件期望联系起来。识别先于估计:如果三个假设不成立,这个等号就不成立,不管你用什么统计方法算出的数字都没有因果解释。估计方法的选择用参数回归还是非参方法来拟合 ,是识别成立之后的事。
用一个类比来加深理解。识别好比确认你手里的地图画的是你要去的那个城市,估计好比在地图上选一条具体的路线。如果地图画的城市就是错的,路线规划得再精细也到不了目的地。因果推断文献里相当一部分争论都发生在识别层面,"你的可交换性假设合理吗""你有没有遗漏混杂""你的处理定义清楚吗",这些问题比"你用 GLM 还是 random forest 拟合"重要得多。
潜在结果框架和 DAG 在因果推断的历史上各自独立发展。Rubin 1974 年提出潜在结果框架时,Pearl 还没有开始研究因果推断;Pearl 1995 年提出 DAG 用于因果分析时,Rubin 的框架已经在统计学界流行了二十年。两套语言之间的关系一度有争议:Rubin 认为 DAG 过于依赖非参结构假设,Pearl 认为潜在结果框架缺少表达因果结构的工具。到 2000 年代之后,主流因果推断教科书,如 Hernán & Robins 2020,已经把两套工具合并使用:用 DAG 表达因果假设和判断调整集,用潜在结果定义估计量和推导识别公式。本书也遵循这个惯例。
用 dagitty 推导调整集
上面的理论告诉我们,要识别 ATE,需要对一组满足后门准则的变量 条件化。在简单的 DAG 里可以用肉眼判断,但当变量多到 49 个时,人工判断很容易遗漏或犯错。dagitty 包可以从 DAG 的形式定义自动推导最小调整集。
本章继续使用第 1 章介绍的 RHC 数据集,。下面的代码定义了 RHC 的因果结构,然后用 adjustmentSets() 推导出哪些变量必须控制。
set.seed(2026)
library(dagitty)
# 定义 RHC 的因果结构——三组协变量都是混杂
# 每组既影响医生是否决定上 RHC,也影响病人结局
rhc_dag <- dagitty("dag {
severity [pos=\"1,0\"]
comorbidity [pos=\"2,0\"]
demographics [pos=\"0,0\"]
A [pos=\"0.5,1.5\"]
Y [pos=\"2,1.5\"]
severity -> A
severity -> Y
comorbidity -> A
comorbidity -> Y
demographics -> A
demographics -> Y
A -> Y
}")
exposures(rhc_dag) <- "A"
outcomes(rhc_dag) <- "Y"
# dagitty 自动推导最小调整集
adjustmentSets(rhc_dag, type = "minimal")
adjustmentSets() 返回的最小调整集为 {comorbidity, demographics, severity},即三组协变量全部需要控制。这个结果在 RHC 的 DAG 结构下是唯一的最小调整集,因为三组变量都同时连接 和 ,缺少任何一组都会留下未阻断的后门路径。
在实际操作中,这三组协变量对应 RHC 数据集里的 49 个具体变量:severity 包含 apache_score、blood_pressure、heart_rate、respiratory_rate 等连续生理指标;comorbidity 包含 cancer、cardiovascular、renal、hepatic 等二分类合并症;demographics 包含 age、sex、race、medical_insurance 等人口学变量。从第 3 章开始,每种方法都会把这些变量作为调整变量放进模型。
注意 adjustmentSets() 返回的是最小调整集,即变量数最少的合法集。有时同一个 DAG 会有多个最小调整集,都是合法的,用哪一个取决于变量的测量精度和数据可得性。如果想看包含所有合法变量的完整集合,可以把 type 参数改为 "canonical"。
本章小结:知道该调整什么,下一步是怎么调整
本章从上一章的事实出发,搭建了回答"RHC 到底有没有因果效应"所需的理论工具。潜在结果框架给了定义因果效应的语言,ATE 和 ATT 让我们明确了想估的目标量,DAG 让我们把因果假设画出来并形式化判断该控制哪些变量,三个识别假设则给出了"观察数据里的条件期望可以替代潜在结果期望"的条件。
这套框架回答了 WHAT 的问题:调整什么、调整的数学依据是什么。从第 3 章开始,进入 HOW 的问题。第 3 章会用最简单的工具回归调整,在 RHC 数据上逐步加入协变量,观察 RHC 的系数如何随调整集的变化而移动。回归调整是 G 公式最直观的参数化实现,但它也有自己的天花板,第 3 章结尾会讲清楚它的边界在哪里。
值得记住的是,本章搭建的框架对后续所有方法都是共用的。无论用回归、G 计算、倾向得分、AIPW 还是 TMLE,三个识别假设不变,DAG 不变,估计量定义不变。变的只是估计策略:用什么统计方法去拟合 G 公式右边那个条件期望。如果在后面某一章感到方法细节开始变得复杂,回来翻一翻本章的三个定义和识别公式,会帮你重新抓住主线。
本章知识地图
表 2·1 第 2 章核心概念与常见误解
| 核心概念 | 核心内容 | 常见误解 | 为什么错 |
|---|---|---|---|
| 潜在结果 | 同一个体在处理和不处理下的两个结果 | 潜在结果可以都观察到 | 根本问题:每人只走一条路,反事实永远缺失 |
| ATE | 全体人群 | ATE 就是两组均值差 | 两组均值差是边际关联,只在 RCT 下等于 ATE |
| ATT | 处理组人群 | ATT 和 ATE 一定相等 | 当处理效应异质时,接受处理的那群人的平均效应可能偏高或偏低 |
| DAG | 用节点和箭头表示因果假设 | DAG 是从数据里学出来的 | DAG 是研究者根据领域知识画的,数据不能告诉你因果方向 |
| 后门准则 | 阻断所有 的非因果路径 | 控制的变量越多越好 | 控制碰撞因子会打开新偏倚 |
| 可交换性 | 可以用数据检验 | 未测量混杂的存在与否无法从数据中确认 | |
| 正值性 | 每层 里处理和对照都存在 | 样本量大就能保证 | 临床绝对适应证/禁忌证造成的结构性违反,再多样本也无法修复 |
| 一致性 / SUTVA | 处理版本唯一,无个体间干扰 | 二分变量自动满足 | 同一个""可能对应不同操作方式,导致效应模糊 |
| G 公式 | G 公式就是回归调整 | G 公式是识别等式;回归只是实现它的一种估计方法 | |
| dagitty 最小调整集 | 从 DAG 自动推导该控制哪些变量 | 调整集是唯一的 | 同一个 DAG 可能有多个合法调整集,最小调整集是变量最少的那个 |