Найти перекрывающиеся интервалы - PullRequest
1 голос
/ 14 ноября 2011

Контекст: Насколько я вижу, 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.d1, tvc.d2, см. Пример), который указывает, что данный эпизод (определяется start.cp и stop.cp) перекрывает (= 1) интервал TVC. Предполагается, что [start.cp, stop.cp) . Как это можно сделать без зацикливания на наборе ТВЦ, то есть я ищу векторизованное решение.

P.S .: Пожалуйста, не стесняйтесь менять название ...

1 Ответ

1 голос
/ 14 ноября 2011

Я думаю, что Терри Терно, возможно, захочет оспорить вашу претензию. Функция tcut и pyears в рекомендуемом пакете выживания описаны в начале его технической статьи с Синди Кроусон о работе с зависящими от времени ковариатами .У меня были проблемы с пониманием, почему tcv.d1 должен вносить вклад в интервал 2 -> 3, когда время его остановки было 2?Но объяснение для более поздних читателей в комментариях к вопросу.

Вам действительно нужны только векторы 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)
...