🩺

糖尿病肾病MR分析

Risk Factors → Diabetic Nephropathy

利用孟德尔随机化探索糖尿病肾病的潜在因果风险因素

🩺 新手导读:糖肾MR要先统一结局定义

不同研究对糖尿病肾病定义差异较大(eGFR、蛋白尿、临床分期),会直接影响效应大小与可比性。

背景介绍

糖肾是多因素慢病结局。MR有助于从遗传层面筛选可疑风险因子,但需要在队列定义、祖源和终点标准上保持谨慎。

备注(统一三段)

适用人群:想评估代谢风险因素对糖尿病肾病因果效应的临床/基础研究者。
常见错误:混用糖肾与泛CKD终点定义,会造成研究间结果不可比。
论文写法:建议写清终点定义、祖源信息,并在讨论中说明临床外推边界。

📊 研究设计

暴露因素

  • • 血糖水平(Fasting Glucose)
  • • 糖化血红蛋白(HbA1c)
  • • 胰岛素抵抗(HOMA-IR)
  • • 肥胖指标(BMI, WC)

结局变量

糖尿病肾病(Diabetic Nephropathy)

定义:eGFR < 60 + 蛋白尿

🔧 标准MR流程

Step 1: 数据准备

library(TwoSampleMR)
library(MRPRESSO)

# 读取暴露数据(血糖水平)
exposure <- read_exposure_data(
  filename = "fasting_glucose_gwas.txt",
  sep = "\t",
  snp_col = "SNP",
  beta_col = "Beta",
  se_col = "SE",
  effect_allele_col = "EA",
  other_allele_col = "NEA",
  pval_col = "P",
  samplesize_col = "N"
)

# 筛选工具变量
exposure_clumped <- exposure %>%
  filter(pval.exposure < 5e-8) %>%
  clump_data(
    clump_kb = 10000,
    clump_r2 = 0.001
  )

cat("工具变量数量:", nrow(exposure_clumped), "\n")
# 工具变量数量: 42

Step 2: 提取结局数据

# 从 GWAS catalog 提取 DN 数据
outcome <- extract_outcome_data(
  snps = exposure_clumped$SNP,
  outcomes = "DN_GWAS_2023",
  proxies = TRUE
)

# 数据协调
harmonised <- harmonise_data(
  exposure_dat = exposure_clumped,
  outcome_dat = outcome
)

# 移除回文 SNP
harmonised <- harmonised %>%
  filter(palindromic == FALSE)

cat("协调后 SNP 数量:", nrow(harmonised), "\n")
# 协调后 SNP 数量: 38

Step 3: MR 分析

# 执行多种 MR 方法
results <- mr(harmonised,
       method_list = c(
         "mr_ivw",
         "mr_weighted_median",
         "mr_egger_regression",
         "mr_simple_mode",
         "mr_weighted_mode"
       ))

# 计算 OR 和 CI
results %>%
  mutate(
    OR = exp(b),
    CI_lower = exp(b - 1.96*se),
    CI_upper = exp(b + 1.96*se)
  ) %>%
  select(method, nsnp, b, se, pval, OR, CI_lower, CI_upper) %>%
  knitr::kable(digits = 3)

# 输出:
# |method      | nsnp|   b|  se| pval|  OR| CI_lower| CI_upper|
# |:-----------------|----:|------:|------:|-----:|------:|--------:|--------:|
# |IVW        |  38| 0.156| 0.058| 0.007| 1.17|  1.04|  1.31|
# |Weighted Median  |  38| 0.148| 0.062| 0.017| 1.16|  1.03|  1.31|
# |MR-Egger     |  38| 0.132| 0.089| 0.138| 1.14|  0.96|  1.36|
# |Simple Mode    |  38| 0.165| 0.078| 0.035| 1.18|  1.01|  1.37|
# |Weighted Mode   |  38| 0.152| 0.067| 0.024| 1.16|  1.02|  1.33|

Step 4: 敏感性分析

# 异质性检验
heterogeneity <- mr_heterogeneity(harmonised)
print(heterogeneity)

#  method    Q  Q_df  pval
#  IVW     45.2  37  0.156
#  MR-Egger  44.8  36  0.148
# ✅ 无显著异质性(p > 0.05)

# 多效性检验
pleiotropy <- mr_pleiotropy_test(harmonised)
print(pleiotropy)

#  egger_intercept  se  pval
#  0.008      0.012 0.512
# ✅ 无水平多效性(p > 0.05)

# MR-PRESSO(检测离群值)
presso <- mr_presso(
  BetaOutcome = "beta.outcome",
  BetaExposure = "beta.exposure",
  SdOutcome = "se.outcome",
  SdExposure = "se.exposure",
  OUTLIERtest = TRUE,
  DISTORTIONtest = TRUE,
  data = harmonised
)

# MR-PRESSO results:
#  - Outlier-corrected causal estimate: 0.148 (p = 0.012)
#  - No significant outliers detected

Step 5: 可视化

# 散点图
p1 <- mr_scatter_plot(results, harmonised)

# 森林图
p2 <- mr_forest_plot(mr_singlesnp(harmonised))

# 漏斗图
p3 <- mr_funnel_plot(results)

# Leave-one-out 图
loo <- mr_leaveoneout(harmonised)
p4 <- mr_leaveoneout_plot(loo)

# 保存图片
ggsave("scatter_plot.pdf", p1[[1]], width = 8, height = 6)
ggsave("forest_plot.pdf", p2[[1]], width = 10, height = 8)
ggsave("funnel_plot.pdf", p3[[1]], width = 8, height = 6)
ggsave("loo_plot.pdf", p4[[1]], width = 8, height = 6)

🎯 结果解读

✅ 主要发现

空腹血糖水平与糖尿病肾病风险存在显著因果关系

  • IVW 方法:OR = 1.17 (95% CI: 1.04-1.31), p = 0.007
  • Weighted Median:OR = 1.16 (95% CI: 1.03-1.31), p = 0.017
  • Weighted Mode:OR = 1.16 (95% CI: 1.02-1.33), p = 0.024

📊 质量控制总结

  • ✅ 工具变量强度:F > 10(范围:15.2 - 89.3)
  • ✅ 无显著异质性:Cochran's Q p = 0.156
  • ✅ 无水平多效性:MR-Egger intercept p = 0.512
  • ✅ MR-PRESSO 未检测到离群值

📖 参考文献