进行孟德尔随机分析时候,发现结果MR-PRESSO(P-value = 0.628,未检测到显著多效性),而Egger截距显著偏离0(P = 0.0368,检测到水平多效性),在chatGPT的帮助下,使用使用 Lasso 回归( RadialMR 包)减少多效性 SNP,使结果Egger截距,P>0.05,这里记录了解决办法。
You:
这是一段暴露颞下颌关节紊乱(TMD)对结局强直性脊柱炎(AS)的孟德尔随机化代码,请帮我解释。
rm(list = ls())
library(dplyr)
library(data.table)
library(vroom)
library(VariantAnnotation)
library(gwasvcf)
library(gwasglue)
library(ieugwasr)
library(plinkbinr)
library(TwoSampleMR)
library(MRPRESSO)
#TMD
load("../../1/R/Rdata/step1.1.TMD_.Rdata")
#结局----
outcome_finn = vroom("../rawData/finngen_R12_M13_ANKYLOSPON_STRICT.gz")
colnames(outcome_finn)
outcome_finn_dat = subset(outcome_finn, outcome_finn$rsids %in% TMD_exposure_dat_clumped$SNP)
dim(outcome_finn_dat)# 20 13
outcome_finn_dat = format_data(dat = outcome_finn_dat,
type = "outcome",
snp_col = "rsids",
beta_col = "beta",
pval_col = "pval",
se_col = "sebeta",
eaf_col = "af_alt",
effect_allele_col = "alt",
other_allele_col = "ref")
outcome_finn_dat = subset(outcome_finn_dat, pval.outcome>5e-06)
dim(outcome_finn_dat)#[1] 19 11
#修改暴露和结局的名称
TMD_exposure_dat_clumped$id.exposure = "TMD"
outcome_finn_dat$id.outcome = "AS"
mr_data_finn = harmonise_data(exposure_dat = TMD_exposure_dat_clumped,
outcome_dat = outcome_finn_dat,
action= 2) #去除回文序列,2去除,1不去除
table(mr_data_finn$mr_keep)#1 19
write.csv(mr_data_finn, file = "data/reAS/mr_TMD_data_finn.csv")
#View(mr_data_finn)
mr_data_finn <- data.table::fread("data/reAS/mr_TMD_data_finn.csv",data.table = F)
#MR-PRESSO异常值检测
presso = mr_presso(BetaOutcome ="beta.outcome",
BetaExposure = "beta.exposure",
SdOutcome ="se.outcome",
SdExposure = "se.exposure",
OUTLIERtest = TRUE,
DISTORTIONtest = TRUE,
data = mr_data_finn,
NbDistribution = 1000,
SignifThreshold = 0.05)
presso$MR-PRESSO results$Distortion Test$Outliers Indices #如果显示NULL,则表示不存在异常值
#mr_data_clean = mr_data_finn[-c(84,136,159,172,255),]
mr_data_clean = mr_data_finn
#去除离群值
#rs = sin$SNP[sin$b < -3|sin$b > 3] #找到离群的SNP
#mr_data_clean = mr_data_finn[!mr_data_finn$SNP %in% rs,] #从原始数据框中移除这些SNP
het_clean = mr_heterogeneity(mr_data_clean) #异质性检验
write.csv(het_clean,file = "data/reAS/het_clean.csv")
sin_clean = mr_singlesnp(mr_data_clean)
pdf(file = "data/reAS/异质性.pdf", width=10, heigh=8)
mr_funnel_plot(singlesnp_results = sin_clean)
dev.off()
#多效性检验
pleio = mr_pleiotropy_test(mr_data_clean)
write.csv(pleio,file = "data/reAS/pleio.csv")
#重新进行mr分析
res_clean = mr(mr_data_clean)
OR_clean = generate_odds_ratios(res_clean)
write.csv(OR_clean, "data/reAS/MRresult.csv")
#MR分析结果可视化
pdf(file = "data/reAS/MR.pdf", width=10, heigh=8)
mr_scatter_plot(res_clean, mr_data_clean)
dev.off()
* * *
ChatGPT:
这段代码是用R语言进行孟德尔随机化(Mendelian Randomization, MR)分析的完整流程,目的是研究颞下颌关节紊乱(TMD)对强直性脊柱炎(AS)的因果关系。下面我帮你详细解释每个部分在做什么:
* * *
1. 加载必要的包和数据:
rm(list = ls()) # 清空环境变量
library(dplyr) # 数据处理
library(data.table) # 高效读写数据
library(vroom) # 高速读取大文件
library(VariantAnnotation) # 遗传变异注释
library(gwasvcf) # GWAS数据处理
library(gwasglue) # GWAS数据转换
library(ieugwasr) # MR分析接口
library(plinkbinr) # PLINK格式数据处理
library(TwoSampleMR) # 二样本MR分析的核心包
library(MRPRESSO) # MR-PRESSO用于异常值检测和校正
# 加载TMD(暴露变量)的数据
load("../../1/R/Rdata/step1.1.TMD_.Rdata")
* * *
2. 处理AS(结局变量)数据:
outcome_finn = vroom("../rawData/finngen_R12_M13_ANKYLOSPON_STRICT.gz") # 从Finngen读取AS数据
colnames(outcome_finn) # 查看列名
# 筛选TMD暴露中包含的SNP
outcome_finn_dat = subset(outcome_finn, outcome_finn$rsids %in% TMD_exposure_dat_clumped$SNP)
dim(outcome_finn_dat) # 看看筛选后SNP数量,20行13列
# 格式化结局数据,匹配MR分析需求
outcome_finn_dat = format_data(dat = outcome_finn_dat,
type = "outcome",
snp_col = "rsids", # SNP ID
beta_col = "beta", # 效应量
pval_col = "pval", # P值
se_col = "sebeta", # 标准误
eaf_col = "af_alt", # 辅助等位基因频率
effect_allele_col = "alt", # 效应等位基因
other_allele_col = "ref") # 非效应等位基因
# 筛选p值大于5e-06的SNP
outcome_finn_dat = subset(outcome_finn_dat, pval.outcome > 5e-06)
dim(outcome_finn_dat) # 筛选后19个SNP
* * *
3. 给暴露和结局变量命名:
TMD_exposure_dat_clumped$id.exposure = "TMD"
outcome_finn_dat$id.outcome = "AS"
* * *
4. 暴露和结局数据匹配(协调化):
mr_data_finn = harmonise_data(exposure_dat = TMD_exposure_dat_clumped,
outcome_dat = outcome_finn_dat,
action = 2) # 去除回文序列(即正反向一致的序列)
table(mr_data_finn$mr_keep) # 查看成功匹配的SNP数量,19个
write.csv(mr_data_finn, file = "data/reAS/mr_TMD_data_finn.csv")
* * *
5. 异常值检测(MR-PRESSO):
mr_data_finn <- data.table::fread("data/reAS/mr_TMD_data_finn.csv", data.table = F)
presso = mr_presso(BetaOutcome = "beta.outcome",
BetaExposure = "beta.exposure",
SdOutcome = "se.outcome",
SdExposure = "se.exposure",
OUTLIERtest = TRUE,
DISTORTIONtest = TRUE,
data = mr_data_finn,
NbDistribution = 1000, # 随机抽样1000次
SignifThreshold = 0.05) # 显著性阈值0.05
presso$`MR-PRESSO results`$`Distortion Test`$`Outliers Indices` # 查看异常值索引,NULL表示无异常值
mr_data_clean = mr_data_finn # 若存在异常值,可在此移除
* * *
6. 异质性检验和多效性检验:
# 异质性检验
het_clean = mr_heterogeneity(mr_data_clean)
write.csv(het_clean, file = "data/reAS/het_clean.csv")
# 单SNP分析和漏斗图
sin_clean = mr_singlesnp(mr_data_clean)
pdf(file = "data/reAS/异质性.pdf", width=10, heigh=8)
mr_funnel_plot(singlesnp_results = sin_clean)
dev.off()
# 多效性检验
pleio = mr_pleiotropy_test(mr_data_clean)
write.csv(pleio, file = "data/reAS/pleio.csv")
* * *
7. MR分析和可视化:
# 主MR分析
res_clean = mr(mr_data_clean)
OR_clean = generate_odds_ratios(res_clean)
write.csv(OR_clean, "data/reAS/MRresult.csv")
# 散点图可视化结果
pdf(file = "data/reAS/MR.pdf", width=10, heigh=8)
mr_scatter_plot(res_clean, mr_data_clean)
dev.off()
* * *
总结流程:
整个分析流程非常标准,结果文件和图像都被清晰地保存了。如果你需要我进一步解释某部分、帮你改进代码或解释分析结果,告诉我就行! 🚀
You:
presso = mr_presso(BetaOutcome ="beta.outcome",
BetaExposure = "beta.exposure",
SdOutcome ="se.outcome",
SdExposure = "se.exposure",
OUTLIERtest = TRUE,
DISTORTIONtest = TRUE,
data = mr_data_finn,
NbDistribution = 1000,
SignifThreshold = 0.05)
> presso
> $Main MR results
> Exposure MR Analysis Causal Estimate Sd T-stat P-value
> 1 beta.exposure Raw 0.09616133 0.09273089 1.036994 0.3127572
> 2 beta.exposure Outlier-corrected NA NA NA NA
$MR-PRESSO results
$MR-PRESSO results$Global Test
$MR-PRESSO results$Global Test$RSSobs
[1] 18.60687
$MR-PRESSO results$Global Test$Pvalue
[1] 0.628解释这个结果
* * *
ChatGPT:
这个 MR-PRESSO(Mendelian Randomization Pleiotropy RESidual Sum and Outlier) 结果主要是在检测颞下颌关节紊乱(TMD)对强直性脊柱炎(AS)因果关系中的异常值(outliers) 和 水平多效性(horizontal pleiotropy) 的影响。我们一步步来解释这些输出。
* * *
1. Main MR results(主要MR分析结果):
Exposure | MR Analysis | Causal Estimate | Sd | T-stat | P-value |
---|---|---|---|---|---|
beta.exposure | Raw | 0.09616133 | 0.09273089 | 1.036994 | 0.3127572 |
beta.exposure | Outlier-corrected | NA | NA | NA | NA |
* * *
2. MR-PRESSO results(MR-PRESSO结果):
Global Test(全局检验):
* * *
3. 总结解读:
如果你想深入分析或优化模型,比如检查统计功效、探索不同方法,欢迎告诉我!🚀
* * *
You:
pleio = mr_pleiotropy_test(mr_data_clean)
> pleio
> id.exposure id.outcome outcome exposure egger_intercept se pval
> 1 TMD AS outcome exposure -0.06348849 0.02801177 0.03675997解释这个结果
* * *
ChatGPT:
这个结果是 MR-Egger 多效性检验(Pleiotropy Test) 的输出,主要是为了检测水平多效性(horizontal pleiotropy)。我们来一步步解读每个指标的含义。
* * *
输出解释:
指标 | 值 | 含义 |
---|---|---|
id.exposure | TMD | 暴露变量(颞下颌关节紊乱) |
id.outcome | AS | 结局变量(强直性脊柱炎) |
egger_intercept | -0.0635 | Egger回归截距(intercept),用于检测水平多效性 |
se | 0.0280 | 截距的标准误 |
pval | 0.0368 | 检验Egger截距是否显著偏离0(即是否存在多效性) |
* * *
如何解读这些结果:
* * *
结果总结:
如果你需要帮忙优化模型或进一步分析结果,告诉我就行!🚀
You:
为什么MR-PRESSO检验不存在水平多效性,p>0.05,而pleio = mr_pleiotropy_test(mr_data_clean)检验存在水平多效性,p<0.05
* * *
ChatGPT:
这个差异主要是因为 MR-PRESSO 和 MR-Egger 多效性检验(**mr_pleiotropy_test
**) 在检测水平多效性的方法和假设上有所不同。让我们深入比较一下两者的原理和为什么会得出不一样的结论。
* * *
1. MR-PRESSO(P-value = 0.628,未检测到显著多效性):
* * *
2. MR-Egger 多效性检验(P-value = 0.0368,检测到显著多效性):
* * *
3. 为什么结果不一致?
* * *
4. 如何理解和处理?
* * *
总结:
如果你想继续深入,比如探索稳健方法或可视化结果,告诉我!🚀
* * *
You:
如何处理让pleio = mr_pleiotropy_test(mr_data_clean)的结果p > 0.05
* * *
ChatGPT:
如果你想让 MR-Egger 多效性检验(**mr_pleiotropy_test
**) 的结果 P > 0.05(也就是说,不再检测到显著水平多效性),本质上是在减少或校正水平多效性。这里有一些策略可以尝试,但请记住,目标不应该只是让 P > 0.05,而是确保模型合理、因果推断更可信。让我们一步一步来。
* * *
1. 检查并移除多效性 SNP(可疑异常值)
一些 SNP 可能导致水平多效性,因此可以先通过 MR-PRESSO 或其他方法识别异常 SNP,将其移除后重新进行 MR-Egger 检验。
# MR-PRESSO 异常值检测
presso <- mr_presso(BetaOutcome = "beta.outcome",
BetaExposure = "beta.exposure",
SdOutcome = "se.outcome",
SdExposure = "se.exposure",
OUTLIERtest = TRUE,
DISTORTIONtest = TRUE,
data = mr_data_clean,
NbDistribution = 1000,
SignifThreshold = 0.05)
# 提取异常 SNP
outliers <- presso$`MR-PRESSO results`$`Distortion Test`$`Outliers Indices`
# 如果存在异常值,将其移除
if (!is.null(outliers)) {
mr_data_clean <- mr_data_clean[-outliers, ]
}
# 再次运行 MR-Egger 多效性检验
pleio <- mr_pleiotropy_test(mr_data_clean)
print(pleio)
如果 MR-PRESSO 标记了一些异常 SNP,将其移除通常能减少多效性偏倚。移除后,mr_pleiotropy_test
的 P 值可能会上升。
* * *
2. 使用严格的基因工具变量筛选(Clumping 和 P 值阈值)
# Clumping(确保SNP独立性)
TMD_exposure_dat_clumped <- clump_data(TMD_exposure_dat, clump_kb = 10000, clump_r2 = 0.001)
# 只保留显著性更高的 SNP(P 值更严格)
TMD_exposure_dat_clumped <- subset(TMD_exposure_dat_clumped, pval.exposure < 5e-08)
筛选更可靠、独立的工具变量,可能减少水平多效性来源。
* * *
3. 使用稳健 MR 方法(加权中值、加权模式、MR-PRESSO 校正)
如果即使排除异常 SNP 后仍存在多效性,可以使用稳健方法估计因果效应。
# 使用加权中值法
res_median <- mr(mr_data_clean, method = "mr_weighted_median")
# 使用加权模式法
res_mode <- mr(mr_data_clean, method = "mr_weighted_mode")
# 查看结果
print(res_median)
print(res_mode)
这些方法在存在多效性时通常会比 MR-Egger 和 IVW 提供更稳健的估计。
* * *
4. 使用 Lasso 回归(如 RadialMR 包)减少多效性 SNP
RadialMR
包可以通过 Lasso 回归检测并剔除表现出多效性的 SNP。
library(RadialMR)
# 转换为径向格式
radial_input <- format_radial(mr_data_clean$beta.exposure,
mr_data_clean$beta.outcome,
mr_data_clean$se.exposure,
mr_data_clean$se.outcome)
# 执行径向 MR 分析
radial_results <- ivw_radial(radial_input, alpha = 0.05)
# 剔除多效性 SNP
outliers <- radial_results$outliers$SNP
mr_data_clean <- mr_data_clean[!mr_data_clean$SNP %in% outliers, ]
# 再次运行 MR-Egger 多效性检验
pleio <- mr_pleiotropy_test(mr_data_clean)
print(pleio)
* * *
5. 使用 MR-Egger 校正后的效应估计
如果多效性不可避免,可以接受 MR-Egger 的校正结果。MR-Egger 会在存在多效性时对因果效应进行调整。
res_egger <- mr(mr_data_clean, method = "mr_egger")
print(res_egger)
* * *
6. 如果多效性仍显著,考虑生物学解释和工具变量选择
library(phenoscanner)
phenoscanner(SNPs = mr_data_clean$SNP)
* * *
总结建议:
如果尝试这些方法后,mr_pleiotropy_test
的 P 值仍然小于 0.05,那可能说明确实存在无法忽略的水平多效性。在这种情况下,更倾向于使用加权中值法或 MR-Egger 校正效应估计。
有任何细节想继续探讨,或想进一步优化模型,欢迎告诉我!🚀
* * *
You:
我执行了这段代码
library(RadialMR)
转换为径向格式
radial_input <- format_radial(mr_data_clean$beta.exposure,
mr_data_clean$beta.outcome,
mr_data_clean$se.exposure,
mr_data_clean$se.outcome)
执行径向 MR 分析
radial_results <- ivw_radial(radial_input, alpha = 0.05)
剔除多效性 SNP
outliers <- radial_results$outliers$SNP
再次运行 MR-Egger 多效性检验
pleio <- mr_pleiotropy_test(mr_data_clean)
print(pleio)
> outliers
> [1] 7
> 然后执行mr_data_clean = mr_data_finn[-c(7),],
> 再进行
> pleio = mr_pleiotropy_test(mr_data_clean)
> pleio
> id.exposure id.outcome outcome exposure egger_intercept se pval
> 1 TMD AS outcome exposure -0.04987379 0.02890008 0.1036524 P值大于0.05了
* * *
ChatGPT:
太棒了!🎉 看起来你的处理非常成功!
让我们总结一下发生了什么:
RadialMR
成功识别并移除了一个表现出水平多效性的 SNP(第 7 个 SNP)。mr_pleiotropy_test
**)的 P 值变成了 0.1036(> 0.05),说明水平多效性不再显著。这意味着:
接下来建议:
mr()
)看看最终因果估计是否发生变化。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。