生存分析

目录

一、生存分析
  基本术语
二、R语言实现
  0.加载包
  1.示例数据,R包自带数据集"lung"
  2.创建生存对象并拟合函数
  3.可视化
    3.1 默认设置作图
    3.2 我的偏好作图
    3.3 我的作图函数
三、其他
  1.p值如何计算

一、生存分析

一些医学事件所经历的时间,从开始观察到事件发生的时间,不是短期内可以明确判断的。
e.g.乳腺癌病人术后生存时间
针对这类生存资料的分析方法:生存分析

基本术语

event 事件

例如,患者死亡,患者复发……取决于研究要观察的事件

time 时间

一般指,从开始观察到事件发生的时间。

xx期 定义
OS(Overall survival) 总体生存期:从初次治疗到患者死亡的时间。
RFS(Recurrence free survival) 无复发生存期:从初次治疗到出现复发或者随访截止的时间。
PFS(Progression-free survival) 从初次治疗到疾病进展或因任何原因死亡的时间。一般PFS越长,意味着患者有质量的生存时间越长,活得越好。

status 状态

status     含义
1 观察对象出现了终点事件,e.g.观察对象在手术后5年死亡
0 观察对象没有出现终点事件,e.g.观察对象在手术后第3年,与该患者失去联络,该患者的生存情况未知;或者该患者仍存活;或者……

二、R语言实现

0.加载包(如果没有,就安装)

library(survival)
library(survminer)

1. 示例数据,R包自带数据集"lung"

head(lung)
  inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
1    3  306      2  74   1       1       90       100     1175      NA
2    3  455      2  68   1       0       90        90     1225      15
3    3 1010      1  56   1       0       90        90       NA      15
4    5  210      2  57   1       1       90        60     1150      11
5    1  883      2  60   1       0      100        90       NA       0
6   12 1022      1  74   1       1       50        80      513       0
变量 含义
inst Institution code
time Survival time in days
status   censoring status 1=censored, 2=dead
age Age in years
sex Male=1 Female=2
ph.ecog     ECOG performance score as rated by the physician. 0=asymptomatic, 1= symptomatic but completely ambulatorph.karno: Karnofsky performance score (bad=0-good=100) rated by physician
pat.karno     Karnofsky performance score as rated by patient
meal.cal     Calories consumed at meals
wt.loss     Weight loss in last six months (pounds)

2.创建生存对象并拟合函数

创建生存对象需要三个变量

变量
时间,即time 例如生存的时间
状态 ,即status 例如这个样本是否出现终点事件(0或1)
分组标签 本例中分为男女两组

本文按照性别分组,男性是1,女性是2

table(lung$sex)
  1   2 
138  90 

接下来是创建生存对象

fit <- survfit(Surv(time, status) ~ sex, data = lung)             

3.可视化

3.1 默认设置作图

使用函数ggsurvplot()按照默认设置作图

ggsurvplot(fit)
Survival analysis

图中曲线下降说明某些观察对象出现了了终点事件;
图中的"+"表示是删失数据(Cencor),即未出现终点事件的观察对象,可能由于失去联络而未知该观察对象的生存情况。

3.2 我的作图偏好

其中HR(95%CI)和C-index是用函数annotate()添加,这部分要先计算cox模型。

注意点

  1. R语言运行的HR的含义。男性是1,女性是2。按顺序排序,男性是第一组,女性是第二组,HR=0.59 < 1的含义是第二组(女性)相对于第一组(男性)是一个保护因素。为了提前标记好分组的顺序,我的习惯是提前将分组标记为0,1……。

拟合cox模型,及一些必要的准备。

cox <- coxph(Surv(time, status) ~ sex, data = lung)
res <- summary(cox)
x <- lung$time

作图代码如下:

p<-ggsurvplot(fit,
           pval = TRUE, pval.coord = c(0.7*max(x), 1),
           pval.method = TRUE, pval.method.coord=c(0.4*max(x),1),
           risk.table = TRUE, risk.table.col = "strata",
           ggtheme = theme_linedraw(), 
           palette = c("darkblue", "red"), 
           legend.title = "Gender",
           legend.labs = c("Male", "Female"),
           xlab = "Time(days)", xlim = c(0,1000), break.x.by = 200, 
           ylab = "Survival probability"
           )
p$plot <- p$plot+
  theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank())+
  ggtitle("My Survival Plot")+
  theme(plot.title = element_text(hjust = 0.5))+
  annotate("text",x=0.7*max(x),y=0.91, label=paste0("HR(95%CI) = ", round(res$conf.int[1],2), "(",round(res$conf.int[3],2),"-", round(res$conf.int[4],2), ")" ))+
  annotate("text",x=0.7*max(x),y=0.83, label=paste0("C-index = ", round(res$concordance[1],2)))
p$table <- p$table+
  theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank())

png("My Survival analysis.png", width = 4290, height = 4930, res = 1000)
p
dev.off()
参数 含义
pval 是否显示p-value
pval.coord p-value的位置
pval.method 是否显示计算p-value的方法
pval.method.coord pval.method的位置,此处的代码意思是
risk.table 是否显示风险表
risk.table.col 设置风险表的颜色,此处设置为与分组(palette)颜色一致
ggtheme 设置主题,见ggplot2的主题设置
palette 设置分组颜色
legend.title 图例标题
legend.labs 两组的名称,此处设为"Male"和"Female"
xlab 设置x轴名称
xlim 设置x轴的取值范围
break.x.by 设置x轴的刻度
ylab 设置y轴名称
My Survival analysis

3.3 我的作图函数

输入数据object0是如下格式的数据框:

time status groups
xx 1 1
xx 0 0
…… …… ……

file_name 是保存的文件名,我要输出的图片格式是tiff,所以此处应该是"file_name.tiff"这样形式,如果要保存为其他图片格式,需要修改函数中的代码。
其余的参数是我要修改的地方,也就是按我的偏好设置图的地方。
要注意的是这些值都需要设置,可以根据自己的偏好去修改函数,不要的删去,要的留下。

ylab0 xlab0 break_x0 xlim0 legend_title0 legend_labs0
y轴名称 x轴名称 x轴刻度 x轴显示范围 图例标题 分组标签
loop_survival_analysis <- function(object0, file_name, ylab0, xlab0, break_x0,
                                   xlim0, legend_title0, legend_labs0){
  library(survival)
  library(survminer)
  
  # survfit()-------------------------------------------------------------------
  fit <- surv_fit(Surv(time, status) ~ groups, data = object0) 
  
  # cox-------------------------------------------------------------------------
  cox <- coxph(Surv(time, status) ~ groups, data = object0)
  res <- summary(cox)
  x <- object0$time
  
  # fig-------------------------------------------------------------------------
  p<-ggsurvplot(fit,
                pval = TRUE, pval.coord = c(0.7*max(x), 1),
                pval.method = TRUE, pval.method.coord=c(0.4*max(x),1),
                risk.table = TRUE, risk.table.col = "strata",
                ggtheme = theme_linedraw(), 
                palette = c("darkblue", "red"), 
                legend.title = legend_title0,
                legend.labs = legend_labs0,
                xlab = xlab0, xlim = xlim0, break.x.by = break_x0, 
                ylab = ylab0
                )
  
  p$plot <- p$plot+
    theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank())+
    # ggtitle("My Survival Plot")+
    theme(plot.title = element_text(hjust = 0.5))+
    annotate("text",x=0.7*max(x),y=0.91, label=paste0("HR(95%CI) = ", round(res$conf.int[1],2), "(",round(res$conf.int[3],2),"-", round(res$conf.int[4],2), ")" ))+
    annotate("text",x=0.7*max(x),y=0.83, label=paste0("C-index = ", round(res$concordance[1],2)))
  p$table <- p$table+
    theme(panel.grid.major=element_blank(),panel.grid.minor=element_blank())
  
  tiff(file_name, width = 4290, height = 4930, res = 1000)
  print(p)
  dev.off()
}

三、其他

1. p值如何计算

Log-Rank test是无参数检验,近似于卡方检验
H0:两组生存过程相同,H1:两组生存过程不同

取出p值

surv_diff <- survdiff(Surv(time, status) ~ sex, data = lung)
p.value <- 1 - pchisq(surv_diff$chisq, length(surv_diff$n) -1)

surv_diffs 如下所示

surv_diff

Call:
survdiff(formula = Surv(time, status) ~ sex, data = lung)

        N Observed Expected (O-E)^2/E (O-E)^2/V
sex=1 138      112     91.6      4.55      10.3
sex=2  90       53     73.4      5.68      10.3

 Chisq= 10.3  on 1 degrees of freedom, p= 0.001 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容