R语言forestploter包优雅的绘制孟德尔随机化研究森林图

在既往文章中,我们对孟德尔随机化研究做了一个简单的介绍。我们可以发现,使用TwoSampleMR包做出来的森林图并不是很美观。今天我们使用R语言forestploter包优雅的绘制孟德尔随机化研究森林图。
在这里插入图片描述
使用TwoSampleMR包做出来的森林图是这样的
在这里插入图片描述
而很多SCI文章中的森林图是这样的
在这里插入图片描述
我们今天来做个上图这样的森林图,使用的是《R语言复现一篇6分的孟德尔随机化文章》的数据,这篇文章作者直接提供了数据,所以我就直接拿来用了。作者分析了很多精神病和骨密度的结果,这里我就取精神分裂症和骨密度结果来分析
在这里插入图片描述
我们构造森林图的大概格式如下,所以我们要按下图构造数据表格
在这里插入图片描述
这一步只能手工做,没什么好办法,不过也没花几分钟,样本量可以在网站上找,做好大概就是下图这样。公众号回复:孟德尔森林图,可以获得这个数据。
在这里插入图片描述
咱们先来导入数据看一下
在这里插入图片描述
这样的格式和我们绘图格式还有点差别。我们还需调整一下,还有个问题就是95%CI这里的上线区间和下限区间是连在一起的,我们要把它分开提取出来,需要用到一点点非常简单的正则式小知识。使用正则式需要使用stringr包,我们先把95%ci单独提出来

library(stringr)
cl<-bc$`95%Cl`

文章作者制作的这个表格非常整齐,我们提取需要使用str_sub函数,这个函数使用非常简单,你想提取什么内容,输入它的位置就可以了,下限low是1-5位置,这里要注意一下,小数点也占一个位置

bc$low<-str_sub(cl,1,5)

接下来我们提取上限区间,位置是7-11

bc$hi<-str_sub(cl,7,11)

这样数据就单独提取出来了

在这里插入图片描述
接下来就是导入forestploter包来绘制森林图

library(grid)
library(forestploter)

给它把第一个变量空一格,等下绘图的时候好看点

bc$Outcome<- ifelse(!is.na(bc$`sample size`), bc$Outcome, paste0("   ", bc$Outcome))

在这里插入图片描述
sample size、P-Value变量等下要来绘图,我们把缺失的地方变成空格

bc$`sample size` <- ifelse(is.na(bc$`sample size`), "", bc$`sample size`)
bc$`P-Value` <- ifelse(is.na(bc$`P-Value`), "", bc$`P-Value`)

在这里插入图片描述
生成一个变量se,它在绘图的时候表示正方形的大小

bc$se <- (log(as.numeric(bc$hi)) - log(as.numeric(bc$OR)))/1.96

把hi和low转成数字,等下要使用它来转换一下

bc$hi<-as.numeric(bc$hi)
bc$low <-as.numeric(bc$low)

生成OR (95% CI)

bc$`OR (95% CI)` <- ifelse(is.na(bc$se), "",
                           sprintf("%.2f (%.2f to %.2f)",
                                   bc$OR, bc$low, bc$hi))#sprintF返回字符和可变量组合

生成一个空的绘图区间

bc$` ` <- paste(rep(" ", 20), collapse = " ")

最后数据格式如下
在这里插入图片描述
绘图,这里注意下移ci_column = 4是以后面生成的数据来定的

forest(bc[,c(1:2,9,10,5)],
       est = bc$OR,       #效应值
       lower = bc$low,     #可信区间下限
       upper = bc$hi,      #可信区间上限
       sizes = bc$se,
       ci_column = 4,   #在那一列画森林图,要选空的那一列
       ref_line = 1,
       arrow_lab = c("No Schizophrenia", "Schizophrenia"),
       xlim = c(0, 4),
       ticks_at = c(0.5, 1, 2, 3),
       footnote = "This is the demo data. Please feel free to change\nanything you want.")

在这里插入图片描述
我们也可以先给森林图设定一个格式,后面再采用这个格式

tm <- forest_theme(base_size = 10,  #文本的大小
                   # Confidence interval point shape, line type/color/width
                   ci_pch = 15,   #可信区间点的形状
                   ci_col = "#762a83",    #CI的颜色
                   ci_fill = "blue",     #ci颜色填充
                   ci_alpha = 0.8,        #ci透明度
                   ci_lty = 1,            #CI的线型
                   ci_lwd = 1.5,          #CI的线宽
                   ci_Theight = 0.2, # Set an T end at the end of CI  ci的高度,默认是NULL
                   # Reference line width/type/color   参考线默认的参数,中间的竖的虚线
                   refline_lwd = 1,       #中间的竖的虚线
                   refline_lty = "dashed",
                   refline_col = "grey20",
                   # Vertical line width/type/color  垂直线宽/类型/颜色   可以添加一条额外的垂直线,如果没有就不显示
                   vertline_lwd = 1,              #可以添加一条额外的垂直线,如果没有就不显示
                   vertline_lty = "dashed",
                   vertline_col = "grey20",
                   # Change summary color for filling and borders   更改填充和边框的摘要颜色
                   summary_fill = "yellow",       #汇总部分大菱形的颜色
                   summary_col = "#4575b4",
                   # Footnote font size/face/color  脚注字体大小/字体/颜色
                   footnote_cex = 0.6,
                   footnote_fontface = "italic",
                   footnote_col = "red")

使用这个模板绘图

forest(bc[,c(1:2,9,10,5)],
       est = bc$OR,       #效应值
       lower = bc$low,     #可信区间下限
       upper = bc$hi,      #可信区间上限
       sizes = bc$se,
       ci_column = 4,   #在那一列画森林图,要选空的那一列
       ref_line = 1,
       arrow_lab = c("No Schizophrenia", "Schizophrenia"),
       xlim = c(0, 4),
       ticks_at = c(0.5, 1, 2, 3),
       footnote = "This is the demo data. Please feel free to change\nanything you want.",
       theme = tm)

在这里插入图片描述
这样一个符合论文发表的森林图就做好啦。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

$.getScript()方法获取js文件

通过$.getScript(‘xxxx.js’)获取xxxx.js文件&#xff0c;这时的ajax是一个get请求的状态&#xff0c;如果进行了入参data的赋值那么他就会跟在url后面,同理获取json文件&#xff0c;css文件。 一开始没想起这茬。。。

Linux系统部署Nginx详细教程(图文讲解)

前言&#xff1a;本篇博客记录了我是如何使用Linux系统一步一步部署Nginx的完整过程&#xff0c;也是我学习之路上的一个笔记总结&#xff0c;每一行代码都进行了严格的测试&#xff0c;特此做一个技术分享&#xff01; 目录 一、安装依赖 二、安装Nginx 三、配置Nginx 四、…

Spring学习笔记---SpringBoot快速入门

Spring学习笔记---SpringBoot快速入门 Spring学习笔记---SpringBoot1 SpringBoot简介1.1 SpringBoot快速入门1.1.1 开发步骤1.1.1.1 创建新模块1.1.1.2 创建 Controller1.1.1.3 启动服务器1.1.1.4 进行测试 1.1.2 对比1.1.3 官网构建工程1.1.3.1 进入SpringBoot官网1.1.3.2 选择…

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 作者单位 旷视 目的 本文的目标是 通过扩展 PETR&#xff0c;使其有时序建模和多任务学习的能力 以此建立一个 强有力且统一的框架。 本文主要贡献&#xff1a; 将 位置 embedding 转换到 时序表…

Spring Batch之读数据—读XML文件(三十二)

一、XML格式文件解析 XML是一种通用的数据交换格式&#xff0c;它的平台无关性、语言无关性、系统无关性&#xff0c;给数据集成与交换带来了极大的方便。XML在Java领域的解析方式有两种&#xff0c;一种叫SAX&#xff0c;另一种叫DOM。SAX是基于事件流的解析&#xff0c;DOM是…

基于STM32单片机的智能家居烟雾温度火灾防盗报警的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;LCD1602液晶显示屏来显示显示测得的值&#xff1b;SR501人体红外感应是否有人进行防盗&#xff1b;通过烟雾传感器MQ-2获取前的烟雾值&#xff1b;通过DHT11温湿度传感器来获取当前的温湿度&#xff1b;所有的信息通过通过esp82…

如何用DeepDiff测接口数据源变更?

开发同学最近变更了部分业务查询接口底层的数据源&#xff0c;希望测试同学能够针对这些接口进行一些回归验证&#xff0c;校验底层数据源更新前后业务查询接口返回的一致性&#xff0c;保证更新后对正常业务没有影响。 这个回归测试和一般接口测试有所区别&#xff0c;不仅仅…

金融中的数学:概率分布(下)

上篇博客介绍了离散型概率分布&#xff0c;本篇博客介绍连续型概率分布。 1.连续型概率分布 连续型均匀分布&#xff08;Continuous Uniform distribution&#xff09;是一种描述在特定区间内取值均匀分布的概率分布。在该分布中&#xff0c;随机变量在给定区间内的取值概率密…

Vue实现阻止浏览器记住密码功能的三种方法

通常浏览器会主动识别密码表单&#xff0c;在你登录成功之后提示保存密码 &#xff0c; 密码保存到浏览器的 密码管理器中 ( 如下是谷歌浏览器 ) 这种行为是浏览器的行为 &#xff0c;这种操作也是为了方便用户的使用 现在的一个需求是要阻止这个保存密码的弹窗提示 登录页账…

使用IDEA工具debug java annotation processors

最近看Spring提供的自动生成spring-configuration-metadata.json文件的组件。组件依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</opti…

Revit中如何添加剖面?快速实现剖面图

一、Revit中如何添加剖面&#xff1f; 除了标高绘制所得到的楼层平面视图和立面视图之外&#xff0c;还可以添加剖面视图&#xff0c;这样可以得到任意位置一个竖向的剖切面&#xff0c;例如在楼梯细节处理中&#xff0c;楼梯处于建筑物内部&#xff0c;立面也看不到整个楼梯的…

Excel-公式VLOOKUP 使用方法-小记

个人愚见 表示 MongoDB列中的任意一条数据 在 MySQL列 精确查找 和MongoDB列 中一模一样的数据&#xff0c;有的话返回MongoDB列数据&#xff0c;没有话返回#N/A 官方解释

MySQL数据库与表的基本操作 + 表的基本CRUD(增删改查)操作

文章目录 前言一、库的基本操作显示当前所有数据库创建数据库使用数据库删除数据库 二、表的基本操作创建表查看库中所有表查看表结构删除表 三、表的增删改查(基础)新增数据(Create)全列插入指定列插入 查询数据(Retrieve)全列查询指定列查询查询字段为表达式指定列的别名去重…

掘金量化—Python SDK文档—5.API 介绍(1)

​ Python SDK文档 5.API 介绍 5.1基本函数 init - 初始化策略 初始化策略, 策略启动时自动执行。可以在这里初始化策略配置参数。 函数原型&#xff1a; init(context)参数&#xff1a; 参数名类型说明contextcontext上下文&#xff0c;全局变量可存储在这里 示例&…

vue(html,css,vue2,vue3) 学习总结

文章目录 小白 Vue 3 学习一些名词软件安装 VSCode 中的一些设置1. 关闭eslint检查tsconfig.json 配置文件2. ts 文件引用报红 相对路径写法常见图片格式和区别目录结构JS/TS1. prototype(原型对象)2. 导入/导出3. 去除字符串两端空格4. 一些特殊语法糖5. 深拷贝6. 拼接两个数组…

【java爬虫】使用selenium获取某宝联盟淘口令

上一篇文章我们已经介绍过使用selenium获取优惠券基本信息的方法 (15条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 本文将在上一篇文章的基础上更进一步&#xff0c;获取每个优惠券的淘口令&#xff0c;毕竟我们只有复制淘口令才能在APP里面获取优惠…

基于ChatGPT和私有知识库搭建Quivr项目

准备工作 安装docker和docker-compose申请supabase账号 拉取Quivr代码 git clone https://github.com/StanGirard/Quivr.git 复制.XXXXX_env文件 cp .backend_env.example backend/.env cp .frontend_env.example frontend/.env 更新backend/.env和frontend/.env文件 ba…

【hadoop】部署hadoop全分布模式

hadoop全分布模式 全分布模式特点部署全分布模式准备工作正式配置hadoop-env.shhdfs-site.xmlcore-site.xmlmapred-site.xmlyarn-site.xmlslaves对NameNode进行格式化复制到另外两台虚拟机启动 对部署是否成功进行测试 全分布模式特点 真正的分布式环境&#xff0c;用于生产具…

java学习003

Java数组 Java 语言中提供的数组是用来存储固定大小的同类型元素&#xff0c;这一点和PHP语言的可变数组长度不同。 声明变量数组 首先必须声明数组变量&#xff0c;才能在程序中使用数组。下面是声明数组变量的语法&#xff1a; dataType[] arrayRefVar; // 首选的方法 或 …

2023-07-18力扣今日二题-太难了吧

链接&#xff1a; LCP 75. 传送卷轴 题意&#xff1a; 给一个正方形迷宫&#xff0c;主角是A&#xff0c;每次可以上下左右走一格子&#xff0c;有四种类型的格子&#xff1a;墙、初始位置、魔法水晶、空地 另一个人B&#xff0c;可以传送一次A&#xff0c;只能在空地传送&…