浅谈生存分析
浅 谈 生 存 分 析
在生物医学研究中,生存分析是非常重要和常见的分析方法。本文对生存分析中的Kaplan–Meier模型、Cox比例风险模型进行简要的介绍,帮助大家更好地理解生存分析等相关概念。
简介生存分析使用场景
Kaplan–Meier方法
一、方法介绍
A列是从试验开始起,持续的观测时间,星号代表在该时间有删失数据发生; B列是指在A列对应的时间开始之前所有存活的研究对象个数,也可以叫做at risk的人数,表示当前具有死亡风险的有效人群,是排除了已经死亡和删失的数据之后剩余的人数; C列为恰好在A列对应的时间死亡的人数; D列是在该时间点删失的个数,即在实验过程中丢失的、失去跟踪的数据。
上面这个例子的思路就是Kaplan–Meier方法的主要思路,我们也可以用数学公式来表示。一共有m个时间点,每个时间点用下标 i 来表示, i 为从 1 到 m 的整数, 生存概率 S(ti) 可以表示为:
其中,ti 表示第 i 个时间点,ni 表示在 ti 之前的有效人数,di 表示在 ti 死亡的人数,S(ti-1) 表示在上一个时间点 i-1 的生存概率。
根据这一公式,我们可以画图来展示生存率的变化情况,即Kaplan-Meier生存曲线,如下图所示:
一般来说,生存分析是要比较不同组之间的一个生存情况,因此Kaplan-Meier生存曲线一般不止一条曲线。如果想比较整体生存时间分布是否存在统计学差异,一般我们可以采用Logrank统计方法来对生存数据进行统计分析。Logrank统计方法假设两组的生存时间分布一致,去检验是否能拒绝该假设。
除了Logrank检验之外,常用的检验包括Breslow检验,即Wilcoxon检验。该方法加入了权重因子,即每个时刻的总人数,使得试验前期的权重较大,贡献更大,所以Breslow检验对试验前期的差异更加敏感。
Cox模型
Kaplan-Meier方法只能针对单一的变量进行分析,无法同时考察多个因素。当需要同时考察多个因素的影响时,这时我们可以使用Cox比例风险回归模型。
Cox比例风险回归模型(Cox's proportional hazards regression model),简称Cox模型,Cox来自提出者英国统计学家D.R.Cox的名字,主要用于肿瘤和其他疾病的预后分析。这个模型是一种半参数回归模型,因为它的公式中既包含参数模型又包含非参数模型。
其中
t是生存时间,
x1, x2到xp指的是具有预测效应的多个变量,
b1,b2到bp则是每个变量对应的effect size,即效应量,可以理解为结果的影响程度。
h(t)就是不同时间t的 hazard,即风险值,例如在观测死亡事件时,指的是研究对象从试验开始到某个特定时间t之前存活,但在t时间点发生死亡的概率。
h0(t)是基准风险函数,也就是说在其他协变量x1, x2到xp都为0时,即不起作用时,衡量风险值的函数。
install.packages(c("survival","survminer"))
library("survival")
library("survminer")
coxph(formula, data, method)
data("lung")
res.cox <- coxph(Surv(time, status) ~ sex, data = lung)
summary(res.cox)
Call:
coxph(formula = Surv(time, status) ~ sex, data = lung)
n= 228, number of events= 165
coef exp(coef) se(coef) z Pr(>|z|)
sex -0.5310 0.5880 0.1672 -3.176 0.00149 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
exp(coef) exp(-coef) lower .95 upper .95
sex 0.588 1.701 0.4237 0.816
Concordance= 0.579 (se = 0.022 )
Rsquare= 0.046 (max possible= 0.999 )
Likelihood ratio test= 10.63 on 1 df, p=0.001111
Wald test = 10.09 on 1 df, p=0.001491
Score (logrank) test = 10.33 on 1 df, p=0.001312
res.cox <- coxph(Surv(time, status) ~ age+sex+ph.ecog, data = lung)
summary(res.cox)
fit <- survfit(res.cox, data = lung)
ggsurvplot(fit, conf.int = TRUE, legend.labs=c("Sex=1", "Sex=2"),
ggtheme = theme_minimal())
1
往期精彩回顾