Purrr (или метла) для вычисления пропорционального теста для сгруппированного набора данных (тест с несколькими пропорциями) - PullRequest
4 голосов
/ 06 апреля 2020

Допустим, у меня есть фрейм данных, состоящий из "года" и "когнитивных нарушений" (1 = да, 0 = в противном случае)

dataset

Я хочу сравнить пропорции каждый год. Таким образом, 2000 будет:

 df %>% 
  filter(year == 2000) %>% 
  {prop.test(rev(table(.$cogimp)),p = 0.5, conf.level=0.95)}

И я могу проверить по:

prop.test(x = 3, n = 30, p = 0.5, conf.level=0.95)

Однако мне кажется, что я могу упростить эти анализы, используя метлу или мурлыканье. Моя цель - создать такую ​​таблицу:

final table

Код указан ниже:

df <- structure(list(year = c(2000, 2000, 2015, 2015, 2000, 2015, 2000, 
                              2000, 2000, 2000, 2015, 2006, 2015, 2015, 2010, 2006, 2006, 2010, 
                              2000, 2006, 2015, 2006, 2015, 2015, 2000, 2015, 2000, 2015, 2015, 
                              2010, 2015, 2015, 2015, 2000, 2006, 2006, 2006, 2015, 2015, 2006, 
                              2015, 2010, 2000, 2000, 2010, 2006, 2010, 2010, 2015, 2000, 2015, 
                              2006, 2000, 2006, 2015, 2006, 2000, 2010, 2010, 2010, 2015, 2006, 
                              2015, 2000, 2015, 2010, 2010, 2010, 2010, 2000, 2000, 2000, 2006, 
                              2015, 2015, 2000, 2000, 2000, 2015, 2006, 2006, 2010, 2006, 2000, 
                              2010, 2000, 2015, 2015, 2015, 2015, 2010, 2000, 2000, 2010, 2006, 
                              2010, 2010, 2000, 2000, 2000), cogimp = c(0, 0, 0, 0, 0, 0, 0, 
                                                                        0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
                                                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 
                                                                        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 
                                                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 
                                                                        1, 1, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -100L), class = c("tbl_df", 
                                                                                                                                         "tbl", "data.frame"))

df %>% 
  count(year, cogimp)

df %>% 
  filter(year == 2006) %>% 
  {prop.test(rev(table(.$cogimp)),p = 0.5, conf.level=0.95)}

prop.test(x = 3, n = 30, p = 0.5, conf.level=0.95)
prop.test(x = 2, n = 19, p = 0.5, conf.level=0.95)

1 Ответ

2 голосов
/ 06 апреля 2020

Использование tidy из пакета метлы. Адаптировано из { ссылка }

library(dplyr)
library(broom)

df <- structure(list(year = c(2000, 2000, 2015, 2015, 2000, 2015, 2000, 
                              2000, 2000, 2000, 2015, 2006, 2015, 2015, 2010, 2006, 2006, 2010, 
                              2000, 2006, 2015, 2006, 2015, 2015, 2000, 2015, 2000, 2015, 2015, 
                              2010, 2015, 2015, 2015, 2000, 2006, 2006, 2006, 2015, 2015, 2006, 
                              2015, 2010, 2000, 2000, 2010, 2006, 2010, 2010, 2015, 2000, 2015, 
                              2006, 2000, 2006, 2015, 2006, 2000, 2010, 2010, 2010, 2015, 2006, 
                              2015, 2000, 2015, 2010, 2010, 2010, 2010, 2000, 2000, 2000, 2006, 
                              2015, 2015, 2000, 2000, 2000, 2015, 2006, 2006, 2010, 2006, 2000, 
                              2010, 2000, 2015, 2015, 2015, 2015, 2010, 2000, 2000, 2010, 2006, 
                              2010, 2010, 2000, 2000, 2000), cogimp = c(0, 0, 0, 0, 0, 0, 0, 
                                                                        0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
                                                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 
                                                                        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 
                                                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 
                                                                        1, 1, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -100L), class = c("tbl_df", 
                                                                                                                                         "tbl", "data.frame"))

df_test <- df %>% 
  group_by(year) %>%
  summarize(cogimp = sum(cogimp), n = n()) %>%
  group_by(year, cogimp, n) %>%
  do(fitYear = prop.test(.$cogimp, .$n, p = 0.5, conf.level = 0.95))

tidy(df_test, fitYear) %>%
  select(year, cogimp, n, p.value)
#> # A tibble: 4 x 4
#> # Groups:   year, cogimp, n [4]
#>    year cogimp     n   p.value
#>   <dbl>  <dbl> <int>     <dbl>
#> 1  2000      3    30 0.0000268
#> 2  2006      2    19 0.00132  
#> 3  2010      8    20 0.502    
#> 4  2015      3    31 0.0000163

Создано в 2020-04-06 пакетом Представления (v0.3.0)

...