找到重叠的间隔

时间:2011-11-14 14:03:58

标签: r intervals overlapping

背景:据我所知,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。:请随时更改标题...

1 个答案:

答案 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}}