跳转至

When bad adjustment looks good: what goes wrong in Plasmode 0.1.0 simulations

作者: M. Ehsan Karim
主题: 因果推断
相关性: 6/10
链接: https://arxiv.org/abs/2609.24053


一、领域脉络与小综述

这个方向是什么:Plasmode 模拟("plasma" + "mode",即"真实数据 + 模拟模式")是因果推断中评估混杂控制方法性能的一类模拟框架。它不同于完全参数化的 Monte Carlo 模拟——后者从指定分布中生成数据,而 Plasmode 从真实队列中重采样协变量和处理,再注入研究者指定的结局模型与效应大小。其根本目的是在保留真实数据中难以手工指定的复杂关联结构(相关性、偏态、稀疏性、交互)的同时,获得已知真相(known truth)的模拟数据,从而评估不同估计方法在"接近现实"条件下的偏倚、方差和覆盖概率。该方向的成熟度处于"已被广泛使用但缺乏实现验证"的阶段:方法学文献推荐它,工具包实现了它,但很少有人检查实现是否真的做到了它声称的事。

发展脉络:

  • 奠基工作:Franklin et al. (2013, Computational Statistics & Data Analysis) 提出 Plasmode 框架,用于药物流行病学中评估混杂调整方法在大型医疗索赔数据库中的表现。其核心设计是"从观测数据中重采样协变量和处理,保留变量间的联合分布,然后模拟结局"。这篇论文确立了 Plasmode 的基本范式:真实协变量 + 真实处理 + 模拟结局。作者在摘要中明确说明其动机是"普通模拟方法无法捕捉医疗索赔数据的复杂特征"。
  • 方法学警示:Shaw et al. (2025, Statistics in Medicine) 对 Plasmode 模拟在因果推断中的使用提出警告,区分了 sample-treatment 与 generate-treatment 两种设计,并指出前者(重采样观测处理)会导致某些估计器"错误地显得过于有偏"或"错误地显得无偏",取决于具体设定。这篇论文是本文的直接对话对象——本文引用它来说明"表观性能反映的是模拟设计而非被评估方法"("Apparent performance then reflects the simulation rather than the method being evaluated")。
  • 应用扩散:Vader et al. (2023, Epidemiology) 使用 Plasmode 模拟比较 IPTW 在电子健康记录数据中处理混杂变量缺失和结局错分时的表现;Du et al. (2024, 2025) 分别用 Plasmode 模拟比较倾向得分匹配与基数匹配、因果森林与 IPTW 在集群水平混杂下的表现。这些应用表明 Plasmode 已成为方法学比较的标准工具之一。
  • 工具化:Meng & Huang (2025, American Journal of Epidemiology) 发布 REFINE2,一个自动化 Plasmode 模拟的 Shiny 应用,允许分析者输入自己的数据并快速比较不同估计算法在估计 ATE 时的表现。本文引用它说明"更新的工具使用相同的设计"——即 generate-treatment 范式仍在延续。

子线索聚类:

  1. 设计选择之争:sample-treatment vs. generate-treatment。Shaw et al. 系统比较了两种策略,指出 generate-treatment 更适合评估依赖倾向得分的方法,因为它保证了处理分配机制已知。本文发现的是 generate-treatment 在 Plasmode 0.1.0 中的实现缺陷,与 Shaw 等人的设计层面批评形成互补。
  2. 应用驱动的方法比较:Vader、Du 等人在具体流行病学问题(缺失数据、集群混杂)中使用 Plasmode 作为评估工具。这类工作默认 Plasmode 实现是正确的,本文的发现对这些应用的结论提出了质疑——如果它们使用了受影响的分支,其方法比较可能无效。
  3. 工具开发与可用性:REFINE2 等工具试图让 Plasmode 更易用,但自动化程度越高,实现缺陷越隐蔽。本文的审计提醒:工具的可视化界面和文档可能掩盖底层数据流的错误。

这个方向在追问的核心问题:

  • 模拟数据是否真的包含了研究者设计好的混杂结构? 这是 Plasmode 有效性的根本问题。本文给出的诊断答案是:不一定,实现细节可以静默地破坏它。
  • 如何验证模拟实现与设计意图一致? 本文提出了一种实用的验证策略:在零效应下检查处理-协变量关联(AUC)是否保留,检查报告效应是否与生成模型一致。
  • 方法比较的结论在多大程度上是模拟设计的产物? Shaw et al. 从设计层面提出了这个问题,本文从实现层面提供了具体案例。

⚠️ 作者的 framing(这是作者的说法):作者把缺口 frame 成"Plasmode 0.1.0 的实现缺陷导致三个对应关系(行对应、干预对应、目标对应)被破坏,使得 generate-treatment 设计退化为一种无意的 sample-treatment 设计,同时处理-协变量关联被稀释"。他通过策略 A/B/C 的对比实验证明:未修改的生成器让所有估计器(包括故意错误指定的)都看似无偏,而修正对齐后,错误指定的估计器暴露出 0.10–0.11 的风险差偏倚。作者淡化的竞争路线包括:对 Plasmode 设计本身(而非实现)的批评(Shaw et al. 的立场),以及更广泛的模拟验证框架(如 ADEMP 虽然被引用,但只作为报告标准,没有作为验证工具)。什么明显该被引/该存在、却没出现在 intro 里:没有讨论其他 Plasmode 实现(如 SAS/Stata 版本或其他 R 包)是否也有类似问题;没有讨论如何系统性地审计模拟代码的自动化工具;没有提及与数据生成过程验证相关的更广泛文献(如 simulation calibration 的一般方法)。

张力:被引文献之间存在一个值得注意的张力:Shaw et al. (2025) 批评 sample-treatment 框架并推荐 generate-treatment,而本文发现 generate-treatment 在 Plasmode 0.1.0 中的实现缺陷使其实际效果接近 sample-treatment(结局由观测处理生成)且处理-协变量关联被破坏。这意味着:遵循 Shaw 等人的建议使用 generate-treatment 框架的研究者,如果使用了 Plasmode 0.1.0,实际上得到的可能既不是 sample-treatment 也不是正确的 generate-treatment,而是一种更糟的混合体——处理与协变量几乎独立,但结局却依赖于观测处理。这不是被引文献之间的矛盾,而是"设计层面的建议"与"实现层面的现实"之间的落差。


二、最核心、最简单的例子 / 数学问题

第一步:符号、模型、可观测数据

设真实队列中有 N 个个体,每个个体有:

  • X_i ∈ ℝ^p:协变量向量(可观测,来自真实数据)
  • A_obs,i ∈ {0, 1}:观测到的处理(可观测,来自真实数据)
  • Y_i:结局(在 Plasmode 中为模拟生成)

Plasmode 模拟的目标是生成一个新的数据集 {(X_i, A_sim,i, Y_i)},使得: 1. X 的联合分布与真实数据一致(通过重采样实现) 2. A_sim 与 X 的关系由研究者指定的处理模型决定(generate-treatment 设计) 3. Y 由研究者指定的结局模型决定,其中包含 A_sim 的因果效应

预期流程(generate-treatment,研究者意图):

  1. 重采样:从 N 个个体中有放回地抽取 n 个(或使用原始 N 个),得到协变量 X_i 和观测处理 A_obs,i
  2. 拟合处理模型:在原始数据上拟合 P(A_obs = 1 | X) = logit⁻¹(X^T β),得到估计值 β̂
  3. 计算倾向得分:对每个被采样的个体 i,计算 p_i = logit⁻¹(X_i^T β̂)
  4. 生成新处理:从 Bernoulli(p_i) 中抽取 A_sim,i
  5. 生成结局:从指定的结局模型生成 Y_i,其中处理项使用 A_sim,i

实际流程(PlasmodeBin() 0.1.0 的代码行为):

  1. 排序:将数据框按 A_obs 排序(未处理组在前,处理组在后)
  2. 重采样:从排序后的数据框中抽取索引 idx(分层采样,保证两组都有足够样本)
  3. 构建处理设计矩阵:X_A 在原始顺序的数据上构建(model.matrix 调用时未排序)
  4. 错位:执行 X_A[idx, ] 时,idx 指向排序后的行位置,但 X_A 是原始顺序 → 第 i 个被采样的个体拿到的是另一个个体的协变量
  5. 计算倾向得分:用错位的 X_A 计算 p_i
  6. 生成处理:从错位的 p_i 中抽取 A_sim,i
  7. 生成结局:用观测处理 A_obs,i(而非 A_sim,i)生成 Y_i

第二步:最小内核

考虑一个极端简化的例子,只有 4 个个体,1 个协变量 X,处理模型为:

P(A = 1 | X) = logit⁻¹(β₀ + β₁ X),其中 β₁ = 2(X 与处理正相关)

假设原始数据为:

个体 X A_obs
1 -1.0 0
2 -0.5 0
3 0.5 1
4 1.0 1

按 A_obs 排序后(稳定排序,0 在前):

排序后位置 原始个体 X A_obs
1 1 -1.0 0
2 2 -0.5 0
3 3 0.5 1
4 4 1.0 1

假设采样索引 idx = (2, 3, 1, 4)(从排序后的位置中抽取)。

正确做法:个体 2(X=-0.5)应得到 p = logit⁻¹(β₀ + 2×(-0.5)) = logit⁻¹(β₀ - 1);个体 3(X=0.5)应得到 p = logit⁻¹(β₀ + 1)。

Plasmode 0.1.0 的实际做法:X_A 是原始顺序的矩阵,即 X_A = (-1.0, -0.5, 0.5, 1.0)ᵀ。执行 X_A[idx, ] 得到 (-0.5, 0.5, -1.0, 1.0)ᵀ。于是: - 排序后位置 2(原始个体 2,X=-0.5)拿到 X_A[2] = -0.5 ✓(碰巧正确) - 排序后位置 3(原始个体 3,X=0.5)拿到 X_A[3] = 0.5 ✓(碰巧正确) - 排序后位置 1(原始个体 1,X=-1.0)拿到 X_A[1] = -1.0 ✓(碰巧正确) - 排序后位置 4(原始个体 4,X=1.0)拿到 X_A[4] = 1.0 ✓(碰巧正确)

这个例子中所有个体都碰巧正确,因为排序没有改变相对位置(X 与 A_obs 完全正相关)。但如果 X 与 A_obs 不是完全单调关系,错位就会发生。

更现实的例子:假设 X 与 A_obs 的关系不是完美的。考虑:

个体 X A_obs
1 0.5 0
2 1.5 1
3 -1.0 0
4 2.0 1

按 A_obs 排序后:个体 1 (X=0.5), 个体 3 (X=-1.0), 个体 2 (X=1.5), 个体 4 (X=2.0)。

假设采样 idx = 2(排序后第 2 个位置,即原始个体 3,X=-1.0)。但 X_A[2] 是原始顺序第 2 行,即个体 2 的 X=1.5。于是个体 3(X=-1.0,真实 p 应很低)被赋予了基于 X=1.5 计算的 p(很高)。抽取 A_sim 时,本应大概率是 0,现在大概率是 1。

这就是行错位的本质:采样索引指向排序后的行,但设计矩阵是原始顺序,导致"张冠李戴"。

为什么这会导致"糟糕的调整看起来很好":当错位发生时,A_sim 与 X 的关联被稀释。在合成队列中,源模型 AUC 从对齐后的 0.841 降到未对齐的 0.503——A_sim 几乎与 X 独立。此时: - 未调整的估计量已经接近无偏(因为没有混杂需要调整) - 任何调整方法(无论正确还是错误指定)都显得无偏 - 方法之间的差异被压缩到接近零

这就解释了为什么在未修改的生成器下,五个估计器(包括故意错误指定的)都看似无偏:不是因为它们都有效,而是因为模拟数据中根本没有留下需要调整的混杂。

这个最小内核揭示了论文的核心数学问题:一个看似简单的"先排序、再采样、再建矩阵"的代码流程,如果三个步骤的顺序和索引不一致,就会静默地破坏模拟数据的因果结构。而由于最终数据集中 X、A_sim、Y 之间的关联看起来"合理"(没有报错、没有警告),这种破坏极难被察觉。


三、这篇论文做了什么

三句话: 1. 研究了什么问题:对 Plasmode 0.1.0 R 包中 PlasmodeBin() 函数的 generate-treatment 分支进行代码审计,检验其是否满足三个基本对应关系——行对应(采样个体是否拿到自己的协变量)、干预对应(结局是否由返回的处理生成)、目标对应(报告效应是否与生成模型一致)。 2. 核心方法:通过源代码追踪 + 三种策略(A:原始顺序、B:按观测处理排序、C:对齐修正)在相同随机种子下的对比实验,在合成队列和 SUPPORT/右心导管队列中各运行 200 次零效应重复,用源模型 AUC、粗风险差偏倚、条件 log OR 等指标诊断错位的影响。 3. 主要结论:PlasmodeBin() 0.1.0 存在行错位缺陷——采样个体通常收到另一个体的处理概率,结局由观测处理而非返回处理生成,报告效应与生成效应不一致。这导致未修改的生成器几乎消除设计好的混杂(AUC 从 0.841 降至 0.503),使所有估计方法(包括错误指定的)都看似无偏。对齐修正后,错误指定的估计器暴露出 0.10–0.11 的风险差偏倚。

关键设定与假设:

  • 测试对象:PlasmodeBin() 中"处理模型和结局模型都以公式形式提供"的分支(即双公式分支)。这是文档声称支持 generate-treatment 设计的配置。
  • 三个对应关系(作者明确提出的验证标准):
  • 行对应:被采样个体的处理概率必须基于该个体自己的协变量计算
  • 干预对应:结局必须由返回给分析者的处理(A_sim)生成,而非观测处理(A_obs)
  • 目标对应:报告的处理效应必须与结局生成模型中的系数一致
  • 诊断指标:
  • 源模型 AUC:在源数据上拟合的倾向得分模型对生成处理的判别能力。AUC ≈ 0.5 表示处理与协变量几乎独立(混杂丢失);AUC ≈ 源数据值表示关联保留。
  • 粗风险差偏倚:未调整估计量减去真实效应(零效应下即估计量本身)。
  • 条件 log OR:在同时包含观测处理和返回处理的模型中,检验效应出现在哪个处理上。
  • 实验设计:合成队列(6 个正态协变量,N=4000,模拟 n=2000)和 RHC 队列(32 个协变量,5735 完整案例,模拟 n=3000),各 200 次重复,注入零效应。策略 A 运行未修改的包,策略 B 将输入数据按观测处理排序(模拟包内部排序的效果),策略 C 用一行代码修正对齐。

主要结果:

  1. 行错位是系统性的:在合成队列的原始顺序下,99.985% 的采样个体收到另一个体的处理概率。这不是偶发错误,而是代码逻辑的必然结果——排序后的采样索引与原始顺序的设计矩阵不兼容。
  2. 错位削弱混杂:源模型 AUC 从对齐后的 0.841 降至未对齐的 0.503(合成队列),RHC 队列从 0.756 降至 0.496。处理与协变量的关联几乎被完全消除。
  3. 错位使所有估计器看似无偏:在未修改的生成器下,五个估计器(未调整、正确/错误指定的 g-computation、正确/错误指定的 IPW)的粗风险差偏倚都接近零(合成队列 +0.0051)。对齐后,未调整估计量偏倚达 +0.3037,错误指定的 g-computation 和 IPW 偏倚为 0.10–0.11,而正确指定的估计器仍接近无偏(g-computation +0.0005,IPW +0.0085)。
  4. 错位方向依赖输入顺序:在 7 种结构化顺序下,粗风险差偏倚从 -0.0719 到 +0.3032 不等;在 500 种随机顺序下,平均 AUC 为 0.499,无一超过 0.55。错位可能削弱、保留甚至反转设计好的混杂。
  5. 效应出现在观测处理上:注入 OR=2 时,条件 log OR 在观测处理上为 +0.696(目标 0.693),在返回处理上仅为 +0.017。这证实了结局-处理解耦——结局由观测处理生成,而非返回处理。
  6. 边际校准问题:对齐后,合成队列的达到处理患病率为 0.241,低于请求的 0.300。这是因为源数据中处理患病率为 0.506,校准截距在采样前计算,但采样后的协变量分布与源数据不同。

证明路线与技术技巧:

  • 整体路线:作者没有采用传统的数学证明,而是采用"代码审计 + 对照实验"的验证策略。具体逻辑是:
  • 从源代码中识别出三个对应关系的断裂点(排序、采样、矩阵构建的顺序不一致)
  • 设计策略 A/B/C 来隔离每个断裂点的贡献——A 是原始状态,B 模拟包的内部排序效果,C 是修正后的对照
  • 用源模型 AUC 作为"处理-协变量关联是否保留"的定量诊断
  • 用注入 OR=2 的实验来区分"效应出现在哪个处理上"
  • 用 7 种结构化顺序和 500 种随机顺序来证明错位效应的方向依赖性和普遍性

  • 关键技巧:

  • AUC 作为诊断工具:作者没有直接检查代码逻辑(虽然也做了),而是通过测量生成数据中处理与协变量的关联来间接验证。这是一个"输出验证"策略——即使不看代码,也能发现数据有问题。
  • 策略 B 和 C 的对照设计:B 和 C 在每轮重复中产生完全相同的随机数流,唯一区别是 C 修正了行对应。这种"单变量干预"设计使得任何差异都可归因于行错位。
  • 零效应设计:在零效应下,任何非零的估计偏倚都直接归因于模拟设计而非真实效应,简化了诊断。
  • 蒙特卡洛区间:200 次重复的 95% 蒙特卡洛区间量化了抽样不确定性,使"0.503 vs 0.841"的差异具有统计可信度。

  • 技术难点:作者面对的核心难点是"如何证明一个静默错误的存在"。代码不报错、数据看起来合理、估计结果看似合理——唯一的线索是 AUC 异常低。作者的解决方式是:先通过源代码追踪找到机制,再通过对照实验证明因果性,最后通过顺序扫描证明普遍性。

真实例子与应用:

  • 合成队列:6 个独立正态协变量,处理模型为 logit⁻¹(X^T β),结局模型为线性回归加处理效应。这是最简单的验证场景,用于建立基线结果。
  • SUPPORT/右心导管队列:32 个协变量,5735 个完整案例,模拟 3000 人。这是真实数据的验证场景,证明缺陷在复杂数据中同样存在。
  • 7 种结构化顺序:按处理、按倾向得分、按协变量等排序,证明错位效应不是特定顺序的偶然结果。
  • 500 种随机顺序:证明在随机输入下,错位几乎总是削弱混杂(平均 AUC ≈ 0.5),但具体方向(增强/削弱/反转)取决于顺序。

🔎 结论是否比证明窄:作者的结论比证明窄。具体来说: - 作者只测试了 PlasmodeBin() 的双公式分支,其他分支(如单公式、拟合对象输入)只做了代码检查,没有实验验证。 - PlasmodeCont() 只做了一个实验(确认返回错误标识符),PlasmodeSur() 只做了源代码检查。 - 作者没有系统审计已发表研究中哪些使用了受影响的分支,因此无法估计实际影响范围。 - 作者提出的修正方案(策略 C 的一行代码)只解决了行对应问题,没有解决干预对应和目标对应问题——这两个问题在修正后依然存在。 - 作者没有讨论修正后剩余偏倚(如错误指定估计器的 0.10–0.11 偏倚)是否反映了真实的方法性能差异,还是仍有其他实现缺陷。


四、开放问题

  1. 其他 Plasmode 版本和分支是否受影响? 作者只深入测试了 PlasmodeBin() 的双公式分支。PlasmodeCont() 和 PlasmodeSur() 的检查不完整,且 0.1.0 之后的版本(如果有)是否修复了这些问题未知。要确认这一点,需要对 CRAN 存档中的所有版本进行系统审计,并对每个分支运行类似的对照实验。

  2. 已发表的 Plasmode 研究结论是否需要重新评估? 作者提到 Plasmode 0.1.0 自 2017 年以来被用于多项方法学比较研究(引文 7–9),但未确定哪些研究使用了受影响的分支。这是一个可操作的调查问题:检索所有引用 Plasmode 0.1.0 的论文,检查其代码是否触发行错位路径,重新运行关键比较。

  3. 如何设计自动化的模拟有效性检查? 作者提出的诊断方法(源模型 AUC、双处理回归)是事后检查,但需要手动实施。一个开放问题是:能否将这类检查嵌入 Plasmode 工具本身,在生成数据时自动报告处理-协变量关联的保留程度、效应出现的位置、以及边际校准的偏差?这需要定义"可接受的保留程度"的阈值,并考虑不同场景(如弱工具、稀有处理)下的适用性。

  4. generate-treatment 框架下,如何同时保证行对应、干预对应、目标对应和边际校准? 作者的修正解决了行对应,但干预对应(结局应由 A_sim 生成)和目标对应(报告效应应与生成模型一致)在修正后依然存在问题。一个更深层的问题是:在重采样框架下,这四个对应关系是否可能同时满足?还是存在某种不可能性定理?这需要形式化定义"正确的 Plasmode 生成过程"并分析其可行性边界。

  5. 行错位是否影响方差估计和覆盖概率? 作者只评估了偏倚。但即使偏倚被修正,错位导致的"有效样本量"变化(因为处理概率被随机分配给错误的个体)可能影响方差估计的准确性。这需要理论分析:错位后的数据生成过程对应的似然是什么?基于此似然的推断是否有效?

提醒:要确认上述问题是否为真 gap,建议检索 2023–2026 年间关于 Plasmode 模拟的方法学论文(特别是 Statistics in Medicine 和 American Journal of Epidemiology 上的后续工作),看它们是否已经解决了这些问题。如果多篇近期论文都指向同一问题,那是共识性 gap;如果互相矛盾,则是机会。


Maintained by 陈星宇 · Homepage · Source on GitHub

评论