2016-04-07 11 views
2

У меня есть вопрос об использовании dplyr и reshape2 для вычисления статистики хи-квадратов по нескольким столбцам. Ниже приведен небольшой dataframe ...Статистика хи-квадрат по нескольким столбцам данных с использованием dplyr или reshape2

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) 

Как бы использовать summarise_each или melt вычислить Sat колонку против каждого из остальных переменных для производства хи-квадрат остатков и р-значение статистики. Я думаю, что должно быть что-то вроде:

Example %>% summarise_each(funs(chisq.test(... 

но я не уверен, как его закончить. Кроме того, как бы я расплавил фрейм данных и использовать group_by или do(), чтобы получить статистику хи-квадрат? Мне интересно видеть оба метода. Если есть способ включить пакет broom, это тоже здорово, или tidyr вместо reshape2.

Подведем итоги, я хотел бы запустить хи-квадрат тесты, такие как

chisq.test(Example$Sat, Example$Gender) 

, но ... Я хотел бы, чтобы произвести хи-квадрат статистики для Sat переменной против Gender, Ethnicity, и AgeGroup. Это небольшой пример, и я надеюсь, что методы, описанные выше, позволят мне быстро и эффективно создавать статистику хи-квадрата по многим столбцам. Бонус, если я могу построить остатки на карте тепла с ggplot2, поэтому я заинтересован в включении пакета broom в этот пример.

+0

Есть периоды в 'Sat', который, вероятно, должен быть запятой; он не будет работать как есть. – alistaire

ответ

1

Если нам нужно, чтобы получить 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 

Или извлечь statistic

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

Чтобы получить residuals, было бы проще с base R

lapply(Example[setdiff(names(Example), "Sat")], 
     function(x) chisq.test(x, Example$Sat)$residuals) 
+0

Спасибо за подробные ответы, они отлично работают! Только один вопрос, я не знаком с «setdiff», в чем его цель? – Mike

+0

@Mike Цель 'setdiff' - вернуть те элементы в первом векторе, которые не находятся во втором векторе. В этом примере он должен вернуть все имена столбцов, кроме «Сб». – akrun