主题
暴露端核查 · UKB-PPP 到底有多少 cis-pQTL 蛋白
这页干什么
回答三个反复被问到的数字:1,954(文献里的蛋白数)、1,955(导师 docx 里的蛋白数)、1,659(我们结果表里的蛋白数)分别是什么,差在哪,该在 Methods 里写哪一个。 核查日期 2026-07-29,全部为实测(直接统计 protein_info.csv),非引用。
一、结论先说
| 数字 | 含义 | 用在哪 |
|---|---|---|
| 1,954 | UKB-PPP 中至少有一个 cis 哨兵 pQTL 的唯一蛋白数 | ✅ Methods 里报这个 |
| 1,955 | 同上,但按行计(有 1 个蛋白带 2 个 cis 哨兵) | 导师 docx 用的是这个,与 1,954 是同一件事 |
| 1,659 | 在某个具体结局里真正能算出 Wald 比的蛋白数 | ✅ 各结局的实际检验数,FDR 分母,放补充表 |
一句话:1,954 是暴露端的天花板,1,659 是结局端匹配后的实际检验数。两者不矛盾,是漏斗的两端。
二、实测:文件里有什么
数据文件 D:\mrdata\exposure\protein_info.csv(= Sun et al. 2023 UKB-PPP 哨兵 pQTL 表,判别集 N=54,219):
| 项 | 实测值 |
|---|---|
| 有效行(primary sentinel associations) | 14,287 |
| ├ cis 行 | 1,955 |
| └ trans 行 | 12,332 |
| 文件中出现过的唯一蛋白(cis+trans) | 2,415 |
| 唯一 cis 蛋白(Assay Target) | 1,954 |
每蛋白 cis 哨兵数分布:1,953 个蛋白各 1 个,1 个蛋白有 2 个 → 1,955 行 = 1,954 蛋白。
文件末尾另有 16,456 行全空行(Excel 导出残留),统计时已剔除。
三、1,954 → 1,659 的逐层损耗
以 FinnGen R13 DM_RETINOPATHY_STRICT 为例,逐步实测:
| 步骤 | 剩余 | 掉了 | 原因 |
|---|---|---|---|
| cis 蛋白全集 | 1,954 | — | 起点 |
去掉 rsID 为 - 的变异 | 1,885 | −69 | 该字段为 -(无 rsID),按 rsID 匹配无法使用。原始实现同样做了此过滤(1_r9_mr_diabetes.Rmd 里数出 70 个 -) |
| 按 rsID 去重成工具 SNP | 1,874 SNP | −11 SNP | 11 个 rsID 被 2 个蛋白共用(如 rs1859788 = PILRA+PILRB),蛋白数不减 |
| 该 SNP 在结局 GWAS 中存在 | 1,703 SNP / 1,714 蛋白 | −171 SNP | FinnGen 填补面板无此位点 |
| harmonise 通过 | 1,648 SNP / 1,659 蛋白 | −55 SNP | harmonise_action=2,MAF 无法定向的回文 SNP 丢弃 |
覆盖率 1,659/1,954 = 85%。
四、这个数随结局而变
| 结局 | 可检验蛋白数 |
|---|---|
| FinnGen R13 五个并发症(DR-STRICT/黄斑/新青光眼/神经/糖肾) | 1,659(全部相同) |
| 外部 T1D(GWAS Catalog) | 1,722 |
| 外部 T2D(Mahajan DIAMANTE noUKBB) | 1,614 |
五个 FinnGen 结局数字完全一致,是因为它们出自同一填补面板、位点集合相同。差异只来自非 FinnGen 结局的位点覆盖,与暴露端无关。
五、与文献的对照
C1R 多病共存那篇(Proteogenomic mapping of multimorbidity identifies C1R linking coronary artery disease and dementia)Methods 原文:
we performed two-sample Mendelian Randomization (MR) using cis-pQTLs for 1,954 plasma proteins (discovery cohort: UK Biobank, N=54,219)
两个数与我们实测完全一致(1,954 唯一 cis 蛋白;N=54,219 判别集样本量)。说明该文献取的就是"所有有 cis 工具的蛋白",与本课题起点相同,不存在"它用得更多"的情况。 它同样存在结局端匹配损耗,只是正文未报——直接从 1,954 跳到"224 个蛋白显著 / 274 对关联"。
六、已定的处理口径(2026-07-29)
| 决定 | 结论 | 理由 |
|---|---|---|
| Methods 报哪个数 | 1,954 | 与文献同口径;各结局实际检验数入补充表并说明 FDR 按结局分组校正 |
| 那 69 个无 rsID 的变异要不要用位置匹配捞回 | 不捞 | 最多多 3.5%,却要重算全部 FDR、两个版本都重跑;这些位点多为低频/indel,工具本就弱 |
| MHC 区 cis 蛋白(25 个)要不要剔 | 保留但标注 | 跨并发症共享的 5 个蛋白全在 MHC 区,剔了线索就没了;但必须标注"位于 MHC 区,LD 结构复杂,不宜解释为跨病共同驱动"。详见 MHC 区为什么是假阳性雷区 |
七、损耗会不会带来偏倚
不会带来假阳性。损耗发生在"结局 GWAS 有没有这个位点"这一步,不是按蛋白特征筛选,属非差异性缺失(non-differential loss)。缺失位点偏向低频/难填补变异,对应蛋白工具强度本就偏弱,丢失的是检验效能(可能漏真信号),不会让留下的 1,659 个多出假信号。审稿意见若问及,答 "non-differential loss, biases toward the null" 即可。
八、复核方法(可重跑)
bash
python3 - <<'EOF'
import csv
rows=[r for r in csv.DictReader(open('/mnt/d/mrdata/exposure/protein_info.csv',encoding='utf-8-sig'))]
cis=[r for r in rows if r['cis/trans'].strip().lower()=='cis']
print('cis行', len(cis), '唯一cis蛋白', len({r['Assay Target'] for r in cis}))
EOF