Cox模型的假设

作者: JeremyL | 来源:发表于2022-02-16 19:14 被阅读0次

    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模型的假设

        本文链接:https://www.haomeiwen.com/subject/zopdlrtx.html