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)

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

相关推荐
czhc11400756632 天前
LINUX913 shell:set ip [lindex $argv 0],\r,send_user,spawn ssh root@ip “cat “
tcp/ip·r语言·ssh
zhangfeng11332 天前
win7 R 4.4.0和RStudio1.25的版本兼容性以及系统区域设置有关 导致Plots绘图面板被禁用,但是单独页面显示
开发语言·人工智能·r语言·生物信息
zhangfeng11332 天前
在 R 语言里,`$` 只有一个作用 按名字提取“列表型”对象里的单个元素 对象 $ 名字
开发语言·windows·r语言
高-老师2 天前
R语言生物群落(生态)数据统计分析与绘图实践技术应用
开发语言·r语言·生物群落
WangYan20223 天前
R语言:数据读取与重构、试验设计(RCB/BIB/正交/析因)、ggplot2高级绘图与统计检验(t检验/方差分析/PCA/聚类)
r语言·ggplot2·dplyr
zhangfeng11333 天前
错误于make.names(vnames, unique = TRUE): invalid multibyte string 9 使用 R 语言进行数据处理时
开发语言·r语言·生物信息
zhangfeng11334 天前
R geo 然后读取数据的时候 make.names(vnames, unique = TRUE): invalid multibyte string 9
开发语言·chrome·r语言·生物信息
梦想的初衷~5 天前
R语言生物群落数据分析全流程:从数据清洗到混合模型与结构方程
机器学习·r语言·生态·环境
没有梦想的咸鱼185-1037-16637 天前
基于R语言机器学习方法在生态经济学领域中的实践技术应用
开发语言·机器学习·数据分析·r语言
zhangfeng11337 天前
R 语法高亮为什么没有,是需要安装专用的编辑软件,R语言自带的R-gui 功能还是比较简单
开发语言·r语言