我想使用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地图版本可以解决问题,但是我不太能将其组合在一起。预先感谢。
答案 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()
语句中隐式完成的。最后,您将获得cyl
,vs
,am
的每种组合的观测值和标准化残差。应该适用于任何数据框。
希望这就是您想要的。