Храните несколько значений 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)