背景:据我所知,R缺乏一致的功能,这有助于在生存/事件历史分析的背景下进行数据准备,例如:插曲分裂包括时变协变量(有时称为“计数过程数据”)。
对于每个人(id
),会给出每集的开头(start.cp
)和结束时间(stop.cp
)。此外,对于每个 1,2,...,p 时变协变量(TVC),我们知道情节何时开始(tvc.start_
)以及何时结束({{ 1}})。
在我的例子中(见下文),TVC的数量是2,但通常数量可以变化(从1到p)。
示例:
输入数据:
tvc.stop_
TVC的名称是已知的,即在该示例中已知
id start.cp stop.cp tvc.start1 tvc.start2 tvc.stop1 tvc.stop2
1 1 1 2 2 3 4 7
2 1 2 3 2 3 4 7
3 1 3 4 2 3 4 7
4 1 4 7 2 3 4 7
5 1 7 12 2 3 4 7
structure(list(id = c(1, 1, 1, 1, 1), start.cp = c(1, 2, 3, 4,
7), stop.cp = c(2, 3, 4, 7, 12), tvc.start1 = c(2, 2, 2, 2, 2
), tvc.start2 = c(3, 3, 3, 3, 3), tvc.stop1 = c(4, 4, 4, 4, 4
), tvc.stop2 = c(7, 7, 7, 7, 7)), .Names = c("id", "start.cp",
"stop.cp", "tvc.start1", "tvc.start2", "tvc.stop1", "tvc.stop2"),
row.names = c(NA, 5L), class = "data.frame")
预期结果:
tvc.start <- c("tvc.start1", "tvc.start2")
tvc.stop <- c("tvc.stop1", "tvc.stop2")
问题:对于每个TVC,我想创建一个新的向量( id start.cp stop.cp tvc.start1 tvc.start2 tvc.stop1 tvc.stop2 tvc.d1 tvc.d2
1 1 1 2 2 3 4 7 0 0
2 1 2 3 2 3 4 7 1 0
3 1 3 4 2 3 4 7 1 0
4 1 4 7 2 3 4 7 0 1
5 1 7 12 2 3 4 7 0 1
structure(list(id = c(1, 1, 1, 1, 1), start.cp = c(1, 2, 3, 4,
7), stop.cp = c(2, 3, 4, 7, 12), tvc.start1 = c(2, 2, 2, 2, 2
), tvc.start2 = c(3, 3, 3, 3, 3), tvc.stop1 = c(4, 4, 4, 4, 4
), tvc.stop2 = c(7, 7, 7, 7, 7), tvc.d1 = c(0, 1, 1, 0, 0), tvc.d2 = c(0,
0, 0, 1, 1)), .Names = c("id", "start.cp", "stop.cp", "tvc.start1",
"tvc.start2", "tvc.stop1", "tvc.stop2", "tvc.d1", "tvc.d2"), row.names = c(NA,
5L), class = "data.frame")
,tvc.d1
,参见示例),表示给定的一集(由{定义) {1}}和tvc.d2
)重叠(= 1)TVC的间隔。假设 [start.cp,stop.cp)。如何在不循环播放TVC的情况下完成此操作,即我正在寻找矢量化解决方案。
P.S。:请随时更改标题...
答案 0 :(得分:1)
我认为Terry Therneau可能想要对您的声明提出质疑,tcut
早期在his technical article with Cindy Crowson on handling time-dependent covariates中描述了pyears
函数和推荐生存包中的tvec <- with(dat, c(start.cp[1], stop.cp))
dat$tvc.d1 <- 1*( findInterval(tvec, # the "1*" converts to numeric
as.numeric( dat[ 1, c("tvc.start1", "tvc.stop1")]) ,
all.inside=FALSE)[1:5] == 1)
dat$tvc.d2 <- 1*( findInterval(tvec,
as.numeric( dat[ 1, c("tvc.start2", "tvc.stop2")]) ,
all.inside=FALSE)[1:5] == 1)
。我无法理解为什么tcv.d1应该在间隔2期间提供曝光 - > 3停止时间是2?但是后来读者的解释是在对这个问题的评论中。
你真的只需要start.cp stop.cp向量和第一行作为输入数据。您可以将区间定义向量与每个组件/ indivdiual的开始和停止向量的向量进行比较,并找到=='1'的区间。我正在研究数据是否真的以这种方式出现,您可能不需要在设置中复制启动和停止时间。
{{1}}