使用Purrr(或broom)计算分组数据的比例检验(多比例检验)。

4
假设我有一个数据框,由"年份"和"认知障碍"(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)

然而,我认为使用broom或purrr可以使这些分析更简单。我的目标是拥有像这样的表格:

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

使用broom包中的tidy。改编自https://dev59.com/TWEh5IYBdhLWcg3wMA0t#30015869

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年4月6日,使用了 reprex软件包 (v0.3.0)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接