2016-05-27 14 views
3

Ich habe einen Datenrahmen 'math.numeric' mit 32 Variablen. Jede Zeile repräsentiert einen Schüler und jede Variable ist ein Attribut. Die Schüler wurden basierend auf ihrer Abschlussnote in 5 Gruppen eingeteilt.Schleife durch t.tests für Datenrahmenuntergruppen in r

Die Daten sieht wie folgt aus:

head(math.numeric) 
school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason ... group 
1  1 18 2  1  1  4 4 1 5 1   2 
1  1 17 2  1  2  1 1 1 3 1   2 
1  1 15 2  2  2  1 1 1 3 3   3 
1  1 15 2  1  2  4 2 2 4 2   4 
1  1 16 2  1  2  3 3 3 3 2   3 
1  2 16 2  2  2  4 3 4 3 4   4 

I auf jede Variable für die Gruppe t-Tests am Durchführen 1 vs. alle anderen Gruppen mit dieser Gruppe signifikant unterschiedliche Eigenschaften zu identifizieren. Ich suche die p-Werte für jeden Test, wie zu ziehen:

t.test(subset(math.numeric$school, math.numeric$group == 1), 
     subset(math.numeric$school, math.numeric$group != 1))$p.value 
t.test(subset(math.numeric$sex, math.numeric$group == 1), 
     subset(math.numeric$sex, math.numeric$group != 1))$p.value 
t.test(subset(math.numeric$age, math.numeric$group == 1), 
     subset(math.numeric$age, math.numeric$group != 1))$p.value 

ich, um herauszufinden versucht haben, wie ich eine Schleife, dies zu tun in einer Zeit eines jeden Test anstelle des Schreibens aus erstellen können. Ich habe eine for-Schleife ausprobiert, und laply, aber bis jetzt hatte ich kein Glück.

Ich bin ziemlich neu, so dass jede Hilfe geschätzt werden würde.

Courtney

+0

Sie sollten Beispieldaten enthalten Ihr Problem [reproduzierbaren] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example machen) und es leichter machen, dir zu helfen. – MrFlick

Antwort

3

Ihre Beispieldaten reichen nicht aus, um tatsächlich T-Tests für alle Untergruppen durchzuführen. Aus diesem Grund nehme ich den iris Datensatz, der 3 Pflanzenarten enthält: Setosa, Versicolor und Virginica. Dies sind meine Gruppen. Sie müssen Ihren Code entsprechend anpassen. Im Folgenden zeige ich, wie man eine Gruppe im Vergleich zu allen anderen Gruppen, eine Gruppe gegen jede andere Gruppe und alle Kombinationen einzelner Gruppen testet.

Eine Gruppe im Vergleich zu allen anderen Gruppen kombiniert:

Zuerst lassen Sie uns sagen, ich will versicolor und Virginica zu Setosa vergleichen, das heißt Setosa ist mein group 1 zu dem alle anderen Gruppen verglichen werden sollte. Eine einfache Möglichkeit, zu erreichen, was Sie wollen, ist die folgende:

sapply(names(iris)[-ncol(iris)], function(x){ 
      t.test(iris[iris$Species=="setosa", x], 
        iris[iris$Species!="setosa", x])$p.value 
        }) 
Sepal.Length Sepal.Width Petal.Length Petal.Width 
7.709331e-32 1.035396e-13 1.746188e-69 1.347804e-60 

Hier habe ich die Namen der verschiedenen Variablen im Datensatz names(iris) geliefert - exlcuding die Spalte angibt, die Gruppenvariable [-ncol(iris)] (da es sich um die letzte Spalte) - als Vektor zu sapply, der die entsprechenden Namen als Argumente an die Funktion übergibt, die ich definiert habe.

Eine Gruppe im Vergleich zu allen anderen Gruppen:

Falls Sie groupwise Vergleiche für alle Gruppen machen wollen, können die folgenden hilfreich sein: Erstellen Sie zunächst ein Datenrahmen von allen Gruppen x variable Kombinationen, die Sie werden, abgesehen von der Gruppierungsvariablen selbst und der Referenzgruppe, natürlich. Dies kann erreicht werden durch:

comps <- expand.grid(unique(iris$Species)[-1], # excluding Setosa as reference group 
        names(iris)[-ncol(iris)] # excluding group column 
        ) 
head(comps) 
     Var1   Var2 
1 versicolor Sepal.Length 
2 virginica Sepal.Length 
3 versicolor Sepal.Width 
4 virginica Sepal.Width 
5 versicolor Petal.Length 
6 virginica Petal.Length 

Hier sind Var1 die verschiedenen Arten und Var2 die verschiedenen Variablen, für die Vergleiche durchgeführt werden. Die Referenz group 1 oder Setosa ist in diesem Fall implizit. Jetzt kann ich apply verwenden, um die Tests zu erstellen. Ich tue dies, indem ich jede Zeile von comps als Argument mit zwei Elementen verwende, von denen das erste angibt, um welche Gruppe es sich handelt, und das zweite Argument gibt an, welche Variable verglichen werden soll. Diese werden verwendet, um den ursprünglichen Datenrahmen zu unterteilen.

wo Gruppe 1 aka Setosa in der Funktion fest codiert ist. Das gibt mir einen Datenrahmen mit p-Werte für alle Kombinationen (mit Setosa als Referenzgruppe), so dass sie leicht zu sehen:

head(comps) 
     Var1   Var2   pval 
1 versicolor Sepal.Length 3.746743e-17 
2 virginica Sepal.Length 3.966867e-25 
3 versicolor Sepal.Width 2.484228e-15 
4 virginica Sepal.Width 4.570771e-09 
5 versicolor Petal.Length 9.934433e-46 
6 virginica Petal.Length 9.269628e-50 

Alle Kombinationen von Gruppen:

Sie können die erweitern oben leicht einen Datenrahmen zu erzeugen, der p-Werte von t-Tests für jede Kombination von Gruppen enthält. Ein Ansatz wäre:

comps <- expand.grid(unique(iris$Species), unique(iris$Species), names(iris)[-ncol(iris)]) 

Dies hat jetzt drei Spalten. Die ersten beiden sind die Gruppen und die dritte die Variable:

head(comps) 
     Var1  Var2   Var3 
1  setosa  setosa Sepal.Length 
2 versicolor  setosa Sepal.Length 
3 virginica  setosa Sepal.Length 
4  setosa versicolor Sepal.Length 
5 versicolor versicolor Sepal.Length 
6 virginica versicolor Sepal.Length 

Sie können diese verwenden, um die Tests durchzuführen:

comps$pval <- apply(comps, 1, function(x) { 
    t.test(iris[iris$Species==x[1], x[3]], iris[iris$Species==x[2], x[3]])$p.value 
}) 

ich eine Fehlermeldung: Was soll ich tun?

t.test kann eine Fehlermeldung ausgeben, wenn die Stichprobengröße zu klein ist oder die Werte für eine Gruppe konstant sind. Dies ist problematisch, da es möglicherweise nur für bestimmte Gruppen auftritt und Sie möglicherweise nicht im Voraus wissen, welche es ist. Der Fehler wird jedoch den gesamten Funktionsaufruf an apply stören, und Sie werden keine Ergebnisse sehen.

Eine Möglichkeit, dies zu umgehen und die problematischen Gruppen zu identifizieren, ist das Umbrechen der Funktion t.test um dplyr::failwith (siehe auch ?tryCatch). Um zu zeigen, wie dies funktioniert, sollten Sie Folgendes berücksichtigen:

smalln <- data.frame(a=1, b=2) 
t.test(smalln$a, smalln$b) 
> Error in t.test.default(smalln$a, smalln$b) : not enough 'x' observations 

failproof.t <- failwith(default="Some default of your liking", t.test, quiet = T) 
failproof.t(smalln$a, smalln$b) 
[1] "Some default of your liking" 

Auf diese Weise, wenn t.test einen Fehler werfen würde, Sie ein Zeichen als Ergebnis erhalten statt und die Berechnung weiter mit anderen Gruppen. Natürlich können Sie auch default auf eine Nummer oder irgendetwas anderes setzen. Es muss kein Charakter sein.

Statistische Haftungsausschluss: Nach all dem, beachten Sie, dass die Durchführung einer Reihe von t-Tests ist nicht unbedingt eine gute statistische Praxis. Vielleicht möchten Sie Ihre p-Werte anpassen, um mehrere Tests zu berücksichtigen, oder Sie möchten alternative Testverfahren verwenden, die gemeinsame Tests durchführen.

3

Hows das?

pvals <- numeric() #the vector of p values 
k <- 1 #in case you choose to use a subset not continuing from 1 

# "for(i in seq(1,5))" is just doing the pvalues for the first 5 columns. You could do a 
# list, like "c(1,2,4)" (in place of "seq(1,5)"), to do tests for columns 1, 2, and 4. 
# To do all of the columns, try "for(i in seq(1,(ncol(math.numeric)-1)))". 

for(i in seq(1,5)){ 

    # using your code to grab the p-values and store them in the kth element of "pvals" 
    pvals[k] <- t.test(subset(math.numeric[,i], math.numeric$group == 1), 
     subset(math.numeric[,i], math.numeric$group != 1))$p.value  

    #iterating the "pvals" vector entry counter 
    k=k+1 
} 
pvals #printing the p values for each test 
1

Sie können den Datenrahmen nach Gruppen aufteilen und mapply() über die Spalten hinweg verwenden. Die Ausgabe wird zu einer kompilierten Liste von Teststatistiken: Statistik, Parameter, p-Wert, Konfid. Intervall usw.

# FILTER ROWS AND SUBSET NUMERIC COLS 
group1df <- df[df$group==1, 1:ncol(df)-1] 
othgroupdf <- df[df$group!=1, 1:ncol(df)-1] 

# T-TEST FCT 
tfct <- function(v1, v2){ 
     t.test(v1, v2) 
} 

# RUN T-TESTS BY COL, SAVE RESULTS TO LIST 
ttests <- mapply(tfct, group1df, othgroupdf)