主题
10 · 第 4c 步 · 外部复制 · 两侧都换
状态:✅ 完成(§0–§6 写于运行之前,§7 为运行后回填) 权限:只分流不否决。★ v4 明写:不可用 4c 的阴性否定 4a/4b 的阳性。
〇、这一步做什么
暴露侧换成 deCODE(SomaScan)、结局侧换成 MVP / Salem,两侧同时脱离发现设置。
| 换了 | 没换 | |
|---|---|---|
| 4a | 暴露平台 | 结局队列 |
| 4b | 结局队列 | 暴露工具 |
| 4c | 两侧都换 | — |
一、★★ 先查清的一件事:4c 在我们的设置下大部分是冗余的
实测:4a 的 deCODE 工具里 23/28 就是发现队列的同一个 SNP (4a 按 C1R 规则「优先用重叠哨兵」,见 06 页)。
而单工具 Wald 比值的 p 值完全由结局侧决定(z = βY/σY,βX 约掉, 见跨平台表怎么读)。
于是对「同一个 SNP」的那些对:
- 4b:
b = βout(MVP) / βexp(Olink),p = p_out(MVP) - 4c:
b = βout(MVP) / βexp(deCODE),p = p_out(MVP)—— 同一个 p
4c 对这些对不提供任何新的统计证据,只改变 ①效应量尺度 ②方向(当两平台暴露 beta 反号时)。
→ 绝不能把 4c 的「显著」当成第三次独立验证。那是同一个检验数了两遍。
真正独立的只有换了 SNP 的对:CLPS(rs2766588→rs2766575)、 TNXB(rs9267797→rs150043706)。
1.1 文献先例
Wang et al., BMC Urology 2024(PMC11662591)是找到的两侧都换的直接先例: 发现期用 FinnGen 蛋白组 + deCODE 暴露、UKB-SAIGE 结局; 复制期用 UKB-PPP 暴露、FinnGen R11 结局;3 个蛋白里只有 SLURP1 复制成功, 随后做固定效应 meta 分析合并两期(OR 1.50, 95%CI 1.30–1.74)。
这个先例的分量有限,如实说明
① 它把 FinnGen 的小样本蛋白组(Olink n=619 / SomaScan n=828)当发现集、 把 UKB-PPP(n=54,219)当复制集 —— 复制集比发现集大两个数量级, 与常规的「发现大、复制小」相反,我们的设置恰好相反(4c 功效更低)。 ② 期刊为 BMC Urology,非方法学期刊。
→ 采用它的两期设计与 meta 合并思路,但不照搬其功效预期。
二、可做范围
| 项 | 数 |
|---|---|
| 第 3 步存活 | 53 对 |
| 4X 否决 | 1 对 |
| 当前存活 | 52 对 |
| 有 deCODE cis 工具 | 26 对 |
| 有外部结局队列且能算出估计 | 34 对 |
| ★ 两侧都有 = 4c 可做 | 17 对 |
缺口:只缺 deCODE 工具 17 对 · 只缺外部结局队列 8 对 · 两侧都缺 10 对。
★ Maculopathy 与 NeovascGlaucoma 一对都进不来 —— 它们没有任何外部结局队列。 这与既有 Limitations 一致。
2.1 17 对里,真正独立的只有 4 对
| 对数 | 说明 | |
|---|---|---|
| 工具是同一个 SNP | 13 | ★ p 值将与 4b 完全相同,不是独立证据 |
| 工具换了 SNP | 4 | CLPS×Reti · TNXB×Neph/Neuro/Reti —— 唯一真正独立的检验 |
三、方法
1. 暴露:4a 已选好的 deCODE 工具(beta_exposure_alt / se)
2. 结局:4b 已用的外部队列(MVP DR / MVP neuropathy / Salem DN)
3. Wald 比值,等位对齐到暴露效应等位
4. BH FDR,按结局分组(与第 2/3/4a/4b 一致)
5. 标注每一对是否 same_snp_as_discovery(决定它是否独立于 4b)判定分类(无否决权):
| 取值 | 含义 |
|---|---|
confirmed | FDR<0.05 且方向与发现一致 |
direction_consistent_not_significant | 同向未达 FDR |
opposite | FDR<0.05 且方向相反 |
not_assessable | 缺任一侧 |
★ 另设一列 independent_of_outcome_cohort_check:仅当 same_snp_as_discovery == FALSE 为 TRUE。 写作时只有这一列为 TRUE 的才可称「独立确证」。
四、★ 预期(写于运行之前)
4.1 机械可验的强预期
13 对 same-SNP 的
p_4c必须与 4b 的p_repl数值完全相同(容差 1e-10)。
这不是猜测,是代数恒等式的推论。若不成立,说明谐化或 SNP 匹配有 bug。
4.2 数量预期
| 项 | 预期 |
|---|---|
| 可评估 | 17 对 |
confirmed | ★ 约 5 对,且几乎全部来自 same-SNP 组(因为它们在 4b 就已显著) |
| 独立确证(换了 SNP 且显著) | ★ 预计 0–1 对。TNXB/CLPS 的新工具在外部队列里未必有强信号 |
opposite | 预计 1–2 对(AGER/APOE×Neph 在 4b 已是反向未达 FDR) |
★ 4b 里 replicated 的 5 对是 AIF1 AOC1 NUDT5 PAM TNXB(均 Retinopathy)。 其中 TNXB×Reti 恰好是换了 SNP 的 —— 它是本步最值得看的一对。
4.3 ★★ 验收断言(抓不到即 stop())
| # | 断言 |
|---|---|
| C1 | same-SNP 的对,p_4c 与 4b p_repl 数值相同(容差 1e-10) —— 代数恒等式,不成立即有 bug |
| C2 | same-SNP 的对,b_4c / b_4b 必须等于 βexp(Olink) / βexp(deCODE)(容差 1e-6)—— 验证只有分母变了 |
| C3 | 输入集必须 ⊆ 4X 之后的存活集;被 4X 否决的 APOL1×Maculopathy 不得出现 |
| C4 | 任何一对都不得被 4c 否决(vetoed 全 FALSE) |
| C5 | independent_of_outcome_cohort_check 为 TRUE 的恰好是换了 SNP 的那些对 |
| C6 | 产物取值全 ASCII、列名无内部流程编号 |
★ C1 与 C2 是本步的核心:它们检验的不是「结果好不好」, 而是我有没有正确理解 4c 与 4b 的数学关系。这两条若过不了, 后面所有解读都建立在错误的基础上。
五、产物(预期)
| 产物 | 路径 |
|---|---|
| 判定表 | results/external_replication/replication_both_sides.csv |
| 脚本 | analysis/45_replicate_both_sides.R |
六、局限(先写下)
- 17/52 可做,
Maculopathy与NeovascGlaucoma全军覆没(无外部队列) - ★★ 13/17 与 4b 不独立(同一 SNP → 同一 p 值),只有 4 对是真正独立的检验
- 功效最低:两侧都换,且我们的复制集不比发现集大(与所引先例相反)
- ★ 阴性不可用于否定 4a/4b 的阳性(v4 明文)
七、运行结果
执行日期:2026-08-07 状态:✅ 完成 脚本:analysis/45_replicate_both_sides.R结论:零独立确证;新增 1 对送 4X(TNXB × Retinopathy);不否决任何一对
7.1 预测对账
| §4.2 预测 | 实际 | |
|---|---|---|
| 可评估 17 对 | 18 行 / 17 对(MICB_MICA×Neph 有两条适配体各一行) | ✅ 需说明 |
confirmed 约 5 对 | 5 对 | ✅ |
| 独立确证 0–1 对 | 0 对 | ✅ |
opposite 1–2 对 | 1 对 | ⚠️ 数对了、对象错了 |
opposite 那条预测的理由是错的,如实记
我预测 opposite 会来自 AGER/APOE×Neph,理由是「它们在 4b 已是反向未达 FDR」。 这是把「方向相反」当成了「显著相反」 —— 它们的 p 在 4c 不变(same-SNP), 当然仍不显著。实际那 1 对来自完全不同的地方:独立组的 TNXB×Retinopathy。
数量碰对不代表推理对。
7.2 主结果:4c 的贡献比看上去小得多
| 判定 | 与 4b 同一个检验(same-SNP) | 真正独立 |
|---|---|---|
confirmed | 5 | 0 |
| 同向未达 FDR | 6 | 2 |
| 反向未达 FDR | 3 | 1 |
opposite | 0 | 1 |
★★ 那 5 个 confirmed 不能当第三次独立验证
它们的工具与发现队列是同一个 SNP,p_4c 与 4b 的 p_repl 数值完全相同 (C1 实测最大差 0)。写作时只能说效应量在 deCODE 尺度上一致, 不能说「在两侧都换的设置下得到独立确证」。
真正独立的 4 对里,确证数 = 0。
7.3 ★ 新增的 4X 输入:TNXB × Retinopathy
| 值 | |
|---|---|
| 发现工具 | rs9267797(Olink 哨兵) |
| deCODE 工具 | rs150043706(换了 SNP) |
| 4a 估计(deCODE 暴露 × FinnGen 结局) | +0.137 |
| 4c 估计(deCODE 暴露 × MVP 结局) | −0.082,FDR 2.06e-04 |
| 4b 判定(Olink 工具 × MVP 结局) | replicated |
按 v4 §6 路由铁律(4a/4c 报警 → 查表位),已标记 epitope_investigation。
但有一条压倒性的替代解释,4X 必须先排除
deCODE 这个工具是罕见变异:eaf = 0.0141(MAF 1.4%),F=3145。 它与发现哨兵 rs9267797 是不同的变异, 在 MHC 区(TNXB 在 MHC)完全可能标记不同的独立信号 / 不同单倍型。
→ 「同一基因的两个不同 cis 变异效应方向不同」首先是遗传结构问题,未必是表位问题。 4X 处理它时不能默认走表位,必须先看两个变异之间的 LD。
7.4 跑中查出的两个缺陷
| # | 缺陷 | 影响 | 抓住它的 |
|---|---|---|---|
| 1 | 4b 的 p 值由 CI 反推(MVP 文件 standard_error 全是 #NA,CI 只有 4 位有效数字) | 与文件报告的 p 差最多 174 倍;3 对判定从「同向未达 FDR」误判。修后 4b 复制成功 7 → 10 | C1(本步的断言,抓出的是上一步的 bug) |
| 2 | 等位对齐用错了参照:我用 Olink 哨兵的等位去对 deCODE 工具 | TNXB 三对被误判 not_assessable(而该变异在三个结局文件里都有完整记录);CLPS 因两 SNP 等位碰巧相同而"没报错" —— 等于悄悄给了个可能错的答案。★ 正好打在 4c 唯一的 4 对独立检验上 | 我核实「变异是否真的缺失」时发现 |
修法: 1 → 结局文件报了 p 就直接用(单 SNP Wald 的 p 恒等于结局侧 p),SE 仍由 CI 反推供 Wald 比值用 2 → 改从 4a 自己写的 deCODE cis 缓存取工具等位,新增 C7(独立检验不得因等位对齐失败而丢失)与 C8(same-SNP 的两平台等位集合须一致)
修复 1 的影响面已逐项核过
4X 产物逐字节相同、否决结论不变(仍 APOL1×Maculopathy)、存活集不变(52 对)。 改变的只有 4b 的三对:AGER×Neuro · GALNT3×Reti · HCG22×Reti 从「同向未达 FDR」→ replicated。
7.5 产物
results/external_replication/replication_both_sides.csv(18 行 × 37 列)
7.6 写作口径(定死,别在正文里放大 4c)
- 4c 只对 17 对可做,
Maculopathy/NeovascGlaucoma一对都没有 - 14/18 与 4b 是同一个检验,不得计为独立证据
- 独立确证 = 0
- 唯一的独立报警
TNXB×Reti 有罕见变异 + MHC 单倍型这个替代解释,待 4X 判 - ★ 不得用 4c 的阴性否定 4a/4b 的阳性(v4 明文)