在摘要小节中保留chisq.test的多个值

时间:2019-02-02 03:18:08

标签: r dplyr hypothesis-test

我对正在执行卡方检验的数据进行了分组,并希望返回一个汇总表,该表包含来自htest对象的多个值。例如(from a previous question

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对象的多个值(例如statistichtest)作为摘要表中的不同列返回。 / p>

我尝试过

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 :(得分:4)

另一种选择是利用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…

答案 1 :(得分:1)

一种方法是按组(nestGM收集数据,然后使用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)