Skip to content

对照定义敏感性分析:做了什么、为什么撤回

先看这里

results/ctrl_sensitivity/ 里的产物不能按字面使用。 其中的「效应保留率」不能解释为"扣除糖尿病贡献后剩余的效应"—— 该因果归因经检验不成立,已撤回。本页记录全过程,防止日后误用。

一、当初想做什么

R9 主线用一般人群对照,审稿人最可能问:"你发现的并发症蛋白,凭什么不是糖尿病蛋白?"

设想的答案:R13 的多数并发症端点把对照限定在糖尿病人内, 所以拿同一批蛋白在 R13 跑一遍,若效应仍在,就说明它不是糖尿病效应。

二、实际做了什么

新增脚本 analysis/36_control_definition_sensitivity.R, 并为糖网补跑了一条 R13_ctrlcmp 筛查线(见下方第五节)。

设计三类对比:

类别结局用途
A 阴性对照T1D_gcst、T2D_mahajan两版用完全相同的外部文件,估计值必须一致
B release 对照NeovascGlaucoma两版对照都是一般人群,隔离"纯 release 更新"的影响
C 对照定义变化Retinopathy、Nephropathy、NeuropathyR13 把对照限定到糖尿病人
D 编码不同MaculopathyR9 是 DM_MACULOPATHY_EXMORE,R13 是 DM_MACULOPATHY表型编码不同

三、★ 为什么核心解释被撤回

初看结果很漂亮:R9 显著者在 R13 的中位效应保留率为糖网 62%、肾病 73%、神经 68%、黄斑 75%, 而三个 A 级候选中 APOL1 保留 89%、ERMAP 80%(高于背景),IFNAR1 只有 44%(远低于背景)。

于是我一度得出"IFNAR1 的信号大部分来自糖尿病本身"。这个结论站不住。

第一层检验:赢家诅咒

用"R9 显著"选蛋白再看 R13 保留多少,这个设计本身就会产生衰减(回归均值)。 做对称性检验:反过来用 R13 显著选、看在 R9 保留多少。

结局以 R9 选 → R13 保留以 R13 选 → R9 保留
Retinopathy62%122%
Nephropathy73%137%
Neuropathy68%146%
Maculopathy75%118%

两个方向都指向"R9 的效应系统性大于 R13",不是对称衰减——排除了单纯的赢家诅咒

第二层检验:对照定义未变的参照组(决定性)

关键是找一个对照定义没变的结局做参照。NeovascGlaucoma 两版对照都是一般人群 (366,206 → 483,921),正是这个参照。统一取 p<0.05 让四个结局都有足够样本:

结局对照定义不对称程度(百分点)
NeovascGlaucoma完全没变−34
Neuropathy温和限制−34
Nephropathy剧烈限制−23
Retinopathy剧烈限制−22

决定性证据

对照定义完全没变的结局,不对称程度最大(−34),不小于对照定义变了的那些。

⇒ R9 与 R13 的效应量差异不能归因于对照定义。 它是 R9→R13 这个 release 更新本身带来的普遍现象,与对照怎么定义无关。

第三层检验:机制检验同样不支持

若差异源于"R9 对照含非糖尿病人、把糖尿病效应折进来",则糖尿病相关蛋白|b9|−|b13| 应明显大于无关蛋白。实测四个结局的 Wilcoxon p 分别为 0.129、0.761、0.984、0.321,全部不显著

四、撤回后,还剩什么可用

可用(且干净)

1. 阴性对照通过。 T1D/T2D 两版用完全相同的外部文件,85 对配对的 |b9−b13| 最大为 0。比较机制本身无误。

2. 方向一致性 100%。

结局R9 显著对数方向一致R13 名义显著R13 过 FDR
Retinopathy2424(100%)199
Maculopathy1919(100%)188
Nephropathy99(100%)96
Neuropathy55(100%)54
合计5757(100%)5127

3. 三个 A 级候选在 R13 的表现(事实陈述,不含因果解释)

蛋白R9 效应R13 效应R13 FDRR13 是否达 FDR
APOL10.41960.37290.0095
ERMAP−1.1100−0.88670.0328
IFNAR1−0.2458−0.10710.69

不可用

  • 不能把「效应保留率」解释为"扣除糖尿病贡献后的残余效应"
  • 不能说 IFNAR1 是"糖尿病驱动"——它的衰减(44%)虽低于该结局背景(75%), 但由于对照定义未变的结局也有同等不对称,该差异无法归因
  • 不能称之为"独立复制"——R9 与 R13 是同一队列 FinnGen 的两个 release, 样本高度重叠,只能叫 sensitivity analysis

五、R13_ctrlcmp 这条新筛查线是什么

为了让糖网能做同表型编码的对比,在 mr-pipeline/outcome_manifest.csv 中 新增了一行 release = R13_ctrlcmp

R13_ctrlcmp,Retinopathy,finngen_R13_DM_RETINOPATHY_EXMORE.gz,DM_RETINOPATHY_EXMORE,15353,62519,...

它与 R9 的 Retinopathy 表型编码完全相同DM_RETINOPATHY_EXMORE), 仅对照数不同(R9 308,633 vs R13 62,519)。产物在 results/screen_R13_ctrlcmp/ (1,659 个工具,minF = 43.8,14 个显著)。

原 manifest 已备份为 outcome_manifest.csv.bak-20260731-ctrlcmp

追加 manifest 行时的两个坑

  1. 原文件末尾没有换行符 → 直接追加会让 fread 把新行当作"单行页脚"整行丢弃
  2. 备注字段里不能含逗号(未加引号会破坏字段数,同样被当页脚丢掉)

六、真正能回答"是不是糖尿病效应"的,是另一个分析

糖尿病易感性对照分析analysis/27_diabetes_contrast.R,产物在 results/diabetes_contrast/)才是正解——它在同一份数据内直接比较 并发症端与糖尿病端的效应,不受 release 差异干扰。

本页这个分析不应作为正文核心证据,最多作为一段稳健性描述, 且只写「方向一致性 100%、27/57 在另一 release 仍达 FDR」,不提保留率、不做归因。

七、方法学教训

提出这个方案时,我没有想到要预先找一个"对照定义未变"的参照组。 方案被批准、跑完、得出漂亮结论之后,才在自查中发现归因不成立。

应当在设计阶段就问:这个对比里,除了我关心的那个变量,还有什么在同时变化? 本例中同时变化的是 FinnGen release 版本,而它的影响并不小于对照定义。

个人科研与运维文档 · 内容持续修订