主题
方案 C 执行结果(2026-07-29)
这页干什么
记录 T1D 换源 + 双零重叠敏感性 + 四项方法学增补 的完整执行与结果。 所有数字均为本地实测,脚本与产物路径逐条给出,可复核。
一、方案 C 三个目标全部达成
| 目标 | 结果 |
|---|---|
| T1D 换源 → GCST90824163 | ✅ 工具覆盖 96.8%,显著关联 57 条 |
| rg(T1D, T2D) | ✅ 0.886 → 0.087(验收线 < 0.2) |
| T2D 加 MVP 敏感性 | ✅ 方向 100% 一致 |
| (新增)T1D 零重叠复制 | ✅ 84.6% 同向 |
换源后 rg 的整体结构才讲得通:
| 性状对 | 旧源 | 新源 |
|---|---|---|
| T1D – T2D | 0.886 | 0.087 |
| 视网膜病变 – T1D | 0.781 | 0.453 |
| 黄斑 – T1D | 0.770 | 0.454 |
| 糖肾 – T1D | 0.769 | 0.433 |
| 神经 – T1D | 0.772 | 0.359 |
旧源下 T1D 与四个并发症的 rg 齐整地落在 0.77–0.78,那是"糖尿病"的信号;换源后分化开(0.36–0.45),且一律低于 T2D 的 0.59–0.74,符合 FinnGen 并发症以 2 型为主的事实。
二、三组数据源对照
判据分四档,避免"复制成功"被含糊使用:covered(对照数据里有该工具;没有的判定不了,不算失败)→ 同向 → 同向 p<0.05 → 同向 FDR<0.05。
| 对照 | 主分析显著 | 覆盖 | 同向 | 同向 p05 | 同向 FDR05 |
|---|---|---|---|---|---|
| T1D 新 vs 旧(GCST90475661) | 57 | 55 | 34 (61.8%) | 10 | 10 |
| T1D 新 vs Crouch(零重叠) | 57 | 39 | 33 (84.6%) | 25 | 19 |
| T2D Mahajan vs MVP(零重叠) | 28 | 27 | 27 (100%) | 24 | 22 |
- 与旧源有 21 条方向完全相反(KLK1、MOG、CDSN、VEGFB、OSM、APOH、FGF21、CD80…)。两份数据若测同一表型不可能近四成翻转,与位点层证据(TCF7L2 p=9.5e-66 → p=0.67)一致
- UKB 重叠不是结论的驱动因素:完全不含 UKB 的数据里 84.6% 同向、近半 FDR 显著。未覆盖的 18 条正是 MHC 那批
- T2D 主结果方向零翻转;唯一未覆盖的是 ABO
产物:results/source_compare/
三、★糖尿病易感性对照
动机见 FinnGen 端点对照定义问题:并发症端点的对照是一般人群,估计目标是"糖尿病 + 并发症"的复合效应。
做法:同一工具变异下,比较蛋白对并发症与对 T1D/T2D 的效应量。
统计说明(须写进方法)
并发症估计与糖尿病估计共享暴露工具、且共享 FinnGen 对照池,两者正相关: Var(b_c − b_d) = v_c + v_d − 2cov,cov > 0。 我们按独立计算方差(用 v_c + v_d),这会高估差值方差 → z 偏小 → 更难判为"并发症特异"。 这是保守的一侧,不会夸大特异性主张。
57 条显著关联 / 31 个蛋白的归类:
| 分类 | 关联数 | MHC 区 | 非 MHC |
|---|---|---|---|
| 糖尿病驱动 | 35 (61%) | AIF1, ATP6V1G2, CFB, LTB, MICB/MICA, TNXB, SIGLEC5, TRIM40 | AOC1, APOE, BCL2L15, IL7R, ITGB7, LACTB2, NOTCH2, NUDT5, PAM, TIGIT, TPPP3, WARS |
| 并发症增强 | 11 | AGER, HCG22 | ACRBP, CLPS |
| 并发症特异 | 10 | BTN2A1, BTN3A2 | APOL1, ERMAP, IFNAR1, VWC2L |
| 方向背离 | 1 | — | GALNT3 |
超过一半的显著关联,本质是"这个蛋白让人更容易得糖尿病",不是并发症特异机制。
对既有候选的修正
APOE、PAM、NOTCH2 被判为糖尿病驱动——而这三个此前是共定位支持的候选。 它们对糖网的"因果效应"很可能经由"更容易得糖尿病",而非视网膜特异机制。 这不是分析出错,是此前没做这层对照所以看不出来;同类文献(含 C1R 那篇与 baseline)均未处理。
一个独立的内部互证
共定位簇的成分印证了同一分类:
APOE 簇 = APOE, 黄斑, 糖肾, 视网膜病变, T2D ← 糖尿病在簇内
NOTCH2 簇 = NOTCH2, 黄斑, 视网膜病变, T1D, T2D ← 糖尿病在簇内
APOL1 簇 = APOL1, 黄斑 ← 只有并发症
ERMAP 簇 = ERMAP, 黄斑
IFNAR1 簇 = IFNAR1, 黄斑"效应量比值"与"哪些性状进同一个簇"是两个互相独立的判据,结论一致 —— 说明这个分类是数据里本来就有的结构。
产物:results/diabetes_contrast/,脚本 analysis/27_diabetes_contrast.R
四、候选靶点决策表
四道过滤(共定位支持 + 非 MHC + 糖尿病对照 + PheWAS 多效性)收敛为 A 级 3 个,全部指向糖尿病黄斑病变:
| 蛋白 | 共定位 PP | 糖尿病对照 | PheWAS 脱靶性状数 |
|---|---|---|---|
| ERMAP | 0.899 | 并发症特异 | 6 |
| IFNAR1 | 0.837 | 并发症特异 | 4 |
| APOL1 | 0.815 | 并发症特异 | 2 |
对照组的多效性:APOE 642 个脱靶性状、AGER 322、BTN2A1 248、AIF1 235、BTN3A2 195 —— 全部归为"高多效,成药需谨慎"(对标 C1R 那篇对 ABO 关联 63 个性状的处理)。
跨病方向一致性:15 个跨 ≥2 个并发症的蛋白无一方向相反(不同于 C1R 那篇的 BTN2A1/FGF5)。
产物:results/targets/target_decision_table.csv,脚本 analysis/32_targets_table.R
五、★通路富集必须按 MHC 分组
走 g:Profiler REST API(clusterProfiler 在本机 R 4.3 需源码编译,放弃)。
| 分组 | 头号富集项 |
|---|---|
| 全部 31 个蛋白 | immune response,p = 7.2e-07 |
| 仅 MHC 区(11) | immune response p = 4.6e-04;Butyrophilin (BTN) family interactions |
| 仅非 MHC(20) | 免疫信号消失(最好仅 p = 0.047),改为脂蛋白颗粒相关 |
结论
"免疫机制驱动糖尿病并发症"这个看似漂亮的结论,完全由 MHC 那一块撑着。 不拆开跑就会写出一个由 LD 结构造成的假机制。
产物:results/enrichment/enrichment_gprofiler.csv,脚本 analysis/29_enrichment.R + tools/enrich_win.py
六、代码改动
| 文件 | 改动 |
|---|---|
analysis/_region_io.R | 加 gcst_beta 分支;两类 GCST 按列名解析列号;缓存键加入文件签名 |
analysis/05_hyprcoloc.R | FMT_MAP 扩为三分支 |
analysis/04_ldsc.R | ★修断点续跑缺陷(见下) |
analysis/27,29,31,32 | 新增四个脚本 |
修掉的一个静默错误
04_ldsc.R 原本以「.sumstats.gz 文件是否存在」决定是否跳过 munge。 换数据源后它照样 skip munge(已存在),复用旧源的 munge 产物, rg 仍报 0.886 —— 换源等于没换,且不报任何错。
已改为指纹判据:源文件(名/大小/mtime)+ N + fmt 任一变化即作废重算; 指纹在 munge 成功之后才落盘,中途失败下次会重算,不会留下"看似有效"的产物。
为什么必须按列名解析列号
实测 GCST90824163 的 rsid 在第 9 列、GCST90013791 在第 10 列。 写死列号会读到错误的列且完全静默(区域读到 0 行 → 该位点被跳过,不报错)。
七、两个环境坑
1. 大文件下载必须走 Windows 侧
WSL 在 NAT 模式下够不到 Windows 的 127.0.0.1 代理(每条 wsl 命令开头的警告即此),裸连 EBI 约 26 KB/s; Windows 侧的 Git Bash 有 HTTP_PROXY/HTTPS_PROXY/ALL_PROXY = 127.0.0.1:10808,curl 自动读取,约 8.8 MB/s —— 差约 300 倍。 g:Profiler 等外部 API 同理,也必须从 Windows 侧调。
2. curl -C - 会把已完整的文件越续越大
本地文件达到或超过远端 Content-Length 时,续传会继续往末尾追加,产生比远端还大的坏文件,且每轮 md5 都不同。 "重试到 md5 匹配"的循环反而在持续破坏文件。
正确做法:续传前先比对 Content-Length;或直接下到临时文件,校验通过后才替换(坏文件改名保留,不删)。
八、配图
四项新增分析的配图(沿用项目统一规范:英文标注 + theme_mr + PNG 600dpi 与矢量 PDF 双份):
| 图 | 路径 | 说明 |
|---|---|---|
diabetes_contrast_scatter | results/diabetes_contrast/figures/ | 并发症效应 vs 糖尿病效应散点;对角线上方=对并发症作用更强;形状区分 MHC |
diabetes_contrast_stacked | 同上 | 各结局的四类构成堆叠条 |
source_replication | results/source_compare/figures/ | 三组数据源对照的四档判据条形图 |
enrichment_by_mhc | results/enrichment/figures/ | 按 MHC 分组的通路富集——免疫信号在非 MHC 组消失 |
target_pleiotropy | results/targets/figures/ | 候选靶点的 PheWAS 脱靶负担(对数轴),按分层着色 |
脚本 analysis/33_figures_new.R。F 盘另存一份 PNG 便于查看:F:\project\mr-pipeline-r9\results_key\figures\。
出图时踩的坑
首版图例与脚注被右边缘截断(项目此前也踩过)。已用 guide_legend(nrow = 2) 把图例排成两行、 caption 手动插入换行、并加宽画布解决。出图后必须实际看一眼渲染结果, ggsave 不会因为文字超出边界而报错。
九、数据清单
文件(D:\mrdata\outcome\) | 用途 |
|---|---|
GCST90824163.h.tsv.gz | 外部 T1D 主分析(McGrail 2026) |
GCST90013791.h.tsv.gz | T1D 零重叠复制(Crouch 2025) |
GCST90475667.tsv.gz | T2D 零重叠敏感性(MVP),md5 f7dcf901… |
GCST90475661.tsv.gz | 旧 T1D,已退役保留 |