引言:
生存分析是临床上较为常用的统计学方法,用于比较不同组别的患者在接受干预之后,生存时间的变化情况。生存分析是医学领域中一个重要的内容,在各个疾病领域的研究中都运用十分广泛。在R中进行生存分析常用的包主要有survival包以及survminer包。
•Survival 包提供了生存函数的建立,Cox模型的建立,以及比较分析。这个包也提供了基于基础绘图系统的生存曲线绘制。•Survminer包提供了基于ggplot2系统对于生存分析的可视化,使得生存分析具有更加美观的图形,以及自我定制方式。
而今天我们的主角就是Survminer包,让我们鼓足精神一起来学习“如何使用Survminer包优雅的绘制生存曲线”吧。
1.Survminer包主要函数介绍
#该包包含的主要函数有:
主要函数用法ggsurvplot ()利用'number at risk'表,事件表的累计数量和被过滤的主体表的累计数绘制生存曲线arrange_ggsurvplots ()在同一页面上排列多个ggsurvplotsggsurvevents ()绘制事件的时间分布surv_summary ()生存曲线总结,默认的summary ()函数相比,surv_summary ()创建一个数据帧,其中包含来自survfit结果的漂亮摘要surv_cutpoint ()一次确定一个或多个连续变量的最佳切点,提供与生存最显著关系对应的一个切点的值。pairwise_survdiff ()生存曲线的多重比较,计算分组级别之间的配对比较,以及多个测试的更正ggcoxzph ()比例危害的图形测试,显示缩放的Schoenfeld残差图,以及使用ggplot2的平滑曲线,plot.cox.zph()的包装器ggcoxdiagnostics ()显示诊断图表显示cr比例危险模型的良好ggcoxfunctional ()显示关于零cox比例危险模型鞅残差的连续解释变量的图,cox模型中连续变量的函数形式的正确选取ggforest ()绘制CoxPH模型的forest plotggcoxadjustedcurves ()绘制coxph模型的调整生存曲线ggcompetingrisks ()绘制竞争风险的累积关联曲线
在以上众多函数中,ggsurvplot ()函数和ggcoxzph ()函数是生存分析中应用最多的函数,arrange_ggsurvplots ()函数是让多个 ggsurvplots作图生存曲线合并。今天我们也将主要讲解这三个函数。(如果需要其他函数的学习,请自行查阅 Survminer包说明文档)
2.主要函数ggsurvplot()
2.1 用法:
ggsurvplot(fit, data = NULL, fun = NULL, color = NULL, palette = NULL, linetype = 1, conf.int = FALSE, pval = FALSE, pval.method = FALSE, test.for.trend = FALSE, surv.median.line = "none", risk.table = FALSE, cumevents = FALSE, cumcensor = FALSE, tables.height = 0.25, group.by = NULL, facet.by = NULL, add.all = FALSE, combine = FALSE, ggtheme = theme_survminer(), tables.theme = ggtheme, ...)
2.2 主要参数详解:
参数用法fit需要画的生存曲线对象,可以是拟合好的生存对象,也可以是包含生存信息的数据框、列表data用来拟合生存曲线的数据集,如果未提供,则将从“fit”对象中提取数据fun定义生存曲线变换的任意函数。event:f(y) = 1-y;cumhaz:f(y) =-log(y);pct:生存率百分比color绘制生存曲线的颜色设置,可使用调色板palette使用调色板linetype改变线条类型conf.int逻辑值,如果为TRUE,则绘制置信区间pval逻辑中,如果为TRUE,则绘制p值pval.method是否添加一个文本,其中包含用于计算pvalue的检验名称,该文本对应于生存曲线的比较。仅在pval=TRUE时使用test.for.trend逻辑值,默认为FALSE,如果是TRUE,返回p值的趋势检测surv.median.line用于在中间生存点绘制水平/垂直线的字符向量,可选择的值包括c("none","hv","h","v")中的一个,其中v:垂直,h:水平risk.table显示绝对数量和风险个体的百分比cumevents指定是否显示累计事件数表的逻辑值,默认值为FALSEcumcensor逻辑值,指定是否显示审查累计次数的表,默认值为FALSEtables.height数值(在[0-1]中),指定主生存图下所有表的一般高度add.all逻辑值如果为真,则将合并患者的生存曲线(空模型)添加到主图中combine逻辑值如果为TRUE,则在同一绘图上合并列表survfit对象2.3 示例:
#首先,安装并加载包,直接在R中安装即可
install.packages("survival")install.packages("survminer")library(survival)library(survminer)
#示例数据选用R语言中非常出名的lung数据集
#查看数据组成View(lung)
#表中数据解释:
•time:患者生存时间,单位是days•status:患者结局,1表示删失,2表示死亡•其余变量:自变量,比如:age表示年龄,sex表示性别等等
#然后,使用该数据拟合生存曲线 (这里使用Survival包,具体生存分析的方法可以查看Survival包学习文档)
fit<- survfit(Surv(time, status) ~ sex, data = lung)
#构建好fit对象后,开始画图
#默认参数画图ggsurvplot(fit, data = lung)
# 添加中位生存ggsurvplot(fit, data = lung, surv.median.line = "hv")
# 改变标签: title & labelsggsurvplot(fit, data = lung, surv.median.line = "hv", legend = "bottom", #将图例移动到下方 legend.title = "sex", #改变图例名称 legend.labs = c("Male", "Female"), linetype = "strata")# 改变线条类型
# 添加p值和置信区间ggsurvplot(fit, data = lung, surv.median.line = "hv",legend.title = "sex", legend.labs = c("Male", "Female"), pval = TRUE,conf.int = TRUE)
# p值其他添加方法# 指定p值ggsurvplot(fit, data = lung, pval = 0.04)
# 指定字符ggsurvplot(fit, data = lung, pval = "The hot p-value is: 0.031")
# 添加风险表ggsurvplot(fit, data = lung, surv.median.line = "hv",legend.title = "sex", legend.labs = c("Male", "Female"), pval = TRUE,conf.int = TRUE,risk.table = TRUE, tables.height = 0.2,tables.theme =theme_cleantable())
# 颜色设置:palettes. ggsurvplot(fit, data = lung, surv.median.line = "hv",legend.title = "sex", legend.labs = c("Male", "Female"), pval = TRUE,conf.int = TRUE,risk.table = TRUE, tables.height = 0.2,tables.theme =theme_cleantable(), palette = c("#E7B800", "#2E9FDF"))
# 同时改变font size, style and colorggsurvplot(fit, data = lung, main = "Survival curve", font.main = c(16, "bold", "blue"), font.x = c(14, "bold.italic", "red"), font.y = c(14, "bold.italic", "grey"), font.tickslab = c(12, "plain", "darkgreen"))
#接下来,我们将讲解如何在一张图片上绘制多个生存曲线,这里使用R内置数据colon(自变量更多)
#查看colon数据View(colon)
#我们选择自变量sex(性别)+ rx(治疗方式)+adhere(邻近器官)
#拟合多个生存曲线fit3 <- survfit( Surv(time, status) ~ sex + rx + adhere,data = colon )# 画多个生存曲线 ggsurvplot(fit3, data = colon, fun = "cumhaz", conf.int = TRUE, ggtheme = theme_bw())
#以上图形可以看出,图形复杂且杂乱,因此需要分割图片
# 分割开多个生存曲线 ggsurv<-ggsurvplot(fit3, data = colon, fun = "cumhaz", conf.int = TRUE, risk.table = TRUE, risk.table.col="strata", ggtheme = theme_bw())curv_facet <- ggsurv$plot + facet_grid(rx ~ adhere)curv_facet
#风险表也需要分割
#每一个facet plot item对应一个风险表,水平垂直都分割ggsurv$table + facet_grid(rx ~ adhere, scales = "free")+ theme(legend.position = "none")
#或者,每一个facet columns对应一个风险表,只分割垂直方向tbl_facet <- ggsurv$table + facet_grid(.~ adhere, scales = "free")tbl_facet + theme(legend.position = "none")
#最终合并分割后生存曲线和风险表,主要应用ggplot包的gridExtra函数
# 合并生存曲线和风险表g2 <- ggplotGrob(curv_facet)g3 <- ggplotGrob(tbl_facet)min_ncol <- min(ncol(g2), ncol(g3))#gridExtra::gtable_rbind表示合并表格g <-gridExtra::gtable_rbind(g2[, 1:min_ncol], g3[, 1:min_ncol], size="last")g$widths <- grid::unit.pmax(g2$widths, g3$widths)# 最终绘制于一张图上grid::grid.newpage()grid::grid.draw(g)
#因图片偏大,建议自行运行代码查看
3.主要函数arrange_ggsurvplots ()
3.1用法:
arrange_ggsurvplots(x, print = TRUE, title = NA, ncol = 2, nrow = 1, surv.plot.height = NULL, risk.table.height = NULL, ncensor.plot.height = NULL, ...)
3.2 参数详解:
参数用法xggsurvplots的列表print逻辑值。如果为TRUE,则显示排列的图title图片的标题。默认值为NAsurv.plot.height网格上生存点的高度,默认:0.75risk.table.height网格上风险表的高度,默认值为0.25,当risk.table=FALSE时忽略ncensor.plot.height删失点的高度,当 ncensor.plot = TRUE时使用3.3 示例:
# 从lung数据库和colon数据库中分别构建两个生存曲线fit1<- survfit(Surv(time, status) ~ sex, data = lung)fit2<- survfit(Surv(time, status) ~ adhere, data = colon)# 图1选择fit1,图2选择fit2,先分别画图splots <-list()splots[[1]] <- ggsurvplot(fit1, data = lung, risk.table = TRUE, ggtheme = theme_minimal())splots[[2]]<- ggsurvplot(fit2, data = colon, risk.table = TRUE, ggtheme = theme_grey())# 合并在同一张图中arrange_ggsurvplots(splots, print = TRUE, ncol = 2, nrow = 1, risk.table.height = 0.4)
# 也可以不输出,直接保存pdf格式在指定文件夹res <- arrange_ggsurvplots(splots, print = FALSE)ggsave("myfile.pdf", res)
4.主要函数ggcoxzph()
4.1 用法:
ggcoxzph(fit, resid = TRUE, se = TRUE, df = 4, nsmo = 40, var, point.col = "red", point.size = 1, point.shape = 19, point.alpha = 1, caption = NULL, ggtheme = theme_survminer(), ...)
4.2 参数:
参数作用fitcox.zph类对象resid逻辑值,如果为TRUE,则残差和拟合度包括在绘图中se如果逻辑值为TRUE,则将在两个标准误差处添加置信区间df拟合曲线的自由度,df=2,表示线性拟合nsmo用来画拟合的样条平滑曲线点的数目4.3 示例:
#依旧使用 lung数据# 行cox回归和ph检验fit <- coxph(Surv(time, status) ~ sex + age, data = lung)ftest <- cox.zph(fit)# 查看cox回归整体模型ftest
#画所有变量ggcoxzph(ftest)
# 用指定变量顺序和变量画图,font.main标题的字体样式ggcoxzph(ftest, var = c("age", "sex"), font.main = 10)
#Cox模型Ph检验图看法:(以上图结果为例)
•cox回归模型cox.zph.fit,模型的整体检验P值(GLOBAL)是0.194,大于0.05,说明模型整体满足PH检验。•从上图可以看出,二个变量的P值均大于0.05,说明每个变量均满足PH检验。•上图中实线是拟合的样条平滑曲线(黑色实线),虚线表示拟合曲线上下2个单位的标准差(黑色虚线)。如果残差曲线(红色的点)偏离2个单位的标准差则表示不满足比例风险假定。从上图中可见,各协变量满足PH风险假设。•正常情况下,以上Schoenfeld残差(图中红色的点)应该与时间无关,如果残差与时间有相关趋势,则违反PH假设的证据。残差图上,横轴代表时间,如果残差均匀的分布,则表示残差与时间相互独立。
5.小结
当然,实现生存分析可视化的方法还有很多,比如:SPSS、Graphpad Prism等多种作图工具,小伙伴们可以依据自己的爱好自行选择哦。