使用 dplyr 或 reshape2 跨数据框多列的卡方统计量

Mik*_*ike 5 r reshape2 dplyr broom

我有一个关于使用dplyrreshape2计算多列卡方统计量的问题。下面是一个小数据框...

Sat <- c("Satisfied","Satisfied","Dissatisfied","Dissatisfied",
                                       "Neutral")

Gender <- c("Male","Male","Female","Male","Female")

Ethnicity <- c("Asian","White","White","Asian","White")

AgeGroup <- c("18-20","18-20","21-23","18-20","18-28")

Example <- data.frame(Sat,Gender,Ethnicity,AgeGroup)
Run Code Online (Sandbox Code Playgroud)

我将如何使用summarise_eachmelt计算Sat针对每个其他变量的列以生成卡方残差和 p 值统计数据。我想一定有类似的东西:

Example %>% summarise_each(funs(chisq.test(... 
Run Code Online (Sandbox Code Playgroud)

但我不知道如何完成它。另外,我将如何融化数据框并使用group_bydo()获取卡方统计数据?我有兴趣看到这两种方法。如果有一种方法可以合并broom包,那也很棒,或者tidyr代替reshape2.

所以回顾一下,我想运行卡方检验,例如

chisq.test(Example$Sat, Example$Gender)
Run Code Online (Sandbox Code Playgroud)

但是......我想产生卡方统计为Sat对变量GenderEthnicityAgeGroup。这是一个小例子,我希望上面的方法能让我以快速有效的方式创建跨多列的卡方统计数据。如果我可以用 绘制热图中的残差ggplot2,这就是我有兴趣将broom包合并到​​这个示例中的原因。

akr*_*run 3

如果我们需要得到p values

 Example %>% 
    summarise_each(funs(chisq.test(., 
               Example$Sat)$p.value), -one_of("Sat"))
 #     Gender Ethnicity  AgeGroup
 #1 0.2326237 0.6592406 0.1545873
Run Code Online (Sandbox Code Playgroud)

或者提取statistic

Example %>%
    summarise_each(funs(chisq.test(., 
           Example$Sat)$statistic), -one_of("Sat"))
#   Gender Ethnicity AgeGroup
#1 2.916667 0.8333333 6.666667
Run Code Online (Sandbox Code Playgroud)

要获得residuals,会更容易base R

 lapply(Example[setdiff(names(Example), "Sat")], 
       function(x) chisq.test(x, Example$Sat)$residuals)
Run Code Online (Sandbox Code Playgroud)