2016-04-07 13 views
2

Ich habe eine Frage über die Verwendung dplyr und reshape2, um Chi-Quadrat-Statistiken über mehrere Spalten zu berechnen. Im Folgenden finden Sie ein kleiner Datenrahmen ...Chi-Quadrat-Statistik über mehrere Spalten eines Datenrahmens mit dplyr oder 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) 

Wie würde ich verwenden summarise_each oder melt die Sat Spalt gegen jeden der anderen Variablen zu berechnen Chi-Quadrat-Rest und p-Wert Statistiken zu erzeugen. Ich denke, es so etwas wie sein:

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

aber ich bin nicht sicher, wie es zu beenden. Auch, wie würde ich den Datenrahmen schmelzen und group_by oder do() verwenden, um die Chi-Quadrat-Statistiken zu erhalten? Ich bin daran interessiert, beide Methoden zu sehen. Wenn es eine Möglichkeit gibt, das broom Paket einzubauen, wäre das auch großartig, oder tidyr statt reshape2.

So zu rekapitulieren, würde ich gerne Chi-Quadrat-Tests, wie

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

aber ... Ich möchte Chi-Quadrat-Statistik für die Sat Variable gegen Gender, Ethnicity, laufen produzieren und AgeGroup. Dies ist ein kleines Beispiel, und ich hoffe, dass die obigen Methoden es mir erlauben werden, Chi-Quadrat-Statistiken in vielen Spalten schnell und effizient zu erstellen. Bonus, wenn ich die Residuen in einer Heat Map mit ggplot2 plotten kann, weshalb ich an der Einbindung des broom Pakets in dieses Beispiel interessiert bin.

+0

Es gibt Perioden in 'Sat', was wohl Kommas sein sollten; es wird nicht so laufen wie es ist. – alistaire

Antwort

1

Wenn wir die 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 

oder zu extrahieren, die statistic

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

Um die residuals zu bekommen bekommen müssen, wäre es einfacher, mit base R

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

Danke für die ausführlichen Antworten, sie funktionieren super! Nur eine Frage, ich bin nicht vertraut mit "setdiff", was ist der Zweck davon? – Mike

+0

@Mike Der Zweck von 'setdiff' besteht darin, die Elemente im ersten Vektor zurückzugeben, die nicht im zweiten Vektor enthalten sind. In diesem Beispiel sollten alle Spaltennamen mit Ausnahme von "Sat" zurückgegeben werden. – akrun