Cox比例风险模型(Cox, 1972)本质上是统计学回归模型,医学研究中常用于调查患者生存时间与一个或多个预测变量之间的关系。
生存分析的步骤:
- 定义危险和生存函数,
- 构建不同患者组的Kaplan-Meier生存曲线,
- 两个或多个生存曲线之间进行log-rank检验
Kaplan-Meier曲线和log-rank检验是单因素分析。在研究中,只研究一个因素的影响,进而忽略了其他因素的影响。
此外,Kaplan-Meier曲线和log-rank检验只有在预测变量是分类的情况下才有用(例如:治疗A vs治疗B;男性和女性)。对于基因表达、体重或年龄等定量预测指标,它们并不能很好的分析。
这儿要提出一种新的方法,那就是Cox比例风险回归分析,既适用于定量预测变量,也适用于分类变量。
Cox回归模型不仅适用于离散或连续性变量,还可以同时评估多个危险因素对生存时间的影响。
# 基本的Cox比例风险模型
Cox比例风险模型可同时评估多个因子对生存的影响。在特定时间点事件发生的概率就是风险概率( hazard rate),预测风险概率的因素被称为协变量。
Cox模型用风险函数h(t)表示。简单地说,风险函数可以解释为t时刻的死亡风险,可以用下面方程计算:
- t表示生存时间
- h(t)是由一组协变量(x1,x2,…,xp)确定的风险函数,系数(b1,b2,…,bp)表示了协变量的影响(即效应量)。
- 术语h0称为基准危险。当所有协变量xi等于0 (exp(0)等于1)时风险概率。
exp(bi)称为危险比(HR)。bi>0的风险比,表明随着第i个协变量的值的增加,事件风险增加,因此生存时间缩短。换句话说,风险比大于1表示协变量与事件概率正相关,因此与生存时间负相关。
- HR = 1: 没有影响
- HR < 1: 减少风险概率
- HR > 1: 增加风险概率
如果存在两个病人 k 和k’,各自风险函数和风险函数比例如下:
- 病人 k的风险函数
- 病人k’的风险函数
- 两者之间的比,不受时间的影响
换句话说,如果一个人在最初的某个时间点的死亡风险是另一个人的两倍,那么在以后的所有时间里,死亡风险仍然是另一个人的两倍。
# 在R中构建Cox模型
Survival包用于生存分析计算
survminer包用于可视化生存分析结果
install.packages(c("survival", "survminer"))
library("survival")
library("survminer")
survival 包中coxph()可以用于构建Cox比例风险回归模型。
coxph(formula, data, method)
formula: 为以生存对象为响应变量的线性模型。函数Surv()创建生存对象,如:Surv(时间,事件)。
Data: 包含变的数据框。
method: 默认efron, 还有‘breslow’ 和 ‘exact’.
示例
data("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: 机构代码
- time: 生存时间(天)
- status: 审查状态,1=截尾,2=死亡
- age: 年龄
- sex: Male=1 Female=2
- ph.ecog: ECOG 评分 (0=good 5=dead)
- ph.karno: 医生进行的Karnofsky 评分 (bad=0-good=100)
- pat.karno: 病人自己进行的Karnofsky 评分
- meal.cal: 用餐时摄入的卡路里
- wt.loss: 过去六个月体重减轻
对协变量: age, sex, ph.ecog and wt.loss, 首先进行单变量Cox分析; 然后我们将使用两个变量进行多变量cox分析来探究这些因素是如何共同影响生存的。
## 单变量Cox回归
res.cox <- coxph(Surv(time, status) ~ sex, data = lung)
res.cox
Call:
coxph(formula = Surv(time, status) ~ sex, data = lung)
coef exp(coef) se(coef) z p
sex -0.531 0.588 0.167 -3.18 0.0015
Likelihood ratio test=10.6 on 1 df, p=0.00111
n= 228, number of events= 165
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
- 统计显著性: z Pr(>|z|) 给出了Wald 统计显著性,计算方式是每个回归系数除以标准差 (z = coef/se(coef)). wald 统计评估的是变量的beta (β)系数是否显著偏离0;
- 回归系数:正数表示预后比较好,负数表示预后比较差;在这个模型中,性别betax系数等于 -0.53,表明女性的死亡风险(存活率)低于男性。
- 风险比(Hazard ratios.): 指数系数(exp(coef) = exp(-0.53) = 0.59),也称为风险比,给出了协变量的效应大小。例如,女性(性别=2)可以将风险降低0.59倍,即41%。女性与良好的预后有关。
- 风险比的置信区间。输出还给出了风险比(exp(coef))的上下95%置信区间,下95%= 0.4237,上95%= 0.816。
- 模型的整体统计显著性。整个模型的显著性提供了三种可选检验的p值:似然比检验( likelihood-ratio test)、Wald检验(Wald test)和log-rank打分(score logrank statistics.)。这三种方法对于足够大的N,它们会得到类似的结果。对于小N,它们可能会有所不同。似然比检验在样本量小的情况下具有更好的性能,因此通常首选它。
## 对每个协变量进行单因素cox分析。
covariates <- c("age", "sex", "ph.karno", "ph.ecog", "wt.loss")
univ_formulas <- sapply(covariates,
function(x) as.formula(paste('Surv(time, status)~', x)))
univ_models <- lapply( univ_formulas, function(x){coxph(x, data = lung)})
# Extract data
univ_results <- lapply(univ_models,
function(x){
x <- summary(x)
p.value<-signif(x$wald["pvalue"], digits=2)
wald.test<-signif(x$wald["test"], digits=2)
beta<-signif(x$coef[1], digits=2);#coeficient beta
HR <-signif(x$coef[2], digits=2);#exp(beta)
HR.confint.lower <- signif(x$conf.int[,"lower .95"], 2)
HR.confint.upper <- signif(x$conf.int[,"upper .95"],2)
HR <- paste0(HR, " (",
HR.confint.lower, "-", HR.confint.upper, ")")
res<-c(beta, HR, wald.test, p.value)
names(res)<-c("beta", "HR (95% CI for HR)", "wald.test",
"p.value")
return(res)
#return(exp(cbind(coef(x),confint(x))))
})
res <- t(as.data.frame(univ_results, check.names = FALSE))
as.data.frame(res)
beta HR (95% CI for HR) wald.test p.value
age 0.019 1 (1-1) 4.1 0.042
sex -0.53 0.59 (0.42-0.82) 10 0.0015
ph.karno -0.016 0.98 (0.97-1) 7.9 0.005
ph.ecog 0.48 1.6 (1.3-2) 18 2.7e-05
wt.loss 0.0013 1 (0.99-1) 0.05 0.83
上面的结果显示了回归系数、效应量(以风险比表示)和每个变量在总体生存率方面的统计显著性。通过单独的单变量Cox回归来评估每个因素对生存的影响。
现在,我们想要研究这些因素是如何共同影响生存的。为了回答这个问题,我们将进行多元Cox回归分析。由于ph.karno在单变量Cox分析中不显著,将在多变量分析中剔除它。我们将把3个因素(性别、年龄和博士)纳入多元模型。
## 多元回归分析
res.cox <- coxph(Surv(time, status) ~ age + sex + ph.ecog, data = lung)
summary(res.cox)
Call:
coxph(formula = Surv(time, status) ~ age + sex + ph.ecog, data = lung)
n= 227, number of events= 164
(1 observation deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
age 0.011067 1.011128 0.009267 1.194 0.232416
sex -0.552612 0.575445 0.167739 -3.294 0.000986 ***
ph.ecog 0.463728 1.589991 0.113577 4.083 4.45e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
exp(coef) exp(-coef) lower .95 upper .95
age 1.0111 0.9890 0.9929 1.0297
sex 0.5754 1.7378 0.4142 0.7994
ph.ecog 1.5900 0.6289 1.2727 1.9864
Concordance= 0.637 (se = 0.026 )
Rsquare= 0.126 (max possible= 0.999 )
Likelihood ratio test= 30.5 on 3 df, p=1.083e-06
Wald test = 29.93 on 3 df, p=1.428e-06
Score (logrank) test = 30.5 on 3 df, p=1.083e-06
三种检验中(likelihood, Wald和score)的p值都是显著的,表明模型是显著的。这些检验基于的无效假设是所有beta (β)是0。在上面的例子中,无效假设均被拒绝。
多变量Cox分析中,性别和 ph.ecog是显著的(p < 0.05)。但协变量年龄不显著(p = 0.23,大于0.05)。
## 可视化生存时间的估计分布
用Cox模型对数据进行拟合后,就可以在任何给定时间点对特定风险组的预测生存概率进行可视化。函数survfit()估计生存概率,默认情况下是协变量的平均值。
# Plot the baseline survival function
ggsurvplot(survfit(res.cox), color = "#2E9FDF",data = lung,
ggtheme = theme_minimal())
想要评估性别对估计生存概率的影响。在本例中,构造了一个有两行的新数据,每一行代表一个性别值;其他协变量设置为它们的平均值(如果是连续变量)或最低水平(如果是离散变量)。对于一个 虚拟变量(dummy covariate),平均值是数据集中编码为1的比例。
# Create the new data
sex_df <- with(lung,
data.frame(sex = c(1, 2),
age = rep(mean(age, na.rm = TRUE), 2),
ph.ecog = c(1, 1)
)
)
sex_df
sex age ph.ecog
1 1 62.44737 1
2 2 62.44737 1
# Survival curves
fit <- survfit(res.cox, newdata = sex_df)
ggsurvplot(fit, conf.int = TRUE, legend.labs=c("Sex=1", "Sex=2"),data = lung,
ggtheme = theme_minimal())
# 原文:
- STHDA Cox Proportional-Hazards Model
- Cox DR (1972). Regression models and life tables (with discussion). J R Statist Soc B 34: 187–220
- MJ Bradburn, TG Clark, SB Love and DG Altman. Survival Analysis Part II: Multivariate data analysis – an introduction to concepts and methods. British Journal of Cancer (2003) 89, 431 – 436
系列文章
- 生存分析入门和R分析
- Cox比例风险模型
- Cox模型的假设