Получите `chisq.test()$p.value` для нескольких групп, используя`dplyr::group_by()`

Я пытаюсь провести тест хи-квадрат на нескольких группах в кадре 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, чтобы увидеть, есть ли изменения в p.values ​​для кросс-таблицы partido и genero, условно для 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(), но я нахожу код громоздким - по крайней мере, для моих студентов. На самом деле, я вложил много наших преподавателей (очень сложная группа по математике и программированию), чтобы они могли как можно больше избегать векторных функций.

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>

как в: тест Фишера и Пирсона на независимость

Но, почему нет group_by() работать с summarise(chisq.test()$p.value)?

1 ответ

Решение

В dplyr Вы можете просто использовать имена переменных без кавычек для доступа к соответствующим столбцам, независимо от того, находитесь ли вы в группе или нет. Так что удаление .$ аксессоры из .$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
Другие вопросы по тегам