Как преобразовать мои данные в формат процесса подсчета с начальным временем остановки для усечения интервала в R? - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы смоделировать повторяющееся событие с субъектами, которые входят и выходят из риска в течение периода наблюдения исследования.

У меня есть данные о периодах отсутствия риска (началои даты окончания), когда субъект не может испытать событие.

Буду признателен за любую помощь в том, как преобразовать мои данные в этот формат процесса подсчета с начальным временем остановки, которое отражает как возникновение события, так и усечение интервала в R. Я могу преобразовать данные в формат процесса подсчета с возникновением события,но я не знаю, как разделить мои начальные остановки, чтобы отразить ненаблюдаемые периоды (кроме создания вручную набора данных, которого я бы очень хотел избежать).

Это очень упрощенный пример моей структуры входных данныхв широком формате:

Просмотр структуры входных данных

Это то, чего я хочу достичь:

id t0 t1 outcome
 1  0 36       0
 2  0  5       1
 2  5  15      1
 2 15  36      0
 3  0   9      0
 3 11  20      1
 3 20  36      0

На моей иллюстрации субъект 1 никогдаиспытывает событие при правильной цензуре в 36 месяцев.Субъект 2 испытывает событие дважды и остается в периоде риска в течение всего периода наблюдения.Субъект 3 испытывает событие один раз и выходит из периода риска через 9 месяцев и повторно входит в период риска через 11 месяцев.

Другая полезная информация о моем исследовании:

  1. У субъектов естьобщее время начала 0 месяцев.
  2. Субъекты подвергаются цензуре по праву через 36 месяцев, если событие не происходит.
  3. Субъекты наблюдаются в течение 3 лет.
  4. Субъекты могут перемещаться ви вне риска для разного количества времени и частоты в течение 3-летнего периода наблюдения.

Спасибо!

1 Ответ

0 голосов
/ 21 декабря 2018

Возможно, мне не хватает некоторых угловых случаев, и, возможно, есть более элегантное решение, но, похоже, это работает.

Я предлагаю запустить первые две строки основной логики, затем первые три, четыре,и т. д. и проверять результаты на каждом этапе, чтобы сформировать понимание того, что делает каждый шаг.

library(tidyr)
library(dplyr)

subjects <- data.frame(
  id = 1:3,
  event = c(0, 1, 1),
  time_to_event_1 = c(NA, 5, 20),
  time_to_event_2 = c(NA, 15, NA),
  time_to_risk_out_start_1 = c(NA, NA, 9),
  time_to_risk_out_end_1 = c(NA, NA, 11),
  time_to_risk_out_start_2 = NA,
  time_to_risk_out_end_2 = NA
)

subjects %>%
  mutate(start = 0,
         end = 36) %>%
  select(-event) %>%
  gather(event, t0, -id) %>%
  group_by(id) %>%
  arrange(id, t0) %>%
  filter(!is.na(t0)) %>%
  mutate(t1 = lead(t0)) %>%
  filter(!is.na(t1),
         !grepl("time_to_risk_out_start", event)) %>%
  mutate(outcome = lead(grepl("time_to_event", event), default = 0)) %>%
  select(id, t0, t1, outcome) %>%
  ungroup()

Также для дальнейшего использования лучше поделиться своими данными, используя dput(subjects), чтобы людям было легче помогать - в этом случае это было довольно легко воспроизвести:)

...