为条件风险集模型创建时间变量(Cox 回归)
Creating time variables for conditional risk set model (Cox regression)
我正在使用分层 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
,但每次事件发生时'resetting the clock';和一个 sequence 变量,指示国家在哪个序列或阶段,即下一个事件是否是第二个、第三个、第四个...(数字应该增加 在事件之后)。因此,数据将如下所示:
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
函数来做,但没有找到方法。
您可以使用 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
我正在使用分层 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
,但每次事件发生时'resetting the clock';和一个 sequence 变量,指示国家在哪个序列或阶段,即下一个事件是否是第二个、第三个、第四个...(数字应该增加 在事件之后)。因此,数据将如下所示:
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
函数来做,但没有找到方法。
您可以使用 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