Skip to content

答疑:暴露数据用哪一版 · 结局命名 · 作图时机

2026-08-07 R9 v3/v4 重跑期间提出的一组问题与查证结果。 凡标「实测」的都是当场跑出来的数字;凡标「未查证」的就是没查证,不要当结论用。

流程顺序方面的答疑见 流程答疑 2026-08-06。 现行流程定稿见 v4


Q1 · UKB-PPP 有两张表,我们该用哪一版?

背景:他们做了什么

UKB-PPP 给 54,219 名 UK Biobank 参与者验血,用 Olink Explore 3072 测了 2,923 种蛋白,然后扫描 DNA 找出哪些位点影响哪个蛋白的浓度(即 pQTL)。 我们做 MR 用的工具变量就是这些位点。

为什么要把人分两组

这个扫描是几百万个位点 × 近三千种蛋白,等于上百亿次统计检验。 检验做得越多,纯靠运气撞出"看起来显著"的假信号就越多。防它有两招:

  1. 门槛设极严:P < 1.7×10⁻¹¹(普通 GWAS 是 5×10⁻⁸,严了近 3000 倍)
  2. 留一批人不参与"找",事后拿来"验"

原文的分法(实测算术核对:34,557 + 17,806 = 52,363):

54,219 人(受检总数)
   ├── 34,557 人  发现组 discovery(欧裔,随机基线队列)  用来「找」
   ├── 17,806 人  复制组 replication(其余,多祖先)      留着「验」
   └──  1,856 人  质控剔除

原文 Methods 原句:

"Discovery pQTL analyses were performed in participants of European ancestry from the randomly selected baseline cohort (n = 34,557), which was broadly representative of the full UKB cohort, with the remaining samples (n = 17,806) used as a replication cohort."

两张表分别是什么

Supplementary Table 9 —— 我们在用的这张

在 34,557 人里找出 14,287 个 primary associations,然后每一个都去 17,806 人里复核。 所以表里有两套数字(discovery) 一组 + (replication) 一组。

Supplementary Table 10

不分组,把 52,363 人(发现组 + 复制组)合起来重扫,用至多 2,380 万 imputed 变异, 找出 23,588 个 primary associations —— 比表 9 多 65%

原文对这批的措辞是:

"identifying 23,588 putative primary associations"

putative(推定的)不是随手写的:所有人都拿去"找"了,一个人都没剩下来"验"

并排对照

表 9(在用)表 10
用多少人「找」34,55752,363
留多少人「验」17,8060
primary associations14,28723,588(多 65%)
其中 cis1,955 条 / 1,954 蛋白未知(需另下表)
每个位点有无复核成绩
原文称呼primary associationsputative primary associations
效应量精度稍低稍高

这个取舍没法两全:同一批人不能既用来「找」又用来「验」——用来找的时候你已经挑了它, 再拿同一批人验等于自己给自己打分。

我们文件里到底是哪张(实测)

/mnt/d/mrdata/exposure/protein_info.csv 表头 33 列,只有 (discovery)(replication) 两组效应量列,没有任何 full-cohort 列确认是 Supplementary Table 9。 要换表 10 必须另外下载。

★ 复制列我们从来没用过 —— 实测它的成绩

本地实测原文报的
有复制队列 BETA 的 cis 记录1,955 / 1,955,零缺失
方向一致1,955 / 1,955 = 100%
方向一致 复制 P<1.3e-51,872 / 1,955 ≈ 95.8%1,869 / 1,955 = 95.6%
discovery vs replication 的 β 相关0.9961r = 0.99

(1,872 与 1,869 差 3 条,是按 log10(p) 粗切未处理边界所致,量级完全一致。)

翻译:这批工具里 96% 在一批全新的人身上重测过、结果照样成立。 v4 已把「内部复制」定位在第 1 步的工具质量标注——这是白捡的证据,不用额外下任何数据。

结论:用表 9

三条理由,第一条最重要:

  1. 只有表 9 有留出的独立复核。药靶 MR 里工具有效性是命门——本课题已因 APOL1 表位伪影撤回过一整条结论。96% 的复制率比多 65% 的关联数值钱。
  2. putative 这个词会跟着你进 Methods
  3. 最接近的同构研究 C1R 用的就是 1,954 蛋白 = 表 9

代价要说清:表 9 的 βexp 精度略低,有 cis 工具的蛋白可能更少。 但 winner's curse 的方向是保守的——βexp 在 Wald 比的分母上,被高估 → MR 估计偏向零

折中主分析用表 9,表 10 留作敏感性分析,最后做,不影响主链。


Q2 · 哪一版"发文章更认可"?审稿人会不会问?有没有教程?

实际查证的结果

① 文献里两种都有,而且常常不说清。 搜到的 proteome-wide MR 论文里, 有报 n = 34,557(发现集)的,也有报 54,219 / 52,363 / 50,395 的。

② ⚠️ 一个实例值得警惕。 逐字读了 PMC11265128(多组学 MR 找 GSTM4), 其 Methods 原文:

"This collaborative endeavor scrutinized plasma proteomic signatures within a cohort of 54,219 UKB participants.""...uncovering a total of 14,287 significant genetic associations."

这两句自相矛盾:14,287 是表 9(发现集)的关联数,而 54,219 是受检总人数—— 它实际用的是表 9,报出来的样本量却是 54,219。 且该文完全没写 cis 工具的筛选标准(无 P 阈值、无 cis 窗口、无 F 统计量、无 clumping)。

③ 没有任何指南规定该用哪一张表。 STROBE-MR(20 个主条目 + 30 个子条目)要求的是 「列表说明各阶段所有数据来源」——它管你说没说清,不管你选了哪个

所以"哪个更认可"是个错问题

决定认可度的不是选哪张表,是说没说清、前后一不一致。 真正会被抓的硬错误是:

你报的样本量和你实际用的估计值对不上。

这是审稿人一对就发现的,而它在这个文献里很常见(见上面那个实例)。

两个选择被问到时的处境不对称

你选审稿人可能问能怎么答
表 9"为什么不用样本更大的全队列版?"答案现成:全队列版原文自称 putative、无留出复制;发现集有 n=17,806 独立复核,cis 95.6% 方向一致且显著,且我们逐工具报告复核状态
表 10"原文把这批标为 putative、无独立复核,工具有效性如何保证?"不好答——那个词是原文自己加的

表 9 的辩护是原文替你写好的;表 10 的质疑也是原文替审稿人写好的。

有哪些教程/规范(都不规定选哪张表)

文献管什么
STROBE-MR(Skrivankova 2021, JAMA / BMJEQUATORMR 报告规范,要求列明各阶段数据来源
Standardizing the reporting of MR studiesBMC Medicine 2023)报告标准化
Common pitfalls in drug target MRBMC Medicine 2024, PMC11481744)药靶 MR 常见坑
Schmidt 2020 Nat Commun 11:3255药靶 MR 框架

⚠️ 只逐字核实了 STROBE-MR 的结构与上述那篇实例;其余三份未逐字读过是否提及 pQTL 版本选择, 只是从定位判断不会规定到这个粒度。要确证须逐份读。

★ 写进 Methods 的建议句

Exposure instruments were the primary cis-pQTLs reported by UKB-PPP (Sun et al., Nature 2023) from the discovery cohort (n = 34,557), for which an independent replication cohort (n = 17,806) was held out; 95.6% (1,869/1,955) of cis associations remained significant and directionally concordant in replication. We did not use the full-cohort release (n = 52,363), which the original authors describe as putative primary associations without held-out replication.

这一句同时做到三件事:说清用了哪个 · 样本量与数据来源一致(避开上述实例的错误)· 把"为什么不用大的"提前答掉。


Q3 · 工具表到底是 1,955 还是 1,954?是不是第一行表头算进去了?

不是表头问题。两个数都对,指的是两件事。 实测:

含义
30,744文件物理行数
30,743数据行(减表头 1 行)—— csv.DictReader 读到的正是这个,表头未被计入
16,456完全空行(CSV 尾部填充)
14,287cis/trans 注释的行 = 原文 primary associations 总数
1,955其中 cis 关联数(行数)
1,954有 cis 关联的唯一蛋白数

原文正文两句分别就是这两个数:

"A total of 1,955 of the 14,287 primary associations were in cis""1,954 of 2,922 proteins ... having a cis association"

差的那 1 个查出来了:EBI3_IL27

它是一个测定靶标对应两个基因(Olink 复合探针),所以有 2 条 cis 记录

rsID位置cis gene
-chr16:28501747IL27
rs8109160chr19:4247479EBI3

1955 − 1 = 1954。

顺带解释了另一件事:第 1 步查出的那个「唯一存活的 rsID = "-" 工具」, 就是 EBI3_IL27 的 IL27 那一条。它没有 rsID → 结局侧匹配不上任何东西 → 最终被 grepl("^rs", SNP) 剔除。

准确措辞:1,954 个蛋白、1,955 条 cis 记录,其中 1 条无 rsID 不可用。 不要写成"1,954 个蛋白各有一个 cis 工具"。


Q4 · T1D_gcst / T2D_mahajan 这样写在图表上合适吗?

不合适——它们是内部 ID,只用于溯源与消歧,绝不能上图或上论文表格。 这条早已是本项目的规则,且有现成函数与强制机制。

analysis/_viz_common.Rpretty_outcome()

内部 ID全名短名(拥挤坐标轴用)
RetinopathyDiabetic retinopathyRetinopathy
MaculopathyDiabetic maculopathyMaculopathy
NephropathyDiabetic nephropathyNephropathy
NeuropathyDiabetic neuropathyNeuropathy
NeovascGlaucomaNeovascular glaucomaNeovascular glaucoma
T1D_gcstType 1 diabetesType 1 diabetes
T2D_mahajanType 2 diabetesType 2 diabetes
T1D_crouchType 1 diabetes (Crouch)
T2D_mvpType 2 diabetes (MVP)

规则的理由写在代码注释里:

★ 数据来源刻意不写进图内,统一写在图注里 —— 同一疾病有多个来源 (T2D 主分析 Mahajan2018 noUKBB,敏感性 MVP GCST90475667; T1D 主分析 GCST90824163,零重叠复制 Crouch GCST90013791)。 把来源印在坐标轴上会让不同图之间无法对照,写图注才是通行做法。

强制机制:pretty_outcome(strict = TRUE) 遇到未登记 ID 直接 stop(),不让原始 ID 溜上图。

⚠️ 但风险在别处,实测查出两个真错

① 结果 CSV 里全是内部 ID。 genetic_correlation_rg.csv 的行列名就是 T1D_gcst / T2D_mahajan这张表若原样进补充材料,内部 ID 就漏进论文了。 → 需要一道「发表版导出」,不能直接交现有 CSV。

② LDSC 热图副标题有两处错14_figure_downstream.R:142):

r
subtitle = sprintf("FinnGen %s endpoints, European LD scores", rel)
  • 渲染成 "FinnGen R9_dm endpoints" —— R9_dm内部 ID,正好违反这条规则本身
  • 更要紧:6 个性状里有 2 个根本不是 FinnGen(T1D = GWAS Catalog GCST90824163、 T2D = DIAMANTE Mahajan)→ 图上的事实错误

★ 轴标签走了规范,副标题没走——因为副标题是自由文本,规范管不到。 → 补一条断言:图内任何文本不得出现 R9_dm|R13|_gcst|_mahajan|_finngen 这类 ID 模式


Q5 · 是不是所有分析做完才做图?

不是——要分两类。

什么时候做为什么
诊断图每步做,放 results/_diag/,不进论文它就是用来发现表格看不出的问题
成稿图最后一步统一做依赖最终数字、最终标签、最终正文/补充归属

诊断图必须早做——本课题有教训:旧散点图两轴都取 |β|把 13 条「两端异号」的关联折叠进了同号点堆里,方向背离在图上完全看不见, 只能在 PPT 里口头交代。后来专门补了保留符号的四象限图才让它可见。 这种问题看表格永远发现不了。

成稿图必须晚做,四条理由,最后一条最重要

  1. 数字会变(后续步骤的记账未定)
  2. 标签/措辞会变(v4 的措辞阶梯改过)
  3. PPT 取图目录靠手工改名同步,早做会造成版本漂移
  4. 早早盯着成稿图看,人会从图里读出叙事,在分析没做完时就把结论锁死

Q6 · 图注不放在图上,放 doc 或 txt 文件里 —— 可以吗?

可以,而且这个决定顺手解决了一个已有的 bug。

四条理由

  1. 本项目已知的失效模式:图注超长会被静默横向裁掉。 图注不进图,这个失效模式直接消失
  2. 期刊投稿系统基本都要求图是不带图注的独立文件,图注写在正文文件里
  3. 可编辑性:图注在写作/返修期改很多轮,为改个错字重渲染图很蠢且易错
  4. 复用:同一张图要进论文 / PPT / docs,三处需要的图注长度和语言都不一样

★ 但有一个条件,否则是拿一个 bug 换另一个

图注文件必须由画图的同一段代码生成,不能手写。 否则会漂移——图重画了、数字变了,图注还引着旧数,而这类错误看不出来 (同类教训:断言过时 vs 内容真错)。

做法save_both()caption = 参数,画图时顺手写出 <图名>.caption.txt一处真值来源,想漂移都漂移不了。

界线:什么留在图上

留在图上移出去
坐标轴标签(走 pretty_outcome())· 图例 · 单位 · 分面标签 · 显著性标记图注(关于图的散文)
—— 即「看懂这张图所必需的」数据来源(正是发现事实错误的地方)
标题 / 副标题(期刊也不要,属于图注的一部分)

保留一个开关:内部 / PPT 版留标题,投稿版剥掉。


由本页产生的待办

  • [ ] 第 1 步补做:把工具表的 (replication) 四列做成逐工具复制状态标注 (v4 规定这属第 1 步工具质量层,且数据现成、零成本)
  • [ ] 作图统一处理时:① 修 14_figure_downstream.R:142 的错误副标题 ② 加「图内文本不得含内部 ID」断言 ③ save_both()caption = 参数写出同名 txt ④ 写「发表版表格导出」函数,行列名过 pretty_outcome()
  • [ ] 敏感性分析:下 Supplementary Table 10(full cohort, n=52,363)跑一遍对照
  • [ ] 未查证项BMC Medicine 2023/2024、Schmidt 2020 三份是否提及 pQTL 版本选择

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