为条件风险集模型创建时间变量(Cox回归)

时间:2015-01-26 10:19:47

标签: r survival-analysis

我正在准备一个数据集,以通过使用分层Cox回归来拟合条件风险集模型。我想知道是否有任何方法可以创建我需要的变量而无需运行耗时的循环。

基本上,我的数据框是这样的,显示特定国家/地区(ID)是否以及何时在特定时间段内遇到某些事件:

 year    ID event   time
 1991    UK     0      1
 1992    UK     0      2
 1993    UK     0      3
 1994    UK     0      4
 1995    UK     0      5
 1996    UK     0      6
 1997    UK     0      7
 1998    UK     0      8

 1991    FR     0      1
 1992    FR     1      2
 1993    FR     1      3
 1994    FR     0      4
 1995    FR     0      5
 1996    FR     1      6
 1997    FR     0      7
 1998    FR     0      8

 1991    IT     1      1
 1992    IT     0      2
 1993    IT     0      3
 1994    IT     0      4
 1995    IT     0      5
 1996    IT     1      6
 1997    IT     0      7
 1998    IT     0      8

我需要再创建两个变量:一个条件时间变量,类似于time,但每次事件发生时都会“重置时钟”;和序列变量,指示国家的顺序或阶段,即下一个事件是第二个,第三个,第四个......(数字应该增加之后事件)。因此,数据看起来像这样:

 year    ID event   time cond.time sequence
 1991    UK     0      1         1        1
 1992    UK     0      2         2        1
 1993    UK     0      3         3        1
 1994    UK     0      4         4        1
 1995    UK     0      5         5        1
 1996    UK     0      6         6        1
 1997    UK     0      7         7        1
 1998    UK     0      8         8        1

 1991    FR     0      1         1        1
 1992    FR     1      2         2        1
 1993    FR     1      3         1        2
 1994    FR     0      4         1        3
 1995    FR     0      5         2        3
 1996    FR     1      6         3        3
 1997    FR     0      7         1        4
 1998    FR     0      8         2        4

 1991    IT     1      1         1        1
 1992    IT     0      2         1        2
 1993    IT     0      3         2        2
 1994    IT     0      4         3        2
 1995    IT     0      5         4        2
 1996    IT     1      6         5        2
 1997    IT     0      7         1        3
 1998    IT     0      8         2        3

任何人都知道如何以一种有效的方式完成这项工作?我试图用ddply函数来做,但没有找到方法。

1 个答案:

答案 0 :(得分:1)

您可以使用data.table包。如果df是您的原始data.frame

library(magrittr)
library(data.table)
dt = data.table(df)

dt[,temp:=ifelse(is.na(lag(event,1)), as.integer(0), lag(event,1)), by=ID]
dt[, sequence:=cumsum(temp)+1, by=ID]

func = function(x)
{
    which(c(1,lag(x,1)[-1]) %in% 1) %>%
    c(length(x)+1) %>% 
    diff
}

dt[, cond.time:=func(event) %>% lapply(seq) %>% unlist, by=ID]

> dt
    year ID event time temp sequence cond.time
 1: 1991 UK     0    1    0        1         1
 2: 1992 UK     0    2    0        1         2
 3: 1993 UK     0    3    0        1         3
 4: 1994 UK     0    4    0        1         4
 5: 1995 UK     0    5    0        1         5
 6: 1996 UK     0    6    0        1         6
 7: 1997 UK     0    7    0        1         7
 8: 1998 UK     0    8    0        1         8
 9: 1991 FR     0    1    0        1         1
10: 1992 FR     1    2    0        1         2
11: 1993 FR     1    3    1        2         1
12: 1994 FR     0    4    1        3         1
13: 1995 FR     0    5    0        3         2
14: 1996 FR     1    6    0        3         3
15: 1997 FR     0    7    1        4         1
16: 1998 FR     0    8    0        4         2
17: 1991 IT     1    1    0        1         1
18: 1992 IT     0    2    1        2         1
19: 1993 IT     0    3    0        2         2
20: 1994 IT     0    4    0        2         3
21: 1995 IT     0    5    0        2         4
22: 1996 IT     1    6    0        2         5
23: 1997 IT     0    7    1        3         1
24: 1998 IT     0    8    0        3         2