什么是森林图?
森林图是在平面直角坐标系中,以一条垂直的无效线(横坐标刻度为1或0)为中心,用平行于横轴的多条线段描述了每个被纳入研究的效应量和可信区间(confidence interval,CI),用一个棱形(或其它图形)描述了多个研究合并的效应量及可信区间。它非常简单和直观地描述了Meta分析的统计结果,是Meta分析中最常用的结果表达形式。
实现森林图的方法有哪些?
在R语言里,实现森林图的方法有很多,比如forestplot包,ggforestplot包,以及survminer包等都可以,当然也可以利用ggplot2包实现更自由的绘制森林图。
今天我们主要讲讲利用survminer包的ggforest函数绘制森林图
这个包有个优势就是可以直接利用模型拟合输出的结果直接输出森林图,不用另外单独准备数据。比如我们可以用survival包来做预后的影响因素分析,然后利用survminer包里的ggforest函数读取survival包拟合的模型结果绘制森林图。
如何安装survminer包?
照例两种方式,要么从R CRAN的不同镜像上安装,要么从github上安装。
第一种方式:从CRAN镜像上安装
install.packages("survminer")
第二种方式:从github上安装
# 首先判断运行环境里是否安装了devtools包,如果没有安装的话,需要先安装devtools包
if(!require(devtools)) install.packages("devtools")
# 利用devtools从github上安装survminer包
devtools::install_github("kassambara/survminer", build_vignettes = FALSE))
准备数据
加载survival包时,自动加载了colon数据框,我们就可以利用这个数据来拟合预后风险。
首先加载survival包,并查看一下colon数据框的基本情况
# 加载dplyr包进行数据处理
library(dplyr)
Attaching package: 'dplyr'
The following objects are masked from 'package:stats':
filter, lag
The following objects are masked from 'package:base':
intersect, setdiff, setequal, union
library(survival)
# 看下colon数据的结构
head(colon)
id study rx sex age obstruct perfor adhere nodes status differ extent
1 1 1 Lev+5FU 1 43 0 0 0 5 1 2 3
2 1 1 Lev+5FU 1 43 0 0 0 5 1 2 3
3 2 1 Lev+5FU 1 63 0 0 0 1 0 2 3
4 2 1 Lev+5FU 1 63 0 0 0 1 0 2 3
5 3 1 Obs 0 71 0 0 1 7 1 2 2
6 3 1 Obs 0 71 0 0 1 7 1 2 2
surg node4 time etype
1 0 1 1521 2
2 0 1 968 1
3 0 0 3087 2
4 0 0 3087 1
5 0 1 963 2
6 0 1 542 1
首先我们对colon数据预处理一下
我们对sex变量和differ变量因子化,并增加中文值标签。
如果我们想在森林图里显示交互作用项,那么就需要提前处理数据,比如我们想看surg和nodes的交互作用,我们可以把两者的相乘项加入模型里。
# 预处理colon数据框
colon <- colon%>%
mutate(sex=factor(sex, labels = c("女性", "男性")),
differ=factor(differ,labels = c("高分化", "中分化", "低分化")),
# 为模型拟合准备交互项
interaction=surg*nodes,
surg= factor(surg,label=c("非手术组","手术组"))
)
利用colon数据来拟合预后风险
model <- coxph(Surv(time, status) ~ sex + differ + surg + nodes + interaction, data = colon )
summary(model)
Call:
coxph(formula = Surv(time, status) ~ sex + differ + surg + nodes +
interaction, data = colon)
n= 1776, number of events= 876
(82 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
sex男性 -0.094440 0.909883 0.068029 -1.388 0.1651
differ中分化 -0.030810 0.969660 0.116865 -0.264 0.7921
differ低分化 0.257933 1.294252 0.136498 1.890 0.0588 .
surg手术组 0.176022 1.192465 0.102487 1.718 0.0859 .
nodes 0.081409 1.084814 0.007312 11.133 <2e-16 ***
interaction 0.023728 1.024012 0.016809 1.412 0.1581
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
exp(coef) exp(-coef) lower .95 upper .95
sex男性 0.9099 1.0990 0.7963 1.040
differ中分化 0.9697 1.0313 0.7712 1.219
differ低分化 1.2943 0.7726 0.9904 1.691
surg手术组 1.1925 0.8386 0.9755 1.458
nodes 1.0848 0.9218 1.0694 1.100
interaction 1.0240 0.9766 0.9908 1.058
Concordance= 0.633 (se = 0.009 )
Likelihood ratio test= 153.9 on 6 df, p=<2e-16
Wald test = 210.2 on 6 df, p=<2e-16
Score (logrank) test = 214.7 on 6 df, p=<2e-16
利用ggforest函数输出森林图
ggforest函数可以自由定义的参数不多,主要有以下几个:
- model= modeldata,指定ggforest函数读取的模型拟合数据
- data= colon,指定输出模型的数据
- cpositions= c(0.01,0.1,0.3),指定森林图的前三列分别离最左侧有多远,0为最左侧,1为最右侧,大家可以根据放入模型的变量的值标签的长度来自行定义。
- refLable=“参照组”,用来指定比值比指标参考组的显示标签,默认的为Reference,我们可以给它调整为参照组。
- fontsize=0.7,调整图里的文字大小。
- noDigits=2,设置小数点的位数,默认值为2。
- main=“图标的标题”,设置图的标题。
Loading required package: ggplot2
Loading required package: ggpubr
Attaching package: 'survminer'
The following object is masked from 'package:survival':
myeloma
ggforest(model = model,
data = colon,
cpositions = c(0.01,0.1,0.3),
refLabel = "参照组",
fontsize=0.7,
noDigits=2,
main = "预后因素回归分析")->pp
ggsave("forest.png")
好了,森林图出来了,如果你想对输出的图进一步处理的话,可以用本站前面介绍的magick包或者其它包进行更加个性化的调整和处理。
小结
利用survminer包ggforest函数制作森林图既有优势也有缺点,优势是可以利用前期拟合的模型输出结果,不用再专门整理数据,当然有优势也就有劣势,就是可以调整的参数较少,缺少更个性化的调整参数。
陈 琼
博士
副主任医师
他从事肿瘤登记与人群流行病学研究,编写肿瘤登记年报,并开发和维护个人网站。他撰写博文,分享数据分析方法、可视化技巧和自动化报告解决方案,同时学习 R 语言,开发 R 包,不断探索高效的数据处理与展示方式。 🚀
回到顶部