Как преобразовать мои данные в формат процесса подсчета с начальным временем остановки для усечения интервала в R?

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

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

Я был бы признателен за любую помощь в том, как преобразовать мои данные в этот формат процесса подсчета с временами начала и окончания, которые отражают как возникновение события, так и усечение интервала в 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 ответ

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

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

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) чтобы людям было легче помогать - в этом случае это было довольно легко воспроизвести:)

Другие вопросы по тегам