晚期生存分析的语法

时间:2018-04-30 23:53:10

标签: r survival-analysis survival

我正在尝试使用survival包使用左截断数据来拟合生存模型,但我不确定正确的语法。

我们假设我们正在衡量雇用(age)和工作类型(parttime)的年龄对公共卫生诊所医生就业时间的影响。 censor变量表示医生是退出还是被审查(0表示退出,1表示审查)。这种行为是在18个月的时间内测量的。退出或审查的时间由两个变量表示,entry(开始时间)和exit(停止时间)表示医生在诊所工作多长时间。如果医生在窗口打开后开始就业。他们的entry时间设置为0.如果他们在窗口开始之前开始工作'他们的entry时间表示当窗口打开时他们已经在该职位上工作了多长时间,而他们的exit时间是从他们最初被雇用的时间起他们要么退出或被窗口审查并关闭'。我们还假设age与就业期间(exit)之间存在双向互动。

这是玩具数据集。它比普通数据集要小得多,因此在给定数据结构的情况下,估计本身并不像包含的语法和变量(使用R中的survival包)是否正确一样重要。玩具数据具有与Singer和Willet的应用纵向数据分析第15章中讨论的数据集完全相同的结构。我试图匹配他们报告的结果,但没有成功。在线没有很多明确的信息如何对R中的左截断数据进行生存分析,并且为该书提供代码的网站(here)不提供相关章节的R代码。在R中,对时变协变量和交互效应进行建模的方法非常复杂,我只是想知道我是否遗漏了一些重要的东西。

这是玩具数据

id <- 1:40
entry <- c(2.3,2.5,2.5,1.2,3.5,3.1,2.5,2.5,1.5,2.5,1.4,1.6,3.5,1.5,2.5,2.5,3.5,2.5,2.5,0.5,rep(0,20))
exit <- c(5.0,5.2,5.2,3.9,4.0,3.6,4.0,3.0,4.2,4.0,2.9,4.3,6.2,4.2,3.0,3.9,4.1,4.0,3.0,2.0,0.2,1.2,0.6,1.9,1.7,1.1,0.2,2.2,0.8,1.9,1.2,2.3,2.2,0.2,1.7,1.0,0.6,0.2,1.1,1.3)
censor <- c(1,1,1,1,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,rep(1,20))
parttime <- c(1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0)
age <- c(34,28,29,38,33,33,32,28,40,30,29,34,31,33,28,29,29,31,29,29,30,37,33,38,34,37,37,40,29,38 ,49,32,30,27,35,34,35,30,35,34)

doctors <- data.frame(id,entry,exit,censor,parttime,age)

现在为模型。

coxph(Surv(entry, exit, 1-censor) ~ parttime + age + age:exit, data = doctors)

这是根据数据结构和我们想知道的内容指定模型的正确方法吗?答案here表明它是正确的,但我不确定是否正确指定了交互变量。

1 个答案:

答案 0 :(得分:1)

通常情况下,直到我发布关于SO问题的问题,我才知道如何自己做。如果存在与时间预测器的交互,我们需要将数据集转换为计数过程,人物周期格式(即长形式)。这是因为每个参与者需要一个时间间隔,该时间间隔跟踪事件的事件对于事件发生的每个时间点<数据集中的任何其他人,直到他们退出研究时为止。

首先让我们制作一个事件变量

doctors$event <- 1 - doctors$censor

在运行cox模型之前,我们需要使用survSplit包中的survival函数。为此,我们需要在事件发生时制作所有时间点的向量

cutPoints <- order(unique(doctors$exit[doctors$event == 1]))

现在我们可以将其传递到survSplit函数中以创建新数据集...

docNew <- survSplit(Surv(entry, exit, event)~.,
                   data = doctors,
                   cut = cutPoints,
                   end = "exit")

...然后我们在

上运行我们的模型
coxph(Surv(entry,exit,event) ~ parttime + age + age:exit, data = docNew)

瞧!