【问题标题】:Creating time to event variable in R在R中创建事件变量的时间
【发布时间】:2016-07-09 10:59:01
【问题描述】:

亲爱的:我一直在尝试创建一个事件发生时间变量。确实,前段时间,我向here 寻求帮助。但是,我发现它并没有完全实现我的目的。

以下是我的数据和我要创建“事件时间”的变量。

df2 = structure(list(Country = c("USA", "USA", "USA", "USA", "USA", 
"USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA"), year = 2000:2012, 
    Event = c(0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 
    0L), `**Time-to-event**` = c(0L, 1L, 2L, 0L, 1L, 2L, 3L, 
    0L, 1L, 0L, 1L, 2L, 3L)), .Names = c("Country", "year", "Event", 
"**Time-to-event**"), row.names = c(NA, -13L), class = "data.frame")

Country  year              Event      **Time-to-event**
USA      2000               0            0
USA      2001               0            1
USA      2002               1            2
USA      2003               0            0
USA      2004               0            1
USA      2005               0            2
USA      2006               1            3
USA      2007               0            0
USA      2008               1            1
USA      2009               0            0
USA      2010               0            1
USA      2011               0            2
USA      2012               0            3

有人建议我使用以下代码来创建事件时间变量

i1 <- with(df2, ave(Event, Country, FUN= 
         function(x) cumsum(c(TRUE, diff(x)<0))))
df2$Time_to_event <- with(df2, ave(i1, i1, Country, FUN= seq_along)-1)

它运行良好,但此代码的问题在于它会计算 Event=1 连续多年的情况。示例如下:

Country  year              Event      **Time-to-event**
USA      2000               0            0
USA      2001               0            1
USA      2002               1            2
USA      2003               0            0
USA      2004               1            **1**
USA      2005               1            **2**
USA      2006               1            **3**
USA      2007               0            0
USA      2008               1            1

相反,对于事件变量在接下来的几年中为 1 的情况,我希望它给出零 (0) 值,而不是计算 1 需要明确的是,这就是我希望看到“事件发生时间”变量的方式。

Country  year              Event      **Time-to-event**
USA      2000               0            0
USA      2001               0            1
USA      2002               1            2
USA      2003               0            0
USA      2004               0            1
USA      2005               1            2
USA      2006               1            0
USA      2007               1            0
USA      2008               1            0
USA      2009               0            0
USA      2010               0            1

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用data.table如下:

    require(data.table)
    setDT(dat)[,tte := seq.int(0,.N-1L), by = cumsum(Event)-Event]
    

    所以你最终得到:

     > dat
        Country year Event **Time-to-event** tte
     1:     USA 2000     0                 0   0
     2:     USA 2001     0                 1   1
     3:     USA 2002     1                 2   2
     4:     USA 2003     0                 0   0
     5:     USA 2004     0                 1   1
     6:     USA 2005     1                 2   2
     7:     USA 2006     1                 0   0
     8:     USA 2007     1                 0   0
     9:     USA 2008     1                 0   0
    10:     USA 2009     0                 0   0
    11:     USA 2010     0                 1   1
    

    为什么?

    让我们看看组件:

     > dat[,.(Event, cumsum = cumsum(Event), run = cumsum(Event)-Event)]
        Event cumsum run
     1:     0      0   0
     2:     0      0   0
     3:     1      1   0
     4:     0      1   1
     5:     0      1   1
     6:     1      2   1
     7:     1      3   2
     8:     1      4   3
     9:     1      5   4
    10:     0      5   5
    11:     0      5   5
    

    Event + cumsum 加起来就是运行次数。按此顺序分组使其工作。

    【讨论】:

    • 嗨@Floo0,感谢您与我分享这个。我试过这个它给出了这个错误:unused argument (by = rleid(cumsum(Event) - Event))。 “te”是什么意思? (时间到了,明白了!)
    • cumsum(shift(Event, fill=1L)) 是另一个你可以输入 by= 的东西。
    • @FKG 您需要先setDT(df2) 才能消除该错误。 tte 只是“时间到事件”的缩写,我猜。
    • 感谢@Floo0。它最初不起作用,只是计算了我数据中的观察结果。然后我取出了所有的 NA,它运行良好。有什么方法可以计算 NA 吗?
    • 您可以在by中指定多个列。所以你可以做by = .(state, cumsum(Event)-Event)
    猜你喜欢
    • 2022-11-13
    • 2021-05-03
    • 2022-12-14
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多