复现一篇16分的孟德尔随机化文章

news2024/10/7 16:23:00

今天我们来复现一篇16分左右的使用了孟德尔随机化方法的文章,文章的题目是:A multivariable Mendelian randomization analysis investigating smoking and alcohol consumption in oral and oropharyngeal cancer(研究口腔癌和口咽癌吸烟和饮酒的多变量孟德尔随机化分析)
在这里插入图片描述
这是一篇老外的文章,咱们试着复现一下文章的数据和图表,和上一篇一样,作者和上一篇一样也是给咱们提供了详尽的数据和R的代码,我们可以跟着作者的思路进行一个复盘。
作者研究的是吸烟和喝酒对口腔癌症的影响,作者指出,吸烟和饮酒对头颈癌的独立影响尚不清楚。既往的观察性研究中报告的它们明显的协同效应也可能低估了独立效应。最后作者的结论是:吸烟和喝酒每一样都会增加口腔癌的风险。
作者有几个数据来源,分别是GSCAN、 GSCAN without UK Biobank、UK Biobank、UK Biobank。作者在文章中直接给出了数据,我在这里就直接使用了。
作者先是分别在这4个数据库中对吸烟和口腔癌,饮酒和口腔癌进行了分析。作者先做的是单变量的MR分析,我们先来演示单变量的。
我这里就演示GSCAN数据库了,其他数据库的做法完全一样。我们先看看作者给出的表格1
在这里插入图片描述

GSCAN数据库中吸烟对口腔癌的OR是2.5,我们来复现一下,先导入R包和数据,数据SI_exposure.csv对应的是GSCAN数据库。

library(TwoSampleMR)
library(MRInstruments)
library(MVMR)
library(MRPRESSO)
exposure_dat <-read_exposure_data("SI_exposure.csv", sep=",", samplesize_col = "N")

在这里插入图片描述
导入数据后需要使用clump_data函数处理一下,主要是挑选P值比较低的SNP,这和在线下载数据的步骤是一样的

exposure_dat <- clump_data(exposure_dat)

读入结局数据,也就是口腔癌的数据

outcome_dat <- read_outcome_data("smandalc_hnc.txt", sep="\t")

在这里插入图片描述
接下来效应等位与效应量保持统一,这一步是必须的,

dat <- harmonise_data(exposure_dat, outcome_dat)

添加两个列名

dat$exposure <- "smoking initiation"
dat$outcome <- "oral/oropharyngeal cancer"

使用mr_keep进行筛选,其实这步是多余的,因为进行MR分析的时候也是有这一步的

dat <- dat[dat$mr_keep=="TRUE",]

进行MR分析,并求出系数

mr_results <- mr(dat)
or_results <- generate_odds_ratios(mr_results)
or_results

在这里插入图片描述
我们可以看到上图的OR是2.5和作者的表格是一致的,其他结果也是一致的,所以咱们算是复原了这个结果。作者还做了个mr_presso多水平效应分析,代码是

dat <- dat[dat$mr_keep=="TRUE",]
mr_presso(BetaOutcome = "beta.outcome", BetaExposure = "beta.exposure", SdOutcome = "se.outcome", SdExposure = "se.exposure", data=dat, OUTLIERtest = TRUE, DISTORTIONtest = TRUE, NbDistribution = 10000,  SignifThreshold = 0.05)

不过这个代码我没跑出来,我见作者也没跑出来。
刚才是吸烟的,下面我们来看看喝酒对口腔癌的影响。也是以GSCAN数据来复原

先导入数据,这里步骤和吸烟差不多的,我直接上代码了,喝酒这里的数据是DPW_exposure.csv数据,表格的结果见下图

在这里插入图片描述
喝酒这部分的代码和吸烟的差不多

exposure_dat <-read_exposure_data("DPW_exposure.csv", sep=",", samplesize_col = "N")
exposure_dat <- clump_data(exposure_dat)
outcome_dat <- read_outcome_data("smandalc_hnc.txt", sep="\t")
dat <- harmonise_data(exposure_dat, outcome_dat)
dat <- dat[dat$mr_keep=="TRUE",]
dat$outcome <- "Head and neck cancer"
mr_results <- mr(dat)
or_results <- generate_odds_ratios(mr_results)

在这里插入图片描述
我们可以看到,结果是9.96,和作者列出的表格也是一样的。
作者还做了一个按癌症部位分层的比较图(下图)
在这里插入图片描述
我就拿吸烟来表示,这个图其实做起来思路很简单,把结果剔出来分析就可以了,就拿a图来说,我们把我们首先收集吸烟的暴露这部分SNP,把口腔癌和口咽癌的结果分别和它比较就行了,所以应该分两部进行。
口腔癌的,关键的代码是outcome_dat$SNP %in% exposure_dat$SNP这句,结果部分取了暴露部分的子集。

exposure_dat <-read_exposure_data("SI_exposure.csv", sep=",", samplesize_col = "N")
exposure_dat <- clump_data(exposure_dat)
outcome_dat <- read_outcome_data("smandalc_oc.txt", sep="\t")
outcome_dat <- outcome_dat[outcome_dat$SNP %in% exposure_dat$SNP,]
dat <- harmonise_data(exposure_dat, outcome_dat)
SI_SNPs <- as.character(dat$SNP[dat$mr_keep=="TRUE"])
dat$exposure <- "smoking initiation"
dat$outcome <- "oral cancer"
dat <- dat[dat$mr_keep=="TRUE",]
mr_results <- mr(dat)
mr_results
or_results <- generate_odds_ratios(mr_results)

在这里插入图片描述
口咽癌的,可以看到smandalc_oc.txt和smandalc_opc.txt是两个不同的结局数据,其他部分的代码完全相同。

exposure_dat <-read_exposure_data("SI_exposure.csv", sep=",", samplesize_col = "N")
exposure_dat <- clump_data(exposure_dat)
outcome_dat <- read_outcome_data("smandalc_opc.txt", sep="\t")
outcome_dat <- outcome_dat[outcome_dat$SNP %in% exposure_dat$SNP,]
dat <- harmonise_data(exposure_dat, outcome_dat)
SI_SNPs <- as.character(dat$SNP[dat$mr_keep=="TRUE"])
dat$exposure <- "smoking initiation"
dat$outcome <- "oropharyngeal cancer"
dat <- dat[dat$mr_keep=="TRUE",]
mr_results <- mr(dat)
mr_results
or_results <- generate_odds_ratios(mr_results)

在这里插入图片描述
因为要汇总很多数据,工作量比较大,这个图我就不画了,汇总好数据后,画起来也是很简单的。
前面讲了单变量的MR分析,下面来介绍一下多变量的孟德尔随机化分析(MVMR)。我们先看一下作者的数据表格。
在这里插入图片描述
作者分析了两个指标,一个是吸烟指数、第二个是每周饮酒量,对这两个指标进行多变量分析,多变量孟德尔随机化考虑了两个变量的相互影响,简单来说可以把另外的当做混杂因素。作者文章中已经说明了怎么提取数据,我这里直接用了。
我们先把暴露变量导入看一下,数据有2个暴露因素,吸烟指数和每周饮酒

XGs <- read.csv("MVMR_dpwandcsi.csv")

在这里插入图片描述
Y结局也导进来看一下

YG <- read.csv("MVMR_dpwandcsi_hnc.csv")

在这里插入图片描述
作者引用了一个综合吸烟指数 (CSI) 数据,把将 CSI 和 DPW 分别限制为 108 个 SNP 和 60 个 SNP。

CSI_DPW_SNPs <- read.csv("CSI_DPW_SNPs.csv")
XGs <- XGs[XGs$SNP %in% CSI_DPW_SNPs$SNP,]
YG <- YG[YG$SNP %in% CSI_DPW_SNPs$SNP,]

接下来要对暴露因素这里的数据处理一下,主要就是把长数据变成宽数据,效应值和可信区间都要处理,处理后的格式见下图

library(tidyr)
XGs_betas <- XGs[,c(1:2,4)]
XGs_betas <- spread(XGs_betas, Exposure, xg)
XGs_se <- XGs[,c(1,3:4)]
XGs_se <- spread(XGs_se, Exposure, xgse)

在这里插入图片描述
接下来是删掉数据中的缺失值

XGs_betas <- na.omit(XGs_betas)
XGs_se <- na.omit(XGs_se)

下面这一步主要的目前是取暴露和结局中相同的SNP,这样一来YG和XGs_betas的SNP就相等了

YG <- YG[YG$SNP %in% XGs_betas$SNP,]
XGs_betas <- XGs_betas[XGs_betas$SNP %in% YG$SNP,]
XGs_se <- XGs_se[XGs_se$SNP %in% YG$SNP,]

在这里插入图片描述
给它们进行排序

XGs_betas <- XGs_betas[order(XGs_betas$SNP),]
XGs_se <- XGs_se[order(XGs_se$SNP),]
YG <- YG[order(YG$SNP),]

分析前还要进行一个格式化

mvmr <- format_mvmr(XGs_betas[,c(2:3)], YG$yg, XGs_se[,c(2:3)], YG$ygse, XGs_betas$SNP)

最后进行分析
IVW分析

mr_mvivw <- mr_mvivw(mr_mvinput(bx = cbind(XGs_betas$DPW, XGs_betas$CSI), bxse = cbind(XGs_se$DPW, XGs_se$CSI), by = YG$yg, YG$ygse))

egger分析

mr_mvegger <- mr_mvegger(mr_mvinput(bx = cbind(XGs_betas$DPW, XGs_betas$CSI), bxse = cbind(XGs_se$DPW, XGs_se$CSI), by = YG$yg, YG$ygse), orientate = 1)

得出饮酒的结果

mvmr_results_DPW <- c(exp(mr_mvivw$Estimate[1]), exp(mr_mvivw$CILower[1]), exp(mr_mvivw$CIUpper[1]), mr_mvivw$Pvalue[1], exp(mr_mvegger$Estimate[1]), exp(mr_mvegger$CILower.Est[1]), exp(mr_mvegger$CIUpper.Est[1]), mr_mvegger$Pvalue.Est[1])
mvmr_results_DPW <- c(format(mvmr_results_DPW, scientific=F))
names(mvmr_results_DPW) <- c("IVW_OR", "IVW_CIL", "IVW_CIU", "IVW_P", "Egger_OR", "Egger_CIL", "Egger_CIU", "Egger_P")

在这里插入图片描述
得出吸烟的结果,在作者文中交代:要获得每个标准偏差增加的结果,请将β和se乘以0.6940093。至于为什么是0.694,我也不明白,有大佬能私信告诉我吗?

mvmr_results_CSI <- c(exp(mr_mvivw$Estimate[2]*0.6940093), exp(mr_mvivw$CILower[2]*0.6940093), exp(mr_mvivw$CIUpper[2]*0.6940093), mr_mvivw$Pvalue[2], exp(mr_mvegger$Estimate[2]*0.6940093), exp(mr_mvegger$CILower.Est[2]*0.6940093), exp(mr_mvegger$CIUpper.Est[2]*0.6940093), mr_mvegger$Pvalue.Est[2])
mvmr_results_CSI <- c(format(mvmr_results_CSI, scientific=F))
names(mvmr_results_CSI) <- c("IVW_OR", "IVW_CIL", "IVW_CIU", "IVW_P", "Egger_OR", "Egger_CIL", "Egger_CIU", "Egger_P")

在这里插入图片描述

因此,吸烟的OR是2.62,饮酒的OR是5.22.和作者的结果一样。

表示为控制饮酒后,吸烟会导致口腔癌发生率增加2.62倍,控制吸烟后,饮酒会导致口腔癌发生率增加5.22倍.
得出了OR和可信区间,画图就简单多了,我就不画了,写到这里已经很累了。还有一些孟德尔随机分析的图生成,可以看我既往的文章。
最后我个人总结一下自己的看法,孟德尔随机化分析要想发高分,主要还是在前期自己大量的数据收集和汇总,代码不是很难,一定要像文章中做多个数据库的,最好同时做单变量和多变量的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/846346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

m3u8怎么变成本地视频?一个小妙招教你轻松搞定

m3u8视频是一种流媒体视频格式&#xff0c;它将整个视频分成多个小文件&#xff0c;每个小文件的长度通常为几秒钟。这些小文件存储在服务器上&#xff0c;并通过网络传输到观众的设备上。当观众观看视频时&#xff0c;视频播放器会按照正确的顺序下载和播放这些小文件&#xf…

自己动手写cpu读后感第一到三章

一 计算机的简单模型 1.1 组成模型 二 接口 具体的说明为

聊聊简单又不简单的图上多跳过滤查询

在图数据库/图计算领域&#xff0c;多跳查询是一个非常常用的查询&#xff0c;通常来说以下类型的查询都可以算作是多跳过滤查询&#xff1a; 1.查询某个用户的朋友认识的朋友 --二跳指定点label的查询 2.查询某个公司的上下游对外投资关系 --N跳指定方向过滤查询 3.查询某个公…

U盘删除的文件如何恢复?只需要这3个方法!

“谁来救救孩子啊&#xff01;u盘里好多重要的文件&#xff0c;不小心被弟弟全部删除了&#xff0c;u盘里删除的文件还能不能恢复呀&#xff1f;快给我出出主意吧&#xff0c;感谢大家&#xff01;” 随着u盘的使用越来越频繁&#xff0c;很多朋友会将重要的文件都保存在u盘里。…

RunnerGo配置场景时接口模式该怎么选

在进行性能测试时&#xff0c;测试场景的正确配置非常关键。首先&#xff0c;需要根据业务场景和需求&#xff0c;设计出合理的测试场景&#xff0c;再利用相应的工具进行配置&#xff0c;实现自动化的性能测试。 在JMeter中&#xff0c;用户需要自己组织测试场景&#xff0c;…

Lattice FPGA解码MIPI视频,IMX219摄像头4Line 1080P采集USB3.0输出,提供工程源码硬件原理图PCB和技术支持

目录 1、前言2、Lattice FPGA解码MIPI的性能及其优越性3、我这里已有的 MIPI 编解码方案4、详细设计方案IMX219摄像头及其转接板D-PHY数据对齐MIPI CSI2视频数据格式转换视频输出矫正 5、Lattice Diamond工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 FP…

完美的分布式监控系统——Prometheus(普罗米修斯)与优雅的开源可视化平台——Grafana(格鲁夫娜)

一、基本概念 1、之间的关系 prometheus与grafana之间是相辅相成的关系。作为完美的分布式监控系统的Prometheus&#xff0c;就想布加迪威龙一样示例和动力强劲。在猛的车也少不了仪表盘来观察。于是优雅的可视化平台Grafana出现了。 简而言之Grafana作为可视化的平台&#xff…

24届近5年同济大学自动化考研院校分析

今天给大家带来的是同济大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、同济大学 学校简介 同济大学历史悠久、声誉卓著&#xff0c;是中国最早的国立大学之一&#xff0c;是教育部直属并与上海市共建的全国重点大学。经过115年的发展&#xff0c;同济大学已经…

无涯教程-Perl - References(引用)

Perl引用是一个标量数据类型&#xff0c;该数据类型保存另一个值的位置&#xff0c;该值可以是标量&#xff0c;数组或哈希。 创建引用 变量&#xff0c;子程序或值创建引用很容易&#xff0c;方法是在其前面加上反斜杠&#xff0c;如下所示: $scalarref \$foo; $arrayref …

风控安全产品系统设计的一些思考

背景 本篇文章会从系统架构设计的角度&#xff0c;分享在对业务安全风控相关基础安全产品进行系统设计时遇到的问题难点及其解决方案。 内容包括三部分&#xff1a;&#xff08;1&#xff09;风控业务架构&#xff1b;&#xff08;2&#xff09;基础安全产品的职责&#xff1…

python_day19_正则表达式

正则表达式re模块 导包 import res "python java c c python2 python python3"match 从头匹配 res re.match("python", s) res_2 re.match("python2", s) print("res:", res) print(res.span()) print(res.group()) print("…

致远OA协同管理软件无需登录getshell

一个男子汉&#xff0c;老守在咱村那个土圪崂里&#xff0c;又有什么意思&#xff1f;人就得闯世事&#xff01;安安稳稳活一辈子&#xff0c;还不如痛痛快快甩打几下就死了&#xff01;即使受点磨难&#xff0c;只要能多经一些世事&#xff0c;死了也不后悔&#xff01; 漏洞…

数据结构日记之《队列的定义》

队列的定义 一、队列的定义和特点二、队列的抽象数据类型定义三、例子 一、队列的定义和特点 队列 (queue) 是一种 先进先出(First In First Out, FIFO) 的线性表。它只允许在表的一端进行插入&#xff0c;而在另一端删除元素。这和日常生活中的排队是一致的&#xff0c;最早进…

SpringBoot3进阶用法

标签&#xff1a;切面.调度.邮件.监控&#xff1b; 一、简介 在上篇《SpringBoot3基础》中已经完成入门案例的开发和测试&#xff0c;在这篇内容中再来看看进阶功能的用法&#xff1b; 主要涉及如下几个功能点&#xff1a; 调度任务&#xff1a;在应用中提供一定的轻量级的调…

AcWing 93:递归实现组合型枚举 ← DFS

【题目来源】https://www.acwing.com/problem/content/95/【题目描述】 从 1∼n 这 n 个整数中随机选出 m 个&#xff0c;输出所有可能的选择方案。【输入格式】 两个整数 n&#xff0c;m&#xff0c;在同一行用空格隔开。【输出格式】 按照从小到大的顺序输出所有方案&#xf…

uniapp根据高度表格合并

没有发现比较友好的能够合并表格单元格插件就自己简单写了一个,暂时格式比较固定 一、效果如下 二、UI视图+逻辑代码 <template><view><uni-card :is-shadow="false" is-full

怎么把CAD高版本转低版本?CAD版本转换方法分享

CAD文件版本转换通常是为了确保更高版本的CAD软件能够打开旧版本的文件。此外&#xff0c;不同版本的CAD软件可能具有不同的功能&#xff0c;因此转换文件版本可以确保可以在任何版本的软件中使用文件。此外&#xff0c;如果我们需要与其他人共享文件&#xff0c;则需要将文件转…

基于EEGLAB的ICA分析

目录 1.ICA原理 2.ICA的实现 3.ICA成分识别 4.ICLabel识别并去除伪迹 5.ICA成分识别练习 1.ICA原理 得到的每一个地形图&#xff0c;实际上就是它的权重谱。 投射&#xff1a;根据原成分恢复原始信号。 选择性投射&#xff1a;去伪。 2.ICA的实现 extended&#xff0c;1&…

bigemap如何添加在线地图源?

第一步 打开浏览器&#xff0c;找到你要访问的地图的URL地址&#xff0c;并且确认可以正常在浏览器中访问&#xff1b;浏览器中不能访问&#xff0c;同样也不能在软件中访问。 以下为常用地图源地址&#xff1a; 天地图&#xff1a; http://map.tianditu.gov.cn 包含&a…

小程序的api使用 以及一些weui组件实列获取头像 扫码等

今日目标 响应式单位rpx小程序的生命周期 【重点】20%小程序框架 weui 【重点】 50%内置API 【重点】30%综合练习 1. 响应式rpx 1.1 rpx单位 rpx是微信小程序提出的一个尺寸单位&#xff0c;将整个手机屏幕宽度分为750份&#xff0c;1rpx 就是 1/750&#xff0c;避免不同手…