Cox模型的假设

Cox比例风险模型做了数个假设。因此,评估拟合的Cox回归模型是否能充分描述数据是很重要的。

  • 测试比例风险假设。
  • 检查异常值。
  • 检测对数风险(log hazard)与协变量之间关系的非线性情况。

为了检验这些模型假设,使用了残差法。Cox模型的常见残差包括:

  1. Schoenfeld residuals 来检验风险概率假设 - Cox .zph()

  2. Deviance residual (symmetric transformation of the Martinguale residuals) 检测异常值 -ggcoxdiagnostics()

  3. 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)
image.png

在上图中,实线是拟合的线,虚线表示拟合线的一个+/- 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())
image.png

也可以通过可视化deviance残差来检查离群值。deviance残差是martingale residual的正态变换。当这些残差应大致对称地分布在零附近,标准差应该为1。

正值对应的是相对于预期生存时间而言“过早死亡”的个体。

负值对应的是“活得太久”的个体。

非常大或非常小的值都是离群值,这是模型无法准确预测的。

ggcoxdiagnostics(res.cox, type = "deviance",
                 linear.predictions = FALSE, ggtheme = theme_bw())
image.png

## 3. 检验非线性

通常,我们假设连续协变量具有线性形式。然而,这个假设应该被检查。

对连续协变量绘制Martingale residuals 是一种常用的检测非线性的方法.

鞅残差可以表现为(-INF, +1)范围内的任意值:

  • 鞅残差在1附近的值表示个体“过早死亡”;

  • 较大的负值对应个体“活得太久”。

函数ggcoxfunctional()显示了无效cox比例风险模型中连续协变量对martingale residuals的图。这有助于合理选择Cox模型中连续变量的函数形式。拟合线应该是线性的表示满足Cox比例风险模型的假设。

ggcoxfunctional(Surv(time, status) ~ age + log(age) + sqrt(age), data = lung)
image.png

图中有一点非线性。

# 原文

STHDA Cox Model Assumptions

系列文章

  1. 生存分析入门和R分析
  2. Cox比例风险模型
  3. Cox模型的假设

你可能感兴趣的:(Cox模型的假设)