用于可视化或过滤P值的Tidy chisq.test输出的功能

时间:2017-01-24 22:56:50

标签: r dplyr purrr tidyverse broom

对于数据......

library(productplots) 
library(ggmosaic)

代码......

 library(tidyverse)
 library(broom)

我正在尝试创建整洁的chisq.test输出,以便我可以轻松过滤或可视化p值。

我正在使用“快乐”数据集(包含在上面列出的任何一个包中)

对于这个例子,如果我想在所有其他变量上调整“happy”变量,我会隔离分类变量(对于这个例子,我不会创建超出年龄,年份等的因子分组) ,然后运行一个简单的函数。

df<-happy%>%select(-year,-age,-wtssall)
lapply(df,function(x)chisq.test(happy$happy,x)

但是,我想从“扫帚”包中输出一个整洁的输出,这样我就可以创建一个p值的数据帧来过滤或可视化。

我尝试过类似下面代码的各种组合,希望能够进一步加入“整洁”的扫帚功能,或者进入“过滤器”,在这里可以缩小重要的p值,或管道进入ggplot条形图p值或chi统计数据。

df%>%summarise_if(is.factor,funs(chisq.test(.,df$happy)$p.value))

...但输出似乎不正确。如果我针对变量分别运行invidivual chisq.test,答案就不同了。

那么,有没有办法轻松地比较分类变量,在这种情况下,对所有其他列“快乐”,并返回一个整洁的数据帧进行进一步的操作和分析?

使用dplyr :: mutate,tidyr :: nest和purrr :: map的Purrr解决方案会很棒,但我觉得嵌套列表列方法不能用于chisq.test。

1 个答案:

答案 0 :(得分:2)

您可以在tidyverse工作流程内完成所有操作,使用map代替lapply。除非您要对数据进行子集化以便以某种方式(例如年龄组)比较结果,否则不需要nest

df <- happy%>%
  select(-id, -year,-age,-wtssall) %>% 
  map(~chisq.test(.x, happy$happy)) %>% 
  tibble(names = names(.), data = .) %>% 
  mutate(stats = map(data, tidy))

unnest(df, stats)

# A tibble: 6 × 6
    names        data   statistic       p.value parameter                     method
    <chr>      <list>       <dbl>         <dbl>     <int>                     <fctr>
1   happy <S3: htest> 92606.00000  0.000000e+00         4 Pearson's Chi-squared test
2     sex <S3: htest>    11.46604  3.237288e-03         2 Pearson's Chi-squared test
3 marital <S3: htest>  2695.18474  0.000000e+00         8 Pearson's Chi-squared test
4  degree <S3: htest>   659.33013 4.057952e-137         8 Pearson's Chi-squared test
5 finrela <S3: htest>  2374.24165  0.000000e+00         8 Pearson's Chi-squared test
6  health <S3: htest>  2928.62829  0.000000e+00         6 Pearson's Chi-squared test