Храните несколько значений chisq.test в обобщенном виде

Я сгруппировал данные, в которых я выполняю тест хи-квадрат, и хотел бы вернуть сводную таблицу, которая включает несколько значений из htest объект. Например ( из предыдущего вопроса),

library(dplyr)

set.seed(1)
foo <- 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 %>% 
  group_by(GM) %>% 
  summarise(p.value=chisq.test(partido, genero)$p.value))

возвращает значение р, но вместо этого я хотел бы несколько значений (скажем, p.value а также statistic) от htest объект должен быть возвращен в виде различных столбцов в сводной таблице.

я пробовал

foo %>%
  group_by(GM) %>%
  summarise(htest=chisq.test(partido, genero)) %>%
  mutate(p.value=htest$p.value, statistic=htest$statistic)

но это выдает ошибку

Ошибка в summarise_impl(.data, точки):
колонка htest должно быть длиной 1 (суммарное значение), а не 9

Как вы делаете это с помощью инструментов Tidyverse?

2 ответа

Решение

Другой вариант заключается в использовании broom::tidy

library(broom)
library(tidyverse)
foo %>%
    group_by(GM) %>%
    nest() %>%
    transmute(
        GM,
        res = map(data, ~tidy(chisq.test(.x$partido, .x$genero)))) %>%
    unnest()
## A tibble: 2 x 5
#  GM      statistic p.value parameter method
#  <fct>       <dbl>   <dbl>     <int> <chr>
#1 Bajo       0.0157   0.900         1 Pearson's Chi-squared test with Yates' c…
#2 Muy ba…    0.504    0.478         1 Pearson's Chi-squared test with Yates' c…

Одним из способов было бы nest данные по группам (GM), а затем использовать map чтобы получить разные значения из каждой группы.

library(tidyverse)

foo %>%
  group_by(GM) %>%
  nest(partido, genero) %>%
  ungroup() %>%
  mutate(p.value = map_dbl(data, ~ chisq.test(.$partido,.$genero)$p.value), 
        statistic = map_dbl(data, ~ chisq.test(.$partido,.$genero)$statistic)) %>%
  select(-data)

#    GM       p.value statistic
#  <fct>      <dbl>     <dbl>
#1 Bajo       0.900    0.0157
#2 Muy bajo   0.478    0.504 

Или, если мы хотим запустить тест только один раз, мы можем сохранить объект в одной переменной и извлечь значения, представляющие интерес.

foo %>%
  group_by(GM) %>%
  nest(partido, genero) %>%
  ungroup() %>%
  mutate(obj = map(data, ~ chisq.test(.$partido,.$genero)), 
         p.value = map_dbl(obj, ~ .$p.value), 
         statistic = map_dbl(obj, ~ .$statistic)) %>%
  select(-data, -obj)
Другие вопросы по тегам