因果推断实践 · 第 8

结果稳不稳:敏感性分析与未测量混杂

前面七章用了多种方法回答同一个问题,结论一致:RHC 增加了 180 天死亡率,风险差在 3–5 个百分点之间。这个一致性让人安心,但它建立在一个共同前提上:控制的 28 个协变量足以消除处理组和对照组之间的系统性差异。换句话说,所有方法都假设不存在未测量的混杂变量。

这个假设合理吗?医生决定是否插 RHC 时,除了 APACHE 评分、血压、肌酐这些数据里有的指标,还会参考床旁即时反应、家属意愿、设备空闲情况。这些因素都没有记录。如果其中某个因素同时影响了医生的决策和患者的存活,所有估计都会偏移。本章不产出新的 ATE 估计,它做的事情是压力测试:前面得到的结论有多经得起"万一还有没控制住的混杂"这个质疑?

不可检验的假设:可交换性

第 2 章引入了因果推断的三大识别假设:可交换性、正值性、一致性。正值性可以通过检查倾向得分分布来诊断,一致性是对处理定义的逻辑约束,这两者都有经验层面的检验手段。可交换性是个例外。

比如在 APACHE 评分都是 70 分的病人中,上导管和不上导管的人,后来死不死应该和他们是否上了导管没有关系,因为 APACHE 70 这一组里的分配已经"近似随机"了。

定义条件可交换性
def:08-exchangeability

给定协变量集合 LL,如果潜在结果 Y(a)Y(a) 与处理指派 AA 条件独立,即

Y(a) ⁣ ⁣ ⁣AL,a,Y(a) \perp\!\!\!\perp A \mid L, \quad \forall\, a,

则称在 LL 条件下处理与结局满足可交换性。

(Rosenbaum 2002)

这个假设说的是:在协变量 LL 的每一层内,处理组和对照组的潜在结果分布相同。它之所以无法检验,是因为永远只能观测到一个人在实际处理状态下的结局,看不到他在另一种处理状态下会怎样。要验证可交换性,需要比较"处理组的 Y(0)Y(0)"和"对照组的 Y(0)Y(0)",但处理组的 Y(0)Y(0) 是反事实,数据里不存在。

在 RCT 中,随机化保证了可交换性。观察性研究没有这个保障,研究者只能尽量把想得到的混杂变量都放进 LL,但"LL 是否足够全面"无法从数据中证实。这就是敏感性分析的出发点:既然无法证明可交换性成立,那就换一个问题——如果可交换性被违反了,违反需要多严重才能推翻结论?

敏感性分析的思路

敏感性分析的核心逻辑是反向思考。传统分析假设没有未测量混杂,直接估计 ATE。敏感性分析反过来问:假设存在一个未测量混杂 UUUU 需要和处理与结局各有多强的关联,才能把 ATE 估计拉到零?如果答案是"UU 需要非常强才能翻盘",结论就比较稳健。这个思路由 Rosenbaum 2002 系统化,本章介绍两种更现代的工具:E-value 和 sensemakr。

E-value:需要多强的混杂才能翻盘

E-value 由 VanderWeele & Ding 2017 提出,它把"未测量混杂需要多强"翻译成一个相对风险的尺度。

先用一个具体例子建立直觉。假设估计出 RHC 增加死亡率 RR = 1.34。E-value 回答的问题是:一个没有测量到的混杂变量,需要多强才能把这个 1.34 完全解释掉?答案是 E-value = 1.42。意思是这个混杂变量需要同时和 RHC 使用、180 天死亡分别有至少 1.42 倍的关联。如果找不到这么强的遗漏因素,1.34 的效应就不太可能全靠混杂偏差来解释。

下面是 E-value 的正式定义。

定义E-value
def:08-evalue

对于一个观测到的相对风险 RRobs\mathrm{RR}_{\mathrm{obs}},其 E-value 定义为

E-value=RRobs+RRobs×(RRobs1).E\text{-value} = \mathrm{RR}_{\mathrm{obs}} + \sqrt{\mathrm{RR}_{\mathrm{obs}} \times (\mathrm{RR}_{\mathrm{obs}} - 1)}.

E-value 表示的是:未测量混杂 UU 与处理的关联以及 UU 与结局的关联至少都要达到这个 RR 值,才能把观测到的效应完全归因于混杂。

(VanderWeele & Ding 2017)

公式里的 RRobs\mathrm{RR}_{\mathrm{obs}} 是调整了已知混杂之后的相对风险。E-value 告诉我们,未测量因素 UU 与 RHC 使用和 180 天死亡的关联强度至少要多大,才能让观测到的不利效应完全消失。E-value 越大,翻盘需要的混杂越强,结论越稳健。

在 RHC 数据上计算 E-value

本章继续使用第 1 章介绍的 RHC 数据集 n=5735n = 5735。AIPW 在第 6 章给出的风险差估计为 0.044,95% CI 为 [0.017,0.072][0.017, 0.072]。要计算 E-value,需要把风险差转换为相对风险的尺度。对照组的 180 天死亡率为 0.465,据此可得调整后的近似 RR(0.465+0.044)/0.465=1.095\mathrm{RR} \approx (0.465 + 0.044) / 0.465 = 1.095

set.seed(2026)
library(tidyverse)
library(EValue)

d <- read_csv(here::here("data", "rhc.csv"), show_col_types = FALSE) |>
  mutate(death180_bin = if_else(death180 == "Yes", 1L, 0L))

# 对照组基线死亡率
r0 <- mean(d$death180_bin[d$rhc == 0])

# AIPW 估计的风险差和 95% CI(来自第 6 章)
ate  <- 0.0442
se   <- 0.0139
ci_lo <- ate - 1.96 * se
ci_hi <- ate + 1.96 * se

# 转换为相对风险尺度——E-value 需要 RR 作为输入
rr_point <- (r0 + ate) / r0
rr_lo    <- (r0 + ci_lo) / r0
rr_hi    <- (r0 + ci_hi) / r0

# 计算 E-value:点估计和置信区间下界各一个
ev <- evalues.RR(rr_point, lo = rr_lo, hi = rr_hi)
print(ev)
结果解读

点估计的 E-value 为 1.42,置信区间下界的 E-value 为 1.23。

点估计 E-value = 1.42 的含义是:一个未测量的混杂因素 UU,需要与 RHC 使用和 180 天死亡各自的关联强度都达到 RR = 1.42 以上,才能把 AIPW 观测到的风险差 0.044 完全解释为混杂偏差。置信区间下界的 E-value = 1.23 更为关键,它意味着 UU 只需要与两端各达到 RR = 1.23,就能让效应的统计显著性消失。

在 ICU 里,能和死亡率产生 1.42 倍关联的变量是什么量级?APACHE 评分与死亡率的关联在 RR = 2–3 之间,血压和肌酐在 RR = 1.5–2.5 之间。这些变量都已经控制了。一个残余的、没被这 28 个变量捕捉到的因素,要同时和 RHC 使用及死亡率各达到 RR = 1.42,在临床上并非不可能,但需要一个相当有影响力的遗漏因素。

E-value 的领域锚定

1.42 孤立地看没有意义,E-value 的价值在于和领域内已知混杂因素的强度做对比。Connors 等人 1996 报告了 APACHE 评分与 RHC 使用的关联约为 RR = 2.0,与 180 天死亡率的关联更强,高评分组死亡风险是低评分组的 2–3 倍。血压、肌酐等协变量与两端的关联在 RR = 1.5–2.5 之间。

我们已经控制了 APACHE 评分、血压、肌酐等 28 个变量,一个残余的未测量混杂要同时在两端都达到 RR = 1.42 的关联强度,可能性并不高但也不能排除。如果 E-value 达到 3 或 4,结论通常被认为非常稳健;1.42 处于中等偏低的位置,保护有限。

到这里有了第一个工具 E-value。它给出了一个数字门槛。接下来要介绍的 sensemakr 会进一步用已观测的协变量作为参照物,让这个门槛更加具体。

同样的 E-value 在不同研究领域意味着完全不同的事情。在药物临床试验中,已知混杂因素的 RR 通常在 1.2–1.5 之间,E-value = 1.42 已经接近上限,结论比较安全。在社会科学中,未测量混杂 RR 可达 3–5,同样的 E-value 几乎提供不了保护。ICU 医学介于两者之间:已知的强混杂如疾病严重程度 RR 可达 2–3,但已被控制。残余混杂要达到 1.42 需要一个相当有影响力的遗漏因素。

雷区E-value 必须搭配领域锚定

E-value 最常见的误用是把它当作一个通用的"稳健性评分",脱离领域知识直接下结论。比如看到 E-value = 2.5 就说"结论很稳健",看到 1.3 就说"结论脆弱"。这样做的问题在于,E-value 衡量的是未测量混杂需要多强,而"多强算强"取决于具体研究领域。在一个变量关联普遍较弱的领域,1.3 已经很难达到;在一个混杂无处不在的领域,2.5 可能轻而易举。正确的做法是:计算 E-value 之后,列出本研究领域中已知混杂因素与处理和结局的关联强度,用这些数字作为参照系来判断 E-value 的含义。没有领域锚定的 E-value 解读是空洞的。

sensemakr:遗漏变量偏差的等高线

Cinelli & Hazlett 2020 提出的 sensemakr 框架用偏 R2R^2 来刻画未测量混杂解释处理变异和结局变异的比例,并允许研究者用已观测的协变量作为基准校准"多强算强"。sensemakr 的核心概念是稳健值,英文称 Robustness Value,简称 RV。

RV 假设的是一个最坏情况的混杂:它和我们已经测量的 28 个变量都不相关,是一个全新的、完全没有捕捉到的因素。这比"已有变量遗漏了某些信息"更极端,因为如果新混杂和已有变量有相关性,已有变量多少能帮我们控制一部分。RV 不给这个好处,它直接问:在最坏的情况下,这个全新因素需要解释处理和结局残差方差的多大比例,才能把效应估计拉到零?

定义稳健值 RV
def:08-rv

稳健值 RV 回答的问题是:一个未测量混杂需要多强,才能把估计到的效应拉低到可以忽略的程度?RV 越大,需要的混杂越强,结论越稳健。

具体而言,RV 用偏 R2R^2 来衡量混杂的强度,即未测量混杂对处理和结局残差方差各自的解释比例。RVq=1\mathrm{RV}_{q=1} 是使效应估计降至零所需的最小偏 R2R^2qq 代表效应缩减的比例,q=1q = 1 意味着完全归零。RVq=1,α=0.05\mathrm{RV}_{q=1, \alpha=0.05} 则是使效应估计的置信区间包含零所需的最小强度,这个阈值更低,因为只需让显著性消失即可。

(Cinelli & Hazlett 2020)

sensemakr 还提供了基准校准功能:选择一个已观测的协变量作为参照,问"如果未测量混杂的强度是 APACHE 评分的 kk 倍,效应估计会变成多少"。研究者通常对"比 APACHE 评分强两倍的混杂因素是否存在"有直觉判断,这比纯数字输出更贴近实务决策。

sensemakr 在 RHC 数据上的应用

sensemakr 需要线性模型作为输入。线性概率模型在这个样本量下的系数估计与 logistic 回归的边际效应接近,且偏 R2R^2 分解在线性框架下有严格保证。

set.seed(2026)
library(tidyverse)
library(sensemakr)

d <- read_csv(here::here("data", "rhc.csv"), show_col_types = FALSE) |>
  mutate(death180_bin = if_else(death180 == "Yes", 1L, 0L),
         sex_bin      = if_else(sex == "Male", 1L, 0L),
         cancer_bin   = if_else(cancer == "No", 0L, 1L))

covs <- c("age", "sex_bin", "cancer_bin", "cardiovascular",
          "congestive_hf", "dementia", "psychiatric", "pulmonary",
          "renal", "hepatic", "gi_bleed", "tumor",
          "immunosupperssion", "transfer_hx", "mi",
          "apache_score", "glasgow_coma_score", "blood_pressure",
          "heart_rate", "respiratory_rate", "temperature",
          "albumin", "creatinine", "bilirubin", "wbc",
          "hematocrit", "das_index", "weight")

# 线性概率模型——sensemakr 需要 lm 对象
lin_mod <- lm(death180_bin ~ rhc + .,
              data = d |> select(death180_bin, rhc, all_of(covs)))

# 以 APACHE 评分为基准,分别看 1 倍、2 倍、3 倍强度的混杂
sens <- sensemakr(model = lin_mod,
                  treatment = "rhc",
                  benchmark_covariates = "apache_score",
                  kd = c(1, 2, 3))
summary(sens)
结果解读

线性模型中 RHC 的系数为 0.053,标准误 0.014,t=3.86t = 3.86p<0.001p < 0.001。处理变量对结局的偏 R2R^2 仅为 0.26%,说明在控制了 28 个协变量之后,RHC 对死亡率解释的独立变异很小。

稳健值 RVq=1=5.0%\mathrm{RV}_{q=1} = 5.0\%:一个与已控制协变量正交的未测量混杂,需要同时解释处理和结局残差方差的至少 5.0%,才能把效应估计拉到零。RVq=1,α=0.05=2.5%\mathrm{RV}_{q=1, \alpha=0.05} = 2.5\%:同样的混杂只需解释 2.5% 的残差方差,就能让置信区间包含零,统计显著性消失。

以 APACHE 评分为基准的校准结果特别有信息量。APACHE 评分对 RHC 使用的偏 R2R^2 为 2.0%,对死亡率的偏 R2R^2 为 1.0%。如果未测量混杂的强度和 APACHE 评分相当,即 1×1 \times apache_score,调整后的效应估计从 0.053 下降到 0.038,仍然显著。如果未测量混杂有 APACHE 评分的 2 倍强度,效应降到 0.023,置信区间的下界接近零。到了 3 倍 APACHE 评分的强度,效应仅剩 0.008,已经不再显著。

在 ICU 里,比 APACHE 评分还强两三倍的遗漏变量意味着什么?APACHE 评分本身已经综合了生理参数、年龄和慢性健康状况,是 ICU 预后预测中解释力最强的单一变量之一。一个强度达到 APACHE 两倍的遗漏因素在临床上很难想象。但让显著性消失的阈值只需要 2 倍,而医生的主观判断、床旁快速恶化程度这类未记录因素并非不可能达到这个水平。

sensemakr 把这些数字关系可视化在等高线图上:横轴是未测量混杂对处理的偏 R2R^2,纵轴是对结局的偏 R2R^2,红色虚线是零等高线。三个红色菱形分别标记了 1 倍、2 倍、3 倍 APACHE 评分强度的位置,3 倍的菱形已经非常接近零等高线。完整等高线图见 PDF 全文。

两种方法的对照解读

E-value 和 sensemakr 从不同角度量化了同一个问题。E-value = 1.42 说的是未测量混杂与处理和结局的关联各需达到 RR = 1.42 才能翻盘。sensemakr 的基准校准则更具体:3 倍 APACHE 评分强度的混杂才能让效应消失,2 倍就能让显著性消失。两种工具给出的图景是一致的:翻盘需要一个不算弱但也谈不上极强的遗漏因素。

综合来看,RHC 增加死亡率的结论对未测量混杂有一定抵抗力,但保护程度中等。效应本身不大,RR 约为 1.10,小效应天然更容易被残余混杂解释掉。这也是 Connors 等人 1996 原文发表后引发持续争论的原因之一。

定义E-value 与 sensemakr 的适用场景
prop:08-evalue-vs-sensemakr

E-value 适合快速报告:只需要点估计和置信区间就能计算,结果是一个直观的 RR 数字,适合写在论文摘要里。它的局限是缺乏内部校准,需要研究者自行提供领域参照。sensemakr 适合深入探索:它用已观测协变量的解释力作为基准,输出等高线图和分阶梯的调整后估计,让读者直观看到"混杂强到什么程度结论才翻转"。它的局限是需要线性模型作为输入,且偏 R2R^2 对非线性关系的捕捉能力有限。实际操作中,两者配合使用效果最好:E-value 给出汇总判断,sensemakr 给出细节和可视化。

雷区敏感性分析不证明没有混杂

敏感性分析不能证明"没有未测量混杂"。它做的事情是量化"未测量混杂需要多强才能推翻结论",本质上是一种压力测试。有时研究者在论文里写"E-value = 3.2,说明未测量混杂不太可能影响我们的结论",这个表述在逻辑上是滑坡的。E-value = 3.2 只能说明"推翻结论需要一个很强的混杂",但无法排除这种强混杂确实存在的可能。正确的表述是:"未测量混杂需要与处理和结局各达到 RR = 3.2 的关联才能解释掉观测到的效应,在本研究领域中,已知混杂因素的关联强度为 RR = X–Y,因此残余混杂达到此水平的可能性较低/中等/较高。"判断"可能性高低"是领域知识的工作,E-value 只提供数字框架。

定义练习 8.1

第 5 章的 IPW 估计给出了风险差约 0.032,标准误约 0.022。计算 IPW 估计对应的 E-value,与 AIPW 的 E-value = 1.42 做比较。较小的效应估计是否意味着更脆弱的结论?结合 ICU 领域知识解释你的判断。

结果解读参考解答
library(EValue)
# IPW 的风险差和标准误
ate_ipw <- 0.032; se_ipw <- 0.022
r0 <- 0.4647  # 对照组基线死亡率

# 转换为 RR 尺度
rr_ipw <- (r0 + ate_ipw) / r0
rr_lo  <- (r0 + ate_ipw - 1.96 * se_ipw) / r0

ev_ipw <- evalues.RR(rr_ipw, lo = rr_lo)
print(ev_ipw)

IPW 的点估计 RR1.069\mathrm{RR} \approx 1.069,对应 E-value 约为 1.31,比 AIPW 的 1.42 更小。置信区间下界的 E-value 接近 1.0,极弱的未测量混杂就能让显著性消失。IPW 的效应估计更小、标准误更大,对未测量混杂的抵抗力更弱。但两种方法的效应方向一致,跨方法的方向一致性本身也是稳健性的证据。

方法卡片方法卡片:敏感性分析

分析目标:评估因果效应估计对未测量混杂的稳健程度,不产出新的 ATE。

E-valueE=RRobs+RRobs×(RRobs1)E = \mathrm{RR}_{\mathrm{obs}} + \sqrt{\mathrm{RR}_{\mathrm{obs}} \times (\mathrm{RR}_{\mathrm{obs}} - 1)}。未测量混杂与处理和结局各需达到此 RR 才能翻盘。需要领域知识锚定。

sensemakr:用偏 R2R^2 量化遗漏变量偏差,稳健值 RV 表示使效应消失所需的最小混杂强度。可以用已观测协变量做基准校准。

R 实现EValue 包的 evalues.RR()sensemakr 包的 sensemakr(),直接接受 lm() 对象。

适用场景:所有依赖可交换性假设的观察性研究。审稿人越来越多地要求作者报告 E-value 或类似的敏感性指标。

局限:无法证明"没有未测量混杂",只能量化"翻盘需要多强"。E-value 缺乏内部校准,sensemakr 依赖线性模型假设。

敏感性分析的思路可以追溯到 Cornfield 在 1959 年为吸烟致癌辩论提供的论证。烟草公司辩称吸烟与肺癌的关联可能由遗传因素造成,Cornfield 反驳:吸烟者肺癌发病率是非吸烟者的 9 倍以上,要用遗传混杂解释,该因素需要在吸烟者中流行率高 9 倍以上,这在生物学上不合理。这个论证和 E-value 一脉相承。Rosenbaum 2002 系统化了这套方法论,VanderWeele & Ding 2017 的 E-value 和 Cinelli & Hazlett 2020 的 sensemakr 则分别提供了更易用的工具。

下一章将转向异质性分析。前面所有方法估计的都是平均处理效应,但 ATE 是全体患者效应的均值,它可能掩盖了不同亚群之间的重要差异。也许对某些患者 RHC 确实有害,而对另一些患者反而有益,平均下来才是一个温和的正向风险差。因果森林可以估计个体化处理效应,帮助拆开 ATE 的"黑箱"。

本章知识地图

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

核心概念核心内容常见误解为什么错
条件可交换性在协变量 LL 条件下潜在结果与处理独立,是因果识别的核心假设可以通过某种统计检验来验证可交换性验证需要观测反事实结局,而反事实在数据中永远缺失
E-value未测量混杂与处理和结局各需达到的最小 RR 才能翻盘E-value 大就说明没有未测量混杂E-value 只量化翻盘所需的混杂强度,不能排除这种混杂存在
领域锚定同一个 E-value 在不同领域含义不同,必须参照已知混杂的关联强度E-value = 2 在任何领域都算稳健药物试验中 RR > 2 的混杂罕见,社会科学中 RR > 2 的混杂常见
稳健值 RV使效应估计降至零所需的最小偏 R2R^2RV 小就说明结论一定错RV 小只说明结论容易被推翻,但小效应的 RV 天然就小
基准校准用已观测协变量的解释力作为参照系评估未测量混杂的合理强度只要超过 1 倍基准就翻盘说明结论不可信要看"kk 倍基准"在领域内是否合理,而不只看倍数大小
敏感性分析的定位压力测试,量化翻盘所需条件,搭配领域知识做判断敏感性分析是因果推断的最后一步,过了就万事大吉它回答的是"假设违反时结论多脆弱",而不是"假设是否成立"