时间依存协变量的Cox回归和时间依存系数Cox回归--解决COX回归不符合风险比例恒定假设

文摘   2024-10-18 08:14   上海  

序言 

   本章主要介绍如果数据不符合PH假设时采取的方法

1.提取数据集

library(mlr3verse)
library(mlr3proba)
library(survival)
task =tsk("gbcs")
data<-task$data()


2.Cox回归,进行等比例风险假设

fit <- coxph(Surv(time, status) ~ nodes + prog_recp, data = data)

# 进行PH检验
zp <- cox.zph(fit)
zp
            chisq df       p
nodes 1.05 1 0.30628
prog_recp 12.68 1 0.00037
GLOBAL 14.44 2 0.00073

可以看到变量prog_recp的P值小于0.05,是不满足PH假设的

plot(zp[2])

         这张图反映了prog_recp变量的系数随着时间的改变,prog_recp偏离的比较厉害,系数大概从810天开始增加,趋近于0;1900天又开始下降,所以它的系数是一直在随着时间改变的,不符合比例风险假设。


3.对时间使用分层函数

vet2 <- survSplit(Surv(time, status) ~ ., data= data, 
cut=c(810, 1900), # 两个拐点把时间分为3层(3段)
episode= "tgroup",
id="id")

vet2[1:7, c("id", "tstart", "time", "status", "tgroup", "prog_recp", "nodes")]
    id tstart time status tgroup prog_recp nodes
1 1 0 810 0 1 141 5
2 1 810 1900 0 2 141 5
3 1 1900 2282 0 3 141 5
4 2 0 810 0 1 78 1
5 2 810 1900 0 2 78 1
6 2 1900 2006 0 3 78 1
7 3 0 810 0 1 422 1

数据多了三列:id/tstart/tgroup

fit2 <- coxph(Surv(tstart, time, status) ~nodes
+prog_recp:strata(tgroup), data = vet2)

fit2
  Call:
coxph(formula = Surv(tstart, time, status) ~ nodes + prog_recp:strata(tgroup),
data = vet2)

coef exp(coef) se(coef) z p
nodes 0.064944 1.067099 0.008907 7.292 3.06e-13
prog_recp:strata(tgroup)tgroup=1 -0.022822 0.977436 0.004791 -4.764 1.90e-06
prog_recp:strata(tgroup)tgroup=2 -0.003196 0.996809 0.001171 -2.728 0.00637
prog_recp:strata(tgroup)tgroup=3 -0.004299 0.995710 0.003534 -1.217 0.22376

Likelihood ratio test=121.1 on 4 df, p=< 2.2e-16
n= 1333, number of events= 171

结果表明prog_recp这个变量只有在tgroup=1和2才有意义,后面一层是没有意义的。

zp1<-cox.zph(fit2)
zp1
                           chisq df    p
nodes 1.40 1 0.24
prog_recp:strata(tgroup) 2.66 3 0.45
GLOBAL 4.02 4 0.40

这时prog_recp:strata(tgroup)就满足了等比例风险假设

plot(zp1)

4.连续性时依系数变换

       上面的图中可以看出prog_recp系数随时间变化的曲线明显不是线性的,我们可以通过数据变换把它变成类似线性的,比如取log,这种变换通过tt(time transform)函数实现。

fit3 <- coxph(Surv(time, status) ~ nodes + prog_recp + tt(prog_recp), # 对prog_recp进行变换
data = data,
tt = function(x, t, ...) x * log(t)
)
fit3
  Call:
coxph(formula = Surv(time, status) ~ nodes + prog_recp + tt(prog_recp),
data = data, tt = function(x, t, ...) x * log(t))

coef exp(coef) se(coef) z p
nodes 0.064031 1.066125 0.008728 7.337 2.19e-13
prog_recp -0.076417 0.926430 0.019173 -3.986 6.73e-05
tt(prog_recp) 0.009967 1.010017 0.002659 3.749 0.000178

Likelihood ratio test=110.5 on 3 df, p=< 2.2e-16
n= 686, number of events= 171

     此时prog_recp的时依系数估计为:0.009967 * log(t)。

     在构建时依协变量时,可以选择x * t、x * log(t)、x * log(t + 20)、x * log(t + 200)等等,没有明确的规定,要结合结果和图示进行选择

# 变换后的PH检验
zp <- cox.zph(fit, transform = function(time) log(time ))

plot(zp[2])
abline(0,0, col="red") # 0水平线
abline(h=fit$coef[2], col="green", lwd=2, lty=2) # 整体估计
abline(coef(fit3)[2:3],lwd=2,lty=3,col="blue") # 现在的估计

  1. 样条技术

         样条技术是一种用于平滑和逼近数据的数学方法。它常用于统计学和数据分析中,特别是当数据呈现出复杂的模式或非线性关系时。

       使用样条技术pspline(time)进行数据变换

fit4 <- coxph(Surv(time, status) ~ nodes + prog_recp + tt(prog_recp), # 对prog_recp进行变换
data = data,
tt = function(x, t, ...) x * pspline(t)
)
fit4
  Call:
coxph(formula = Surv(time, status) ~ nodes + prog_recp + tt(prog_recp),
data = data, tt = function(x, t, ...) x * pspline(t))

coef se(coef) se2 Chisq DF p
nodes 6.48e-02 8.91e-03 8.91e-03 5.28e+01 1.00 3.6e-13
prog_recp -5.46e-02 3.74e-02 2.34e-02 2.13e+00 1.00 0.1441
tt(prog_recp), linear 6.55e-06 3.06e-06 3.06e-06 4.56e+00 1.00 0.0326
tt(prog_recp), nonlin 1.45e+01 3.61 0.0042

Iterations: 10 outer, 40 Newton-Raphson
Theta= 1
Degrees of freedom for terms= 1.0 0.4 4.6
Likelihood ratio test=124 on 6 df, p=<2e-16
n= 686, number of events= 171

       根据结果,可以看出nodes是一个显著的预测因子,而prog_recp在线性平滑函数下对风险没有显著影响,但在非线性平滑函数下具有显著影响。

       还可以使用pspline()函数在R代码里主要是修改了COX回归的基线风险函数,这样,基线风险函数不再是固定的,而是可以随时间变化。

fit5 <- coxph(Surv(time, status) ~ nodes + prog_recp + pspline(time),
data = data
)
fit5
  Call:
coxph(formula = Surv(time, status) ~ nodes + prog_recp + pspline(time),
data = data)

coef se(coef) se2 Chisq DF p
nodes 3.62e-02 1.06e-02 1.06e-02 1.17e+01 1.00 0.00063
prog_recp -3.75e-03 8.31e-04 8.31e-04 2.04e+01 1.00 6.3e-06
pspline(time), linear -2.83e-02 1.31e-03 1.31e-03 4.65e+02 1.00 < 2e-16
pspline(time), nonlin 2.88e+02 2.99 < 2e-16

Iterations: 3 outer, 60 Newton-Raphson
Theta= 0.273
Degrees of freedom for terms= 1 1 4
Likelihood ratio test=1108 on 5.99 df, p=<2e-16
n= 686, number of events= 171

      在这个模型中,时间的多项式样条变换(pspline(time))在统计上是显著的,这表明生存风险是随时间的变化的。在调整了时间的非线性变化(即基线风险的波动)之后nodes和prog_recp的影响在统计上依然显著。

zp5<-cox.zph(fit5)
zp5
                 chisq   df      p
nodes 1.97 1.00 0.16
prog_recp 1.07 1.00 0.30
pspline(time) 430.84 3.99 <2e-16
GLOBAL 435.59 5.99 <2e-16
plot(zp5)

参考 

https://zhuanlan.zhihu.com/p/596831293 

统计咨询||做COX回归不满足PH假定的处理方法解答


BLOODSCREEN
Respiratory Medicine In Training
 最新文章