主题
对照定义敏感性分析:做了什么、为什么撤回
先看这里
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、Neuropathy | R13 把对照限定到糖尿病人 |
| D 编码不同 | Maculopathy | R9 是 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 保留 |
|---|---|---|
| Retinopathy | 62% | 122% |
| Nephropathy | 73% | 137% |
| Neuropathy | 68% | 146% |
| Maculopathy | 75% | 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 |
|---|---|---|---|---|
| Retinopathy | 24 | 24(100%) | 19 | 9 |
| Maculopathy | 19 | 19(100%) | 18 | 8 |
| Nephropathy | 9 | 9(100%) | 9 | 6 |
| Neuropathy | 5 | 5(100%) | 5 | 4 |
| 合计 | 57 | 57(100%) | 51 | 27 |
3. 三个 A 级候选在 R13 的表现(事实陈述,不含因果解释)
| 蛋白 | R9 效应 | R13 效应 | R13 FDR | R13 是否达 FDR |
|---|---|---|---|---|
| APOL1 | 0.4196 | 0.3729 | 0.0095 | ✅ |
| ERMAP | −1.1100 | −0.8867 | 0.0328 | ✅ |
| IFNAR1 | −0.2458 | −0.1071 | 0.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 行时的两个坑
- 原文件末尾没有换行符 → 直接追加会让
fread把新行当作"单行页脚"整行丢弃 - 备注字段里不能含逗号(未加引号会破坏字段数,同样被当页脚丢掉)
六、真正能回答"是不是糖尿病效应"的,是另一个分析
糖尿病易感性对照分析(analysis/27_diabetes_contrast.R,产物在 results/diabetes_contrast/)才是正解——它在同一份数据内直接比较 并发症端与糖尿病端的效应,不受 release 差异干扰。
本页这个分析不应作为正文核心证据,最多作为一段稳健性描述, 且只写「方向一致性 100%、27/57 在另一 release 仍达 FDR」,不提保留率、不做归因。
七、方法学教训
提出这个方案时,我没有想到要预先找一个"对照定义未变"的参照组。 方案被批准、跑完、得出漂亮结论之后,才在自查中发现归因不成立。
应当在设计阶段就问:这个对比里,除了我关心的那个变量,还有什么在同时变化? 本例中同时变化的是 FinnGen release 版本,而它的影响并不小于对照定义。