cox比例风险模型中的时变系数

机器算法验证 r 生存 cox模型 比例风险
2022-04-17 00:23:36

我正在尝试在 R 中拟合 coxph 模型。该研究可以描述如下:我有一个非常大的数据集,以计数过程的形式,包含是否有人对调查做出了回应。时间变量是收到响应的连续月数。该模型预测无响应,即当有人没有响应时。每个 id 有多个记录(我的数据集中的项目代码)。到目前为止,没有连续的协变量。模型中包含的是季节性影响——我想知道每个季节相对于秋季如何增加或降低无反应的风险。我已经对模型进行了分层。结果如下:

Call:
coxph(formula = Surv(start, cum.goodp, dlq.next) ~ winter + spring + 
summer + strata(sector) + cluster(itemcode), data = nr.sample.split)

n= 651033, number of events= 42508 

       coef exp(coef) se(coef) robust se      z Pr(>|z|)    
winter  0.26850   1.30800  0.01307   0.01283  20.92   <2e-16 ***
spring -0.64040   0.52708  0.01385   0.01342 -47.72   <2e-16 ***
summer  0.29188   1.33894  0.01414   0.01284  22.73   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

   exp(coef) exp(-coef) lower .95 upper .95
winter    1.3080     0.7645    1.2755    1.3413
spring    0.5271     1.8972    0.5134    0.5411
summer    1.3389     0.7469    1.3057    1.3731

Concordance= 0.598  (se = 0.004 )
Rsquare= 0.009   (max possible= 0.636 )
Likelihood ratio test= 5864  on 3 df,   p=0
Wald test            = 4783  on 3 df,   p=0
Score (logrank) test = 5634  on 3 df,   p=0,   Robust = 5015  p=0

 (Note: the likelihood ratio and score tests assume independence of
 observations within a cluster, the Wald and robust score tests do not).

然后我估计了一个 cox.zph 函数来测试 PH 假设,其结果如下:

           rho   chisq       p
winter -0.1283  691.45 0.00000
spring -0.1151  569.35 0.00000
summer -0.0163    9.36 0.00221
GLOBAL      NA 1096.18 0.00000 

显然,PH 假设对任何系数都无效。下面是一个,夏天的情节:

[![Plot of Beta(t) for coefficient "summer"][1]][1]

我的问题是:由于季节性虚拟变量本质上是静态的,并且它们的系数明显随时间变量而变化,这有多大关系?我从统计学上得到了这一点,这意味着什么,但是违反 PH 假设是否会使夏季和冬季更有可能发生无响应的(直观地吸引人的)结果无效?如果是这样,有没有办法处理这个问题,以免违反 PH 假设?我知道使用 tt 变换,但我似乎无法弄清楚该函数的确切形式。任何建议、想法或参考将不胜感激。

1个回答

由于季节性虚拟变量本质上是静态的,并且它们的系数明显随时间变量而变化,这有多大关系呢?

您获得的值是一段时间内的平均值。不幸的是,由于您在早期自然有更多的事件时间分析案例,您不能简单地说效果在整个时间中是平衡的。根据我的经验,初期对估算的影响比后期大得多,而且

我从统计学上得到了这一点,这意味着什么,但是违反 PH 假设是否会使夏季和冬季更有可能发生无响应的(直观地吸引人的)结果无效?

同样,它可能不会,但在你检查之前你不能确定。随着时间的推移肯定会发生一些事情,您至少应该看看残差图 ( plot(cox.zph(...)))。PH 有问题并不奇怪,因为季节是时间变量的一部分,并且会有初夏和晚春相似的情况。

如果是这样,有没有办法处理这个问题,以免违反 PH 假设?我知道使用 tt 变换,但我似乎无法弄清楚该函数的确切形式。

这种tt转换很难与大数据一起使用。它会爆炸矩阵并且可能会变得有点混乱,例如,如果您修改生存包中的肺示例:

library(survival)
coxph(Surv(time, status) ~ ph.ecog + tt(age), data=lung,
      tt=function(x,t,...) {
        print(length(x))
        pspline(x + t/365.25)
      })

它打印15809,而原始数据集中只有228行。的原理tt()是将变量输入到转换函数中,您可以随意使用时间。请注意,您还可以根据每个变量使用不同的转换函数:

library(survival)
coxph(Surv(time, status) ~ tt(ph.ecog) + tt(age), data=lung,
      tt=list(
        function(x,t,...) {
          cbind(x, x + t/365.25, (x + t/365.25)^2)
        },
        function(x,t,...) {
          pspline(x + t/365.25)
        }),
      x=T,
      y=T) -> fit
head(fit$x)

给出:

    tt(ph.ecog)x tt(ph.ecog) tt(ph.ecog) tt(age)1 tt(age)2 tt(age)3 tt(age)4
6              1         3.4        11.7        0        0        0    0.000
3              0         2.4         5.8        0        0        0    0.020
38             1         3.4        11.7        0        0        0    0.000
5              0         2.4         5.8        0        0        0    0.000
6.1            1         3.2        10.4        0        0        0    0.000
3.1            0         2.2         5.0        0        0        0    0.026
    tt(age)5 tt(age)6 tt(age)7 tt(age)8 tt(age)9 tt(age)10 tt(age)11 tt(age)12
6       0.00  0.00000    0.000   0.0052    0.359      0.58     0.053         0
3       0.48  0.48232    0.021   0.0000    0.000      0.00     0.000         0
38      0.00  0.00087    0.266   0.6393    0.094      0.00     0.000         0
5       0.03  0.51933    0.437   0.0136    0.000      0.00     0.000         0
6.1     0.00  0.00000    0.000   0.0078    0.388      0.56     0.044         0
3.1     0.50  0.45457    0.016   0.0000    0.000      0.00     0.000         0

因此,我尽量避免使用这种解决方案,并使用我在此处和我对自己问题的回答中所写的时间分割方法。