【问题标题】:Reshaping longitudinal dataset with tmerge or SurvSplit?用 tmerge 或 SurvSplit 重塑纵向数据集?
【发布时间】:2020-06-10 01:43:39
【问题描述】:

我正在尝试使用随时间变化的协变量进行生存分析。数据来自每年进行的纵向调查,我对其进行了处理,使其看起来像这样:

id  event       end.time    income1      income2    income3     income4
1   1           3           8            10         13          8       
2   0           4           13           15         24          35

event 表示事件是否发生,end.time 是事件发生的时间,右边的每个后续期间都有我的时变协变量。因此,对于观察 1,事件发生在第 3 年,在第 1 年,他们获得了 8000 美元的收入,等等。对于观察 2,事件被审查,我们有到第 4 年的数据(当研究结束)。

最后,我希望我的数据看起来像这样:

id  st.time end.time    event   inc

1   0       1           0       8
1   1       2           0       10
1   2       3           1       13
2   0       1           0       13
2   1       2           0       15
2   2       3           0       24
2   3       4           0       35

我查看了 tmerge() 和 SurvSplit() 函数,但不确定如何在这种特定情况下应用它们。似乎使用 SurvSplit(),我可以按年份使用切点,但不确定它将如何重塑随时间变化的协变量。

使用通用重塑可能效果更好?

任何建议将不胜感激。

【问题讨论】:

  • 如何获取 st.time 、end.time 、 events 、审查列的值?
  • 每次观察的开始时间为 0,并以 1 递增(每年)。收入 1、收入 2 与后续年份的测量值相关。 end.time 应该是 event2yr。如果事件没有发生,那么该观察将被审查。实际上,审查列可能不需要存在即可运行 Cox 回归。我会把它拿出来。
  • 作为后续,我已对齐列名以使两个数据框保持一致。
  • id = 2 应该有更多行,对吧?
  • 是的。我截断了数据,但是应该。我会再次编辑它。

标签: r survival-analysis survival


【解决方案1】:

可能会进行一般的重塑以及使用dplyr 进行一些操作。

library(dplyr)

df %>%
  tidyr::pivot_longer(cols = starts_with('income'), values_to = 'inc') %>%
  group_by(id) %>%
  slice(1:first(end.time)) %>%
  mutate(end.time = row_number(),
         st.time = end.time - 1,
         event = replace(event, -n(), 0)) %>%
  select(-name)


#     id event end.time   inc st.time
#  <int> <dbl>    <dbl> <int>   <dbl>
#1     1     0        1     8       0
#2     1     0        2    10       1
#3     1     1        3    13       2
#4     2     0        1    13       0
#5     2     0        2    15       1
#6     2     0        3    24       2
#7     2     0        4    35       3

数据

df <- structure(list(id = 1:2, event = 1:0, end.time = 3:4, income1 = c(8L, 
13L), income2 = c(10L, 15L), income3 = c(13L, 24L), income4 = c(8L, 
35L)), class = "data.frame", row.names = c(NA, -2L))

【讨论】:

  • 这绝对是正确的答案。我需要进一步探索 pivot_longer,因为我实际上有比收入更多的变量。所有变量都以相同的方式形成,例如income_t1、educ_t1。我一直在争论数据,但它似乎只提取了一些信息。
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多