在R的生存分析中,当比例假设被违反时,如何模拟协变量与时间的相互作用

时间:2017-08-24 21:13:20

标签: r survival-analysis cox-regression survival

在R中,当比例性检验(用coxph)表明Cox模型中的比例假设被违反时,在协变量和时间之间合并交互项的最佳方法是什么?我知道你可以使用分层或与时间段的互动,我对后者感兴趣。我无法通过有关如何在互联网上执行此操作的示例找到明确的明确解释。在使用Rossi数据集的最常见示例中,Fox建议这样做,

coxph(formula = Surv(start, stop, arrest.time) ~ fin + age + age:stop + prio, data = Rossi.2)

建模与年龄之间是否存在差异:停止与年龄:开始?公式是否必须使用此格式?如果我使用带有两种参数格式的Surv,下面的内容是否也有意义?

coxph(formula = Surv(week, arrest) ~ fin + age + age:week + prio, data = Rossi)

或者您必须拆分数据集并使用Surv(开始,停止,事件)方法?  此外,还有时间转换方法,

coxph(formula = Surv(week, arrest) ~ fin + age + tt(age) + prio, data = Rossi, tt=function(x,t,...) x*t)

我知道有些人更喜欢使用log(t)代替t的模型。但是,哪一个是模拟与时间的互动的正确方法?这些都是指相同/不同的基础统计模型吗?最后,都是建模(对于交互术语):h(t) = h0(t)exp(b*X*t)

1 个答案:

答案 0 :(得分:1)

这本质上是一个三部分的问题:

  1. 如何估算随时间变化的影响?
  2. 使用survival::coxph函数的不同时变效果规范之间有什么区别
  3. 如何确定时变的形状,即线性,对数,...

下面,我将尝试使用经验丰富的数据示例来回答这些问题,该示例在 {{1}中的vignette on time-dependent covariates and time-dependent coefficients(也称为时变效应)的第4.2节中介绍} 软件包:

survival

1。如何估算时变效应

有多种流行的方法和实现,例如library(dplyr) library(survival) data("veteran", package = "survival") veteran <- veteran %>% mutate( trt = 1L * (trt == 2), prior = 1L * (prior == 10)) head(veteran) #> trt celltype time status karno diagtime age prior #> 1 0 squamous 72 1 60 7 69 0 #> 2 0 squamous 411 1 70 5 64 1 #> 3 0 squamous 228 1 60 3 38 0 #> 4 0 squamous 126 1 60 9 63 1 #> 5 0 squamous 118 1 70 11 65 1 #> 6 0 squamous 10 1 20 5 49 0 survival::coxph或在适当的数据转换后使用GAM(请参见下文)。

尽管具体方法及其实现方式有所不同,但一般的想法是在其中创建长格式数据集

  • 将随访分为几个时间段
  • 对于每个主题,除了最后一个(如果有事件),所有时间间隔的状态均为0
  • 时间变量在每个间隔中更新

然后,时间(或时间的转换,例如log(t))只是协变量,可以通过感兴趣的协变量和时间的(转换的)协变量之间的相互作用来估计时变效应。

如果知道时变的函数形式,则可以使用timereg::aalen方法:

tt()

2。使用cph_tt <- coxph( formula = Surv(time, status) ~ trt + prior + karno + tt(karno), data = veteran, tt = function(x, t, ...) x * log(t + 20)) 函数的不同时变效果规范之间有什么区别

没有区别。我假设survival::coxph函数只是通过转换为长格式进行估算的捷径。您可以使用以下代码验证两种方法是否等效:

转换为长格式

tt()

3。如何确定时变的形状?

如前所述,时变效应只是协变量veteran_long <- survSplit(Surv(time, status)~., data = veteran, id = "id", cut = unique(veteran$time)) %>% mutate(log_time = log(time + 20)) head(veteran_long) %>% select(id, trt, age, tstart, time, log_time, status) #> id trt age tstart time log_time status #> 1 1 0 69 0 1 3.044522 0 #> 2 1 0 69 1 2 3.091042 0 #> 3 1 0 69 2 3 3.135494 0 #> 4 1 0 69 3 4 3.178054 0 #> 5 1 0 69 4 7 3.295837 0 #> 6 1 0 69 7 8 3.332205 0 cph_long <- coxph(formula = Surv(tstart, time, status)~ trt + prior + karno + karno:log_time, data = veteran_long) ## models are equivalent, just different specification cbind(coef(cph_long), coef(cph_tt)) #> [,1] [,2] #> trt 0.01647766 0.01647766 #> prior -0.09317362 -0.09317362 #> karno -0.12466229 -0.12466229 #> karno:log_time 0.02130957 0.02130957 和时间x的相互作用,因此,时变效应可以具有不同的规格,等同于标准回归模型中的相互作用,例如< / p>

  • t:线性协变量效应,线性时变效应
  • x*t:非线性协变量效应,线性时变效应
  • f(x)*t:线性协变量效应,非线性时变(对于类别x),这基本上代表了分层的基准危害
  • f(t)*x:非线性,非线性时变效应

在每种情况下,效果f(x, t)的功能形式都可以从数据中估算出来,也可以预先指定(例如上面的f)。

在大多数情况下,您可能希望根据数据估算f(t)*x = karno * log(t + 20)。据我所知,对这种影响的(惩罚性)估计的支持仅限于 f 软件包。但是,您可以使用survival来估算上面指定的任何效果(在适当的数据转换之后)。下面给出了一个示例,该示例显示mgcv::gam的效果随着时间的推移而趋向于0,而与随访开始时的Karnofsky得分无关(有关详细信息,请参见here,以及第4.2节{ {3}}):

karno

here