【问题标题】:Find overlapping intervals查找重叠区间
【发布时间】:2011-11-14 14:03:57
【问题描述】:

上下文:据我所知,R 缺乏一致的函数来促进生存/事件历史分析上下文中的数据准备,例如情节分割以包括随时间变化的协变量(有时称为“计数过程数据”)。

对于每个人 (id),给出了每集的开始 (start.cp) 和结束时间 (stop.cp)。此外,对于每个 1,2, ..., p 时变协变量 (TVC),我们知道剧集何时开始 (tvc.start_) 和何时结束 (tvc.stop_) .

在我的示例中(见下文),TVC 的数量为 2,但通常数量可以变化(从 1 到 p)。

示例:

输入数据:

  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 的名称是已知的,即在本例中已知

tvc.start <- c("tvc.start1", "tvc.start2") 
tvc.stop <- c("tvc.stop1", "tvc.stop2")

预期结果:

  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,我想创建一个新向量(tvc.d1tvc.d2,参见示例),它表示给定的剧集(由 start.cp 和 @ 定义) 987654332@) 与 TVC 的间隔重叠 (=1)。假设 [start.cp, stop.cp)。如何在不循环 TVC 集的情况下做到这一点,即我正在寻找矢量化解决方案。

P.S.:请随意更改标题...

【问题讨论】:

  • 你能描述一下给定这些数据的预期结果吗?
  • @Andrie 目标(在此示例中使用 2 个 TVC)是创建向量 tvc.d1tvc.d2
  • 我完全不明白你的问题。请提供两个数据集:1)输入数据,2)预期结果。
  • 谢谢,@Andrie 我已经更新了我的示例。
  • @Ben Bolker 老实说,我很难理解findInterval 的实际作用......

标签: r intervals overlapping


【解决方案1】:

我认为 Terry Therneau 可能想对您的主张提出异议,his technical article with Cindy Crowson on handling time-dependent covariates 中早先描述了推荐的生存包中的 tcut 函数和 pyears。我很难理解为什么 tcv.d1 在其停止时间为 2 时应在间隔 2 -> 3 期间提供曝光?但是对于后来的读者的解释在问题的 cmets 中。

你真的只需要 start.cp stop.cp 向量和第一行作为输入数据。您将区间定义向量与每个组件/个体的开始和停止向量的向量进行比较,并找到 == '1' 的区间。我正在考虑数据是否真的以这种方式出现,并且您可能不需要在设置中重复开始和停止时间。

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)

【讨论】:

  • 可能是因为间隔在左侧关闭并在右侧打开,正如上面OP所评论的那样?
  • 哦。似乎对问题的编辑会更“可见”。
  • @DWin 感谢您的回复!我/曾经知道 Therneau/Crowson 的论文,但与 Stata 在这方面的能力相比,它仍然很复杂(好吧,这是我的看法)。但是,我会再次检查他们的论文,以确保我对他们的方法有正确的理解。另外,Ben Bolker(谢谢!)已经回答了您的第二个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
  • 2020-01-28
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多