3. 验证工程总体架构

真实世界研究(RWS)的结果验证不是一次性的统计复核,而是一条贯穿数据、定义、分析、稳健性与结论的工程流水线。它的核心目标只有一个:让“结论”在换人、换时、换环境后仍能被复现,并且其可信程度可以被明确标注。本节把这条流水线拆成五个相互咬合的工程层——数据治理、结果定义、可重复分析、敏感性分析、证据分级,并说明它们之间的输入输出契约与失败回退路径。

一、五层流水线的职责与接口

第一层数据治理层解决“数据能不能用、用了哪一版”。它负责源数据接入、编码映射(如 ICD-10 到本地术语)、变量字典、缺失与异常标记、以及数据版本快照。输出物是带版本号的分析数据集(ADS)与数据质量报告。第二层结果定义层把研究问题翻译成机器可执行的定义:暴露、结局、协变量、随访窗口、纳入排除标准,全部以结构化配置(如 JSON/YAML)固化,避免“定义漂移”。第三层可重复分析层用容器化环境与参数化脚本执行主分析,产出点估计、置信区间与诊断图。第四层敏感性分析层系统性地扰动关键假设,检验结论方向是否稳定。第五层证据分级层依据预设规则,把“结论+稳健性证据”映射为证据等级,并输出可追溯的验证报告。

① 数据治理 源数据接入 · 编码映射 变量字典 · 版本快照 → ADS + 质量报告 ② 结果定义 暴露/结局/协变量 随访窗口 · 纳排标准 → 结构化配置 ③ 可重复分析 容器化环境 · 参数化脚本 主分析 · 诊断图 → 点估计 + CI ④ 敏感性分析 假设扰动 · 亚组 阴性对照 · E-value → 稳健性矩阵 ⑤ 证据分级 预设规则 · 偏倚评估 → 证据等级 + 验证报告 定义漂移/数据缺陷回退 稳健性不足回退 关键契约与产物 • 数据治理 → 结果定义:ADS 必须携带变量字典与版本哈希,定义层不得直接访问原始数据。 • 结果定义 → 可重复分析:所有定义以配置文件固化,分析脚本只读配置,禁止硬编码。 • 可重复分析 → 敏感性分析:主分析输出必须包含效应量、CI、样本量与诊断图,供扰动对比。 • 敏感性分析 → 证据分级:稳健性矩阵是分级的直接输入,方向反转或 CI 跨越无效线触发降级。

二、数据治理层:把“脏数据”变成可追溯资产

数据治理不是简单清洗,而是建立可追溯的映射链。以某医院电子病历为例,源表 diagnosis 中糖尿病编码混杂 ICD-9(250.x)与 ICD-10(E11.x)。治理层需要建立映射表,将两者统一到标准概念集,并记录每条映射的置信度。缺失值处理必须显式声明策略:连续变量用多重插补(M=5),分类变量增设“未知”类别,而非直接删除。关键输出是数据质量报告,包含各变量缺失率、异常值比例、映射覆盖率。若某关键协变量缺失率超过 30%,应在报告中标记为“高风险”,并触发结果定义层的重新评估。

三、结果定义层:用配置锁定研究意图

结果定义层把“研究问题”翻译成不可歧义的配置。以下是一个可执行的 YAML 片段示例(教学示例,非真实研究数据):

study:
  name: "T2DM_心血管结局_验证"
  data_version: "ADS_v2.3_20250101"
cohort:
  index_date: "首次处方二甲双胍日期"
  inclusion: ["年龄≥18", "确诊T2DM", "连续参保≥180天"]
  exclusion: ["1型糖尿病", "终末期肾病", "妊娠"]
exposure:
  drug: "二甲双胍"
  comparator: "磺脲类"
  grace_period: 30
outcome:
  primary: "主要不良心血管事件(MACE)"
  definition: "心梗/卒中/心血管死亡复合终点"
  follow_up: "index_date + 365天"
covariates:
  - "年龄"
  - "性别"
  - "基线HbA1c"
  - "高血压史"
  - "Charlson评分"

这份配置一旦冻结,后续所有分析都基于同一版本。任何修改必须生成新版本号,并记录变更原因。这样,当审阅者质疑“为什么纳入 180 天连续参保”时,可以直接回溯到配置历史,而不是依赖口头解释。

四、可重复分析层:环境、脚本与诊断

可重复分析的核心是“环境即代码”。推荐使用 Docker 镜像固定 R/Python 版本与包依赖,镜像标签包含日期与哈希。分析脚本采用参数化设计,通过命令行传入配置路径与输出目录。主分析通常包括:倾向性评分匹配或加权、Cox 比例风险模型或逻辑回归、以及诊断图(如 Love plot 检查协变量平衡、Schoenfeld 残差检验 PH 假设)。

以倾向性评分匹配为例,关键参数包括卡钳值(如 0.2×logit(PS) 标准差)、匹配比例(1:1 或 1:2)、以及是否放回。匹配后需报告标准化均差(SMD),通常要求所有协变量 SMD < 0.1。若某协变量 SMD 超标,应回到结果定义层检查是否遗漏关键混杂因素,或调整匹配策略。主分析输出应包含:效应量(HR/RR)、95% CI、p 值、事件数、以及匹配前后 SMD 对比表。

五、敏感性分析与证据分级:让结论“抗扰动”

敏感性分析不是可选项,而是验证工程的必要环节。常见扰动维度包括:

  • 定义扰动:改变随访窗口(365 天 vs 730 天)、改变暴露定义(首次处方 vs 持续用药)。
  • 模型扰动:替换倾向性评分模型(逻辑回归 vs 梯度提升)、替换结局模型(Cox vs 竞争风险)。
  • 数据扰动:对缺失值采用不同插补策略、对异常值进行截尾处理。
  • 阴性对照:选择一个理论上不应受暴露影响的结局(如意外伤害),检验是否出现虚假关联。

每次扰动产生一个效应量,汇总为稳健性矩阵。若主分析 HR=0.82(95% CI 0.71–0.95),而多数扰动下 HR 仍在 0.75–0.90 且 CI 不跨越 1,则结论方向稳定。若某扰动导致 HR 反转或 CI 跨越 1,则需在证据分级中降级,并说明该扰动的合理性。

证据分级层依据预设规则(可参考 GRADE 框架的 RWS 扩展)综合以下维度:偏倚风险(数据质量、混杂控制)、间接性(人群与目标人群的匹配度)、精确性(CI 宽度)、一致性(敏感性分析结果方向)、以及直接性(结局定义与临床相关性)。最终输出证据等级(高/中/低/极低)与验证报告。报告必须包含:配置版本、数据版本、主分析结果、敏感性分析汇总、以及降级理由。这样,任何第三方都可以沿着同一条流水线重新执行,并得到可比较的结论。

工程化验证的关键不是追求“完美数据”,而是让每一步的假设、操作与结果都可追溯、可复现、可审计。当结论被质疑时,你能够指出它来自哪一版数据、哪一份配置、哪一次扰动,以及为什么被定为该证据等级。