因果推断实践 · 第 1

问题与数据:RHC 争议的起点

1996 年,Alfred Connors 和同事在 JAMA 发表了一项覆盖五所教学医院、5,735 名 ICU 危重症患者的观察性研究。研究的核心发现让整个重症医学界意外:接受右心导管监测的患者,180 天死亡率比未接受 RHC 的患者了大约 7.5 个百分点。右心导管是一根从颈静脉或锁骨下静脉送入肺动脉的导管。简单来说,它是一个实时的血流动力学探测器:心脏泵了多少血、肺动脉里的压力有多高、血液里的氧够不够用,这些信息 ICU 医生都能从导管上读到。在 Connors 的论文发表之前,绝大多数临床医生默认这些信息有助于指导治疗、改善预后。Connors 的数据说的却是相反的故事:插了管的病人死得更多。

这篇论文引发的争论持续了近十年。支持者认为 RHC 本身可能带来导管相关感染、心律失常、气胸等并发症,监测信息也可能诱导过度干预。反对者则指出一个根本性的统计学问题:接受 RHC 的病人本来就更重,死亡率高也许和导管无关,纯粹是因为这群人的基线风险就高。这个问题用因果推断的语言来说,叫做适应证混杂,英文称 confounding by indication。医生决定是否插管时参考的正是病情严重程度,而病情严重程度本身又直接影响死亡率。处理变量和结局变量共享一个共同原因,观察到的关联就被污染了。

这本书只回答一个问题:RHC 是否因果地增加了 ICU 患者的 180 天死亡率? 每一章用一种不同的因果推断方法来回答它,最后汇总比较。同一份数据、同一个问题、九把不同的刀,读者可以亲手看到每种方法的假设、操作和结论有什么异同。

为什么不能做随机试验

回答因果问题最直接的办法是随机对照试验,简称 RCT。把 5,735 名患者随机分成两组,一组插管、一组不插管,比较死亡率。随机化保证了两组在所有已知和未知的混杂因素上平均相同,观察到的死亡率差异就可以归因于 RHC 本身。

但 RHC 的 RCT 始终没有做成。伦理审查是第一道障碍:如果临床医生认为某个患者需要血流动力学监测,随机把他分到"不插管"组意味着剥夺了一项临床医生认为必要的诊断手段。操作上的阻力同样大——重症科医生对自己的临床判断有强烈信念,愿意让抛硬币决定自己病人是否插管的医生很少。哪怕启动了试验,知情同意的获取在危重症患者身上极其困难,患者本人往往无法签字,家属在极度焦虑中也不太可能冷静权衡研究方案。

RCT 做不了,因果问题还要回答。这就是观察性因果推断存在的理由。Connors 和同事手上有一份丰富的观察数据,记录了患者入 ICU 时的人口学特征、病史、生理指标和病情严重程度评分。利用这些协变量,可以尝试在统计上"模拟"随机化的效果,把适应证混杂剥离出去。接下来的九章就是九种不同的剥离策略。

因果推断的根本困难

定义潜在结果与因果效应
def:potential-outcome

对个体 ii,定义两个潜在结局:Yi(1)Y_i(1) 表示接受 RHC 后的 180 天死亡状态,Yi(0)Y_i(0) 表示未接受 RHC 的 180 天死亡状态。个体因果效应为 Yi(1)Yi(0)Y_i(1) - Y_i(0)。总体平均处理效应为

ATE=E[Y(1)Y(0)]=E[Y(1)]E[Y(0)].\mathrm{ATE} = E[Y(1) - Y(0)] = E[Y(1)] - E[Y(0)].

(Rubin 1974)

这个框架的核心困难在于:对每一个真实的病人,只能观察到一个潜在结局。插了管的人看到了 Y(1)Y(1),没插管的人看到了 Y(0)Y(0),另一个永远缺失。Holland 把这件事称为"因果推断的根本问题"。个体因果效应在原理上不可识别,能做的只是估计总体层面的平均效应 ATE。

估计 ATE 需要用观察到的数据去填补缺失的那一列。最朴素的做法是把 RHC 组的平均结局当作 E[Y(1)]E[Y(1)],把非 RHC 组的平均结局当作 E[Y(0)]E[Y(0)],直接相减。这个做法在 RCT 中完全合法,因为随机化保证了两组可交换。但在观察数据中,RHC 组和非 RHC 组的病人构成系统性地不同,直接比较混进了混杂的成分。下面用数据来看这种"不同"到底有多大。

数据概览

本书使用的数据来自 Connors 等人 1996 年的原始研究,经过清洗后保存在 data/rhc.csv。数据集包含 5,735 名 ICU 患者,49 个变量。处理变量为 rhc,取值 0 或 1;结局变量为 death180,取值 Yes 或 No。关键协变量包括 APACHE III 评分、平均动脉压、肌酐、白蛋白等生理指标,以及年龄、性别、种族、保险类型等人口学变量。

library(tidyverse)
set.seed(2026)

# 读入数据——here::here() 保证路径相对于项目根目录
d <- read_csv(here::here("data", "rhc.csv"), show_col_types = FALSE)
dim(d)  # 5735 行 x 49 列

# 创建二分类结局变量
d <- d |> mutate(death180_bin = ifelse(death180 == "Yes", 1, 0))

# 预览 10 个关键变量的前 6 行
key_vars <- c("rhc", "death180", "age", "sex", "apache_score",
              "blood_pressure", "creatinine", "albumin",
              "heart_rate", "respiratory_rate")
head(d[, key_vars], 6)
结果解读数据预览

数据有 5,735 行、49 列。变量的量纲差异很大:apache_score 在 38–82 之间,blood_pressure 在 41–115 mmHg 之间,creatinine 在 0.6–3.6 mg/dL 之间。这种量纲差异意味着后续做匹配或加权时需要标准化。

基线失衡:谁接受了 RHC?

如果 RHC 的使用是随机的,RHC 组和非 RHC 组在所有基线变量上应该高度相似。现实中这两组的构成差异有多大?需要一个指标来衡量差距的大小。

标准化均值差,简称 SMD,做的事情很简单:把两组之间某个变量的均值差除以合并标准差,消除量纲的影响。SMD = 0.50 意味着处理组的均值比对照组高半个标准差,这是一个相当大的失衡。SMD = 0.10 意味着差距只有十分之一个标准差,通常被认为是可接受的平衡。超过 0.10 就提示存在需要处理的失衡。

library(tableone)

# 选取 12 个关键协变量
vars <- c("age", "sex", "apache_score", "blood_pressure",
          "heart_rate", "respiratory_rate", "creatinine",
          "albumin", "hematocrit", "wbc", "temperature",
          "das_index")

# 按 RHC 分组计算 Table 1,同时输出 SMD
d <- d |> mutate(rhc_label = ifelse(rhc == 1, "RHC", "No RHC"))
tab1 <- CreateTableOne(vars = vars, strata = "rhc_label",
                       data = d, test = FALSE, smd = TRUE)
print(tab1, smd = TRUE)
结果解读基线比较

下表汇总了 12 个关键协变量在两组之间的分布。RHC 组有 2,184 人,非 RHC 组有 3,551 人。

变量No RHC (n=3551n=3551)RHC (n=2184n=2184)SMD
Age, mean (SD)61.76 (17.29)60.75 (15.63)0.061
Male, %53.958.50.093
APACHE Score, mean (SD)50.93 (18.81)60.74 (20.27)0.501
Blood Pressure, mean (SD)84.87 (38.87)68.20 (34.24)0.455
Heart Rate, mean (SD)112.87 (40.94)118.93 (41.47)0.147
Respiratory Rate, mean (SD)28.98 (13.95)26.65 (14.17)0.165
Creatinine, mean (SD)1.92 (2.03)2.47 (2.05)0.270
Albumin, mean (SD)3.16 (0.67)2.98 (0.93)0.230
Hematocrit, mean (SD)32.70 (8.79)30.51 (7.42)0.269
WBC, mean (SD)15.26 (11.41)16.27 (12.55)0.084
Temperature, mean (SD)37.63 (1.74)37.59 (1.83)0.021
DAS Index, mean (SD)20.37 (5.48)20.70 (5.03)0.063

失衡最严重的是 APACHE III 评分,SMD = 0.50,RHC 组均值 60.74 远高于非 RHC 组的 50.93。APACHE 是 ICU 常用的病情严重程度综合评分,分数越高代表病情越重、预期死亡率越高。RHC 组的 APACHE 均值比非 RHC 组高将近 10 分,换算成标准差单位就是半个标准差的差距。平均动脉压的 SMD 也达到 0.46,RHC 组血压更低,这和临床直觉一致:血流动力学不稳定的病人更可能被插管监测。肌酐 SMD = 0.27,RHC 组肾功能更差。白蛋白和血球容积的 SMD 均在 0.23–0.27 之间。

RHC 组的 APACHE 评分分布明显右移,高分段的密度更大。这种右移直观地说明了适应证混杂的核心机制:病情越重的患者越可能被插管,而病情越重本身就意味着死亡风险越高。Love plot 把全部 12 个协变量的 SMD 与 0.1 阈值线画在同一张图上,12 个变量中有 8 个超过了阈值,APACHE 评分和血压的失衡尤其严重。这意味着直接比较两组的死亡率,混杂的成分不可忽略。完整图表见 PDF 全文。

朴素关联:粗死亡率差异

在做任何调整之前,先看最简单的数字:两组的 180 天粗死亡率各是多少?

# 按 RHC 分组计算 180 天死亡率
d |>
  group_by(rhc) |>
  summarise(
    n         = n(),
    deaths    = sum(death180_bin),
    mortality = mean(death180_bin),
    .groups   = "drop"
  )
结果解读粗死亡率

非 RHC 组 3,551 人中 1,650 人在 180 天内死亡,死亡率 46.5%。RHC 组 2,184 人中 1,179 人死亡,死亡率 54.0%。粗死亡率差异为 54.0%46.5%=7.554.0\% - 46.5\% = 7.5 个百分点,RHC 组更高。

停下来想一想。 非 RHC 组死亡率 46.5%,RHC 组 54.0%,差了 7.5 个百分点。如果你是一位 ICU 主任,看到这个数字会立刻下令停用右心导管吗?在翻到下一段之前,试着列出至少一个理由,解释为什么这个差距可能不是 RHC 本身造成的。

7.5 个百分点的差距看起来不小,但它能直接被解读为"RHC 导致死亡率升高 7.5 个百分点"吗?前面的基线比较已经说明了答案:不能。RHC 组的 APACHE 均分高了将近 10 分,血压低了 17 mmHg,肌酐高了 0.55 mg/dL。这些指标全都指向同一个事实——RHC 组的病人入 ICU 时病情就更重。病情更重的人死亡率更高,这和导管本身无关。

雷区粗关联不等于因果效应

观察数据中的粗关联混合了因果效应和混杂偏倚两部分。在 RHC 数据中,适应证混杂的方向是正向的:病情越重 \to 越可能插管,同时病情越重 \to 死亡率越高。这意味着粗关联会高估 RHC 的有害效应。如果 RHC 真的有害,真实效应可能小于 7.5 个百分点;如果 RHC 实际上无害甚至有益,粗关联仍然可能显示正向差异,因为混杂的正偏倚足以盖过保护效应。分辨这两种情形,需要在统计上把混杂剥离出去,这正是后续九章要做的事情。

全书路线图

本书用九种方法回答同一个问题。第 2 章用 DAG 梳理变量之间的因果结构,明确哪些协变量需要调整。第 3 章从最简单的回归调整开始,逐步加入协变量,观察估计值如何变化。第 4 章用 G 计算做标准化,预测反事实结局。第 5 章转向倾向得分,包括匹配、逆概率加权和 overlap weight。第 6 章手动实现 AIPW,体会双重稳健的机制。第 7 章引入机器学习,用 Super Learner、DML 和 TMLE 分别估计。第 8 章做敏感性分析,回答"如果存在未观测混杂,结论还站得住吗"。第 9 章用因果森林探索异质性效应,看 RHC 对哪些亚群有害、对哪些亚群可能有益。第 10 章把所有方法的估计汇总到一张表里,比较点估计和置信区间,讨论方法之间的一致性与分歧。

每章末尾会更新一张累积对比表,格式如下。

表 1·1 方法对比表——第 1 章:朴素关联

方法ATE95% CI核心假设局限
粗差异0.075未调整任何混杂

这张表目前只有一行。后续每章增加一行,到第 10 章合并为终极版本。

本章知识地图

表 1·2 第 1 章核心概念与常见误解

核心概念核心内容常见误解为什么错
右心导管 RHC经静脉插入肺动脉的导管,实时监测血流动力学参数RHC 是一种治疗手段RHC 是诊断/监测工具,本身不直接改变治疗方案
适应证混杂决定是否给予处理的因素同时影响结局,导致处理组和对照组不可比只要样本量够大,混杂就会消失样本量解决的是抽样变异,混杂是系统性偏倚,只有 RCT 或统计调整才能消除
潜在结果每个个体在处理和不处理两种情境下各有一个潜在结局,Y(1)Y(1)Y(0)Y(0)潜在结果可以同时观测每个个体只能处于一种处理状态,另一个潜在结局永远缺失
ATEE[Y(1)]E[Y(0)]E[Y(1)] - E[Y(0)],总体平均处理效应粗死亡率差异等于 ATE粗差异 = ATE + 混杂偏倚;只有在随机化或充分调整后,粗差异才近似 ATE
SMD标准化均值差,用于度量两组协变量平衡程度,<0.1< 0.1 为可接受SMD 小就不需要调整SMD 小说明该变量平衡,但其他变量仍可能失衡;要看全部协变量
APACHE III 评分ICU 病情严重程度综合评分,本数据中 SMD = 0.50APACHE 是唯一的混杂因素血压、肌酐、白蛋白等也有显著失衡,需要同时调整多个混杂因素