主题
★ 列名与产物路径已于 2026-08-07 重构
本页下文引用的列名与文件路径是重构前的。内部流程编号(4a/4b/step3)已从产物中移除,判定产物已移到 results/external_replication/。新旧对照表见 工程约定与事故记录 §四。
★ 重构不改任何数字——已存基线并逐行 diff 验证,主链数字完全一致。
07 · 第 4b 步 · 外部复制 · 换结局队列
执行日期:2026-08-07(同日修复 p 值缺陷后重跑) 状态:✅ 完成 结果:53 对 → 复制成功 10 · 送 4X 1 对 · 方向一致未达 FDR 18 · 反向未达 FDR 5 · 不可评估 19
★ 2026-08-07 修复:p 值曾由置信区间反推,已重跑
根因:MVP 两个结局文件(GCST90475689 / GCST90475676)的 standard_error 列全是 #NA,流水线按 se_from_ci=TRUE 从 CI 反推 SE, 再由 mr_singlesnp 以 b/se 算 p。但这些文件的 CI 只有 4 位有效数字, 反推的 SE 精度不足,算出的 p 与文件报告的 p 相差可达 174 倍:
| SNP | 文件报告 p | CI 反推 p | 倍数 |
|---|---|---|---|
rs149802978 | 1.28e-19 | 2.22e-17 | 174× |
rs2641348 | 4.09e-08 | 3.08e-07 | 7.5× |
rs1049742 | 3.74e-05 | 2.24e-04 | 6.0× |
修法:单 SNP Wald 的 z = βY/σY,MR 的 p 恒等于结局侧的 p —— 结局文件报了 p 就直接用它;SE 仍由 CI 反推(Wald 比值需要),但不再拿它算 p。
影响(已逐项核过):
- 复制成功 7 → 10:新增
AGER×Neuropathy ·GALNT3×Retinopathy ·HCG22×Retinopathy - ★ 送 4X 的
opposite集合完全不变(仍只有TRIM40×Retinopathy) - ★ 4X 产物逐字节相同,否决结论不变,存活集仍 52 对
- Salem 糖肾有真实
StdErr列,不受影响
发现经过:第 4c 步的 C1 断言(same-SNP 的对,p_4c 必须与 4b 的 p_repl 相同)。 ★ 这是为验证自己理解而写的断言,抓出了上一步的数据处理缺陷。
⚠️ 本步违反了「跑前先写记录」的纪律,如实记录
纪律一要求预期必须在运行之前写完。 本步没有做到 —— 修完输入集后直接跑了,本页是事后补写的。
后果:本步没有跑前写死的预期数字,因此 不具备「预期 vs 实际」的自查力(第 0/1/2/3 步都有)。 唯一的事前约束是「输入集必须等于第 3 步存活集」,它写成了代码里的过滤 + 日志。
★ 记在这里而不是掩盖,是因为 4a 连续四轮失效的根因之一正是 「跑完看结果顺不顺眼再调规则」。本步虽然结果看起来干净, 但流程上少了一道保险,后续步骤不得沿用这个做法。
结局命名
本页用内部 ID,论文显示名见总览页对照表。
一、这一步做什么
换结局队列:暴露侧完全不动(同一批 UKB-PPP cis 哨兵、同一个平台), 只把结局从 FinnGen R9 换成独立队列,重做 MR。
| 换了 | 没换 | 因此抓不到 | |
|---|---|---|---|
| 4b | 结局 GWAS | 暴露工具(同一 SNP、同一平台) | 表位伪影——纯由结合力造成的假关联会在每个结局队列里"复制成功" |
★ 所以 v4 §6 规定:4b 报警 → 查结局侧异质性,不是查表位。 这与 4a 的路由不同,别送错。
4b 不否决(v4 §2.2),只分流。「不可评估」保留,不当阴性。
二、★★ 文献状态:C1R 原文没有这一步
逐字读过 C1R 原文(Li et al. medRxiv 2026.07.14.26358022)后确认:
- 它的验证只在暴露侧(冰岛队列 / deCODE / SomaScan)
- 疾病 GWAS 是单一来源——Methods 第 326–328 行: "The summary-level statistics of genetic associations with these ten diseases were extracted from the largest available existing GWAS"
- 发现与验证共用同一份结局数据,没有换过结局队列
→ 4b 无直接文献先例,属本研究自定。写 Methods 必须声明,不许挂靠 C1R。
但我们有 C1R 没有的具体理由做它
我们的并发症结局全部来自 FinnGen 单一队列,且其对照是一般人群 (不是"有糖尿病但无并发症"),estimand 实为**「糖尿病 + 并发症」的复合效应**—— 这是本课题早就记录在案的已知问题。
换一个独立结局队列,正是针对这个问题的直接检验。 C1R 用的是大型联盟 GWAS, 不面临这个问题,所以它没有这一步是合理的;我们面临,所以我们做。
★ 判定阈值仍沿用 4a 的文献依据(C1R Results 第 113–117 行: PFDR<0.05 **and** associated in opposite direction),保持流程内部一致。
三、用什么数据
| 结局(FinnGen R9) | 复制队列 | 来源 | 病例/对照 |
|---|---|---|---|
Retinopathy | MVP 糖网 GCST90475689 | Verma et al. Science 2024, PMID 39024449 | 29,668 / 402,541 |
Neuropathy | MVP 神经 GCST90475676 | 同上 | 59,205 / 375,439 |
Nephropathy | Salem 2019 JDRF-DNCRI 糖肾 | JDRF_DNCRI_DN_min_meta_June2019 | 见 manifest |
Maculopathy | 无 | — | — |
NeovascGlaucoma | 无 | — | (本身 0 个显著蛋白) |
暴露侧:不动,与第 1/2 步同一套 UKB-PPP cis 哨兵。
⚠️ 两个复制队列共享样本:MVP 糖网与 MVP 神经同出 Verma 2024, 且 T2D_mvp(敏感性分析用)也来自 MVP。 写作时必须说明这三者不是相互独立的复制。
⚠️ Salem 2019 的 sumstats 无 N 列,原文只给队列总体上限 → 该队列的 Steiger 定向过滤无法算 R²,被跳过(不影响方向与 p 判定)。 待从原文补充表取 DN-min 的确切病例/对照数后回填。
四、★ 输入集:必须是第 3 步的存活集(本步修的关键缺陷)
缺陷
17_replicate_external.R 原先直接读 results/screen_*/**_significant.csv (= 第 2 步输出),绕过了第 3 步。
后果:会把第 3 步已否决的对又捡回来。
修复与验证
改为读 results/reverse_mr/reverse_mr_results.csv 的 step3_survivor == TRUE, 与 4a 一致。R9_dm 线缺该文件直接 stop()。
运行日志实证修复生效:
[R9_dm] ★ 输入集 = 第 3 步存活集(97 对)
[Retinopathy] 第 3 步已否决 4 对,剔除(24 -> 20)
[T1D_gcst] 第 3 步已否决 30 对,剔除(57 -> 27)
[T2D_mahajan] 第 3 步已否决 11 对,剔除(28 -> 17)被剔的 4 对正是 APOE / BTN3A2 / ITGB7 / TIGIT × Retinopathy。
★ 这是老毛病复发(「下游输入集漂移」此前定位过但只修了个别脚本), 详见工程约定与事故记录 §三。
一处容易连坐改错的地方
35_reverse_mr.R:407 也读 *_significant.csv, 但那是为拼「正反向并排表」取正向效应量,不是输入集。两处用途不同,别一起改。
五、判定规则
对第 3 步存活的每一对(暴露工具不变):
在复制队列里取该 SNP → 谐化 → 单 SNP Wald 比
→ FDR 按结局分组校正
→ 判定:
FDR<0.05 且方向相反 → opposite → 送 4X(查结局异质性)
FDR<0.05 且方向一致 → replicated → 复制成功
方向一致但未达 FDR → same_direction_not_significant(保留)
方向相反但未达 FDR → not_significant_opposite_sign(保留,不送 4X)
复制队列无该结局/该 SNP → not_assessable(保留,不当阴性)★ 「方向相反但未达 FDR」不送 4X —— 与 4a 同一条原则: 没有分辨力的比较不该产生路由动作。
六、覆盖率
| 结局 | 存活对数 | 可评估 | 覆盖率 |
|---|---|---|---|
| Retinopathy | 20 | 20 | 100% |
| Nephropathy | 9 | 9 | 100% |
| Neuropathy | 5 | 5 | 100% |
| Maculopathy | 19 | 0 | 0% |
| 合计 | 53 | 34 | 64% |
⚠️ Maculopathy 一个都评估不了,而它占存活集的 19/53(36%)。 这与 4a 的覆盖缺口(集中在 MHC)是不同的偏倚方向,两者要分开写。
七、结果
| 判定 | 对数 |
|---|---|
same_direction_not_significant | 21 |
not_assessable(全部为 Maculopathy) | 19 |
replicated(FDR<0.05 同向) | 7 |
not_significant_opposite_sign | 5 |
opposite(→ 4X) | 1 |
7.1 复制成功的 7 对(全在糖网)
| 蛋白 | 发现队列 OR | 复制 β | FDR |
|---|---|---|---|
| PAM | 0.888 | −0.1461 | 4.4e-16 |
| NOTCH2 | 0.598 | −0.4088 | 3.1e-06 |
| NUDT5 | 3.080 | +0.8116 | 3.7e-06 |
| AOC1 | 0.809 | −0.1234 | 9.0e-04 |
| LTB | 1.919 | +0.2176 | 2.0e-03 |
| TNXB | 1.309 | +0.0600 | 1.4e-02 |
| AIF1 | 0.622 | −0.2466 | 3.3e-02 |
7.2 ★ 送 4X 的 1 对
| 蛋白 | 结局 | SNP | 发现队列 OR | 复制 β | FDR |
|---|---|---|---|---|---|
| TRIM40 | Retinopathy | rs3815079 | 0.71 | +0.229 | 8.7e-04 |
方向翻转(发现队列保护性、MVP 糖网风险性)。 ★ 路由到 4X 后查的是结局侧异质性(FinnGen vs MVP 的表型定义、对照构成), 不是表位 —— 暴露侧工具完全没换。
⚠️ TRIM40 是 MHC 区蛋白,其结局侧差异也可能与 MHC 长程 LD 相关,4X 时要一并看。
7.3 方向相反但未达 FDR(保留,不送 4X)
AGER/LTB/APOE × Nephropathy(FDR 0.99)、HCG22 × Neuropathy(0.16)、 SIGLEC5 × Retinopathy(0.13)。全部离阈值很远,属噪声,不构成报警。
八、★★ 4a × 4b 交叉表 —— 本步最有信息量的产出
| 4b 不可评估 | 4b 复制成功 | 4b 同向不显著 | 4b 反向不显著 | 4b 送 4X | |
|---|---|---|---|---|---|
| 4a 不可评估 | 10 | 2 | 12 | 2 | 1 |
| 4a 送 4X | 2 | 1 | 1 | 0 | 0 |
| 4a 稳健 | 7 | 4 | 8 | 3 | 0 |
★ 没有任何一对被 4a 和 4b 同时报警
这是 v4 §2.1「4a 与 4b 盲区互补」的实证:
| 对 | 4a | 4b | 说明 |
|---|---|---|---|
AOC1 × Retinopathy | 送 4X | 复制成功 | 换平台方向翻、换队列却复制上 → 指向暴露侧测量问题 |
APOL1 × Maculopathy | 送 4X | 不可评估 | 黄斑无外部队列,4b 帮不上忙 |
MICB_MICA × Maculopathy | 送 4X | 不可评估 | 同上 |
MICB_MICA × Nephropathy | 送 4X | 同向不显著 | 4b 未反驳 |
TRIM40 × Retinopathy | 不可评估 | 送 4X | deCODE 无此蛋白,4a 帮不上忙 |
四个 4a 报警里有两个落在 4b 盲区(Maculopathy),唯一的 4b 报警落在 4a 盲区(deCODE 无 TRIM40)。
→ 谁也替代不了谁。 若只做其中一个,会漏掉另一半的报警。
★ AOC1 这一行尤其有价值:两步给出相反的信号,而这恰恰是可解释的—— 4a 换了平台就翻方向、4b 换了队列却复制上 → 问题在暴露侧测量,不在结局定义。 这正是 4X 需要的归因线索。
九、如何解读
not_assessable不是阴性。 19 对全是 Maculopathy,因为没有外部队列—— 是我们没数据,不是它没通过。same_direction_not_significant(21 对)也不是阴性。 复制队列样本量与表型定义 都与发现队列不同,方向一致已是有意义的信息。- 7 对复制成功全在糖网,因为糖网的复制队列样本量最大(29,668 例)。 其他结局的"未达 FDR"很可能是功效问题,不是效应不存在。
- ⚠️ 三个 MVP 队列共享样本(糖网/神经/T2D 同出 Verma 2024), 不能当作三次独立复制 —— 与跨平台表的误读风险是同一类问题。
十、进正文还是补充(暂定)
| 内容 | 暂定去向 | 依据 |
|---|---|---|
| 4b 无文献先例、属自定 | 正文 Methods | ★ 必须声明,不许挂靠 C1R |
| 做 4b 的理由(FinnGen 单源 + 一般人群对照) | 正文 Methods | 它是本课题特有的动机 |
| 判定规则与 FDR 分组 | 正文 Methods | — |
| 覆盖率 64% 与 Maculopathy 全缺 | 正文 Results + Limitations | 偏倚方向与 4a 不同,要分开写 |
| 复制成功的 7 对 | 正文表 | — |
| 4a × 4b 交叉表 | ★ 正文(或补充图) | 它是"两者互补"这一方法学主张的唯一实证 |
| MVP 三队列共享样本 | Limitations | 不能当独立复制 |
| 全部 53 对明细 | 补充材料 | — |
⚠️ 暂定,第 7 步统一复核。
十一、产物
results/screen_R9_dm/replication_external.csv
97 行(含 T1D/T2D 对照臂),并发症 53 行
新增列:fdr_repl · step4b_class · to_4X · to_4X_route
results/logs/repl_4b_20260807.log⚠️ step4_survivor 列仍在,但在 v4 下语义作废(第 4 步不判存活)。 保留以免下游报错,判定一律用 step4b_class。
⚠️ 本文件仍含中文取值(repl_dataset 列,如「MVP糖网(GCST90475689)」), 尚未按编码约定清理, 运行时已打印告警。待办。