Skip to content

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.806 打分里 eqtl_score=2)。

真实结果(摘自证据矩阵,实测)

基因eQTL FDRPP.H4判定
CASP10AMD0.00150.97✅ MR+coloc(score 2)
CFHAMD0.00030.97✅ MR+coloc(score 2)
TNFRSF10AAMD0.00140.35⚠ MR only(H4 未过 0.8)
MERTKAMD0.0120.15⚠ MR only,无共定位
MERTKDR0.100.01❌ 不显著、无共定位

一个 FDR 口径要注意

by=disease 里 AMD 一族同时包含 AMD/WetAMD/DryAMD/AMD_iamdgc 四个高度相关的结局 × 基因,一起做 BH。这在 BH-PRDS 下有效,但把相关结局、甚至复制队列 IAMDGC 都并进发现层 FDR,概念上把"发现"和"复制"混在一族。发表时应说明,或把 IAMDGC 单列作复制。见 07 审计

个人科研与运维文档 · 内容持续修订