Как узнать, подвергаются ли данные цензуре в анализе выживания с использованием r

У меня есть набор данных, который выглядит так (бессмысленный пример):

id <- c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
year <- c(1990, 1991, 1992, 1989, 1990, 1991, 1992, 1993, 1989, 1990, 1992, 1993)
event<- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1) 

df <- cbind(id, year, event)

Предполагается, что в период с 1989 года до самой смерти велись непрерывные наблюдения за всеми тремя идентификаторами. Однако, как вы можете видеть, идентификатор 1 подвергается цензуре слева (нет информации о начале), идентификатор 2 подвергается цензуре справа (нет информации о начале или конце), а идентификатор 3 имеет пробелы в наблюдении (информация о начале и конце, но с пробелами). ). В маленькой таблице это легко увидеть, но при работе с большими наборами данных становится сложнее.

Изменить: есть ли способ группировки по идентификатору и создания сводной таблицы с информацией о полноте данных, например:

id   left-censored   right-censored   gaps in obs. 
1    1               0                0             
2    0               1                0
3    0               0                1

person johnny    schedule 10.12.2020    source источник
comment
Хорошо, я перефразировал вопрос.   -  person johnny    schedule 10.12.2020


Ответы (1)


Вы можете сгруппировать (я использую dplyr) свой data.frame (я использую tibble) по идентификатору, а затем создать новые переменные, которые указывают, является ли для каждого идентификатора первый год наблюдение было 1989 г., умер ли человек под наблюдением и равно ли количество строк на идентификатор промежутку времени (max_year - min_year + 1). В этом случае я бы сказал, что ID 2 не подвергается цензуре, поскольку ее первый год наблюдения - 1989 год, который вы определяете как начальный год.

library(tibble)
library(dplyr)


id <- c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3)
year <- c(1990, 1991, 1992, 1989, 1990, 1991, 1992, 1993, 1989, 1990, 1992, 1993)
deceased <- c(0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1) 

df <- tibble(id, year, deceased)

start_year <- 1989

df %>% group_by(id) %>% mutate(left_censored = min(year) > start_year,  ## left censored, if first year is after 1988
                               right_censored = max(deceased) == 0, ## right censored, if did not die within observation 
                               has_gaps = n() < max(year) - min(year) + 1) ## has gaps, 

Результат:

# A tibble: 12 x 6
# Groups:   id [3]
      id  year deceased left_censored right_censored has_gaps
   <dbl> <dbl>    <dbl> <lgl>         <lgl>          <lgl>   
 1     1  1990        0 TRUE          FALSE          FALSE   
 2     1  1991        0 TRUE          FALSE          FALSE   
 3     1  1992        1 TRUE          FALSE          FALSE   
 4     2  1989        0 FALSE         TRUE           FALSE   
 5     2  1990        0 FALSE         TRUE           FALSE   
 6     2  1991        0 FALSE         TRUE           FALSE   
 7     2  1992        0 FALSE         TRUE           FALSE   
 8     2  1993        0 FALSE         TRUE           FALSE   
 9     3  1989        0 FALSE         FALSE          TRUE    
10     3  1990        0 FALSE         FALSE          TRUE    
11     3  1992        0 FALSE         FALSE          TRUE    
12     3  1993        1 FALSE         FALSE          TRUE 

Изменить. Если вам нужен обзор, вы можете добавить:

df %>% group_by(id) %>% mutate(left_censored = min(year) > start_year,  ## left censored, if first year is after 1988
                                   right_censored = max(deceased) == 0, ## right censored, if did not die within observation 
                                   has_gaps = n() < max(year) - min(year) + 1) %>%## has gaps, 
      dplyr::distinct(id, left_censored, right_censored, has_gaps) %>%
      ungroup() %>%
      summarise(left_censored = sum(left_censored), right_censored = sum(right_censored), has_gaps = sum(has_gaps))

И получить:

# A tibble: 1 x 3
  left_censored right_censored has_gaps
          <int>          <int>    <int>
1             1              1        1

Как я упоминал ранее: здесь ID 2 не считается подвергнутым левой цензуре, так как ее начальная дата — 1989 год.

Edit2: если вы уберете ungroup(), вы получите обзор, который вы просили:

df %>% group_by(id) %>% mutate(left_censored = min(year) > start_year,  ## left censored, if first year is after 1988
                               right_censored = max(deceased) == 0, ## right censored, if did not die within observation 
                               has_gaps = n() < max(year) - min(year) + 1) %>%## has gaps, 
  dplyr::distinct(id, left_censored, right_censored, has_gaps) %>%
  summarise(left_censored = sum(left_censored), right_censored = sum(right_censored), has_gaps = sum(has_gaps))

и получить:

  id left_censored right_censored has_gaps
  <dbl>         <int>          <int>    <int>
1     1             1              0        0
2     2             0              1        0
3     3             0              0        1
person Chris    schedule 10.12.2020
comment
Круто, спасибо большое! И да, вы правы, id 2 не оставлен без цензуры, я забыл отредактировать текст после того, как немного изменил данные. - person johnny; 10.12.2020