【问题标题】:Get `chisq.test()$p.value` for several groups using `dplyr::group_by()`使用 `dplyr::group_by()` 获取多个组的 `chisq.test()$p.value`
【发布时间】:2017-08-16 22:46:12
【问题描述】:

我正在尝试对 dplyr 框架内的几个组进行卡方检验。问题是,group_by() %>% summarise() 似乎没什么用。

模拟数据(与有问题的数据结构相同,但随机,因此 p.values 应该很高)

set.seed(1)
data.frame(partido=sample(c("PRI", "PAN"), 100, 0.6),
       genero=sample(c("H", "M"), 100, 0.7), 
       GM=sample(c("Bajo", "Muy bajo"), 100, 0.8)) -> foo

我想比较 GM 定义的几个组,以查看 partido 和 Genero 的交叉表的 p.values 是否有变化,以 GM 为条件。

明显的dplyr方式应该是:

foo %>% 
  group_by(GM) %>% 
  summarise(pvalue=chisq.test(.$partido, .$genero)$p.value)  #just the p.value, so summarise is happy

但是我得到了未分组数据的 p.values,只是时间,而不是每个表的 p.value:

# A tibble: 2 × 2 GM pvalue <fctr> <dbl> 1 Bajo 0.8660521 2 Muy bajo 0.8660521

使用我得到的过滤器测试每个组:

foo %>% 
  filter(GM=="Bajo") %$% 
  table(partido, genero) %>% 
  chisq.test()

返回:X-squared = 0.015655, df = 1, p-value = 0.9004

foo %>% 
  filter(GM=="Muy bajo") %$% 
  table(partido, genero) %>% chisq.test()

返回:X-squared = 0.50409, df = 1, p-value = 0.4777

dplyr:summarise() 适用于具有多个参数的函数,所以这应该不是问题:

data.frame(a=1:10, b=10:1, c=sample(c("Grupo 1", "Grupo 2"), 10, 0.5)) %>% 
    group_by(c) %>% 
    summarise(r=cor(a, b))

像魅力一样工作。它似乎不适用于 chisq.test。

我设法使用tidyr::nest()purrr::map() 获得了我想要的嵌套模型,但我发现代码很麻烦——至少对我的学生来说是这样。实际上,我已经投入了很多人来教他们(一个非常数学和编程挑战的小组)dplyr,这样他们就可以尽可能地避免使用向量函数。

foo %>% 
  nest(-GM) %>% 
  mutate(tabla=map(data, ~table(.))) %>% 
  mutate(pvalue=map(tabla, ~chisq.test(.)$p.value)) %>% 
  select(GM, pvalue) %>% 
  unnest()

A tibble: 2 × 2
       GM   pvalue
    <fctr>  <dbl>
1     Bajo  0.9004276
2 Muy bajo  0.4777095

do() 也能做到这一点:

foo %>% 
  group_by(GM) %>% 
  do(tidy(chisq.test(.$partido, .$genero)))

Source: local data frame [2 x 5]
Groups: GM [2]
    GM statistic   p.value parameter
<fctr>     <dbl>     <dbl>     <int>
1     Bajo 0.0156553 0.9004276         1
2 Muy bajo 0.5040878 0.4777095         1
# ... with 1 more variables: method <fctr>

如:Fisher's and Pearson's test for indepedence

但是,¿为什么group_by() 不能与summarise(chisq.test()$p.value) 一起使用?

【问题讨论】:

    标签: r dplyr chi-squared tidyverse


    【解决方案1】:

    dplyr 中,您通常可以只使用不带引号的变量名来访问相关列,无论您是在 groupby 中还是在其他组中。因此,从 .$partido.$genero 中删除不需要的 .$ 访问器,我得到:

    foo %>% 
        group_by(GM) %>% 
        summarise(pvalue= chisq.test(partido, genero)$p.value) 
    
    # A tibble: 2 × 2
            GM    pvalue
        <fctr>     <dbl>
    1     Bajo 0.9004276
    2 Muy bajo 0.4777095
    

    【讨论】:

    • 有效! dplyr 让事情变得如此简单,以至于我不得不使用.$ 使自己复杂化。非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多