gpt4 book ai didi

r - 使用 `chisq.test()$p.value` 为多个组获取 `dplyr::group_by()`

转载 作者:行者123 更新时间:2023-12-01 09:48:39 26 4
gpt4 key购买 nike

我正在尝试对 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 和 generic 的交叉表的 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) 一起工作?

最佳答案

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

关于r - 使用 `chisq.test()$p.value` 为多个组获取 `dplyr::group_by()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42991993/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com