• 发文
  • 评论
  • 微博
  • 空间
  • 微信

生信代码:生存曲线绘制!

科研菌 2020-12-30 22:28 发文

引言:

   生存分析是临床上较为常用的统计学方法,用于比较不同组别的患者在接受干预之后,生存时间的变化情况。生存分析是医学领域中一个重要的内容,在各个疾病领域的研究中都运用十分广泛。在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等多种作图工具,小伙伴们可以依据自己的爱好自行选择哦。

声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    科研菌

    每天为您提供高质量的原创科研论文...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码