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

在既往文章中,我们对孟德尔随机化研究做了一个简单的介绍。我们可以发现,使用TwoSampleMR包做出来的森林图并不是很美观。今天我们使用R语言forestploter包优雅的绘制孟德尔随机化研究森林图。

使用TwoSampleMR包做出来的森林图是这样的

而很多SCI文章中的森林图是这样的

我们今天来做个上图这样的森林图,使用的是《R语言复现一篇6分的孟德尔随机化文章》的数据,这篇文章作者直接提供了数据,所以我就直接拿来用了。作者分析了很多精神病和骨密度的结果,这里我就取精神分裂症和骨密度结果来分析

我们构造森林图的大概格式如下,所以我们要按下图构造数据表格

这一步只能手工做,没什么好办法,不过也没花几分钟,样本量可以在网站上找,做好大概就是下图这样。公众号回复:孟德尔森林图,可以获得这个数据。

咱们先来导入数据看一下

这样的格式和我们绘图格式还有点差别。我们还需调整一下,还有个问题就是95%CI这里的上线区间和下限区间是连在一起的,我们要把它分开提取出来,需要用到一点点非常简单的正则式小知识。使用正则式需要使用stringr包,我们先把95%ci单独提出来

r 复制代码
library(stringr)
cl<-bc$`95%Cl`

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

r 复制代码
bc$low<-str_sub(cl,1,5)

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

r 复制代码
bc$hi<-str_sub(cl,7,11)

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

接下来就是导入forestploter包来绘制森林图

r 复制代码
library(grid)
library(forestploter)

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

r 复制代码
bc$Outcome<- ifelse(!is.na(bc$`sample size`), bc$Outcome, paste0("   ", bc$Outcome))

sample size、P-Value变量等下要来绘图,我们把缺失的地方变成空格

r 复制代码
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,它在绘图的时候表示正方形的大小

r 复制代码
bc$se <- (log(as.numeric(bc$hi)) - log(as.numeric(bc$OR)))/1.96

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

r 复制代码
bc$hi<-as.numeric(bc$hi)
bc$low <-as.numeric(bc$low)

生成OR (95% CI)

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

生成一个空的绘图区间

r 复制代码
bc$` ` <- paste(rep(" ", 20), collapse = " ")

最后数据格式如下

绘图,这里注意下移ci_column = 4是以后面生成的数据来定的

r 复制代码
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.")

我们也可以先给森林图设定一个格式,后面再采用这个格式

r 复制代码
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")

使用这个模板绘图

r 复制代码
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)

这样一个符合论文发表的森林图就做好啦。

相关推荐
天桥下的卖艺者2 天前
chrals.CTI函数升级版发布,增加了CTI衍生的脂肪指数提取
数据库·r语言
小师兄吃牛肉3 天前
什么是R语言?如何快速学习R语言
开发语言·学习·r语言
喆星时瑜3 天前
Win10/11 安装 R 与 RStudio 详细图文教程
开发语言·r语言·安装
喆星时瑜4 天前
R语言基础语法入门
开发语言·r语言
喆星时瑜4 天前
R语言向量语法的详细教程
开发语言·r语言
临床数据科学和人工智能兴趣组6 天前
在R语言中, 使用 as.factor() 函数转换数值型变量
开发语言·r语言
babe小鑫15 天前
信息与计算科学专业应届生面试 怎么证明自己能解决业务问题
学习·r语言·excel
深兰科技17 天前
深兰科技受邀参与第二届中国(南宁)—东盟人工智能场景应用对接会,深化AI国际合作
人工智能·qt·r语言·scala·symfony·智能机器人·深兰科技
赵钰老师18 天前
基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析
python·arcgis·数据分析·r语言
User_芊芊君子22 天前
RStudio 鸿蒙 PC 适配全记录:以 Qt 原生工作区承载嵌入式 R
qt·r语言·harmonyos