孟德爾隨機化小試 從軟件安裝數據下載到多種檢驗

孟德爾隨機化(Mendelian Randomization, MR)作為一種利用基因數據推斷因果關系的強大工具,在流行病學研究中應用廣泛。本文將詳細講解MR的核心原理、完整分析流程,并附上關鍵代碼實現,幫助你從零開始完成一次MR分析。
在這里插入圖片描述

1. 什么是孟德爾隨機化?

孟德爾隨機化是一種基于全基因組關聯研究(GWAS)數據,利用單核苷酸多態性(SNP)作為工具變量(IV) 來揭示暴露與結局間因果關系的方法。

其核心邏輯類似“自然隨機對照試驗”:

  • 隨機對照試驗(RCT):人為將研究對象隨機分配到實驗組/對照組
  • 孟德爾隨機化:通過基因變異的自然隨機分配(減數分裂時的隨機分離),將攜帶特定等位基因的個體視為“暴露組”,非攜帶者視為“對照組”

2. 為什么選擇MR?

相比隊列研究等觀察性研究,MR的優勢在于:

  • 避免反向因果:基因在出生前已確定,暴露狀態(由基因影響)早于結局發生
  • 減少混雜偏倚:基因與后天環境、行為等混雜因素通常無關
  • 低成本驗證:可直接免費利用公開GWAS數據

MR的三大核心假設(必須滿足!)

MR結果的可靠性完全依賴以下三個假設,需嚴格驗證:

假設名稱核心內容驗證方法
關聯性假設工具變量(SNP)與暴露因素顯著相關計算p值(通常p<5e-8)、F統計量(建議F>10,避免弱工具變量偏倚)、R2
獨立性假設SNP與結局之間不存在通過混雜因素的關聯(SNP僅通過暴露影響結局)確保SNP與已知混雜因素無關聯,通過敏感性分析驗證
排他性假設SNP不直接影響結局,僅通過暴露間接影響計算SNP與結局的獨立關聯性(p>0.05),MR-Egger回歸可弱化此假設要求

關鍵提示:若假設不成立,因果推斷結果可能完全錯誤。例如,若某SNP既影響BMI(暴露),又直接影響心臟病(結局),則違反排他性假設,不能用于推斷BMI與心臟病的因果關系。

MR分析完整流程與代碼實現

1. 環境配置(R語言)

MR分析涉及到的R包可以一次性安裝

MRCIEU/TwoSampleMR
VariantAnnotation
mrcieu/gwasglue
VariantAnnotation
mrcieu/gwasglue 
CMplot
MendelianRandomization
LDlinkR
ggplot2
ggfunnel
cowplot
plinkbinr
FastDownloader
FastTraitR
MRPRESSO
SNPlocs.Hsapiens.dbSNP155.GRCh37
SNPlocs.Hsapiens.dbSNP155.GRCh38
tidyverse
MungeSumstats
GenomicFiles
explodecomputer/plinkbinr
MRPRESSO
pedropark99/ggfunnel
xiechengyong123/friendly2MR
NightingaleHealth/ggforestplot
BSgenome.Hsapiens.1000genomes.hs37d5
BSgenome.Hsapiens.NCBI.GRCh38
glmnet
meta
psych

2. 數據來源

MR分析依賴GWAS匯總數據,常用公開數據庫包括:

  • IEU匯總數據庫(MRCIEU):全球最大的GWAS數據平臺(https://gwas.mrcieu.ac.uk/)
  • 精神病學基因組聯盟(PGC):專注精神疾病GWAS數據
  • 社會科學遺傳學聯盟(SSGAC):包含教育、收入等社會表型數據
  • UK Biobank:包含超50萬樣本的多表型數據
  • 自建數據:自己開展的GWAS分析結果

3. 暴露數據處理(關鍵步驟)

暴露數據即與“暴露因素”相關的GWAS數據,需篩選符合“關聯性假設”的SNP。

3.1 從VCF文件獲取暴露數據
# 讀取VCF格式的GWAS數據
VCF_dat <- VariantAnnotation::readVcf('ieu-a-2.vcf.gz')
# 轉換為TwoSampleMR所需格式
exp_dat <- gwasglue::gwasvcf_to_TwoSampleMR(vcf = VCF_dat)# 篩選符合關聯性假設的SNP(p<5e-8)
exp_dat <- subset(exp_dat, pval.exposure < 5e-08)
3.2 處理連鎖不平衡(LD)

SNP間的連鎖不平衡會導致工具變量相關性過高,需通過“聚類”去除:

# 自定義本地LD聚類函數(避免調用云端API)
fix_ld_clump_local <- function (dat, tempfile, clump_kb, clump_r2, clump_p, bfile, plink_bin) {shell <- ifelse(Sys.info()["sysname"] == "Windows", "cmd", "sh")# 輸出SNP和p值到臨時文件write.table(data.frame(SNP = dat[["rsid"]], P = dat[["pval"]]),file = tempfile, row.names = F, col.names = T, quote = F)# 調用PLINK進行LD聚類fun2 <- paste0(shQuote(plink_bin, type = shell), " --bfile ",shQuote(bfile, type = shell), " --clump ", shQuote(tempfile,type = shell), " --clump-p1 ", clump_p, " --clump-r2 ",clump_r2, " --clump-kb ", clump_kb, " --out ", shQuote(tempfile,type = shell))print(fun2)system(fun2)# 讀取聚類結果res <- read.table(paste(tempfile, ".clumped", sep = ""), header = T)unlink(paste(tempfile, "*", sep = ""))# 輸出去LD后的SNPreturn(subset(dat, dat[["rsid"]] %in% res[["SNP"]]))}# 運行LD聚類(以歐洲人群為例)
fuck <- fix_ld_clump_local(dat = dplyr::tibble(rsid=exp_dat$SNP, pval=exp_dat$pval.exposure),tempfile = file.path(getwd(),'tmp.ld_clump.exp_dat'),clump_kb = 10000,  # 10kb內的SNP進行聚類clump_r2 = 0.001,  # 剔除r2>0.001的SNPclump_p = 1,plink_bin = 'path/to/plink',  # PLINK路徑bfile = "1kg/EUR"  # 1000G歐洲人群參考面板
)# 提取去LD后的暴露數據
exp_dat_clumped <- exp_dat[exp_dat$SNP %in% fuck$rsid,]
saveRDS(file = 'ieu-a-2.exp_gwas', exp_dat_clumped)
3.3 從其他來源獲取暴露數據
# 從GWAS目錄獲取(例如BMI數據)
df_gwas <- subset(MRInstruments::gwas_catalog,grepl("Speliotes", Author) & Phenotype == "Body mass index")exp_dat <- TwoSampleMR::format_data(df_gwas)# 從GTEx獲取eQTL數據(例如特定基因在脂肪組織的表達)
df_gwas <- subset(MRInstruments::gtex_eqtl, gene_name == "IRAK1BP1" & tissue == "Adipose Subcutaneous")exp_dat <- TwoSampleMR::format_gtex_eqtl(df_gwas)# 從IEU數據庫直接提取(通過ID)
exp_gwas <- TwoSampleMR::extract_instruments(outcomes = 'ieu-a-2')  # 'ieu-a-2'為某表型ID
3.4 評估工具變量強度(計算F統計量)

F統計量用于判斷是否為“弱工具變量”(F<10提示可能存在偏倚):

MR_calc_r2_F <- function(beta, eaf, N, se){# 計算R2和F統計量r2 <- (2 * (beta^2) * eaf * (1 - eaf)) /(2 * (beta^2) * eaf * (1 - eaf) + 2 * N * eaf * (1 - eaf) * se^2)F <- r2 * (N - 2) / (1 - r2)print(paste("平均F值:", mean(F)))return(dplyr::tibble(r2=r2, F=F))
}# 計算并篩選F>10的SNPf_stats <- MR_calc_r2_F(beta = exp_dat_clumped$beta.exposure,  # 暴露的beta值(log(OR))eaf = exp_dat_clumped$eaf.exposure,    # 等位基因頻率N = exp_dat_clumped$samplesize.exposure,  # 樣本量se = exp_dat_clumped$se.exposure       # 標準誤)exp_dat_final <- exp_dat_clumped[f_stats$F > 10, ]  # 保留強工具變量

4. 結局數據處理

結局數據即與“結局變量”相關的GWAS數據,需滿足“排他性假設”。

4.1 從PGC數據庫獲取結局數據(以ADHD為例)

# 讀取ADHD的GWAS匯總數據(meta分析結果)df_gwas =read.table(gzfile('ADHD2022_iPSYCH_deCODE_PGC.meta.gz'), header = T)# 僅保留與暴露SNP重疊的數據
df_gwas <- df_gwas[df_gwas$SNP %in% exp_gwas$SNP,]# 轉換為TwoSampleMR格式
out_gwas <- data.frame(SNP = df_gwas$SNP,chr = as.character(df_gwas$CHR),pos = df_gwas$BP,beta.outcome = log(df_gwas$OR),  # 將OR轉換為log(OR)se.outcome = df_gwas$SE,samplesize.outcome = df_gwas$Nca + df_gwas$Nco,  # 總樣本量(病例+對照)pval.outcome = df_gwas$P,eaf.outcome = with(df_gwas, (FRQ_A_38691*Nca + FRQ_U_186843*Nco)/(Nca + Nco)),  # 計算整體等位基因頻率effect_allele.outcome = df_gwas$A1,other_allele.outcome = df_gwas$A2,outcome = 'ADHD',id.outcome = 'ADHD2022_iPSYCH_deCODE_PGC'
)# 篩選符合排他性假設的SNP(p>0.05,與結局無直接關聯)
out_gwas <- subset(out_gwas, pval.outcome > 0.05)
4.2 從其他來源獲取結局數據

opengwas_jwt需要注冊ieu并申請token后才可以從網站下載數據

# 從IEU數據庫提取
out_gwas <- TwoSampleMR::extract_outcome_data(snps = exp_gwas$SNP, outcomes = 'ieu-a-7',opengwas_jwt = opengwas_jwt)  # 'ieu-a-7'為結局ID# 從UK Biobank提取
anxiety_outcome <- TwoSampleMR::extract_outcome_data(snps = exp_dat_clumped$SNP, outcomes = "ukb-b-11311")

5. 數據協調(Harmonization)

確保暴露和結局數據中SNP的等位基因方向一致(關鍵步驟,否則結果完全錯誤):

# 協調暴露和結局數據
dat <- TwoSampleMR::harmonise_data(exposure_dat = exp_gwas,  # 處理后的暴露數據outcome_dat = out_gwas    # 處理后的結局數據
)
# 查看協調結果(檢查是否有方向沖突的SNP被剔除)
head(dat)

關鍵說明:協調過程會自動處理:

  • 等位基因方向不一致的SNP(如暴露中A為效應等位基因,結局中a為效應等位基因,會自動轉換)
  • 回文SNP(如A/T和T/A,無法判斷方向時會被剔除)
  • 完全不匹配的SNP(直接剔除)

6. 因果效應估計

使用多種方法計算暴露對結局的因果效應,結果一致更可信:

# 查看所有可用的MR方法
TwoSampleMR::mr_method_list()# 選擇常用方法進行分析(IVW、Egger、加權中位數)
mr_regression <- TwoSampleMR::mr(dat,method_list = c('mr_ivw', 'mr_egger_regression', 'mr_weighted_median')
)
print(mr_regression)# 若結局為分類變量(如疾病),轉換為OR值(方便解讀)
mr_regression_or <- TwoSampleMR::generate_odds_ratios(mr_res = mr_regression)
print(mr_regression_or)# 繪制散點圖(直觀展示各SNP的效應及整體趨勢)
pdf(file = 'MR散點圖.pdf', width = 6, height = 6)
print(TwoSampleMR::mr_scatter_plot(mr_results = mr_regression, dat = dat))
dev.off()

7. 假設驗證與敏感性分析

7.1 異質性檢驗(判斷工具變量效應是否一致)
# IVW方法的Q統計量檢驗
heterogeneity_ivw <- TwoSampleMR::mr_heterogeneity(dat)
print(heterogeneity_ivw)  # Q_pval < 0.05提示存在異質性# MR-PRESSO檢驗(檢測離群值導致的異質性)
heterogeneity_presso <- TwoSampleMR::run_mr_presso(dat, NbDistribution = 3000)  # 3000次模擬# 全局檢驗(是否存在異質性)
print(heterogeneity_presso[[1]]$`MR-PRESSO results`$`Global Test`$Pvalue)# 離群值檢測(若存在,需剔除后重新分析)
print(heterogeneity_presso[[1]]$`MR-PRESSO results`$`Distortion Test`$`Outliers Indices`)
  • 若存在異質性:使用隨機效應IVW模型,或剔除離群值后重新分析
  • 若無異質性:固定效應IVW模型更可靠
7.2 水平多效性檢驗(驗證獨立性假設)
# MR-Egger截距檢驗
pleiotropy_test <- TwoSampleMR::mr_pleiotropy_test(dat)
print(pleiotropy_test)
# 若p < 0.05:拒絕截距為0的假設,提示存在水平多效性(結果不可靠)
7.3 Leave-one-out分析(敏感性檢驗)
# 逐一剔除每個SNP后重新分析,判斷結果是否依賴某個SNP
mr_loo <- TwoSampleMR::mr_leaveoneout(dat)# 繪制leave-one-out圖
TwoSampleMR::mr_leaveoneout_plot(leaveoneout_results = mr_loo)
# 若剔除某SNP后結果顯著變化(如效應值跨過0),提示結果不穩定
7.4 單SNP分析(查看個體工具變量效應)
# 每個SNP單獨進行MR分析
mr_res_single <- TwoSampleMR::mr_singlesnp(dat)# 繪制漏斗圖(判斷是否存在小研究效應)
TwoSampleMR::mr_funnel_plot(mr_res_single)# 繪制森林圖(展示每個SNP的效應)
TwoSampleMR::mr_forest_plot(mr_res_single)
7.5 方向性檢驗(判斷因果方向)
TwoSampleMR::directionality_test(dat) # TRUE表示暴露→結局的方向更可能成立

8. 一鍵生成報告(可選)

# 生成Markdown格式的完整報告
TwoSampleMR::mr_report(dat, output_type = "md")

四、MR的局限性與注意事項

  1. 依賴GWAS數據質量:樣本量過小、人群分層會導致結果偏倚
  2. 工具變量選擇至關重要:弱工具變量(F<10)會導致效應估計偏差
  3. 無法完全避免多效性:即使通過檢驗,仍可能存在未識別的水平多效性
  4. 僅反映平均效應:無法推斷個體水平的因果關系
  5. 數據重疊問題:暴露和結局數據若來自同一人群,需控制樣本重疊比例(建議<10%)

參考

https://mrcieu.github.io/TwoSampleMR/articles/perform_mr.html
https://hexo.limour.top/Mendelian-Randomization

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93952.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記一次:postman請求下載文件的使用方法

前言&#xff1a;筆者的后端接口是swagger&#xff0c;遇到像文件導出下載的功能就實現不了。然后使用postman工具就可以了。注&#xff1a;postman工具使用send下拉選項中有請求下載&#xff0c;如圖完美解決。后續有其它方法在補充。

快速搭建項目(若依)

RuoYi-Vue 是一個 Java EE 企業級快速開發平臺&#xff0c;低代碼的框架。 1.環境要求&#xff1a; 其中MySQL和Redis放在服務器上或者本機上。 2.代碼搭建&#xff1a; 代碼下載地址&#xff1a;https://gitee.com/y_project/RuoYi-Vue&#xff0c;在官方文檔里面可下載若依…

iOS開發之UICollectionView為什么需要配合UICollectionViewFlowLayout使用

1. UICollectionView 的職責分離UICollectionView 本質上只是一個容器&#xff0c;用來展示一系列的 cell&#xff08;單元格&#xff09;。 它本身 不關心 cell 的擺放方式&#xff0c;只負責&#xff1a;Cell 的復用&#xff08;避免性能浪費&#xff09;Cell 的增刪改查滾動…

一、部署LNMP

一、準備環境操作系統&#xff1a;CentOS 7.x&#xff08;最少 2 核 CPU 2GB 內存 20GB 磁盤&#xff09;網絡&#xff1a;能訪問公網&#xff08;用于下載包&#xff09;軟件版本&#xff1a;Nginx 1.20MySQL 5.7/8.0PHP 7.4WordPress 6.x&#xff08;商城插件 WooCommerce&…

【時時三省】vectorCAST 便捷使用技巧

山不在高,有仙則名。水不在深,有龍則靈。 ----CSDN 時時三省 目錄 1,工程的共享 2,工程的關鍵文件保存 2,工作環境目錄下,各個文件夾的作用 1,build 和 environment 的區別 2,vcm的作用 3,tst 文件的妙用 4,配置文件的妙用 5,復制測試環境 6,vectorCAST…

TOPSIS 優劣解距離法總結

TOPSIS 優劣解距離法總結 1. 基本思想 TOPSIS&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09;方法通過計算方案與正理想解&#xff08;最優值&#xff09;和負理想解&#xff08;最劣值&#xff09;的距離&#xff0c;來評價方案的優…

機器學習筆試題

人工智能與機器學習單選題&#xff08;50道&#xff09;1. 機器學習的核心目標是&#xff1a;A. 通過硬編碼規則解決問題 B. 從數據中自動學習模式 C. 提高計算機硬件性能 D. 優化數據庫查詢速度2. 以下屬于監督學習任務的是&#xff1a;A. 聚類分析 B. 圖像分類 C. 異常檢測 D…

CISP-PTE之路--10文

1.TCP/UDP 工作在 OSI 哪個層? 應用層 傳輸層 數據鏈路層 表示層 答案:傳輸層 解析:TCP(傳輸控制協議)和 UDP(用戶數據報協議)是 OSI 模型中傳輸層的核心協議,負責端到端的數據傳輸管理,如可靠性(TCP)、實時性(UDP)等。 2.下列哪種設備可以隔離 ARP 廣播幀? …

接口性能測試工具 - JMeter

1. 下載和運行JMeter 是由 Java 語言編寫的, 因此 JMeter 的使用依賴于 Java 環境 - JRE.前往 oracle 官網下載 JMeter 壓縮包.Mac 用戶解壓完成后, 在包內的 bin 目錄下運行 sh jmeter:Windows 用戶直接運行 bin 目錄下的 jmeter.bat:即可進入 JMeter 主頁面:1.1 添加環境變量…

Go語言實戰案例-數據庫事務處理

在實際業務中&#xff0c;很多操作需要保證 要么全部成功&#xff0c;要么全部失敗&#xff0c;否則可能造成數據不一致。比如&#xff1a;? 用戶轉賬&#xff08;A 賬戶扣款&#xff0c;B 賬戶加款&#xff09;? 下單支付&#xff08;生成訂單、扣減庫存、記錄支付&#xff…

為何vivo做了頭顯,小米卻選擇AI眼鏡

在押注下一代智能終端這件事上&#xff0c;手機廠商為何步調不一致&#xff1f;文&#xff5c;游勇編&#xff5c;周路平在手機銷量和創新都陷入停滯的背景下&#xff0c;主流手機廠商正在探索下一代交互終端&#xff0c;試圖尋找新的增長點。今年6月&#xff0c;小米發布了AI眼…

Day24 目錄遍歷、雙向鏈表、棧

day24 目錄遍歷、雙向鏈表、棧顯示指定目錄下的所有 .h 文件 功能描述 遍歷指定目錄&#xff08;遞歸進入子目錄&#xff09;&#xff0c;查找所有以 .h 為后綴的頭文件&#xff0c;將其完整路徑&#xff08;路徑 文件名&#xff09;存儲到雙向鏈表中&#xff0c;并正向或反向…

JupyterLab 安裝(python3.10)

目錄 一、環境 二、安裝 三、啟動Jupyterlab 四、通過chrome瀏覽器進行訪問 五、打開Jupyter Notebook 六、pandas驗證 JupyterLab 是一個基于 Web 的交互式開發環境&#xff0c;是經典 Jupyter Notebook 的下一代版本。它支持多種編程語言&#xff08;如 Python、R、Juli…

【neo4j】安裝使用教程

一、安裝 1.0 前置條件 安裝配置好jdk17及以上 注意我使用的是neo4j 5.26.10版本&#xff0c;匹配java17剛好 Java Archive Downloads - Java SE 17.0.12 and earlier 無腦安裝即可 配置以下環境變量 1.1 安裝程序 Neo4j Deployment Center - Graph Database & Anal…

AECS(國標ECALL GB 45672-2025)

車載緊急呼叫功能作為車輛遇險時的響應機制&#xff0c;為司機和乘客的安全營救提供通信支持。為了能夠降低通信延遲&#xff0c;提高響應速度&#xff0c;基于4G/5G的下一代緊急呼叫技術&#xff08;NG eCall&#xff09;將在歐盟于2027年起成為強制標準&#xff0c;中國也已經…

week3-[循環嵌套]好數

week3-[循環嵌套]好數 題目描述 如果一個正整數 xxx 只有最左邊一位不是 000&#xff0c;其余都是 000&#xff0c;那么稱其為好數。例如 400040004000 和 222 都是好數&#xff0c;但是 120120120 不是。 給定正整數 nnn&#xff0c;在 111 到 nnn 間有多少個數是好數&#xf…

智能制造加速器:某新能源車智慧工廠無線網絡優化提升方案

隨著工業4.0和智能制造的快速發展&#xff0c;傳統制造工廠的網絡架構正面臨前所未有的挑戰。為了滿足柔性生產、實時數據驅動以及高可靠運營的需求&#xff0c;某新能源車智慧工廠啟動了一項無線網絡優化提升項目。本項目通過部署智能組網設備&#xff0c;構建高效、穩定、智能…

nginx-自制證書實現

nginx-自制證書實現一、 確認nginx是支持https功能的二、生成私鑰三、 根據ca.key生成nginx web服務器使用的證書簽名請求文件nginx.csr四、使用ca.key給nginx.csr進行簽名&#xff0c;生成公鑰證書nginx.crt五、將證書與域名綁定六、添加域名解析并訪問一、 確認nginx是支持ht…

FreeRTOS,事件標注組創建,xEventGroupCreate、xEventGroupCreateStatic

1. xEventGroupCreate ()&#xff1a;動態創建&#xff08;臨時借內存&#xff09; 作用&#xff1a; 向系統&#xff08;FreeRTOS 的堆內存&#xff09;“臨時申請” 一塊內存來存放事件組&#xff0c;不需要我們自己提前準備內存。 例子&#xff08;基于你的代碼修改&#xf…

Linux網絡socket套接字(上)

目錄 前言 1.Socket編程準備 1.理解源IP地址和目的IP地址 2.認識端口號 3.socket源來 4.傳輸層的典型代表 5.網絡字節序 6.socket編程接口 2.Socket編程UDP 1.服務端創建套接字 2.服務端綁定 3.運行服務器 4.客戶端訪問服務器 5.測試 6.補充參考內容 總結 前言…