使用R dplyr / purrr按组获取卡方输出矩阵

时间:2019-03-25 00:54:57

标签: r dplyr purrr

我想使用tidyverse的元素按组获取卡方输出矩阵(例如,标准化残差,期望值)。使用mtcars数据集,这是我开始的地方:

mtcars %>% 
  dplyr::select(vs, am) %>%
  table() %>%
  chisq.test(.) 

产生卡方检验统计量。例如,为了获得标准化残差,我唯一成功的代码是:

mtcars %>% 
  dplyr::select(vs, am) %>%
  table() %>%
  chisq.test(.) -> chi.out

chi.out$stdres

     vs am       Freq
1  0  0  0.9523038
2  1  0 -0.9523038
3  0  1 -0.9523038
4  1  1  0.9523038

理想情况下,我想将观测值和标准化残差转换为数据框格式。像这样:

cbind(as.data.frame(chi.out$observed),as.data.frame(chi.out$stdres))

  vs am Freq vs am       Freq
1  0  0   12  0  0  0.9523038
2  1  0    7  1  0 -0.9523038
3  0  1    6  0  1 -0.9523038
4  1  1    7  1  1  0.9523038

最后,我想按组进行此操作,例如在mtcars数据集中的cyl列上。似乎dplyr和一些带有map_dfr或map_dfc的purrr地图版本可以解决问题,但是我不太能将其组合在一起。预先感谢。

1 个答案:

答案 0 :(得分:1)

这是我对解决方案的建议。

library(dplyr)
library(reshape2)

mtcars %>% 
  select(vs, am, cyl) %>%
  table() %>%
  apply(3, chisq.test) %>%
  lapply(`[`, c(6,9)) %>%
  melt() %>%
  spread(key = L2, value = value) %>%
  rename(cyl = L1) %>%
  select(cyl, vs, am, observed, stdres) %>%
  arrange(cyl)


   cyl vs am observed     stdres
1    4  0  0        0 -0.6422616
2    4  0  1        1  0.6422616
3    4  1  0        3  0.6422616
4    4  1  1        7 -0.6422616
5    6  0  0        0 -2.6457513
6    6  0  1        3  2.6457513
7    6  1  0        4  2.6457513
8    6  1  1        0 -2.6457513
9    8  0  0       12        NaN
10   8  0  1        2        NaN
11   8  1  0        0        NaN
12   8  1  1        0        NaN

这对cyl的每组都进行卡方检验。分组是在select()语句中隐式完成的。最后,您将获得cylvsam的每种组合的观测值和标准化残差。应该适用于任何数据框。

希望这就是您想要的。