Cox比例风险模型做了数个假设。因此,评估拟合的Cox回归模型是否能充分描述数据是很重要的。
- 测试比例风险假设。
- 检查异常值。
- 检测对数风险(log hazard)与协变量之间关系的非线性情况。
为了检验这些模型假设,使用了残差法。Cox模型的常见残差包括:
Schoenfeld residuals 来检验风险概率假设 - Cox .zph()
Deviance residual (symmetric transformation of the Martinguale residuals) 检测异常值 -ggcoxdiagnostics()
Martingale residual评估非线性 - ggcoxfunctional()
# R中评估Cox模型的可靠性
## R 环境
install.packages(c("survival", "survminer"))
library("survival")
library("survminer")
## 构建Cox模型
library("survival")
res.cox <- coxph(Surv(time, status) ~ age + sex + wt.loss, data = lung)
res.cox
Call:
coxph(formula = Surv(time, status) ~ age + sex + wt.loss, data = lung)
coef exp(coef) se(coef) z p
age 0.02009 1.02029 0.00966 2.08 0.0377
sex -0.52103 0.59391 0.17435 -2.99 0.0028
wt.loss 0.00076 1.00076 0.00619 0.12 0.9024
Likelihood ratio test=14.7 on 3 df, p=0.00212
n= 214, number of events= 152
(14 observations deleted due to missingness)
## 1. 风险概率假设
函数Cox .zph()[在生存软件包中]提供了一个方便的解决方案,来检验Cox回归模型拟合中包含的每个协变量的比例风险假设。
对于每个协变量,函数cox.zph()将相应的缩放Schoenfeld残差集与时间相关联,以检验残差与时间之间的独立性。此外,它对模型作为一个整体执行整体的检验。
library("survival")
res.cox <- coxph(Surv(time, status) ~ age + sex + wt.loss, data = lung)
res.cox
Call:
coxph(formula = Surv(time, status) ~ age + sex + wt.loss, data = lung)
coef exp(coef) se(coef) z p
age 0.02009 1.02029 0.00966 2.08 0.0377
sex -0.52103 0.59391 0.17435 -2.99 0.0028
wt.loss 0.00076 1.00076 0.00619 0.12 0.9024
Likelihood ratio test=14.7 on 3 df, p=0.00212
n= 214, number of events= 152
- 风险比例假设
test.ph <- cox.zph(res.cox)
test.ph
chisq df p
age 0.5077 1 0.48
sex 2.5489 1 0.11
wt.loss 0.0144 1 0.90
GLOBAL 3.0051 3 0.39
可以使用survminer包的ggcoxzph()函数进行图形诊断,该函数为每个协变量生成依赖时间的缩放的Schoenfeld residuals 图。
ggcoxzph(test.ph)
在上图中,实线是拟合的线,虚线表示拟合线的一个+/- 2倍标准误差范围。
性别的图,因为男女的影响分了层。
## 2.异常值检测
为了测试有影响的观察结果或异常值,可以可视化下面结果:
- the deviance residuals
- the dfbeta values
survminer包中函数ggcoxdiagnostics()为检查有影响的观察提供了一个方便的解决方案。
ggcoxdiagnostics(fit, type = , linear.predictions = TRUE)
fit: coxph.object对象。
type: 在Y轴上呈现的残差类型。c(“martingale”, “deviance”, “score”, “schoenfeld”, “dfbeta”, “dfbetas”, “scaledsch”, “partial”).
linear.predictions: 一个逻辑值,指示是显示观测对象的线性预测(TRUE),还是只是在X轴上显示观测对象的索引(FALSE)。
指定参数type = " dfbeta ",依次删除每个观测值,绘制回归系数的估计变化;同样,type= " dfbetas "产生系数的估计变化除以它们的标准误差。
ggcoxdiagnostics(res.cox, type = "dfbeta",
linear.predictions = FALSE, ggtheme = theme_bw())
也可以通过可视化deviance残差来检查离群值。deviance残差是martingale residual的正态变换。当这些残差应大致对称地分布在零附近,标准差应该为1。
正值对应的是相对于预期生存时间而言“过早死亡”的个体。
负值对应的是“活得太久”的个体。
非常大或非常小的值都是离群值,这是模型无法准确预测的。
ggcoxdiagnostics(res.cox, type = "deviance",
linear.predictions = FALSE, ggtheme = theme_bw())
## 3. 检验非线性
通常,我们假设连续协变量具有线性形式。然而,这个假设应该被检查。
对连续协变量绘制Martingale residuals 是一种常用的检测非线性的方法.
鞅残差可以表现为(-INF, +1)范围内的任意值:
鞅残差在1附近的值表示个体“过早死亡”;
较大的负值对应个体“活得太久”。
函数ggcoxfunctional()显示了无效cox比例风险模型中连续协变量对martingale residuals的图。这有助于合理选择Cox模型中连续变量的函数形式。拟合线应该是线性的表示满足Cox比例风险模型的假设。
ggcoxfunctional(Surv(time, status) ~ age + log(age) + sqrt(age), data = lung)
图中有一点非线性。
# 原文
STHDA Cox Model Assumptions
系列文章
- 生存分析入门和R分析
- Cox比例风险模型
- Cox模型的假设