这里介绍生存曲线的绘制,对于生物医学领域来说,文章中很常见的图。
一.数据处理
如果你想获取该数据用于自己练习,下面是获取数据的地址:
https://docs.qq.com/sheet/DV1JxUnpRR3FqbWN3
数据格式是这样的。
数据第A列是病人ID,B到I列临床信息,其他列是病人的标准化后的基因表达数据。
我们只需要左侧红框的临床数据和一列基因表达数据。
library(dplyr)library(survival)library(survminer)data "BioInfoNotesData3.csv",row.names = data datadata$Time datadata data, Time, everything())surdata 1,colnames(surdata) "Time",surdata$Status $Status==surdata$Group $Gene>median(surdatasurdata$Time $Time/surdata 1,head(surdata)
处理后的数据如下:
一列时间,一列生存状态,如果样本的状态是“Dead”,生存分析时候用死亡时间;同样的,如果样本状态是"Alive",那就用最后随访的时间。Alive为0,Dead为1。一列根据基因表达值高低分为2组。
二.绘图
绘图我们用survival包中的survfit函数,该包是用于生存分析的包。这里简单提一下生存分析里面的参数,参数formula写成Surv(Time,Status) ~ Group 的形式,这里是按照前面的数据写的,你名称不一样可以换,但顺序不能变。当然,该包还可以用于其他模型的分析。
survfit(formula, data, weights, subset, na.action, stype=1, ctype=1, id, cluster, istate, timefix=TRUE, etype, error, ...)
我们用前面的数据拟合曲线
fit ~ Group, data = surdata)
拟合的曲线是可以直接用plot来绘图的。
plot(fit, lty = 2:3)
但用plot来绘图需要自己写很多参数,既然有人造好了轮子,我们就直接用就行啦。
ggsurvplot(fit,palette = c("#E7B800", "#2E9FDF"),# 自定义调色板 #conf.int =TRUE,# 增加置信区间 xlab ="Time in Year", #x轴标题 urv.median.line = "hv", #增加中位生存时间 risk.table = TRUE,# 添加风险表 pval = TRUE, # 添加P值 legend.title = "",# 设置图例标题,这里设置不显示标题,用空格替代 legend = c(0.8,0.75), # 指定图例位置 legend.labs = c("High", "Low")# 指定图例分组标签 #ggtheme =theme_light() )
每一个参数在上面都已经解释了,你可以改改,看看结果图,就知道各参数含义。
另外,还有一个ggsurvplot函数也用来绘制生存曲线。
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, ...
参数解释:
- fit # 拟合的生存曲线对象,就是前面拟合的数据
- data # 用来拟合生存曲线的数据集,如果没有提供,那么数据将从'fit'对象中提取。
- fun # 常用三个字符参数;"event"绘制累计风险概率图 (f(y)=1-y);"cumhaz"绘制累计风险(HR),"pct"绘制生存概率(用百分比表示)
- color # 设置生存曲线的颜色。
- cumevents # 逻辑词,是否添加累积事件表
- cumcensor # 逻辑词,是否添加累积删失表
- tables.height = 0.25 # 生存曲线图下所有生存表的高度,数值0-1之间
- group.by # 包含分组变量名称的字符向量,向量长度≤2
- facet.by # 字符向量,指定绘制分面生存曲线的分组变量(应≤2)的名称
- ggtheme=theme_survminer() # 设置ggplot2主题,如ggtheme =theme_light();theme_survminer、theme_cleantable(),也可以是其他包的主题,比如ggpugr包的主题。
- tables.theme # 作用于生存表的ggplot2主题名称。
- tables.height # 数值(在[0 - 1]中),指定主要生存图下所有表的高度。
- add.all = FALSE # 逻辑词;是否添加总患者生存曲线到主生存图中
- palette # 调色板,默认"hue"。可选调色板有"grey", "npg", "aaas", "lancet", "jco", "ucscgb", "uchicago", "simpsons" 和 "rickandmorty",除此以外你自己可以指定颜色码,比如前面我指定的"#E7B800", "#2E9FDF"。
- linetype = 1 # 设置曲线线型。可以按"strata"设置线型;或按数字向量c(1, 2)或按字符向量c("solid", "dashed")设置
- conf.int # 逻辑词;默认FASLE;为TRUE则绘制曲线置信区间
- pval = FALSE # 逻辑词;为TRUE则将统计检验计算的p值添加到图上;为数字,则直接指定P值大小,如pval = 0.03;为字符串,则添加字符串到图上,如pval = "p-value: 0.031"
- pval.method # 逻辑词,是否添加计算p值的统计方法的文本;只有当 pval = TRUE时, 才会在图上添加检验方法文本
- test.for.trend # 逻辑词,默认为FALSE;为TRUE则返回趋势p值的检验,趋势检验旨在检验生存曲线的有序差异
- surv.median.line # 在中位生存时间点处绘制水平或垂直线的字符向量;可用值有"none"、"hv"、"h"、"v";其中v绘制垂直线,h绘制水平线。
- risk.table = FALSE # 逻辑词,图上是否添加风险表;"absolute" 显示处于风险中的绝对数量;"percentage" 显示处于风险中的百分比数量;"abs_pct" 显示处于风险中的绝对数量和百分比
其实,参数和上面的ggsurvplot函数是一样的。
ggsurvplot(fit,palette = c("#FF3030", "#0000FF"), xlab ="Time in Year", #x轴标题 urv.median.line = "hv", #增加中位生存时间 #risk.table = TRUE,# 添加风险表 pval = TRUE, # 添加P值 legend.title = "",# 设置图例标题,这里设置不显示标题,用空格替代 legend = c(0.8,0.75), # 指定图例位置 legend.labs = c("High", "Low") ,# 指定图例分组标签 ggtheme =theme_survminer())
ggsurvplot(fit,palette = c("#FF3030", "#0000FF"), linetype =1, xlab ="Time in Year", #x轴标题 urv.median.line = "hv", #增加中位生存时间 #risk.table = TRUE,# 添加风险表 pval = TRUE, # 添加P值 pval.coord=c(15,0.75), legend.title = "",# 设置图例标题,这里设置不显示标题,用空格替代 legend = c(0.8,0.75), # 指定图例位置 legend.labs = c("High", "Low") ,# 指定图例分组标签 ggtheme =theme_test())
参考资料:
1.survival帮助文档
2.survminer帮助文档