主题
下游分析:PheWAS · LDSC · HyPrColoc
三类下游分析——评估工具多效性(PheWAS)、疾病间遗传相关(LDSC)、共享因果信号(HyPrColoc)。 对应原始实现工作流第 ④⑥⑧ 步(
4_r9_hyprcoloc·6_r9_phewas·8_sensitivity_AMD;⑤5_r9_data_clean是清洗 ④ 的输出,不算独立分析)。
先搞清楚:谁依赖谁、谁先跑
三者互相不依赖,但和 MR 的关系不一样——LDSC 根本不需要 MR 结果:
疾病 GWAS(全量)─────────────────────────────────► LDSC
(独立!不依赖 MR,可先跑)
暴露 cis-pQTL ─┐
├──► MR 批量筛查 ─┬──► PheWAS (要显著 SNP 列表)
疾病 GWAS ─────┘ (analysis/01_screen.R) └──► HyPrColoc (要跨≥2病的蛋白 + 区域数据)| 分析 | 吃什么数据 | 依赖 MR? | 什么时候跑 |
|---|---|---|---|
| LDSC | 全量疾病 GWAS | ❌ 不依赖 | 越早越好——它回答"这些病值不值得放一起做泛并发症分析",是给课题设计定调的前置论证 |
| PheWAS | MR 显著 SNP 列表 | ✅ 依赖 | MR 之后。几分钟就完 |
| HyPrColoc | 跨≥2 病的蛋白 + UKB-PPP 区域数据 | ✅ 依赖 | MR 之后。几小时,最贵 |
PheWAS 和 HyPrColoc 谁先都行(互不依赖)。实际按"先便宜后贵"跑:PheWAS 几分钟先把可疑工具标出来,HyPrColoc 几小时做最终判决。
本页的阅读顺序(PheWAS → LDSC → HyPrColoc)是按理解递进排的:先看工具干不干净 → 再看病之间什么关系 → 最后看因果判决,不代表执行顺序。
常见疑问:这三个分析分 R9/R13 吗?
| 分析 | 版本 | 为什么这样 |
|---|---|---|
| PheWAS | 不分,R9+R13 合并 | 它问的是"这个 SNP 还关联多少别的表型"——多效性是 SNP 自身的属性,跟结局用 R9 还是 R13 无关。合并去重后一次查完即可 |
| LDSC | 分(R9 / R13) | 直接吃疾病 GWAS。R13 病例数比 R9 多 30–50%,且只有 R13 有湿性/干性 AMD 亚型和糖网严格定义 |
| HyPrColoc | 分(R9 / R13) | 同上,且目标蛋白取自对应版本的筛查结果 |
bash
Rscript analysis/03_phewas.R # 合并跑
Rscript analysis/04_ldsc.R R9 # 或 R13
Rscript analysis/05_hyprcoloc.R R9 # 或 R13一、PheWAS(工具多效性扫描)
目的:MR 的"排他性假设"要求工具 SNP 只通过暴露蛋白影响结局。PheWAS 把每个显著 cis-pQTL 工具 SNP 拿去 OpenGWAS 扫全表型,看它还关联多少其他性状——多效性越高,越要谨慎。
数据怎么来 / 怎么做
- 原始做法:手动在 OpenGWAS 网站查每个 SNP,存成
phewas/<snp>.csv(6_r9_phewas.R只做汇总+画图,查询在脚本外) - 我们做法:用
ieugwasr::phewas()+ OpenGWAS token 自动化查询(脚本analysis/03_phewas.R)bash它用Rscript analysis/03_phewas.R # token 从 ~/.Renviron 的 OPENGWAS_JWT 读Sys.glob("results/screen_*/*_significant.csv")把 R9 和 R13 的显著 SNP 一起捞出来去重再查——同一个 SNP 不管从哪版筛出来的,多效性都一样,不需要查两遍。
多重检验:Bonferroni 校正 ★
检验数 = 查询的 SNP 数 × OpenGWAS 数据集数(每个 SNP 在每个数据集里各检验一次):
为什么脚本里还留着 p<1e-5
1e-5 只是去 OpenGWAS 拉候选的粗筛(服务端过滤),不是显著性判据。因为 1e-5 比 Bonferroni 阈值 4.38e-9 宽松,所有 Bonferroni 显著的关联都必然在拉回来的结果里,不会漏。脚本会自检这一点,若粗筛比 Bonferroni 还严会告警提示你放宽重查。显著性一律以 bonferroni_sig 列为准。
结果
- 228 个唯一显著 SNP → 22,473 条关联,其中 12,151 条(54.1%)Bonferroni 显著(查询日期 2026-07-20,阈值 4.38e-9)
PheWAS 数字不是逐位可复现的——必须记录溯源
PheWAS 实时查 OpenGWAS 在线数据库,库在变、你的显著 SNP 数也在变,两个因子都进 Bonferroni 分母:
阈值 = 0.05 / (显著 SNP 数 × OpenGWAS 数据集数)实测漂移记录:
| 日期 | 显著 SNP | 数据集数 | 阈值 | Bonferroni 显著 |
|---|---|---|---|---|
| 2026-07-16 | 224 | ~4,680(降级路径) | 4.77e-8 | — |
| 2026-07-18 | 243 | ~4,687(降级路径) | 4.39e-8 | 14,090 |
| 2026-07-20 | 228 | 50,056(gwasinfo 正常) | 4.38e-9 | 12,151 |
⚠️ 07-16/07-18 那两次 gwasinfo() 查询失败,走了脚本里的降级分支(用"返回结果里的数据集数"顶替,约 4,680),低估了检验数、阈值偏松。07-20 起 gwasinfo() 正常返回 50,056,阈值收紧 10 倍——这是修正,不是变差。
结论稳健性:靶点分层(A/B 级)在新旧阈值下完全一致,只有 n_offtarget 计数变小(PILRA 44→38、TGFB1 35→27、APOE 679→617)。APOE 仍是头号多效位点。
★ 2026-07-26 独立复算发现:磁盘上的 PheWAS 结果又是降级路径跑的
tools/verify_phewas.R 直接读 phewas_all.csv 重算,比对 phewas_provenance.csv:
| 项 | 上表引用的 07-20 正常运行 | 磁盘上实际的 07-22 运行 |
|---|---|---|
| 检验 SNP 数 | 228 | 183 |
| 数据集数来源 | gwasinfo 正常(50,056) | ⚠ 降级:返回结果里的数据集数(4,911) |
| Bonferroni 阈值 | 4.38e-9 | 5.56e-8(宽松 10.2 倍) |
| Bonferroni 显著 | 12,151 | 12,910 |
也就是说本页上表引用的数字描述的是 07-20 那次运行,而当前产物是 07-22 降级路径的结果。
复算量化影响(以 183 SNP × 50,056 数据集 = 正确阈值 5.46e-9 重算,tools/verify_tier.R):
| 层面 | 结论 |
|---|---|
| 全库显著关联数 | 12,910 → 11,060(当前 CSV 虚高 1,850 条 = 16.7%) |
| A/B 靶点分层 | 19 个候选 0 个跨界 —— A 级全部仍 A,B 级(APOE 692→622、AGER 359→311、CFB 150→122)全部仍 B |
| 头部多效蛋白 | 前 4 名不变(APOE / CELSR2 / ABO / AGER);第 5 名会换(NCAN 289 超过 HLA-E 279) |
| 两份汇报 PPT | 完全不受影响 —— PPT 未使用任何 PheWAS 结果 |
分层不受影响有其结构原因:正确阈值更严 ⇒ 脱靶计数只能减少 ⇒ 只可能 B→A 升级、不可能 A→B 降级,因此A 级候选名单不可能因此丢人。复算实测无一升级。
本页与阶段六表格里的数字是对的
按正确阈值复算得 PILRA 38 / PILRB 38 / TGFB1 27 / APOE 622,与阶段六表格及本页 07-20 记录(38 / 38 / 27 / 617)逐个吻合。 已发布的数字无需修改;偏松的只是磁盘上的 phewas_*.csv。
真实风险:若有人直接用当前 CSV 重新生成脱靶表或靶点网络图,会得到虚高的计数(PILRA 47、TGFB1 35、APOE 692)。发表前应在 gwasinfo 正常时重跑,或用 ndb=50056 钉住数据集数。
根因未修(订正前述表述):降级分支确实会打印 ⚠️ 提示、并写入 provenance,并非完全静默;但它继续执行且 exit 0,CI/编排脚本无从感知。脚本已内置 ndb= 命令行参数可钉住数据集数——修复手段一直存在,只是 07-22 那次没用。建议把降级改为硬失败(或要求显式 --allow-degraded),否则同一问题会反复出现(07-16、07-18、07-22 已三次)。
⚠️ 另有一处代码注释写反了:降级分支的注释写「保守,会低估检验数」——低估检验数会让阈值变松,属反保守,注释与实际效果相反。 ::: :::
溯源文件:投稿方法学直接引用它 ★
每次跑 03_phewas.R 都会写 results/phewas/phewas_provenance.csv,记录这一次的全部参数:
| 字段 | 含义 |
|---|---|
query_date / query_time | 查询日期时间(投稿必写) |
n_snps_tested | 查询的工具 SNP 数 |
n_opengwas_datasets | 当时 OpenGWAS 的数据集总数 |
n_datasets_source | 这个数从哪来:gwasinfo() 实时查询 / 命令行 ndb= 钉住 / 退化:返回结果里的数据集数 |
n_tests / bonferroni_threshold | 检验数与阈值 |
query_pval_cutoff | 拉候选的粗筛阈值 |
n_associations_returned | 实际返回的关联条数 |
ieugwasr_version / r_version | 软件版本 |
定稿后把分母钉死
论文定稿时用 Rscript analysis/03_phewas.R ndb=50056 钉住数据集数,之后无论库怎么长,重跑都能复现同一个阈值。 n_datasets_source 会记成"命令行 ndb= 钉住",审稿人一看就明白。
投稿要做的三件事(对照已发表同类研究的通行做法):
- 方法学写清楚:查询日期、数据集数、Bonferroni 分母怎么算的
- 把
phewas_all.csv作为 Supplementary Data 附上——等于冻结快照,读者不必重查库 - 可成药性(Open Targets,阶段⑦)同理记日期。外部 API 类阶段(03 PheWAS / 07 可成药性)收尾时务必核一眼产出是不是整片空值——07 曾因代理写死在 WSL 内不可达而全表
NOT_FOUND却退出码 0,详见阶段七 · 复现与自查
参考:直接竞品 Hou et al. 2025(UKB-PPP pQTL→干性 AMD)根本没做 PheWAS,多效性只用 MR-Egger/MR-PRESSO/共定位,其 Bonferroni 分母是"检验的蛋白数 1,763"。我们单 cis 工具做不了 Egger/PRESSO,PheWAS + 共定位正是替代方案,证据强度不弱于它。
- 产出:
phewas_all.csv(全部,含bonferroni_sig/p_bonf列)+phewas_summary.csv(每 SNP 排行)+phewas_offtarget_bonferroni.csv(脱靶明细,供阶段⑥用)
结果怎么看
phewas_summary.csv(先看这个,每 SNP 一行,按 Bonferroni 显著的表型数降序)
| 列 | 含义 | 怎么看 |
|---|---|---|
rsid / protein | 工具 SNP / 对应蛋白 | 对应 MR 结果表里的 SNP |
n_assoc_raw / n_traits_raw | 粗筛(p<1e-5)下的关联数 / 表型数 | 参考用 |
n_traits_bonf ★ | Bonferroni 显著的不同表型数 | 判读只用这个 |
n_assoc_bonf | Bonferroni 显著的关联条数 | |
min_p | 最小 p |
真实结果(Bonferroni 前后对比,前 4 名):
| rsid | protein | n_traits_raw | n_traits_bonf | 判读 |
|---|---|---|---|---|
| rs429358 | APOE | 949 | 685 | 🔴 头号多效位点,校正后仍关联 685 种表型 |
| rs12740374 | CELSR2 | 519 | 442 | 🔴 已知脂质多效位点 |
| rs505922 | ABO | 557 | 394 | 🔴 血型位点,什么都关联 |
| rs2523594 | HLA-E | 541 | 315 | 🔴 HLA 区域,LD 极复杂 |
没有绝对阈值,按量级分档判读(阶段⑥用 n_traits_bonf > 100 作为高多效标记):
| n_traits_bonf | 判读 | 该怎么办 |
|---|---|---|
| < 20 | 多效性低,工具干净 | 正常解读(如 SPRY2 = 0、TNFRSF10A = 7) |
| 20–100 | 中等,多数 cis-pQTL 在这档 | 结合共定位看 |
| > 100 | 🔴 高多效 | 标记为高多效并随表输出 pleiotropy_note(2026-07-27 起不再自动降级,见阶段六;APOE 定稿值 632) |
高多效 ≠ 结论一定错,但举证责任反转
cis-pQTL 落在 APOE/ABO/HLA 这类区域时,它关联几百个表型可能是因为该位点本身处于基因密集、LD 复杂的区域(如 HLA),不一定是这个蛋白真的影响几百种病。所以:
- 不能因为多效性高就直接否定;
- 但也不能只凭 MR 显著就下结论——要靠共定位回答"疾病信号和蛋白信号是不是同一个变异"。
- 本课题的 AGER(rs204993,523 个表型)就是典型:它在 MHC 邻近区,MR 打出 OR=0.14 极显著,但必须等 HyPrColoc 判决。
数据小瑕疵:phewas_all.csv 有空 rsid 行
OpenGWAS 返回的部分关联行 rsid 和 protein 为空(该数据集用的变异 ID 没对上 rsID)。汇总表 phewas_summary.csv 是按 rsid 分组统计的,这些空行不影响每个 SNP 的计数;但你直接翻 phewas_all.csv 时会看到空行,属正常,不是 bug。
二、LDSC(疾病间遗传相关)
目的:用 LD score regression 算疾病两两的遗传相关 rg——判断糖尿病各并发症共享多少遗传基础,以及 AMD、T1D/T2D 与它们的关系。
数据怎么来 / 怎么做
- 工具:
GenomicSEM的munge()+ldsc()(还原原始实现8_sensitivity_AMD.Rmd) - 参考面板:
eur_w_ld_chr(1000G 欧洲 LD scores)+w_hm3.snplist(HapMap3) - 输入:全量 FinnGen R9 sumstats(8 个疾病)bash
Rscript analysis/04_ldsc.R # 预处理 → munge → 遗传相关矩阵
结果:遗传相关矩阵 rg
| 糖网 | 黄斑 | 增殖DR | 肾病 | 神经 | AMD | T2D | T1D | |
|---|---|---|---|---|---|---|---|---|
| 糖网 | 1.00 | 0.95 | 0.73 | 0.97 | 0.74 | 0.29 | 0.75 | 0.57 |
| 黄斑 | 0.95 | 1.00 | 0.75 | 0.94 | 0.60 | 0.24 | 0.67 | 0.58 |
| 肾病 | 0.97 | 0.94 | 0.75 | 1.00 | 0.75 | 0.15 | 0.79 | 0.68 |
| AMD | 0.29 | 0.24 | 0.23 | 0.15 | 0.15 | 1.00 | 0.07 | 0.07 |
| T2D | 0.75 | 0.67 | 0.41 | 0.79 | 0.62 | 0.07 | 1.00 | -0.03 |
产出 results/ldsc/genetic_correlation_rg.csv(R9)、results/ldsc_R13/…(R13)+ h2_observed.csv。
结果怎么看
genetic_correlation_rg.csv 是个对称方阵:第一列 trait 是行名,其余每列一个疾病,格子里就是这两个病的遗传相关 rg。对角线恒为 1(自己跟自己)。上三角和下三角一样,只看一半即可。
| rg 范围 | 含义 | 例(本课题) |
|---|---|---|
| 0.8 ~ 1.0 | 遗传上几乎是同一个病 | 糖网↔肾病 0.968 |
| 0.5 ~ 0.8 | 明显共享遗传基础 | 糖网↔T2D 0.754 |
| 0.2 ~ 0.5 | 弱共享 | 糖网↔AMD 0.294 |
| −0.2 ~ 0.2 | 基本互相独立 | T1D↔T2D −0.031 |
| 负值 | 遗传上反向(一个的风险等位是另一个的保护等位) | 本课题没有明显负相关 |
h2_observed.csv 是每个病的观察尺度遗传度——这个性状有多少变异能被常见 SNP 解释:
| trait | h2_observed | 怎么看 |
|---|---|---|
| T2D | 0.0909 | 最高,符合 T2D 是高度多基因病 |
| DR(糖网) | 0.0238 | |
| RetinaProlif | 0.0070 | 🔴 偏低,该病的 rg 估计会更不稳 |
h2 太低时,那一行的 rg 别当真
LDSC 的 rg 是拿两个病的 h2 做分母算出来的(rg = 协方差 / √(h2₁·h2₂))。h2 越小、分母越小,rg 越容易被放大或乱跳。RetinaProlif 的 h2 只有 0.007,所以它那一行的 rg(如 ↔T1D 0.709)应视为提示性,不宜作为强结论。LDSC 惯例是 h2 的 Z 值 < 4 就不建议报 rg。
当前输出的两个局限(写作时注意)
- 只有 rg 点估计,没有 SE / P 值 —— 现在的脚本从
res$S直接算矩阵,没导出标准误,所以严格说不能声称"rg 显著不为 0"。要下这种结论,需从ldsc_result.rds里的res$V(抽样协方差矩阵)取 SE 再算 P。 - rg 不含因果方向 —— rg 高只说明"共享遗传基础",不等于一个导致另一个。方向要靠 MR 和双向 MR 回答。
R13 的 rg(多了 AMD 亚型与糖网严格定义,R9 没有)
| 糖网 | 糖网(严格) | 黄斑 | AMD | 湿性AMD | 干性AMD | 肾病 | T1D_wide | T2D | |
|---|---|---|---|---|---|---|---|---|---|
| 糖网 | 1.00 | 0.774 | 0.920 | 0.418 | 0.483 | 0.385 | 0.884 | 0.783 | 0.049 |
| AMD | 0.418 | 0.069 | 0.162 | 1.00 | 0.925 | 0.966 | 0.179 | 0.080 | 0.063 |
| 湿性AMD | 0.483 | 0.116 | 0.260 | 0.925 | 1.00 | 0.851 | 0.245 | 0.090 | 0.050 |
| 肾病 | 0.884 | 0.618 | 0.717 | 0.179 | 0.245 | 0.157 | 1.00 | 0.819 | 0.355 |
| T2D | 0.049 | 0.065 | 0.251 | 0.063 | 0.050 | 0.046 | 0.355 | 0.361 | 1.00 |
关键发现(发文章用)
- 糖尿病微血管并发症之间高度遗传相关(R9 糖网↔肾病 0.968/R13 0.884、糖网↔黄斑 0.946/0.920)→ 共享遗传基础,支持"泛并发症"整合分析
- AMD 与所有糖尿病并发症遗传相关都低(R9 0.07–0.29;R13 0.07–0.48)→ AMD 是独立疾病,两个版本都验证了它作为"非糖尿病对照"的合理性
- T1D 与 T2D 遗传上几乎不相关(R9 rg≈−0.03)→ 符合两者病理不同
- 🆕 湿性 ↔ 干性 AMD rg = 0.851(各自与总 AMD 0.925/0.966)→ 两个亚型遗传上高度同源,可合并解读;这也解释了为什么阶段六里 TNFRSF10A/TGFB1/WARS 会在三个 AMD 亚型上方向一致
⚠️ R13 有两处异常,写作前务必核实
- T2D ↔ 糖网 在 R13 只有 0.049,而 R9 是 0.754 —— 同一对疾病、换个版本差 15 倍,非常反常。最可能的原因是 R13 糖网的对照组构成变了:R13 糖网
ncase=15353 / ncontrol=62519,而 R9 是10413 / 308633——R13 的对照池只有 R9 的 1/5,很可能对照里筛掉了大量非糖尿病人群(即对照本身多为糖尿病患者),这会把"糖尿病 vs 糖网"的遗传共享给抵消掉。 - 黄斑 ↔ T1D_wide = 0.967 高得离谱,而黄斑的 h2 只有 0.0143(低 h2 → rg 不稳,见上方警告)。
这两条不要直接写进论文,需先查 FinnGen R13 的 endpoint 定义与对照构成。
rg 怎么帮你读 MR 结果
在 overlap_matrix.csv 里看到"某蛋白同时在糖网和肾病显著"——别急着兴奋:这两个病 rg=0.968,遗传上本来就几乎是一个病,同时显著是意料之中,算不上独立证据。真正有信息量的是跨越低 rg 的共享(比如同时在糖尿病并发症和 AMD 里显著,rg 只有 0.29)。
三、HyPrColoc(多性状共定位)
目的:对 MR 显著的蛋白位点,判断"暴露蛋白 + 多个疾病"是否由同一个因果变异驱动(区分真共享 vs 连锁巧合)。
数据怎么来
- 从 UKB-PPP Synapse(
syn51364943)下每个蛋白单独的区域 sumstats(每蛋白一个.tar,内含各染色体文件,hg38) - 结局区域:全量 FinnGen 对应版本(hg38)→ 都 hg38,按
chr:pos位置匹配 - 驱动脚本:
analysis/05_hyprcoloc.R(引擎R/09_hyprcoloc.R)
bash
Rscript analysis/05_hyprcoloc.R R9 # 24 个跨≥2 病的蛋白 × 12 个 R9 并发症
Rscript analysis/05_hyprcoloc.R R13 # 31 个蛋白 × 9 个 R13 结局(含湿/干 AMD)为什么它跑得比别的都慢
每个蛋白都要:解压该蛋白 tar 里的 cis 染色体文件 + zcat 切最多 12 个全量 FinnGen(每个 ~1GB)的区域。一个蛋白 3–10 分钟是正常的。脚本每算完一个蛋白立即写 _parts/<蛋白>.csv,所以中断了也只丢当前这一个,重跑自动接着算。
结果怎么看 ★
产物在 results/hyprcoloc_R9/(R13 同构):hyprcoloc_results.csv(全部)+ hyprcoloc_shared.csv(只留检出共享簇的)。
每一行 = 一次迭代(iteration)。HyPrColoc 是迭代式的:先找一个共享簇,把它挑出来,再在剩下的性状里继续找,直到找不出为止。所以同一个蛋白会有多行。
| 列 | 含义 | 怎么看 |
|---|---|---|
iteration | 第几轮 | 一个蛋白多行很正常 |
traits | 这一簇里有哪些性状 ★ | 最关键的列,见下方判读 |
posterior_prob | 该簇的后验概率 PP ★ | > 0.7 才算支持(本课题方案定稿值,写在 config.yaml 的 hyprcoloc_pp_threshold) |
regional_prob | 该区域存在共享信号的概率 | 高但 PP 低 = 有信号但分不清是不是同一个 |
candidate_snp | 候选因果变异 | 可拿去查功能注释 |
posterior_explained_by_snp | 该 SNP 解释了多少后验 | 接近 1 = 定位到单个变异,很干净 |
dropped_trait | 本轮被踢出的性状 | |
protein / chr / gene_pos | 蛋白与位点 | |
n_snp | 该区域参与的共同 SNP 数 | 太少(<30)会被跳过 |
n_traits | 一起做共定位的性状总数(蛋白 + 各显著疾病) |
判读的核心:蛋白在不在簇里
这是最容易看错、也最关键的一点——用本课题的真实结果 CFB(_parts/CFB.csv)来讲:
| iteration | traits | posterior_prob | candidate_snp |
|---|---|---|---|
| 1 | Nephropathy, RetinaNOS, RetinaProlif, Retinopathy, SeveralComplications | 0.9999 | 6:32405601 |
| 2 | Hypoglyc, Ketoacidosis, Maculopathy | 1.0 | 6:32372293 |
| 3 | None(dropped: AMD) | — | — |
乍一看 PP=0.9999 和 1.0,好像证据爆表——其实恰恰相反:
🔴 两个簇里都没有
CFB这个蛋白本身! 簇 1 说的是"肾病+视网膜NOS+增殖DR+糖网+多并发症这五个病共享同一个因果变异",簇 2 是"低血糖+酮症酸中毒+黄斑"共享另一个变异。CFB 蛋白自己没进任何一簇 → 说明蛋白的信号和疾病的信号不是同一个变异 → MR 里 CFB 和这些病的关联很可能是 LD 巧合(CFB 位于 chr6:31.9Mb 的 MHC 区域,那里 LD 极其复杂,本来就最容易出这种假象)。
所以判读规则是:
| 看到什么 | 结论 | 怎么写 |
|---|---|---|
| 簇里有「蛋白 + ≥1 疾病」,PP>0.7 | ✅ 最强证据:同一因果变异同时驱动蛋白和疾病 | 可作为主要发现 |
| 簇里有「蛋白 + 多个疾病」,PP>0.7 | ✅✅ 泛并发症共享靶点——本课题最想要的 | 核心卖点 |
| 簇里只有疾病、没有蛋白(如 CFB) | 🔴 共定位不支持:病之间共享,但蛋白不在同一信号上 | MR 那条标"证据不一致",很可能 LD 巧合 |
traits = None | ⚪ 该轮没检出共享簇 | 共定位不支持 |
| PP 在 0.5–0.7 | ⚠️ 证据不足 | 只能说"提示性" |
真实案例:APOE 在 R9 和 R13 的判决不一样
| 版本 | APOE 的簇 | PP | 判决 |
|---|---|---|---|
| R9 | APOE, AMD, 黄斑, 肾病, 视网膜NOS, 糖网, 多并发症 | 0.7563 | 刚过 0.7 → 支持 |
| R13 | APOE, AMD, 干性AMD, 湿性AMD, 糖网 | 0.9564 | 强支持 |
蛋白确实在簇里、PP 也过线,但 APOE 在 PheWAS 里 Bonferroni 校正后仍关联 617 种表型——是头号多效位点。一个"什么病都沾"的位点跨多病共定位,更可能是多效性而非真共享因果。
2026-07-27 前阶段六会把它自动降级为 B 级、不进候选;现改为保留分层 + 附高多效标注(文献惯例是把 PheWAS 脱靶当安全性注释而非排除门槛)。写作时应表述为"提示性发现,因 APOE 已知的广泛多效性,不足以作为因果证据",而不是"APOE 是泛并发症共享靶点"。
判决汇总(hyprcoloc_verdict.csv,每蛋白一行)★
脚本会把上面的规则自动判好,输出 verdict 列。这是最省事的入口:
| 判决 | R9 | R13 | 含义 |
|---|---|---|---|
| ✅ 支持(蛋白与疾病共定位,PP>0.7) | 5 | 9 | 可进阶段⑥ |
| ⚠️ 证据不足(蛋白进簇但 PP<0.7) | 6 | 3 | 只能说提示性 |
| 🔴 不支持(仅疾病成簇、蛋白未进簇 → 疑 LD 巧合) | 11 | 16 | MR 关联多半是假象 |
| ⚪ 不支持(未检出共享簇) | 1 | 3 | |
| 合计分析 | 23 | 31 |
数字为 2026-07-18 从零重算实测(R13 支持=9;此前文档误写 12,已更正)。
最重要的发现:MHC 区那批"跨病明星蛋白"全军覆没
overlap_matrix.csv 里 n_outcomes 排前五的 AGER(15)、HCG22(13)、CFB(11)、BTN2A1(10)、LTB(9)——在 R9 和 R13 里全部落在"仅疾病成簇、蛋白未进簇"这一档,而且它们全在 chr6 的 MHC 区域。
这是两个版本互相印证的结论:MHC 区 LD 极强,一个疾病因果变异能把周围一大片 pQTL 都"带显著",制造出"某蛋白跨 15 种并发症"的假象。光看 MR 的重叠排行榜会被彻底误导——这正是共定位存在的意义。
包括 AGER(MR 里 OR=0.14、P=9×10⁻⁸²、15 个结局显著):R9 的簇是"增殖DR+糖网 PP=0.9864"等,但 AGER 蛋白自己不在任何一簇里 → 那个漂亮的 OR 极可能是 LD 巧合。
附:三类分析对应的脚本
| 分析 | 脚本 | 数据源 | 分版本 | 状态 |
|---|---|---|---|---|
| PheWAS | analysis/03_phewas.R | OpenGWAS(token) | ❌ 合并 | ✅ 完成(243 SNP / 22,473 关联 / 14,090 条 Bonferroni 显著,查询日期 2026-07-18) |
| LDSC | analysis/04_ldsc.R R9|R13 | 全量 FinnGen + eur_w_ld_chr | ✅ 分 | ✅ R9 + R13 均完成 |
| HyPrColoc | analysis/05_hyprcoloc.R R9|R13 | UKB-PPP Synapse 区域 tar + 全量 FinnGen | ✅ 分 | ✅ 完成(R9 23 个 / R13 31 个蛋白) |
| 阶段⑥整合 | analysis/06_network.R R9|R13 | 上面三者 | ✅ 分 | ✅ 完成 → 阶段六·靶点网络 |
相关:结果怎么看 · 批量筛查 · 方法引擎 06-共定位 · 代码结构详解
口径说明(2026-07-27)
本页出现过多个版本的 APOE 脱靶计数(685 / 679→617 / 692→622),源自不同查询日期与不同分母。 定稿值为 632:117 个工具 SNP × 50,164 个数据集 = 5,869,188 次检验,Bonferroni 阈值 8.52×10⁻⁹。 此前分母有两处错:SNP 池含已退出主跑的 FinnGen T1D/T2D 工具(虚增 3.3 倍)、 数据集数走了降级值 4,911 而非元数据全量 50,164(偏松 10.2 倍),净偏松约 3 倍。 溯源见 results/phewas/phewas_provenance.csv。