主题
答疑:暴露数据用哪一版 · 结局命名 · 作图时机
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 用的工具变量就是这些位点。
为什么要把人分两组
这个扫描是几百万个位点 × 近三千种蛋白,等于上百亿次统计检验。 检验做得越多,纯靠运气撞出"看起来显著"的假信号就越多。防它有两招:
- 门槛设极严:P < 1.7×10⁻¹¹(普通 GWAS 是 5×10⁻⁸,严了近 3000 倍)
- 留一批人不参与"找",事后拿来"验"
原文的分法(实测算术核对: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,557 | 52,363 |
| 留多少人「验」 | 17,806 | 0 |
| primary associations | 14,287 | 23,588(多 65%) |
| 其中 cis | 1,955 条 / 1,954 蛋白 | 未知(需另下表) |
| 每个位点有无复核成绩 | 有 | 无 |
| 原文称呼 | primary associations | putative 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-5 | 1,872 / 1,955 ≈ 95.8% | 1,869 / 1,955 = 95.6% |
| discovery vs replication 的 β 相关 | 0.9961 | r = 0.99 |
(1,872 与 1,869 差 3 条,是按 log10(p) 粗切未处理边界所致,量级完全一致。)
翻译:这批工具里 96% 在一批全新的人身上重测过、结果照样成立。 v4 已把「内部复制」定位在第 1 步的工具质量标注——这是白捡的证据,不用额外下任何数据。
结论:用表 9
三条理由,第一条最重要:
- 只有表 9 有留出的独立复核。药靶 MR 里工具有效性是命门——本课题已因 APOL1 表位伪影撤回过一整条结论。96% 的复制率比多 65% 的关联数值钱。
putative这个词会跟着你进 Methods。- 最接近的同构研究 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 / BMJ;EQUATOR) | MR 报告规范,要求列明各阶段数据来源 |
| Standardizing the reporting of MR studies(BMC Medicine 2023) | 报告标准化 |
| Common pitfalls in drug target MR(BMC 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,287 | 有 cis/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:28501747 | IL27 |
rs8109160 | chr19:4247479 | EBI3 |
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.R 的 pretty_outcome():
| 内部 ID | 全名 | 短名(拥挤坐标轴用) |
|---|---|---|
Retinopathy | Diabetic retinopathy | Retinopathy |
Maculopathy | Diabetic maculopathy | Maculopathy |
Nephropathy | Diabetic nephropathy | Nephropathy |
Neuropathy | Diabetic neuropathy | Neuropathy |
NeovascGlaucoma | Neovascular glaucoma | Neovascular glaucoma |
T1D_gcst | Type 1 diabetes | Type 1 diabetes |
T2D_mahajan | Type 2 diabetes | Type 2 diabetes |
T1D_crouch | Type 1 diabetes (Crouch) | — |
T2D_mvp | Type 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 里口头交代。后来专门补了保留符号的四象限图才让它可见。 这种问题看表格永远发现不了。
成稿图必须晚做,四条理由,最后一条最重要:
- 数字会变(后续步骤的记账未定)
- 标签/措辞会变(v4 的措辞阶梯改过)
- PPT 取图目录靠手工改名同步,早做会造成版本漂移
- ★ 早早盯着成稿图看,人会从图里读出叙事,在分析没做完时就把结论锁死
Q6 · 图注不放在图上,放 doc 或 txt 文件里 —— 可以吗?
可以,而且这个决定顺手解决了一个已有的 bug。
四条理由
- ★ 本项目已知的失效模式:图注超长会被静默横向裁掉。 图注不进图,这个失效模式直接消失
- 期刊投稿系统基本都要求图是不带图注的独立文件,图注写在正文文件里
- 可编辑性:图注在写作/返修期改很多轮,为改个错字重渲染图很蠢且易错
- 复用:同一张图要进论文 / 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 版本选择