主题
★ 列名与产物路径已于 2026-08-07 重构
本页下文引用的列名与文件路径是重构前的。内部流程编号(4a/4b/step3)已从产物中移除,判定产物已移到 results/external_replication/。新旧对照表见 工程约定与事故记录 §四。
★ 重构不改任何数字——已存基线并逐行 diff 验证,主链数字完全一致。
06 · 第 4a 步 · 外部复制 · 换暴露平台(deCODE)
状态:✅ 完成 —— 六条验收断言全部 PASS;53 对 → 稳健 22 · 送 4X 4 对 · 不可评估 27(保留)
★ 本步方法在执行中被推翻重写一次(前四版作废),改为严格照搬 C1R 原文。教训见 §8.6。
本页保留了判错过程,不要只看结论
§1–§7 是跑前写的,其中 §4 的方法(IVW 合并多工具 + 自定三分法)后来被推翻。 §4 与 §6 的预期一律保持原样不回改 —— 它们记录的是「当时怎么想的」。 实际执行的方法与结果在 §8。
★ 这一步是本轮唯一一次「方法在执行中被推翻」的,教训值钱,故完整保留。
结局命名
本页用内部 ID,论文显示名见总览页对照表。
一、这一步做什么,以及它不做什么
做:在 deCODE(SomaScan 平台,35,559 名冰岛人)里从头挑 cis 工具—— 可能挑到和 Olink 完全不同的变异——然后重做 MR。
回答的问题:换一个蛋白测量平台、从头建工具,因果方向还成不成立? 顺带摆脱「哨兵是在 UKB-PPP 里选出来的」这一层赢者诅咒。
★ 不做:4a 没有否决权。 按 v4 §2.2,第 4 步只分流:
| 4a 结果 | 处置 |
|---|---|
| 方向一致 | 标 concordant(+ 强度:p<0.05 为 strong,否则 directional_only) |
| 方向相反 | 报警 → 送 4X 表位/PAV 调查(★ 4X 才是全流程唯一否决点) |
| 不可评估 | 保留,不当阴性 |
⚠️ 方向相反 ≠ 我们错了。 deCODE 用 SomaScan 适配体,若哨兵附近有蛋白编码变异(PAV) 破坏了适配体表位,坏的是 SomaScan 那一侧。判谁对谁错是 4X 的事,不是 4a 的事。 本课题的 APOL1 就是这么判的(Olink 与两个 SomaScan 队列相反 + 哨兵是 PAV)。
与已做过的「同变异跨平台」不是一回事:那个是拿我们的哨兵去 deCODE 查效应; 本步是在 deCODE 里重新选工具。
二、用什么数据、什么版本
| 项 | 值 |
|---|---|
| 暴露 | deCODE 血浆蛋白组 pQTL,Ferkingstad et al. Nat Genet 2021;53:1712–1721 |
| 平台 / 样本 | SomaScan,4,907 适配体 / 4,719 蛋白,35,559 名冰岛人 |
| 本地路径 | /mnt/d/mrdata/deCODEdata/(55 个 .txt.gz,各约 950 MB) |
| 坐标系 | hg38,与主分析一致(deCODE readme 明示) |
| 结局 | FinnGen R9 五个并发症全部(旧版只写死了黄斑+视网膜两个) |
| LD 面板 | 1000G EUR,按 rsID clump |
| 输入集 | 第 3 步存活集:53 对 / 29 蛋白 |
2.1 ★ 两个质控辅助文件(本轮新接入)
deCODE 的 proteomics_readme.txt 明确要求用,旧代码一个都没用:
| 文件 | 大小 | 作用 | 旧代码 |
|---|---|---|---|
assocvariants.excluded.txt.gz | 52 MB | 列出 3,725,211 个因质量问题应当剔除的变异 | ❌ 从未使用 |
assocvariants.annotated.txt.gz | 422 MB | 提供真实 effectAlleleFreq;订正多等位变异的 otherAllele | ❌ 本脚本未用(decode_platform_check_r9dm.R 用了) |
readme 原文两处关键:
"a subset of the variants in the summary statistics files should be excluded due to quality issues."
"the summary statistics files sometimes incorrectly have effectAllele=otherAllele for multiallelic variants... This has been corrected in the Extra annotation file."
⚠️ 还有一条易错点:ImpMAF 是次等位频率,不是效应等位频率 (readme:"the effectAllele is not always the minor allele")。 只能用来滤罕见变异和判回文,不能当 eaf 用。
三、覆盖率 —— 4a 够不够格当分流器
| 分层 | 蛋白 | 配对 |
|---|---|---|
| 总体 | 20 / 29 = 69% | 35 / 53 = 66% |
| MHC 蛋白 | 6 / 11 = 55% | 17 / 29 = 59% |
| 非 MHC | 14 / 18 = 78% | 18 / 24 = 75% |
结论:66% 够格当分流器(远高于「大半不可评估」)。
★★ 但缺口不是随机的,它系统性集中在 MHC
缺的 9 个里 5 个是 MHC(HCG22 LTB TRIM40 ATP6V1G2 BTN3A2), 非 MHC 只缺 4 个(ACRBP BCL2L15 LACTB2 TPPP3)。
→ SomaScan 面板对 Olink 的 MHC 区靶标覆盖明显更差,而 MHC 恰恰是假阳性雷区、 最需要跨平台核验的地方——能力最弱的地方正是最需要能力的地方。
这本身是个可写进论文的观察。写作时必须说明「不可评估」的分布是偏的, 不能让读者以为是随机缺失。
⚠️ 口径来源:「deCODE 没有其余 9 个」是用户在 deCODE 下载站检索的结果, 不是我核对官方面板清单得出的。记录如实标注依据来源。
四、什么检验方法
每个蛋白 × 每个适配体:
cis 区 = UKB-PPP 哨兵位置 ±500kb(hg38)
→ 剔除 excluded 质控名单
→ 用 annotated 补 effectAlleleFreq、订正多等位 otherAllele
→ 剔多等位(otherAllele='!')、非 rs、ImpMAF<0.01、SE<=0
→ p < 5e-6
→ plink clump (r²<0.001, 10Mb)
→ F >= 10
→ 与 FinnGen 结局谐化(等位对齐;回文且 MAF>0.42 剔除)
→ 单 SNP Wald ratio参数与主分析同口径(config.yaml:pval_cis 5e-6 / cis_window_kb 500 / clump_r2 0.001 / clump_kb 10000 / f_stat_min 10)。
4.1 ★ cis 锚点为什么用哨兵位置
本项目没有本地基因坐标注释文件(config.yaml 的 gene_annotation 有意留空)。 实测本集合内哨兵到基因的距离中位数 0、最大 4,447 bp, 相对 ±500 kb 窗口误差 <1%,故用哨兵当锚点。这一点要写进 Methods。
4.2 一个基因多个适配体:分别算,互相印证
NOTCH2、APOL1、MICB_MICA 各有 2 个适配体。 每个适配体单独算,汇总到「对」层时:任一适配体方向相反 → 该对送 4X。
★ MICB_MICA 是 Olink 的一个复合探针测两个蛋白,deCODE 上是 MICB / MICA 两个独立文件,两个都映射过来——适配体之间不一致本身就是表位问题的信号。
五、★★ 一个必须提前交代的口径变更:cis 窗口收窄
旧的 decode_new/*.cis.tsv.gz 是用比 ±500kb 更宽的窗口切的 (实测 IFNAR1 旧工具跨度 1.33 Mb、APOL1 970 kb)。
本轮改用 config 的 ±500 kb,与主分析一致 → 会剔掉一部分旧工具。 这是有意的口径统一,不是 bug。 提前算清楚,免得跑完看到「工具变少」误判。
六、★ 预期结果(运行前写定)
6.1 结构性预期(应完全一致,差 1 即缺陷)
| 项 | 预期 |
|---|---|
| 输入:第 3 步存活 | 53 对 / 29 蛋白 |
| deCODE 可评估蛋白 | 20 |
| 待处理适配体文件数 | 23(20 个基因,其中 3 个各有 2 个适配体) |
| 多适配体基因 | NOTCH2 / APOL1 / MICB_MICA |
pinfo 行数断言 | 20(不等则 stopifnot 直接挂) |
| 判「不可评估-平台无数据」的对 | 18 |
6.2 ★ 可证伪的预测:旧 3 基因在新口径下的工具去留
新代码同时改了 窗口收窄 与 excluded 过滤,旧结果因此必然变化。 每一处变化都必须能指名道姓归因到某条规则,否则按缺陷处理。
| gene | 旧工具 | 距锚点 >500kb 应剔除 | 新窗口预期保留 |
|---|---|---|---|
| IFNAR1 | 8 | rs183019916(565kb) · rs12627454(924kb) | ≤ 6 |
| APOL1 | 5 | rs56953345(835kb) | ≤ 4 |
| ERMAP | 0("deCODE 上无达阈 cis 工具") | — | 仍应为 0 |
★ 写「≤」而不是「=」:excluded 质控名单可能再剔掉其中几个。 若实际 < 预期,我必须指出是哪个 SNP、被哪条规则剔的;指不出来就是缺陷。
6.3 质控量级预期
| 项 | 预期 |
|---|---|
| deCODE 单文件总变异数 | 约 30,856,627 |
| excluded 名单占比 | 3,725,211 / 30,856,627 = 12.1% |
| → 每个 cis 区被剔的比例 | 约 12%(大幅偏离需查原因) |
6.4 不可预先指定的部分(这才是要测的)
- 每个蛋白在 deCODE 里选出几个工具、是不是同一个变异
- 方向一致 / 相反的分布
- 有几对送 4X
⚠️ 这几项不写预期是对的——它们是本步的测量目标。 写"预期方向一致"等于预设结论。
七、预期产物
results/platform_check/
decode_reselect_instruments.csv 重选出的工具(含 eaf 真值列)
decode_reselect_qc.csv ★ 质控台账:每适配体剔了多少、为什么
decode_reselect_mr.csv 重做的 MR(5 个并发症 × 全部工具)
decode_4a_verdict.csv ★ 与正向并排的 4a 三分法判定
decode_cis/<GENE>__<SeqId>.cis.tsv.gz cis 区缓存(23 个)预计耗时:23 个适配体文件 × 950 MB zcat + annotated 422 MB 全扫一遍, 估计 40–70 分钟。
八、实际结果
执行日期:2026-08-07 状态:✅ 完成(第五版实现,前四版全部作废) 代码基线:analysis/28_decode_reselect.R 第五版
★★ 本步的方法在执行过程中被推翻重写了一次,必须交代
§4 写的方法(IVW 合并多工具 + 自定三分法)是错的,已废弃。 第五版改为严格照搬 C1R 原文(Li et al. medRxiv 2026.07.14.26358022), 每条规则都能指到原文行号。§4 保留原样以记录判错过程, 实际执行以下方 §8.1 为准。
8.1 最终采用的方法(C1R 原文,可指到行号)
工具选择(原文 Methods 第 365–373 行):
(1) If the IVs identified for a given protein in the Iceland cohort overlapped with those used for the same protein in the UK Biobank, the overlapping instruments were prioritized to ensure consistency with the discovery analysis; (2) If no overlapping IVs were available ... cis-pQTLs that were present in both the protein and the corresponding comorbid disease were identified; then, the cis-pQTL showing the strongest association with the protein (i.e., the smallest p-value) was selected as the instrument; (3) If none of the above criteria were met, the protein was excluded from the validation.
→ 单工具,不做 IVW;优先用与发现队列重叠的同一个变异。
判定(原文 Results 第 113–117 行):
...displayed inconsistent effects (PFDR<0.05 and associated in opposite direction) compared with those in the discovery cohort
→ 触发报警需 FDR<0.05 且方向相反,二者缺一不可。FDR 按结局分组(与第 2/3 步一致)。
角色(原文 Results 第 119–124 行):对存活者的加分筛,不是筛查报警器。
8.2 ★ 验收断言:六条全部 PASS
跑前写死在代码里,不通过直接 stop():
| # | 断言 | 结果 |
|---|---|---|
| V1 | 阳性对照 APOL1×Maculopathy 必须判 opposite | ✅ PASS |
| V2 | IFNAR1 必须用回哨兵 rs914142 | ✅ PASS |
| V3 | IFNAR1×Maculopathy 方向一致 | ✅ PASS(robust_to_instrument_selection) |
| V4 | 输入 = 第 3 步存活 53 对 / 29 蛋白 | ✅ PASS |
| V5 | 每个(蛋白,结局,适配体)只有 1 个工具 | ✅ PASS |
| V6 | 4a 不否决任何一对(v4 §2.2) | ✅ PASS |
8.3 结果
53 对 → 稳健 22 · 送 4X 4 对 · 不可评估 27(全部保留)
| 判定(对层) | 对数 |
|---|---|
not_assessable | 27 |
robust_to_instrument_selection(加分) | 22 |
opposite(→ 4X) | 4 |
工具来源:28 个有效工具里 23 个是与发现队列重叠的哨兵、5 个是 deCODE 自己 p 最小的。 ★ 这正是原文规则(1)的效果——前四版让 clump 把哨兵扔掉,是判定失效的根源。
8.4 ★ 送 4X 表位调查的 4 对
| 蛋白 | 结局 | 变异 | 工具来源 | b正向 | b_4a | OR_4a | FDR_4a |
|---|---|---|---|---|---|---|---|
| APOL1 | Maculopathy | rs136168 | 重叠哨兵 | +0.420 | −0.353 | 0.703 | 4.9e-05 |
| MICB_MICA | Maculopathy | rs3132467 | 重叠哨兵 | +0.108 | −0.562 | 0.570 | 6.3e-06 |
| MICB_MICA | Nephropathy | rs3132467 | 重叠哨兵 | +0.092 | −0.475 | 0.622 | 2.5e-05 |
| AOC1 | Retinopathy | rs1049742 | 重叠哨兵 | −0.212 | +0.286 | 1.331 | 2.9e-04 |
APOL1是已知的表位伪影(Olink 与两个 SomaScan 队列方向相反 + 哨兵是 PAV), 流水线独立地把它抓回来了 → 阳性对照通过MICB_MICA两个适配体互相矛盾(2 对),是最强的表位伪影信号AOC1是本轮新出现的,此前从未被标记
8.5 IFNAR1 的准确结论
用回哨兵 rs914142(deCODE 上 p=1.05e-69)后判为 robust_to_instrument_selection —— 与「三平台同向」完全一致。
★ 前四版把它误判为 opposite,根因是让 clump 把哨兵扔掉: rs914142 被 47 kb 外的 rs58886971 顶掉,后者占 IVW 权重 82.5% 且对结局效应为零 (p=0.94),把合并值拖到 0.003。那是实现造成的,不是数据。
8.6 ★★ 历史教训:前四版为什么连续失效
| 版本 | 问题 | 后果 |
|---|---|---|
| v1 | 判定落在工具层而非适配体层 | 26 个可评估里报 20 个"方向相反",无鉴别力 |
| v2 | 把**"真反转"与"估计≈0"混为一档** | IFNAR1 被误判 |
| v3 | 加异质性闸门(Q + 权重占比) | 把阳性对照 APOL1 也吞了(它 Q p=0.48 工具其实一致,只因单工具权重 0.895 被拦);MHC 区 Q p 普遍 1e-20 以下 → 闸门等于自动放弃全部 MHC 蛋白 |
| v4→v5 | 读原文后推倒重写 | 六条验收全过 |
四条根因,越往后越根本:
- 没读脚本自己引用的文献。
28_decode_reselect.R第 12 行就写着「对标:Li et al. medRxiv 2026.07.14.26358022」,PDF 三个月前就在F:\project下。 项目规则「研究与重用(任何新实现前必需)」被跳过。 - ★ 角色搞反 —— 真正的根因。 原文用它做加分筛,我做成了报警器。 角色一反,判据就失去自然锚点:加分筛的标准是现成的(还显著且同向), 报警器的标准得自己发明 —— 所以才会三次发明、三次推翻。
- 让 clump 扔掉了发现队列的哨兵,与原文规则(1)相反(见 §8.5)。
- ★ 手里有阳性对照却没当验收标准。
APOL1是已知表位伪影, 任何正确规则都必须抓到它。直到第三轮才顺手查。
★★ 第 3 步做对了、4a 做反了,对比很清楚:第 3 步的 FDR 口径是在看到新结果之前 定的;4a 是跑完看结果顺不顺眼再调规则。本版把六条验收写进代码断言,就是堵这个。
8.7 产物
results/platform_check/
decode_4a_verdict.csv 55 行(蛋白 x 结局 x 适配体)
decode_4a_pair_verdict.csv 53 行(对层)
decode_reselect_qc.csv 质控台账(每适配体剔了多少、为什么)
decode_cis/<GENE>__<SeqId>.cis.tsv.gz cis 缓存 23 个
results/logs/decode_4a_v5_20260807.log全部产物非 ASCII 字节 = 0(代码内置断言)。
九、进正文还是补充(暂定)
| 内容 | 暂定去向 | 依据 |
|---|---|---|
| 4a 方法(重选工具、±500kb、质控三件套) | 正文 Methods | 尤其 excluded 名单必须写,否则无法复现 |
| cis 锚点用哨兵位置及其误差(<4.4kb) | 正文 Methods | 自定口径,必须交代 |
| 覆盖率 66% 及其 MHC 偏倚 | 正文 Results + Limitations | ★ 这是发现,不只是限制 |
| 三分法判定结果 | 正文(漏斗一格)+ 补充表 | — |
质控台账 decode_reselect_qc.csv | 补充材料 | 审稿人可据此复现 |
| 送 4X 的对 | 正文 | 4X 是唯一否决点,必须可追溯 |
⚠️ 暂定,第 7 步统一复核。