Skip to content

★ 列名与产物路径已于 2026-08-07 重构

本页下文引用的列名与文件路径是重构前的。内部流程编号(4a/4b/step3)已从产物中移除,判定产物已移到 results/external_replication/新旧对照表见 工程约定与事故记录 §四

★ 重构不改任何数字——已存基线并逐行 diff 验证,主链数字完全一致。

05 · 第 3 步 · 方向性 / 反向 MR

状态:✅ 完成 —— §4 预期 14 项全部命中,零缺陷; 可复现性 104 个文件逐字节相同;并发症 57 对 → 否决 4 对 → 存活 53 对 / 29 蛋白

本页的写作顺序(可核查)

§1–§6 在运行之前写完并定稿,§7 在运行后追加,§4 的预期一个字没改。 §6 的四个决策点也全部在看到新结果之前定下——避免「跑完再挑口径」。

★ 事后补填的"预期"没有约束力——任何差异都能在事后编出一个合理解释。

结局命名

本页表格用内部 IDT1D_gcst / T2D_mahajan 等),它们是文件名与代码里的字符串。 论文显示名与数据来源见总览页对照表。 ★ 内部 ID 绝不允许出现在图上或论文表格里。


一、这一步做什么

把因果方向调过来测一次:

正向(第 2 步已做)反向(本步)
暴露蛋白(cis-pQTL 哨兵,1 个工具)疾病(全基因组显著位点,不设 cis 窗)
结局疾病(FinnGen R9 等)蛋白水平(UKB-PPP 全基因组 sumstats)
估计量Wald ratio固定效应 IVW(工具 ≥2 时)

若反向也显著,说明「蛋白 → 疾病」这个方向存疑:可能互为因果, 也可能存在共同上游,或者是疾病改变了蛋白水平(反向因果)。

这是 v4 全流程仅有的两个否决点之一(另一个是 4X 表位调查)。 第 4 步的外部复制只分流不否决,第 5 步共定位只升级措辞

⚠️ 阴性只能说「未发现反向因果的证据」,不能说「不存在反向因果」。 反向 MR 的功效受疾病侧工具数限制,本轮 Neuropathy 仅 7 个工具(见 §4.1), 功效不足与真无效应在结果上长得一样。


二、用什么数据、什么版本

2.1 反向暴露(疾病侧)

来源outcome_manifest.csvrelease == "R9_dm"7 个结局
目录/mnt/d/mrdata/outcome
工具阈值p < 5e-8(全基因组显著,非 cis
★ T2D 特例主文件是 hg37 且无 rsid,改用 hg38 转换版 Mahajan_hg38_forcoloc.tsv.gz(代码 FILE_OVERRIDE

2.2 反向结局(蛋白侧)

来源UKB-PPP 区域 tar,/mnt/d/mrdata/ukbppp_regional146 个 tar 已就位
索引/mnt/d/mrdata/ukbppp_european_index.csv
取哪些蛋白results/screen_R9_dm/*_significant.csv 的并集 → 95 个蛋白
取哪些位点只取反向工具所在的 chr:pos(hg38)

2.3 LD 面板与坐标系

面板1000G EUR,/mnt/d/mrdata/ldpanel/EUR.bed 已就位)
clumpingplink1.9/usr/bin/plink1.9 已就位),--clump-r2 0.001 --clump-kb 10000

坐标系铁律:LD 面板是 hg19,本课题数据是 hg38。 → clumping 只能按 rsID(r² 是单倍型属性,与坐标无关); → 取蛋白数据只能按 hg38 的 chr:pos(UKB-PPP tar 无 rsid 列)。 两者混用会静默错配。

2.4 代码基线

脚本analysis/35_reverse_mr.R(335 行)
运行目录/home/research/mr-pipeline-r9v3(属主 research
编辑目录F:\project\mr-pipeline-r9v3
与旧脚本的差异只有两处:① 根目录不再硬编码;② MHC 蛋白判定改用 _mhc.R

三、什么检验方法

3.1 反向工具的选取

疾病 sumstats → p<5e-8 → 只留 rs 开头 → 去重
  → 丢模糊回文(AT/CG,无 eaf 时无法定链)
  → 只留在 LD 面板中的 → plink clump (r²<0.001, 10Mb)

★ 「不在面板里的位点 plink 会静默丢弃」,故代码显式统计 n_inpanel 并打印。 plink 返回非零或产物缺失时 stop() 而不是跳过

3.2 ★★ 必须剔除落在蛋白自身 cis 区的反向工具

这是本步最容易出致命假阳性的地方。

若不剔除,那些工具对蛋白的效应就是 cis-pQTL 效应本身, 会被误读成「疾病导致蛋白变化」。

实测病例AGER × Retinopathy):rs915894 距 cis 锚点仅 35 kb、对蛋白 z = −17.3, 含它时 p = 3.2e-26(假阳性),剔掉后不显著。

代码里做两件事:

规则适用
① cis 窗排除剔掉距该蛋白 cis 锚点 ±1 Mb 的工具所有蛋白
② 整个 MHC 排除若该蛋白是 MHC 蛋白,再剔掉 chr6:25–34 Mb 全部工具仅 MHC 蛋白

②的理由:MHC 区长程 LD 极强,远处工具仍可能与 cis 变异连锁,±1 Mb 不够。

3.3 ★ 两个 MHC 区间用途不同,代码里已分开

这是 2026-08-07 改的,此前混用同一组常量,极容易改错

用途取值来源
① 判定「是不是 MHC 蛋白」25.5–34.0 Mb(作者 MHC 列)单一真值源 analysis/_mhc.R,= Sun 2023 原文。这是定义
② 要剔掉的长程 LD 块25–34 Mb(比①下界更宽)目的是防连锁,宽一点更保守,与①不必相同

实测确认两者在本步不产生差异(见 §4.4),但必须保持分开—— 它们是两个不同的问题,将来任一改动都不该牵连另一个。

3.4 估计量与多重检验

  • 工具 ≥ 2 → 固定效应 IVW;工具 = 1 → Wald ratio
  • 等位对齐:一致保留、翻转变号、其余丢弃(记 n_allele_mismatch
  • 多重检验:BH FDRreverse_significant = fdr_rev < 0.05

⚠️ FDR 的分组口径是本步最大的未决问题,见 §6.1。

3.5 回归断言(代码内置,失败即拒绝输出)

AGER × Retinopathy:剔除 cis 工具 ≥1 个 且 p_rev > 1e-3

不满足就 stop()。理由:这是已知的 cis 污染病例, 若断言失败说明 cis 排除逻辑失效,宁可报错也不出假结果


四、★ 预期结果(运行前写定)

4.0 总预期:与旧结果逐位相同

依据:新旧脚本只差两处,且第二处(MHC 判定)实测在本步等价(§4.4)。 故本步应复现旧结果,作为可复现性证明向第 3 步的延伸。

容差:以下数字全部要求完全一致,差 1 即按缺陷处理。

4.1 步骤 1/3 —— 反向工具数(clump 后)

disease预期工具数
T2D_mahajan98
T1D_gcst94
Retinopathy27
Maculopathy11
Nephropathy10
Neuropathy7
NeovascGlaucoma3
合计250 条记录 / 237 个唯一位点 / 7 个疾病

⚠️ NeovascGlaucoma 虽有 3 个工具,但它在第 2 步 0 个显著蛋白 → 不产生任何配对。

4.2 步骤 2/3 —— 蛋白侧

预期
蛋白数95
_prot/ 缓存文件数95

4.3 步骤 3/3 —— 反向 MR 结果

预期
总对数142
status == "ok"142(全部可算,无一失败)
方法全部 IVW(fixed)(无 Wald ratio)
n_iv 范围2 – 98,中位数 83
被剔的 cis 工具总数379
n_cis_excluded > 0 的对数83
protein_in_mhc == TRUE 的对数49
反向显著(现行 FDR 口径)47

按疾病拆分

disease对数反向显著(现行口径)
T1D_gcst5728
T2D_mahajan2811
Retinopathy246
Maculopathy190
Nephropathy91
Neuropathy51
五并发症小计578

并发症的 57 对,与第 2 步 MR 显著的 57 对完全对应(24+19+9+5+0)。

4.4 MHC 判定新旧等价性(已在跑前实测

在本步涉及的 95 个蛋白上:

规则判为 MHC
旧(按 cis_pos 现算 25–34 Mb)20
新(作者 MHC 列,25.5–34.0 Mb)20
双向差集

→ 两规则在本步完全一致,故预期结果不受这处改动影响。

⚠️ 这个结论只对这 95 个蛋白成立,是重新测的,不是从全池 1,954 的结论顺推的—— 换了范围就得重测。

4.5 回归断言的预期值

预期
AGER × Retinopathy n_cis_excluded7
AGER × Retinopathy n_iv19
AGER × Retinopathy p_rev0.0325
断言(需 p_rev > 1e-3通过

⚠️ 代码注释里写的是「剔掉后 p = 0.072」,与实测的 0.0325 对不上——见 §6.4。

4.6 预期产物路径

results/reverse_mr/
  reverse_instruments.csv     250 行
  reverse_mr_results.csv      142 行 + 表头
  _iv/<疾病>.csv              7 个(+ .fp 指纹)
  _prot/<蛋白>.csv            95 个(+ .fp 指纹)

预期耗时:旧 run 工具选择结束 08:50 → 蛋白取数结束 09:17, 蛋白侧约 27 分钟,全程约 30–40 分钟


五、运行方式

bash
MSYS_NO_PATHCONV=1 wsl -e bash -lc \
  'cd /home/research/mr-pipeline-r9v3 && \
   sudo -u research Rscript analysis/35_reverse_mr.R force'

★ 加 force 忽略缓存从零重算——与第 0/1/2 步一致,这是可复现性证明的前提。 (results/reverse_mr 在 v3 目录下尚不存在,本轮是首次生成。)


六、⚠️ 跑之前必须先定的 4 件事

四件均已在「看到新结果之前」定案(2026-08-07)

#决定落实
6.1FDR 改 by_outcome,旧口径存为 fdr_rev_global 仅供对照✅ 代码 d6d8a39
6.2反向显著即否决(保守选择,正文须写明),补 step3_verdict/step3_survivor
6.3MIN_IV_VETO = 5,不足者标「功效不足-无法评估」,保留不否决
6.4更正 AGER 过时注释;补上 reverse_mr_verdict.csv

下方 §6.1–§6.4 保留定案前的原始论证与实测数字,不回改—— 它记录的是「凭什么这么定」,而不是「定成了什么」。

6.1 ★★★ FDR 分组口径 —— 直接决定否决 4 对还是 8 对

现行实现p.adjust(p_rev, "fdr")全部 142 对上一起算, 其中 85 对是 T1D_gcst / T2D_mahajan——它们根本不是并发症, 是「糖尿病对照」那条臂。

这 85 对里有 39 对反向显著(糖尿病改变蛋白水平,本就极合理)。 BH 是自适应的:池子里小 p 值越多,阈值越松 → 并发症那边更容易被判显著

实测三种口径(在旧结果上算,跑前完成):

口径并发症被判反向显著
现行:142 对一起校正8
by_outcome与正向第 2 步一致4
只在 57 个并发症对里校正4

逐对差异(★ 是三口径不一致的):

proteindiseasen_ivMHCp_rev现行142按结局只并发症57
BTN3A2Retinopathy192.59e-079.20e-066.22e-061.48e-05
ITGB7Retinopathy265.15e-061.22e-046.18e-051.47e-04
TIGITRetinopathy261.12e-036.85e-038.88e-032.11e-02
APOERetinopathy251.48e-038.08e-038.88e-032.11e-02
★ HCG22Nephropathy59.15e-033.61e-028.23e-029.63e-02
★ BCL2L15Retinopathy251.06e-024.02e-025.11e-029.63e-02
★ HCG22Neuropathy21.18e-024.20e-025.13e-029.63e-02
★ SIGLEC5Retinopathy261.36e-024.66e-025.45e-029.71e-02

我的判断:现行口径站不住,理由三条——

  1. 与正向第 2 步不一致。正向用 by_outcome,反向用 global,同一篇文章两套口径要被问
  2. 把非并发症的 85 对放进并发症的校正池,而它们的显著是预期内的(糖尿病当然改变蛋白), 用它们去放松并发症的阈值,等于用一批注定显著的检验去换取更多否决
  3. 另两种口径都给 4,只有现行的给 8 —— 现行是离群的那个

建议改为 by_outcome(与正向一致)。★ 但这是改判定规则,必须你点头, 且必须在看到新结果之前定——跑完再改就是挑口径。

6.2 ★★ 第 3 步的否决规则尚未实现

v4 说第 3 步有否决权,但脚本只输出 reverse_significant,没有任何否决动作—— 没有列标记「这对被第 3 步否决」,下游 32 / 29 也不读这个文件。

需要定的reverse_significant == TRUE 是否直接等于否决

⚠️ 严格说「反向显著」≠「正向是错的」,也可能是双向因果。 文献里常见做法是比较两个方向的强度(如 Steiger 方向检验),而非一律否决。

我的建议:反向显著 → 否决,但在正文明确写这是保守选择, 并在补充材料列出被否决的对及其正反向效应量,供读者自行判断。 理由:药靶提名场景下,方向存疑的候选不值得推进到实验验证,宁可漏不可错。

6.3 ★ HCG22 两对的工具数极少(2 和 5)

HCG22 × Neuropathy 的反向 MR 只有 2 个工具× Nephropathy 只有 5 个。 原因:HCG22 是 MHC 蛋白 → 整个 chr6:25–34 Mb 被剔 → Neuropathy 本就只有 7 个工具,剔剩 2 个。

用 2 个工具的 IVW 去否决一个候选,证据基础很薄。 且这两对恰好就是 §6.1 里随口径变化的(现行显著、另两口径不显著)。

建议:设 n_iv 下限(如 ≥3 或 ≥5)才允许行使否决权,不足者标「功效不足,无法评估」—— 这与第 4 步「不可评估 ≠ 阴性」是同一条原则。具体阈值请你定。

6.4 ★ 两处文档与代码/结果不符(已确认,待修)

位置写的实际判定
35_reverse_mr.R:249 注释AGER 剔 cis 后 p = 0.072旧结果 p = 0.0325注释过时(疑似写于加 MHC 全区排除之前),需更正
35_reverse_mr.R:26 头注释输出 reverse_mr_verdict.csv(与正向并排的方向判定)代码从未写这个文件文档承诺了不存在的产物;要么实现要么删掉这行

★ 第二条正是 §6.2 缺的那个东西——头注释里描述的「方向判定」表就是否决规则的载体, 它被写进了文档但从来没实现。


七、实际结果

执行日期:2026-08-07 耗时:蛋白侧 26.3 分钟,全程约 30 分钟 代码基线d6d8a39

分两阶段跑:先用原代码验可复现性,再应用 §6 定下的三项改动。 这样既不丢证明,也避免了「跑完再挑口径」。

7.1 阶段一 —— 可复现性验证:★★ 104 个文件全部逐字节相同

未改动的代码 + force(从零重算)跑一遍,与三个月前的旧结果比对:

产物文件数cmp 结果
reverse_mr_results.csv1完全相同
reverse_instruments.csv1完全相同
_iv/<疾病>.csv7相同 7 / 不同 0
_prot/<蛋白>.csv95相同 95 / 不同 0 / 缺失 0
合计104全部逐字节相同

→ 可复现性证明从第 0/1/2 步延伸到第 3 步

原口径产物已另存为 reverse_mr_results_ORIGGROUPING_20260807.csv(改动后复验仍逐字节相同)。

7.2 §4 预期逐项核对 —— 全部命中

预期实际
反向工具 Retinopathy2727
Maculopathy1111
NeovascGlaucoma33
Neuropathy77
Nephropathy1010
T1D_gcst9494
T2D_mahajan9898
工具合计250 条 / 237 位点 / 7 疾病250 / 237 / 7
蛋白数9595(22,230 条记录)
总对数 / status=="ok"142 / 142142 / 142
反向显著(原口径)4747
剔除的 cis 工具379 个379
MHC 蛋白涉及对数4949
AGER×Retinopathy n_cis_excluded / p_rev7 / 0.03257 / 0.0325
回归断言通过通过

零缺陷。 跑前写死的预期全部命中,无一项需要事后解释。

7.3 阶段二 —— 应用 §6 的三项改动

改动内容
① FDR 分组p.adjustby = disease;旧口径保留为 fdr_rev_global不参与判定
② 否决动作新增 step3_verdict(四类)/ step3_survivor
③ 工具数门槛MIN_IV_VETO = 5,不足者标「功效不足-无法评估」,保留不否决
④ 补产物reverse_mr_verdict.csv —— 头注释承诺过、从未实现的正反向并排判定表

改动只在最后 10 行,_iv / _prot 走缓存(日志确认「复用已有工具」),重跑仅数秒。

7.4 ★ 第 3 步判定结果

全部 7 个疾病

disease通过否决功效不足
Retinopathy2040
Maculopathy1900
Nephropathy900
Neuropathy104
T1D_gcst(对照臂)27300
T2D_mahajan(对照臂)17110

★ 并发症漏斗:进入 57 对 / 31 蛋白 → 否决 4 对 → 存活 53 对 / 29 蛋白

7.5 被否决的 4 对

proteindiseasen_ivMHCβ_revp_revFDR(by_outcome)FDR(旧142)
BTN3A2Retinopathy19+0.07742.59e-076.22e-069.20e-06
ITGB7Retinopathy26+0.04195.15e-066.18e-051.22e-04
TIGITRetinopathy26+0.03281.12e-038.88e-036.85e-03
APOERetinopathy25−0.02621.48e-038.88e-038.08e-03

四对全在 Retinopathy,且在新旧两种 FDR 口径下都被否决——口径之争不影响这 4 对。

完全退出的蛋白只有 2 个ITGB7TIGITBTN3A2APOE 在其他并发症上仍有存活的配对。

7.6 ★ 功效不足的 4 对(保留,不当阴性)

proteindiseasen_iv剔除数MHCp_rev旧口径会否决?
HCG22Neuropathy250.0118
AGERNeuropathy250.509
BTN2A1Neuropathy250.517
TNXBNeuropathy250.914

★★ Neuropathy 的 5 对里有 4 对是 MHC 蛋白,工具全部只剩 2 个。

成因链条很清楚:Neuropathy 本就只有 7 个反向工具(并发症里第二少) → MHC 蛋白要剔掉整个 chr6:25–34 Mb → 剔掉 5 个,只剩 2 个

Neuropathy 端的反向 MR 对 MHC 蛋白基本没有判别力,这必须写进 Limitations。 若无 MIN_IV_VETO 门槛,HCG22 × Neuropathy仅凭 2 个工具被否决。

7.7 FDR 口径的实际影响 —— 旧口径多否决的 4 对去了哪

proteindiseasen_ivFDR(旧142)FDR(by_outcome)新判定
BTN3A2Retinopathy199.20e-066.22e-06否决
ITGB7Retinopathy261.22e-046.18e-05否决
TIGITRetinopathy266.85e-038.88e-03否决
APOERetinopathy258.08e-038.88e-03否决
HCG22Nephropathy53.61e-028.23e-02通过
BCL2L15Retinopathy254.02e-025.11e-02通过
HCG22Neuropathy24.20e-025.13e-02功效不足
SIGLEC5Retinopathy264.66e-025.45e-02通过

→ 多出来的 4 对全部落在 FDR 0.04–0.05 这个边缘带, 把 85 对糖尿病对照臂放进校正池,恰好把它们推过了线。

⚠️ 三对的 by_outcome FDR 在 0.051–0.082 之间,离 0.05 很近。 写作时应说明这几对「接近阈值」,不宜写成明确的阴性。

7.8 产物路径

results/reverse_mr/
  reverse_instruments.csv                        250 行
  reverse_mr_results.csv                         142 行(新增 6 列)
  reverse_mr_verdict.csv                         142 行 × 26 列 ← 正反向并排
  reverse_mr_results_ORIGGROUPING_20260807.csv   原口径存档(可复现性证明)
  _iv/<疾病>.csv        7 个 | _prot/<蛋白>.csv  95 个
results/logs/
  reverse_mr_20260807.log            阶段一(force,可复现性)
  reverse_mr_v4rule_20260807.log     阶段二(新规则)

reverse_mr_verdict.csv 的关键列: b_fwd/se_fwd/p_fwd/fdr_fwd/OR_fwdb_rev/se_rev/p_rev/fdr_rev/fdr_rev_globaln_iv/veto_eligible/step3_verdict/step3_survivor/direction_same_sign/is_complication


八、如何解读

8.1 四对被否决的都在糖网,且不受口径之争影响

BTN3A2 / ITGB7 / TIGIT / APOE × Retinopathy 在新旧两种 FDR 口径下都被否决, 结论稳健。但要注意否决的含义:

⚠️ 「反向显著」不等于「正向是错的」,也可能是双向因果。 我们采取否决是保守选择(药靶提名场景宁可漏不可错), 补充材料并排列出正反向效应量,供读者自行判断。正文必须写明这是一个选择。

APOE 尤其值得一提:它与糖网的关系在文献中双向证据都有, 本步的反向显著与既有认识一致,不是流水线出问题

8.2 ★★ Neuropathy 端对 MHC 蛋白基本没有判别力(Limitations)

Neuropathy 只有 7 个反向工具;MHC 蛋白要剔掉整个 chr6:25–34 Mb → 只剩 2 个。 5 对里 4 对(HCG22 / AGER / BTN2A1 / TNXB)都卡在这里。

→ 这不是「未发现反向因果」,是根本没有能力发现。 写作一律用「无法评估」,不得写成阴性或「通过第 3 步」。

★ 若无 MIN_IV_VETO = 5 门槛,HCG22 × Neuropathy仅凭 2 个工具被否决—— 这正是设门槛的实证理由。

8.3 三对「接近阈值」,不宜写成明确阴性

BCL2L15 × Retinopathy(FDR 0.0511)、SIGLEC5 × Retinopathy(0.0545)、 HCG22 × Nephropathy(0.0823)刚过线存活

写作时应标注「接近阈值」,并在补充表给出精确 FDR, 不要让读者以为它们的方向性证据与 FDR = 0.9 的那些一样干净。

8.4 对照臂的反向显著是阳性对照,不是问题

T1D 30 对、T2D 11 对反向显著(共 41/85)。 这本就该显著——糖尿病当然会改变血浆蛋白水平。

→ 它证明流水线有能力测出真实的「疾病 → 蛋白」信号, 即:第 3 步在并发症端大量「通过」,不是因为方法没功效,而是确实没测到反向信号。 这是一条值得写进正文的方法学阳性对照

8.5 反向阴性只能说「未发现证据」

功效受疾病侧工具数限制(Maculopathy 11、Nephropathy 10、Neuropathy 7)。 功效不足与真无效应在结果上长得一模一样。

8.6 反向 MR 未做多工具敏感性分析(待定)

反向侧有 7–98 个工具,本可以做 MR-Egger、加权中位数、异质性 Q、留一法, 但脚本没做。本轮不补——补了就破坏「与旧结果逐字节相同」这个可复现性证明。

若审稿人问「反向为何不做敏感性分析」,需要有答案。建议作为独立的补充分析另跑一轮。


九、进正文还是补充(暂定)

内容暂定去向依据
反向 MR 的方法(工具阈值、cis 排除、MHC 排除)正文 Methods★ cis 排除必须写,否则读者无法判断是否有假阳性
FDR 分组口径(§6.1 定下的那个)正文 Methods不写读者无法判断否决强度
否决了几对、哪几对正文(漏斗一格)+ 补充表
全部 142 对的反向结果补充材料
T1D/T2D 的 39 对反向显著补充材料 + 正文一句(作阳性对照)
Neuropathy 等工具数少 → 功效不足Limitations与 NeovascGlaucoma 同一条

⚠️ 暂定,第 7 步统一复核。


十、漏斗记账(本步产出)

节点蛋白对数其中 MHC 蛋白
上一步(MR 显著,五并发症)315711
├ 第 3 步 通过49
├ 第 3 步 功效不足-无法评估(保留)44
└ 第 3 步 否决41
第 3 步后存活(进入第 4 步)295311

完全退出的蛋白ITGB7TIGIT(31 → 29)。 BTN3A2 / APOE 虽在 Retinopathy 被否决,但在其他并发症上仍有存活配对。

MHC 蛋白数未变(仍 11 个):被否决的 MHC 蛋白只有 BTN3A2×Retinopathy 一对, 而它在别处存活。

⚠️ 「功效不足」那 4 对计入存活,但必须在正文与补充表里单独标注—— 它们不是通过了检验,是没能力接受检验

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