主题
02 · 血 eQTL MR + 共定位
对应脚本:01_eqtl_mr/01a_prep_eqtlgen.R(预处理)+ 01b_mr_coloc.R(MR+coloc) 数据:eQTLGen 血 cis-eQTL(N 最高 31684)× FinnGen R13 / IAMDGC
01a:建暴露表
eQTLGen 给的是 Z 分数,要先转成 β/se,并把 eaf 对齐到"被评估等位"。
r
# eaf of AssessedAllele
m[, eaf := fifelse(toupper(AssessedAllele)==toupper(AlleleB), AlleleB_all,
fifelse(toupper(AssessedAllele)==toupper(AlleleA), 1-AlleleB_all, NA_real_))]
bs <- z_to_beta(m$Zscore, m$eaf, m$NrSamples) # 见 01 的公式
m[, `:=`(beta=bs$beta, se=bs$se)]effect_allele = AssessedAllele(Z 分数就是对这个等位的),eaf也是这个等位的频率 → 一致 ✓Fstat = (β/se)²逐 SNP 算,供下游过滤
11/13 靶点在 eQTLGen 有血 cis-eQTL(APOE、TYRO3 没有)。
01b:MR + 共定位
两条线用不同的 SNP 集(这是对的):
- MR 用 clump 后的独立工具(
clump_local r2<0.1) - 共定位 用该基因 cis 区全部 SNP(coloc 要整段区域信号,不是 top hit)
r
eg_clump <- clump_local(eg, r2=0.1, kb=1000) # MR 用
h <- harmonise_data(eg_clump, od[...], action=2) # action=2:推断链、按 MAF 丢歧义 SNP
r <- run_mr_one(h)
...
cc <- run_coloc(eg[, c(...)], od, oc, n_exp) # coloc 用全区域 eg(未 clump)先把每个结局对 SNP 并集提取一次并缓存(out_cache.rds),避免每个基因都重扫 800MB。
FDR 与金标准
r
prim <- mr_df[method %in% c("Inverse variance weighted","Wald ratio")]
prim[, fdr := p.adjust(pval, "BH"), by = disease] # 每疾病一族判"稳健因果"= FDR<0.05 且 PP.H4≥0.8(06 打分里 eqtl_score=2)。
真实结果(摘自证据矩阵,实测)
| 基因 | 病 | eQTL FDR | PP.H4 | 判定 |
|---|---|---|---|---|
| CASP10 | AMD | 0.0015 | 0.97 | ✅ MR+coloc(score 2) |
| CFH | AMD | 0.0003 | 0.97 | ✅ MR+coloc(score 2) |
| TNFRSF10A | AMD | 0.0014 | 0.35 | ⚠ MR only(H4 未过 0.8) |
| MERTK | AMD | 0.012 | 0.15 | ⚠ MR only,无共定位 |
| MERTK | DR | 0.10 | 0.01 | ❌ 不显著、无共定位 |
一个 FDR 口径要注意
by=disease 里 AMD 一族同时包含 AMD/WetAMD/DryAMD/AMD_iamdgc 四个高度相关的结局 × 基因,一起做 BH。这在 BH-PRDS 下有效,但把相关结局、甚至复制队列 IAMDGC 都并进发现层 FDR,概念上把"发现"和"复制"混在一族。发表时应说明,或把 IAMDGC 单列作复制。见 07 审计。