Храните несколько значений chisq.test в обобщенном виде - PullRequest
0 голосов
/ 02 февраля 2019

Я сгруппировал данные, в которых я выполняю тест хи-квадрат, и хотел бы вернуть сводную таблицу, содержащую несколько значений из объекта 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, но вместо этого я хотел бы получить несколько значений (скажем, 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 ]

0 голосов
/ 02 февраля 2019

Другой вариант - использовать 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…
0 голосов
/ 02 февраля 2019

Одним из способов будет 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...