【问题标题】:How can I structure my data for a recurrent event analysis?如何构建我的数据以进行周期性事件分析?
【发布时间】:2021-12-20 01:39:06
【问题描述】:

我对 R 很陌生,所以也许这看起来很简单,但我想不通。我的数据看起来像 Df,它需要看起来像 Df2:

Df <- data.frame(country = c("A", "A", "A", "A", "A", "B","B", "B", "B"),
                 year = c("1950", "1951", "1952", "1953", "1954", "1950", "1951", "1952", "1953"), 
                 start_year = c("NA", "1951", "1951", "NA", "1954", "1950", "NA", "1951", "1951"), 
                 end_year= c("NA", "NA", "1952", "NA", "1954", "1950", "NA", "NA", "NA"),
                 status = c(0, 1, 1, 0, 1, 1, 0, 1, 1),
                 treatment = c(10, "NA", 20, 5, "NA", "NA", 30, 100, 10))

Df2 <- data.frame(country = c("A", "A", "A", "A", "B","B", "B"),
                  time1 = c("1950", "1951", "1953", "1954", "1950", "1951", "1952"),
                  time2 = c("1951", "1953", "1954", "1955", "1951", "1952", "1954"),
                  status = c(0, 1, 0, 1, 1, 0, 1),
                  treatment = c(10, 20, 0, "NA", "NA", 30, 110))

我们的目标是在一个结构中进行 PWP 循环事件分析。 Df2 中的处理应该是间隔时间 1 到时间 2 的处理值之和。

有什么想法可以到达那里吗?谢谢!

【问题讨论】:

  • 为什么 B 带有 time1 = 1952treatment = 110A has time1 = 1951` 和 treatment = 20。这里选择yearstart_year的逻辑是什么?
  • @Martin Gal Treatment 在我的数据中是对妇女组织的资助金额。而year 是观察年份,也就是资金发放的年份。 start_year 显示冲突何时开始。现在有意义吗?

标签: r survival-analysis


【解决方案1】:

你可以使用

library(dplyr)

Df %>% 
  mutate(across(where(is.character), ~na_if(.x, "NA")),
         time1 = as.numeric(coalesce(start_year, year)),
         treatment = as.numeric(treatment)) %>% 
  group_by(country, time1, status) %>% 
  summarise(treatment = sum(treatment, na.rm = TRUE), .groups = "drop") %>% 
  group_by(country) %>% 
  mutate(time2 = lead(time1, default = last(time1) + 1)) %>% 
  select(country, time1, time2, status, treatment) %>% 
  ungroup()

得到

# A tibble: 7 x 5
  country time1 time2 status treatment
  <chr>   <dbl> <dbl>  <dbl>     <dbl>
1 A        1950  1951      0        10
2 A        1951  1953      1        20
3 A        1953  1954      0         5
4 A        1954  1955      1         0
5 B        1950  1951      1         0
6 B        1951  1951      0        30
7 B        1951  1952      1       110

这并不完全是您想要的输出(请参阅我的评论),而是解决您的问题的开始。

【讨论】:

    【解决方案2】:
    Df2 <- Df %>% mutate(episode = data.table::rleid(status))
    
    library(tidyverse)
    Df2 <- Df2 %>%
      arrange(country, year) %>%
      group_by(country, episode) %>%
      mutate(time1 = min(year))
    
    Df2 <- Df2 %>%
      arrange(country, year) %>%
      group_by(country, episode) %>%
      mutate(time2 = (max(as.numeric(year) + 1)))
    

    我创建了一个剧集标识符并设法为每个episode 识别time1time2。现在,我仍然需要合并由episode 分组的行,以便每集有一行显示treatment 的总和。任何想法如何做到这一点?

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多