用简单的 R 语言解释和验证 Cox 比例风险回归模型

机器算法验证 r 交叉验证 生存 cox模型
2022-01-29 04:09:19

有人可以用简单的英语向我解释我的 Cox 模型吗?

我使用该函数将以下 Cox 回归模型拟合到我的所有cph数据中。我的数据保存在一个名为Data. 变量wxy是连续的;z是两个水平的因子。时间以月为单位。我的一些患者缺少变量数据z注意:我已在下面适当地注意到 Harrell 博士的建议,即我估算这些值以避免使我的模型产生偏差,并且将来会这样做)。

> fit <- cph(formula = Surv(time, event) ~ w + x + y + z, data = Data, x = T, y = T, surv = T, time.inc = 12)

Cox Proportional Hazards Model
Frequencies of Missing Values Due to Each Variable
Surv(time, event)    w    x    y    z 
                0    0    0    0   14 

                Model Tests          Discrimination 
                                            Indexes        
Obs       152   LR chi2      8.33    R2       0.054    
Events     64   d.f.            4    g        0.437    
Center 0.7261   Pr(> chi2) 0.0803    gr       1.548    
                Score chi2   8.07                      
                Pr(> chi2) 0.0891                      

                   Coef    S.E.   Wald Z   Pr(>|Z|)
         w      -0.0133  0.0503    -0.26     0.7914  
         x      -0.0388  0.0351    -1.11     0.2679  
         y      -0.0363  0.0491    -0.74     0.4600  
         z=1     0.3208  0.2540     1.26     0.2067

我还尝试使用cox.zph下面的命令来测试比例风险的假设,但不知道如何解释其结果。放置plot()命令会给出错误消息。

 cox.zph(fit, transform="km", global=TRUE)
            rho chisq      p
 w      -0.1125 1.312 0.2520
 x       0.0402 0.179 0.6725
 y       0.2349 4.527 0.0334
 z=1     0.0906 0.512 0.4742
 GLOBAL      NA 5.558 0.2347

第一个问题

  • 有人可以用简单的英语向我解释上述输出的结果吗?我有医学背景,没有接受过正规的统计学培训。

第二个问题

  • 正如 Harrell 博士所建议的,我想通过使用该rms包执行 100 次 10 倍交叉验证的迭代来内部验证我的模型(据我了解,这将需要构建100 * 10 = 1000不同的模型,然后要求他们预测生存时间他们从未见过的病人)。

    我尝试使用该validate功能,如图所示。

    > v1 <- validate(fit, method="crossvalidation", B = 10, dxy=T)
    > v1
          index.orig training    test optimism index.corrected  n
    Dxy      -0.2542  -0.2578 -0.1356  -0.1223         -0.1320 10
    R2        0.0543   0.0565  0.1372  -0.0806          0.1350 10
    Slope     1.0000   1.0000  0.9107   0.0893          0.9107 10
    D         0.0122   0.0128  0.0404  -0.0276          0.0397 10
    U        -0.0033  -0.0038  0.0873  -0.0911          0.0878 10
    Q         0.0155   0.0166 -0.0470   0.0636         -0.0481 10
    g         0.4369   0.4424  0.6754  -0.2331          0.6700 10
    

    您如何执行 100 倍重采样?我认为我上面的代码只执行一次交叉验证。

  • 然后我想知道我的模型在预测方面有多好。我尝试了以下方法:

    > c_index <- abs(v1[1,5])/2 + 0.5
    > c_index
    [1] 0.565984
    

    这是否意味着我的模型只比掷硬币好一点点?

第三个问题

Harrell 博士指出,我假设协变量效应是线性的,如果所有协变量效应恰好都是线性的,那么我的样本中的事件数量几乎不足以拟合一个可靠的模型。

  • 这是否意味着我应该在我的模型中包含某种交互项?如果是这样,关于放置什么的任何建议?
2个回答

要开始,请考虑几件事。首先,您排除了太多缺少数据的观察结果,这将导致偏差。考虑多重插补。二、有一种情节方法cox.zph这在评估比例风险时很有用。第三,您假设协变量效应是线性的。第四,如果所有协变量效应恰好都是线性的(这种情况很少见),那么训练样本中的事件数量几乎不足以拟合一个可靠的模型。您的测试样本可能必须有 400 个事件,才能对预测准确性进行可靠评估。目前尚不清楚您是否有足够的数据将数据分成两部分。重采样验证(100 次重复 10 倍交叉验证,或使用引导程序)是更好的解决方案。您的原始外部验证(函数rcorr.censval.surv)和重采样内部验证(函数validatecalibrate)都在 Rrms包中实现。案例研究rms包可以在我的课程笔记中找到,网址为http://biostat.mc.vanderbilt.edu/rms(我下个月在纳什维尔有一个为期 3 天的课程)。注意2×2表格不适用于连续数据。

基于相关示例的 R cph 函数的输出在J. Fox的这篇易于理解的论文中进行了解释。

如果您还没有阅读这篇论文,我强烈建议您阅读。