R语言生存分析
杀杀
生存分析!首先是做生存分析的目的
生存分析:描述几类患者的生存/死亡/结局情况
举个例子:
健康的人在长期的随访时间内都不会死亡,如果我们有一百个健康人入组,那么没有意外的话,在一段时间内(如十年),这些人都会存活
患严重疾病(尤其是癌症晚期)的患者,在几年内则很有可能因为得不到有效治疗而死亡,假如我们有一百个癌症患者入组,那么可能在一年内,就有一部分人会死亡
既然我们是做癌症/疾病的研究,我们通常关心如何延长患者的生命,而不是像感冒一样研究药效或者是治愈时间。除了研究癌症机理,我们更关心什么因素在直接影响着患者的生命。因此,统计学家开发了生存分析的方法,利用已有的生存数据和特定的分组来描述不同组间的生存数据及情况
生存分析需要什么数据
最简单的生存分析需要两列数据:生存(特定结局)时间;生存状态(在这个时间终点时,患者是活着?还是死亡?还是已经无法联系到患者)
当然这样的数据只能画一条生存曲线,如果我们想对比两组间的生存,就必须根据某种因素将患者分成两组,因此正常的生存分析一般会有三列数据,再加一列分组label
生存曲线是怎么估计的:KM法(最常用的)
先明白几个概念:
-
患者是有一个统一的入组条件的,如确诊(一般都是确诊)/手术/开始临床实验等
-
截尾数据:截尾数据经常出现,主要原因是患者在随访中途丢失了,无法找到这个患者,不能确定这个患者未来的哪一天会发生终点事件,因此给它一个“删失”的标记。删失数据不能作为一个生存终点来计算生存概率,但是也没有必要丢弃,所以在生存曲线中用+表示。
-
横轴是时间,纵轴是生存概率,这表示随着时间的推移,患者存活的概率逐渐降低,那么如果在一组健康人和一组重症患者中,他们在不同的时间存活的概率一定会不同。
KM (Kaplan-Meier curve):乘积极限法,发明者:Kaplan和Meier
原理十分简单:
在每一次终点事件发生时,重新计算患者生存概率
这篇文档对生存分析的描述非常通俗易懂,因此引用一下,大家可以阅读,会对生存分析有更好的理解
http://www.360doc.com/content/17/0626/11/6175644_666623573.shtml
甚至可以试着在纸上画一下简单的生存曲线,以便理解其中的意义
p值计算是通过差异统计的方法估计的,使用不同的方法所估计的p值不同,ggplot2附加的生存分析函数ggsurvplot中可以有三种统计差异的方法,默认是logrank(长时间随访
生存分析画图注意事项:
x轴范围:选择最合适的时间单位(月份/年/天)
(根据需求制定你的x轴范围,如癌症研究一般认为,患者五年内不出现死亡,则未来他死亡的可能性会大大降低。因此即使我使用的是overall survival数据(随访时间可能长达一二十年),但五年后的情况对我意义不大,因此我的x轴范围仍然选择五年,如果终点事件是复发,也是一样的)
如果入组患者中,生存时间都比较短,大部分患者在一年内死亡了,那么这时候设定5年的范围是不明智的,建议这时候把x轴范围设为一年,并将单位更换成月,让你的图更加美观
年/月/天的选择其实都是根据实际情况的,终点事件在几个月内发生的,可以更换成天,一般正规的随访记录都是以天和月为单位,在没有月份为单位的原始数据中,一般将天数除以30
颜色(高风险适合使用偏暖一点的颜色,比如深红色,橙色等等(代表危险!),而预期生存好的一类建议使用冷色调,比如绿色,蓝色(代表生命力))平常看文献的时候如果有看到好看的配色可以保存一下。
生存分析代码
一般我们会使用ggsurvplot函数来绘制生存曲线,根据分组的不同,可以画出不同线条数的生存曲线。在绘制之前要先用survfit构建生存分析的模型(也就是乘积极限法的计算过程)
以下是我常用的代码以及注释,大家可以放进自己的生存分析数据中试试
data_demo <- data_demo1
surv_TTP<-survfit(Surv(os, event) ~ label, data =data_demo)
TitleNames <- "label" #你的分组的名字
title <- "demo survival analysis" #图的名字
legend_label <- c("group A","group B")
#画很多图的时候以上几个参数经常要变,所以写在外面方便更改
ggsurvplot(surv_TTP,
pval = TRUE, #计算并显示组间差异的显著性
pval.size = 6.5, #p值显示的大小
pval.coord=c(3,5),#p值的位置
conf.int = F, #是否显示置信区间,这里没显示
fun = "pct",palette=c("#0dc32f","#2e7bf0"), # "#2e7bf0" 颜色代码
risk.table = F, #风险表格,显示对应的患者数量
xlim = c(0, 120),#x轴范围,这里是120个月的意思
break.time.by = 24, #x轴间隔,每24个月显示一格
xlab = "Overall Survival (months)", #x轴的label
ylab = "Survival Proportion",#y轴的label
font.tickslab = 16, #x,y轴数字的大小
font.x = 18,font.y = 18, #x,y轴label的大小
font.subtitle = 18, #图片title的大小
font.legend = 7, #分组legend的大小
legend = c(0.1,0.3), #分组legend的位置
legend.labs = legend_label,#分组legend的内容
censor.size = 0, #删失标记的大小,0就是去掉删失标记
size = 1.2, #生存曲线的粗细
axes.offset = T, #绘图是否从原点开始,这个可以自己画一下看区别
#一般我会觉得True比较好看
legend.title = TitleNames,
main = "Survival curves",
submain = title)