主题
孟德尔随机化 · 从零开始读懂(小白入门)
这一页假设你完全没学过统计遗传,从"为什么要做这个"讲到"结果长什么样",一条线读下来。 读完你应该能回答三个问题:我们在证明什么 · 凭什么能证明 · 哪些结果算数。 想直接看结果怎么读 → 结果怎么看;想看每步的公式与文献 → 方法引擎详解。
先给你一句话
我们在做的事:从血里的两千多种蛋白中,找出哪些蛋白的高低是"导致"糖尿病并发症(糖网、肾病、神经病变等)的原因,而不只是"跟着一起变"。 用来判断因果的工具,是人出生时就随机拿到的基因。
第一章 为什么需要 MR:普通研究解决不了的问题
1.1 相关 ≠ 因果
假设我们抽了一万个糖尿病人的血,发现:血里 A 蛋白高的人,得糖网的多。能说"A 蛋白导致糖网"吗?不能。至少有三种解释:
| 可能性 | 说明 | 例子 |
|---|---|---|
| 真因果 | A 蛋白确实伤害视网膜 | 那它就是药物靶点 ✅ |
| 混杂(confounding) | 有第三个因素同时抬高 A 蛋白和糖网风险 | 病程长的人 A 蛋白高、糖网也多 → 真凶是病程 |
| 反向因果(reverse causation) | 是糖网(或它的病理过程)让 A 蛋白升高 | 视网膜坏了才释放 A 蛋白,A 是结果不是原因 |
观察性研究(横断面、队列)没法把这三种区分开。你能校正的只有你测到的混杂因素,测不到的(reverse causation、未知混杂)就无解。
1.2 金标准是 RCT,但这里做不了
理论上最干净的做法是随机对照试验(RCT):把人随机分两组,一组把 A 蛋白调高,一组不动,随访十年看谁得糖网多。因为分组是随机的,两组的病程、年龄、血糖、生活习惯平均下来都一样,唯一差别就是 A 蛋白 → 结果差异只能是 A 蛋白造成的。
但现实里:没有能安全调高 A 蛋白的药、随访十年成本天价、伦理上也不允许。对绝大多数蛋白,RCT 根本没法做。
1.3 基因就是老天爷帮我们做的随机分组
关键洞察在这里:
精子和卵子结合时,父母的等位基因是随机分给你的(减数分裂,孟德尔第二定律)。这个"随机发牌"发生在你出生之前,不受你后来的血糖、吸烟、病程、有没有得糖网的任何影响。
于是,如果我们能找到一个只影响 A 蛋白高低的基因变异(SNP),那么人群就被老天爷自动分成了两组:
携带该变异(A 蛋白天生偏高) ←── 随机分配,与后天因素无关
人群 ──┤
不携带(A 蛋白天生偏低)这两组人的年龄、生活习惯、病程平均下来是可比的(因为分配是随机的),差别只在 A 蛋白 → 这就近似一次天然的 RCT。这个思路就叫孟德尔随机化(Mendelian Randomization, MR)。
| RCT | MR |
|---|---|
| 研究者随机分组 | 受精时随机分配基因 |
| 干预:给药 | 干预:天生带不带这个变异 |
| 随访十年 | 基因从出生就"暴露"了,等于终身随访 |
| 贵、慢、常不可行 | 用已有的 GWAS 数据算,几分钟 |
顺带一个 MR 的独有优势
MR 反映的是"一辈子都比别人高一点点"的效应,而不是"吃药三个月"的效应。所以它更适合回答"这个靶点值不值得开发药物",不适合直接预测"用药后降多少风险"。
第二章 MR 的骨架:三个角色和三条假设
2.1 三个角色
工具变量 IV (SNP)
│ ①相关性:确实影响暴露
▼
暴露 (Exposure) ────因果?───▶ 结局 (Outcome)
= 某个蛋白 = 某种糖尿病并发症
▲ ▲
└──② 不能有混杂偷偷连过来 │
③ SNP 不能绕开暴露、直接影响结局 ┘- 暴露(exposure)=你怀疑是"因"的东西。本课题 = 血浆里某个蛋白的水平。
- 结局(outcome)=你想解释的"果"。本课题 = 糖尿病视网膜病变 / 肾病 / 神经病变 / AMD 等。
- 工具变量(IV, instrumental variable)=拿来代替暴露的 SNP。MR 全部的可信度都压在工具上。
2.2 三条假设(MR 的命根子)
工具变量必须同时满足三条,缺一条结论就不成立:
| # | 假设 | 白话 | 违反了会怎样 | 我们用什么保护它 |
|---|---|---|---|---|
| ① | 相关性 (Relevance) | SNP 真的能改变这个蛋白 | 工具太弱 → 估计有偏、随机噪声被放大 | F 统计量(F<10 剔除) |
| ② | 独立性 (Independence) | SNP 不通过混杂因素影响结局 | 混杂又混进来了 | 用 cis 变异 + 人群/祖先匹配 |
| ③ | 排他性 (Exclusion restriction) | SNP 只能经过这个蛋白影响结局,不能走别的路 | 多效性偏倚——最主要的威胁 | 共定位、PheWAS、Egger、PRESSO、cis 设计 |
假设 ③ 是最难的,也是全部质控的核心
"多效性(pleiotropy)"= 一个 SNP 同时影响好几个性状。比如 APOE 的 rs429358 关联了近千种表型——用它当工具,你根本分不清结局的变化是经过目标蛋白,还是经过它影响的其他一堆东西。本页后面提到的绝大多数检验,都是在跟假设 ③ 死磕。
2.3 为什么本课题用 cis-pQTL(重要)
- pQTL=影响某个**蛋白(protein)**血浆浓度的 SNP。
- cis-pQTL=这个 SNP 就落在编码该蛋白的基因自己附近(一般指基因两端 ±1 Mb 内)。
- trans-pQTL=在别的染色体/远处,通过一大堆中间环节间接影响这个蛋白。
打个比方:想调节一台机器上"A 零件"的产量——
- cis = 直接拧 A 零件生产线上的旋钮(机制明确,几乎不可能影响别的产线);
- trans = 去总电闸上拨一下(A 零件产量是变了,但整个工厂几十条线全跟着变了)。
trans 天生多效性一堆,会砸烂假设 ③;cis 机制最直接、最干净。所以本课题只用 cis-pQTL(工具表按 cis/trans == "cis" 过滤)。代价是:cis 工具通常每个蛋白只有 1 个左右——这直接决定了我们用哪种统计方法(见下一章)。
工具是"现成的",不是我们自己 clump 出来的
本课题的 cis 工具直接取自 UKB-PPP(Sun et al., Nature 2023)Supplementary Table 9 里的显著 cis-pQTL——每个蛋白一个 LD 独立的哨兵变异(数据实测 99.9% 的蛋白只有 1 个)。据论文方法学描述(经检索,未直接读到原文全文),这些是对显著变异做 PLINK 区域化 clumping 后的代表变异,LD 独立性由原文上游完成,我们不再二次 clumping。后文流程图里"cis 窗口 + clumping"那一步是通用引擎(换非 pQTL 暴露、从原始 sumstats 起跑)才走的;本课题筛查直接用现成哨兵。详见 工具变量选择。
第三章 一次 MR 到底怎么算出来的
3.1 两样本设计:不需要同一批人
我们不需要一个"既测了蛋白又随访了糖网"的队列。只要两份互相独立的现成 GWAS 汇总数据:
| 数据来源 | 提供什么 | |
|---|---|---|
| 暴露侧 | UKB-PPP(约 5.4 万英国人测了 ~3000 种血浆蛋白) | SNP → 蛋白的效应量 beta.exposure |
| 结局侧 | FinnGen(芬兰全国生物库,几十万人的疾病诊断) | SNP → 疾病的效应量 beta.outcome |
这叫两样本 MR(two-sample MR)。两个队列人群不重叠(英国 vs 芬兰),正好避免"样本重叠偏倚"。
为什么两侧都得是欧洲人?
不同人群的 SNP 之间连锁结构(LD)不一样。两侧人群不一致,等位频率和连锁结构错配会让效应量不可比。所以流水线要求暴露的 ancestry 与 LD 参考面板一致,不一致直接报错拦截(见 使用教程 §4.4)。
3.2 核心算式:Wald ratio(就一个除法)
只有 1 个工具 SNP 时,因果效应就是一个除法:
直觉:"这个 SNP 让疾病风险变了多少" ÷ "这个 SNP 让蛋白变了多少" = "蛋白每变 1 个单位,疾病风险变多少"。
就像:踩油门 1 厘米 → 车速 +5 km/h(暴露侧);踩油门 1 厘米 → 油耗 +0.5 L(结局侧);那么车速每 +1 km/h → 油耗 +0.1 L(相除,把油门这个中介消掉了)。
3.3 用我们的真实数字走一遍(AGER → 糖网)
拿结果表 results/screen_R9/Retinopathy_significant.csv 的第一行(真实数据):
| 量 | 数值 | 意思 |
|---|---|---|
SNP | rs204993 | 工具变量 |
protein | AGER | 暴露蛋白(晚期糖基化终产物受体) |
effect_allele.exposure | G | 效应等位(下面所有效应都相对 G 而言) |
beta.exposure | −0.17 | 每多带一个 G,AGER 蛋白降低 0.17 个标准差 |
beta.outcome | +0.332 | 每多带一个 G,糖网的 log-odds 升高 0.332 |
代进除法:
这正是结果表里的 b = -1.9548。再转成大家习惯的 OR:
翻译成人话:携带 G 的人 AGER 天生更低、而且糖网更多 → 反过来说,AGER 越高,糖网风险越低,AGER 每高 1 个标准差,糖网的比值比约为 0.14(95%CI 0.12–0.17,P=9×10⁻⁸²)。AGER 看起来是保护性的。
这个 0.14 不能直译成"高一个 SD 就少 86% 的病"
Wald ratio 是外推:它把"SNP 造成的那一丁点差异(0.17 SD)"线性放大到"整整 1 个 SD"。分母越小,放大倍数越夸张,OR 越极端。所以 cis-pQTL MR 的 OR 只该看方向和是否显著,绝对数值不要当疗效预测。这是新手最常犯的错。
3.4 多个工具时:IVW = 加权平均
如果一个暴露有好几个独立工具,每个工具各给一个 Wald ratio,把它们按精度加权平均就是 IVW(逆方差加权)——估计得准的 SNP(se 小)说话声音大。这是常规 MR 的主分析方法。
方法怎么选,流水线是按工具数自动决定的:
| 工具数 | 用什么 | 一句话 |
|---|---|---|
| 1 个(本课题批量筛查的常态) | Wald ratio | 就是上面那个除法 |
| ≥2 | IVW | 主分析:加权平均 |
| ≥3 | MR-Egger | 允许多效性存在,截距 ≠ 0 就是多效性的警报 |
| ≥3 | 加权中位数 / 众数 | 即使一半工具是坏的也稳,用来交叉验证 |
| ≥3 | MR-RAPS | 工具偏弱、样本可能重叠时更稳健 |
**判读原则:几种方法方向一致才可信。**只有 IVW 显著、中位数和 Egger 都不支持 → 大概率是某个坏工具带偏的,别写进结论。
那只有 1 个工具的时候,这些互相验证不就都没了?
对——这正是 cis-pQTL 筛查的固有局限:单 SNP 没法做 Q 检验、Egger 截距、留一法。所以本课题把"验证"的担子交给两根支柱:共定位(疾病信号和蛋白信号是不是同一个因果变异,排 LD 混杂)、PheWAS(这个工具是不是多效位点,排水平多效性)。这就是为什么下游分析不是"锦上添花",而是必须做。
⚠️ 注意:不要把"跨结局一致性(同一蛋白在多个并发症里都显著)"当成第三根验证支柱。遗传高度相关的并发症(如糖网↔肾病 rg≈0.97)本就会一起显著,多效位点(APOE)也到处显著——它区分不了真因果和假象,只能算支持性观察,不能替代共定位/PheWAS。
第四章 把整条流水线串起来看
到这里方法都齐了,现在看它们在实际分析里按什么顺序发生、每一步在解决哪条假设。
4.1 全流程一张图
【输入】UKB-PPP cis-pQTL 工具表 【输入】FinnGen 疾病 GWAS (R9/R13)
(一行一个 pQTL,含 beta/se/eaf) (全基因组,几百万行)
│ │
▼ ▼
① 读取 + 标准化 ────────────────────────────────┤ 各家格式不同:-log10P 还原、
│ │ OR 取 log、列名对齐、去坏行
▼ │
② 选工具变量 (IV) │ → 保护假设①
· 只留 cis(基因 ±500kb) │
· P < 5e-6 │
· LD clumping 去冗余 (r²<0.001) │
· 算 F,F<10 剔除(弱工具) │
│ │
└──────────────► ③ 谐化 Harmonise ◄──────┘ → 防方向搞反
· 等位基因对齐、回文 SNP 处理
· Steiger 定向过滤(剔除方向反的)
│
▼
④ MR 估计(Wald / IVW / Egger…) → 得出 b、OR、P
│
┌───────────────┼───────────────┐
▼ ▼ ▼
⑤ 敏感性检验 ⑥ 多重检验 FDR ⑦ 共定位
Q / Egger截距 几百个组合 同一因果变异?
PRESSO / LOO 压假阳性 → 保护假设③
│ │ │
└───────────────┼───────────────┘
▼
⑧ 证据整合 + 出报告/结果表
│
▼
⑨ 下游:PheWAS(多效性)· LDSC(疾病间遗传相关)
HyPrColoc(多疾病共享因果变异)对应到代码:R/ 里的编号文件就是这些工序,详见 代码结构详解。
4.2 每一步在防哪种错(这是理解全流程的钥匙)
| 步骤 | 它在防什么错 | 不做会怎样 |
|---|---|---|
| 标准化 | 单位/编码错乱 | FinnGen 的 mlogp 当成 P 值 → 所有 SNP 都"极显著" |
| cis 窗口 | 多效性(假设③) | 用 trans 工具 → 结论可能走的是别的通路 |
| LD clumping | 同一个信号被重复计数 | 一个位点算了 10 遍 → 把置信区间人为缩窄 |
| F 统计量 | 弱工具偏倚(假设①) | 弱工具让估计朝观察性关联方向偏 |
| 谐化 | 效应方向反了 | 保护因素被报成危险因素(符号反了) |
| Steiger | 反向因果 | 把"病导致蛋白变"错报成"蛋白导致病" |
| FDR | 多重检验假阳性 | 1587 个工具 × 23 个病,光靠运气就能蹦出几十个 P<0.05 |
| 敏感性检验 | 单个坏工具带偏 | 结论其实由一个离群 SNP 撑着 |
| 共定位 | 连锁巧合 | 蛋白和疾病其实是两个挨着的不同变异 → 假因果 |
| PheWAS | 高多效工具 | APOE 这种"什么都关联"的位点,结论不可信 |
| 双向 MR | 方向搞反 | 因果箭头画反了 |
4.3 我们实际跑的两条路线
| 批量筛查(本课题主力) | 单条精细分析 | |
|---|---|---|
| 命令 | Rscript analysis/01_screen.R R9 | Rscript run_all.R |
| 规模 | ~1600 个 cis 工具 × 23 个结局(R9) | 1 个暴露 × 少数结局 |
| 方法 | 单 SNP Wald ratio + 按结局做 FDR | 自适应全套 + 敏感性 + 共定位 |
| 改哪里 | outcome_manifest.csv(结局清单) | config.yaml |
| 产出 | 每结局显著表 + 跨结局重叠矩阵 + 汇总表 | 完整 HTML 报告 |
| 干什么用 | 广度扫描:先找出哪些蛋白有信号 | 深挖:把某个蛋白钉死 |
顺序是:先用批量筛查铺开找信号 → 再拿显著的蛋白做精细分析和下游验证。
第五章 下游三件套:为什么它们是必需的
单 SNP 的 Wald ratio 显著,只是入场券。真正决定一条结果能不能写进论文的,是下面三件事。
5.1 共定位(Colocalization)——排除"连锁巧合"
要解决的问题:MR 说 AGER 和糖网都跟这个位点有关,但会不会其实是两个不同的因果变异,只是恰好挨在一起、被连锁不平衡(LD)绑在一块儿?
打比方:晚上看见两栋楼同时亮灯——
- 是同一个总开关控制的(→ 真共享,共定位支持)?
- 还是各有各的开关只是碰巧同时开(→ 连锁巧合,共定位不支持)?
怎么做:把这个基因位点附近成百上千个 SNP 的关联信号整条曲线拿来比对,算后验概率(= 二者共享同一因果变异的概率)。判定线两个方法不同:coloc.abf 用 PP.H4 > 0.8(Giambartolomei 惯例);HyPrColoc 用 PP > 0.7(本课题方案定稿值,见 config.yaml)。
- coloc.abf:两两做(1 个蛋白 vs 1 个病)
- HyPrColoc:多性状一起做(1 个蛋白 vs 一堆病)——问的是"这个蛋白是不是同一个变异同时驱动了糖网+肾病+神经病变",正好对上我们"泛并发症共享靶点"的课题。
共定位需要"区域级"数据,不是几个哨兵 SNP
批量筛查每个蛋白只用了 1 个哨兵 SNP,做不了共定位。要跑共定位,得从 UKB-PPP Synapse 把每个蛋白的区域 sumstats(cis 窗口内上千个 SNP)单独下下来。这就是 HyPrColoc 排在数据下载之后的原因。
判读:MR 显著 且 共定位支持 = 证据强;MR 显著 但 共定位不支持 = 标"证据不一致",很可能是 LD 巧合。
5.2 PheWAS——给工具做背景调查
把每个显著的工具 SNP 拿去 OpenGWAS 扫上万种表型,看它还关联多少别的东西。关联得越多,越可能违反假设③(排他性)。
我们的实测结果(243 个显著 SNP → 22,473 条关联,查询日期 2026-07-18):
| SNP | 蛋白 | 关联表型数 | 怎么看 |
|---|---|---|---|
| rs429358 | APOE | 949 | 著名多效位点,结论必须打问号 |
| rs505922 | ABO | 557 | 同上(血型位点,什么都关联) |
| rs2523594 | HLA-E | 541 | HLA 区域,LD 极复杂 |
| rs204993 | AGER | 523 | 在 HLA 附近,需共定位交叉验证 |
注意 AGER 也在这张榜上——所以第三章那个漂亮的 OR=0.14,光凭 MR 还不能下结论,必须等共定位。这就是"下游不是可选项"的活例子。
5.3 LDSC——这些病到底是不是一回事
LDSC(LD score regression)用全基因组数据算两种病之间的遗传相关 rg(−1 到 1),衡量它们共享多少遗传基础。它不做因果,是给整个课题定调用的。
我们的实测(R9,8 个疾病):
| 发现 | 数字 | 意味着什么 |
|---|---|---|
| 微血管并发症之间高度相关 | 糖网↔肾病 rg=0.97、糖网↔黄斑 0.95 | 它们共享遗传基础 → 支持"泛并发症"整合分析这个课题设计 |
| AMD 跟糖尿病并发症基本不相关 | rg = 0.07–0.29 | AMD 是独立疾病 → 拿它当"非糖尿病对照"是合理的 |
| T1D 与 T2D 几乎不相关 | rg ≈ −0.03 | 两者病理不同 → 必须分开分析,不能合并 |
第六章 结果怎么看(速览)
完整版在 → 结果怎么看 · 逐列逐图详解。这里先给你判读一条结果的五个问题:
- 工具强不强? 看
Fstat—— 必须 > 10(我们实际中位数约 790,很强)。 - 显著吗? 看
FDR< 0.05,不是p< 0.05。跑了上千个组合,光看 P 一定有假阳性。 - 方向是什么? 看
OR:>1 = 蛋白升高增加风险;<1 = 保护。(数值大小别直译,见 §3.3) - 稳不稳? 同一个蛋白是不是在多个相关并发症里都显著(看
overlap_matrix.csv)?只在一个病里冒头、别的都没有 → 谨慎。 - 是不是巧合? 这个 SNP 在 PheWAS 里多效性高不高?共定位 PP.H4 支持吗?
五个都过 → 可以写进结论。任何一个不过 → 写"提示性发现,需进一步验证"。
常见误解 FAQ
Q:MR 的 OR = 0.14,是不是说这个蛋白能把风险降 86%? 不是。见 §3.3——Wald ratio 是把 SNP 造成的微小差异线性外推到 1 个 SD,OR 会被放大。只看方向和显著性。
Q:某个病 0 个显著蛋白,是不是说明蛋白跟它没关系? 不是,多半是功效不足。比如 R9 的视网膜动脉阻塞只有 181 个病例——样本太少,什么都测不出来。看 SUMMARY_publication.csv 的 ncase 一列就明白了。
Q:为什么 T2D(FinnGen)有 72 个显著,而 T2D(Mahajan)只有 7 个? 结局定义不同。FinnGen 自己的 T2D 定义偏宽松(把很多广义病例算进来),显著数会虚高。Mahajan 是专门的 T2D meta 分析,定义严格。这正是我们同时跑两个 T2D 数据源的原因——用来互相校验。
Q:P 值都 1e-82 了还需要 FDR 吗? 需要。FDR 是流程纪律,对整批结果统一执行。极显著的那些 FDR 照样极小(AGER 的 FDR=1.4e-78),不影响;它拦的是 P=0.01 那批"看着显著其实是撞运气"的。
Q:只有 1 个工具 SNP,MR 还算数吗? 算,但必须靠共定位 + PheWAS 两根支柱补位(跨结局一致性只是支持性观察,不算独立验证;见 §3.4 的提示框)。这是 cis-pQTL MR 的标准做法,也是本领域的惯例。
Q:MR 证明了因果,就能直接做药吗? MR 给的是"值得投入"的遗传学证据(方向 + 是否有因果),不能替代功能实验。所以本课题后面还接视网膜 eQTL 组织落位、可成药性评估,以及湿实验验证。
术语速查
| 词 | 一句话 |
|---|---|
| SNP | 单个碱基的常见变异,是基因组上的"位点" |
| GWAS | 全基因组关联分析:扫全部 SNP 看哪个跟性状有关,产出"汇总数据" |
| sumstats | GWAS 汇总数据:每个 SNP 一行,含 beta/se/p |
| beta | 效应量。连续性状 = 变化多少;疾病 = log(OR) |
| OR | 比值比。>1 危险,<1 保护,=1 没影响 |
| eaf | 效应等位基因频率 |
| LD(连锁不平衡) | 挨着的 SNP 会一起遗传,导致"信号绑定" |
| clumping | 按 LD 去冗余,只留代表性 SNP |
| pQTL / eQTL | 影响蛋白 / 基因表达水平的 SNP |
| cis / trans | 在基因自己附近 / 在远处 |
| IV | 工具变量,代理暴露的那个 SNP |
| F 统计量 | 工具强度,<10 = 弱工具 |
| 多效性 pleiotropy | 一个 SNP 影响多个性状(MR 的头号敌人) |
| FDR | 错误发现率,多重检验校正后的显著性 |
| PP.H4 | 共定位后验概率,>0.8 = 共享同一因果变异 |
| rg | 遗传相关,两个性状共享遗传基础的程度 |
接下来读什么
| 你想干嘛 | 去哪 |
|---|---|
| 看懂结果表和图 | 结果怎么看 ⭐ |
| 自己跑一遍 | 新手快速上手 |
| 看代码怎么组织的 | 代码结构详解 |
| 看每步的公式和文献 | 方法引擎详解 |
| 看本课题完整方法学 | 案例-糖尿病 pQTL 研究 |
| 还有哪些方法能补 | 可补充的 MR 方法 |