【问题标题】:How to make time to event in unbalanced panel data in r?如何在 r 中的不平衡面板数据中腾出时间?
【发布时间】:2023-03-03 20:42:01
【问题描述】:

我有一个不平衡的面板数据,其中包含一个指示事件是否发生的二进制变量。我想控制时间依赖性。做到这一点的方法是控制自事件发生以来已经过去的时间。

这是一个可重现的示例,带有我想要实现的向量。谢谢!

   id year onset time_since_event
1   1 1989     0                0
2   1 1990     0                1
3   1 1991     1                2
4   1 1992     0                0
5   1 1993     0                1
6   1 1994     0                2  
7   2 1989     0                0
8   2 1990     1                1
9   2 1991     0                0
10  2 1992     1                1
11  2 1993     0                2
12  2 1994     0                3  
13  3 1991     0                0
14  3 1992     0                1
15  3 1993     0                2  

°

id <- c(1,1,1,1,1,2,2,2,2,3,3)
year <- c(1989,1990,1991,1992,1993,1994,1989,1990,1991,1992,1993,1994,1991,1992,1993)
onset <- c(0,0,1,0,0,0,0,1,0,1,0,0,0,0)
time_since_event<-c(0,1,2,0,1,2,0,1,2,3,0,1,2) #what I want to create
df <- data.frame(cbind(id, year, onset,time_since_event))

【问题讨论】:

  • “time_since_event”是否只与“onset”相关联?或者您是否打算将其也与“id”或“year”相关联?
  • 自从ID切换后,它与id和年份相关联,我不希望time_since_event不断累积,需要将其设置回0
  • 您的示例中没有演示,是吗?您能否更新一下该要求和所需的输出?
  • 已修复!对此感到抱歉
  • 你永远不需要做data.frame(cbind(...));试试data.frame(...)。当您有混合数据类型(如字符串 ID 或日期列)时,这也将保护您免受奇怪的行为。

标签: r


【解决方案1】:

试试这个:

id <- c(1,1,1,1,1,2,2,2,2,3,3)
year <- c(1989,1990,1991,1992,1993,1989,1990,1991,1992,1991,1992)
onset <- c(0,0,1,0,0,0,1,0,1,0,0)
period <- c(0, cumsum(onset)[-length(onset)])
time_since_event <- ave(year, id, period, FUN=function(x) x-x[1])
df <- data.frame(id, year, onset, time_since_event)

我创建了一个名为period 的变量,它描述了每个事件之前的不同时期。时期重叠患者并不重要,因为我们将按患者和时期分组,因此如果是新患者或新时期,计数将重新开始。

使用ave() 函数允许我们在每个分组中分配值。这里我们根据分组变量idperiod 分析year。我最后使用的函数只是从每个分组中的当前值中减去第一个值。

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    相关资源
    最近更新 更多