1

我想用在研究观察期间进出风险的受试者来模拟一个反复发生的事件。

我有关于受试者无法体验事件的非风险期(开始和结束日期)的数据。

我将不胜感激有关如何将我的数据转换为这种计数过程格式的帮助,该格式具有反映 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 年的观察期内,受试者可以以不同的时间和频率进出风险。

谢谢!

4

1 回答 1

0

我可能会遗漏一些极端情况,并且可能有更优雅的解决方案,但这似乎可行。

我建议运行主逻辑的前两行,然后是前三、四行等,并检查每个阶段的输出,以了解每个步骤在做什么。

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),以便人们更容易地提供帮助 - 在这种情况下,它很容易复制:)

于 2018-12-21T09:55:18.640 回答