Skip to Tutorial Content

Hinweise

Eine R-Nutzerin, die bereits vorher einen R-Kurs belegt hat, bewertete dieses Tutorial insgesamt mit einer Schwierigkeit von 5.5 (0=sehr leicht, 10=sehr schwer). Sie brauchte für dieses Tutorial ungefähr 1h40min. Klicke auf “Nächstes Kapitel” und es geht los.

Einführung

Nachdem wir die deskriptive Statistik so weit erst mal abgehandelt haben, machen wir heute Inferenzstatistik. Ich warne Dich schon mal vor: das wird etwas trocken und recht anstrengend, aber am Ende kannst Du dann schon ungefähr die Hälfte der Tests aus der Methodenlehre in R nachrechnen. Das ist wirklich praktisch, denn so kannst Du auch Übungsaufgaben aus der Methodenlehre nachprüfen. Bald bist Du vollkommen autonom was die Statistik angeht!

Wir fangen mit \(t\)-Tests an, behandeln anschließend die ANOVA und am Ende die Kontrastanalyse. Wir nutzen wieder die Vorlesungsdaten:

t-Test

Gegen eine Konstante

Der einfachste \(t\)-Test ist der gegen eine Konstante. Sagen wir mal die Körpergröße von Frauen in Deutschland ist 168cm. Wir wollen prüfen ob Psychologiestudentinnen in ihrer Körpergröße von 168cm signifikant abweichen bei einem \(\alpha\)-Niveau von 5%.

t.test(data$groesse[data$geschlecht == "weiblich" & data$studium == "Psychologie"], mu = 168)
## 
##  One Sample t-test
## 
## data:  data$groesse[data$geschlecht == "weiblich" & data$studium == "Psychologie"]
## t = 0.85149, df = 63, p-value = 0.3977
## alternative hypothesis: true mean is not equal to 168
## 95 percent confidence interval:
##  167.0530 170.3533
## sample estimates:
## mean of x 
##  168.7031

Wir übergeben den Vektor, den wir testen wollen (vorher filtern und selektieren!) und geben die Konstante über den Parameter mu an. Wir sehen, dass in unserer Stichprobe die Körpergröße bei 168.7cm liegt, gleichzeitig ist dieses Ergebnis nicht signifikant verschieden von 168cm. Die Wahrscheinlichkeit dieses Ergebnisses, sofern die 168cm in der Population korrekt ist, liegt bei 0.3977. Also durchaus wahrscheinlich.

Prüfe nun nach ob das gleiche für SeKo-Studentinnen gilt.

t.test(data$groesse[data$geschlecht == "weiblich" & data$studium == "Seko"], mu = 168)

Unabhängige Stichproben

Für den \(t\)-Test bei zwei unabhängigen Stichproben prüfen wir ob es einen signifikanten Unterschied zwischen SeKo- und Psychologiestudierenden in den Mathepunkten gibt.

t.test(data$mathe[data$studium == "Seko"], 
       data$mathe[data$studium == "Psychologie"])
## 
##  Welch Two Sample t-test
## 
## data:  data$mathe[data$studium == "Seko"] and data$mathe[data$studium == "Psychologie"]
## t = -2.4102, df = 40.301, p-value = 0.0206
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -3.1784166 -0.2794589
## sample estimates:
## mean of x mean of y 
##  9.142857 10.871795

Wir übergeben also einfach die zwei Vektoren, die gegeneinander getestet werden sollen. Wir finden einen signifikanten Unterschied (\(\alpha=5\%\)), der \(p\)-Wert ist 0.0206. Merkwürdigerweise sind die Freiheitsgrade nicht 104 (wir haben 106 valide Messwerte, und die Freiheitsgrade sind \(n-2\)). Das liegt daran, dass hier ein Welch-Test gerechnet wurde, da die Varianzgleichheit als Voraussetzung verletzt ist. Wenn Du trotzdem einen \(t\)-Test haben willst, dann gib an, dass die Varianzen gleich sind:

t.test(data$mathe[data$studium == "Seko"], 
       data$mathe[data$studium == "Psychologie"],
       var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  data$mathe[data$studium == "Seko"] and data$mathe[data$studium == "Psychologie"]
## t = -2.6676, df = 104, p-value = 0.008863
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -3.0142169 -0.4436585
## sample estimates:
## mean of x mean of y 
##  9.142857 10.871795

Wird auch signifikant, mit einem noch kleineren \(p\)-Wert. Diesmal stimmen die Freiheitsgrade mit unserer Überlegung überein.

Rechne nun zur Übung einen \(t\)-Test für den Unterschied zwischen der Körpergröße von Männern und Frauen (ohne Trennung nach Studienfach). Gehe diesmal von der gerichteten Hypothese aus, dass Männer größer sind als Frauen. Finde den entsprechenden Parameter zur Not über eine Websuche oder die Hilfe. Gehe davon aus, dass Varianzgleichheit gegeben ist.

t.test(data$groesse[data$geschlecht == "männlich"], 
       data$groesse[data$geschlecht == "weiblich"],
       var.equal = TRUE, alternative = "greater")

Abhängige Stichproben

Für abhängige Stichproben können wir uns den Unterschied zwischen dem Mögen von Hunden und Katzen anschauen:

t.test(data$hunde_m, data$katzen_m, var.equal = TRUE, paired = TRUE)
## 
##  Paired t-test
## 
## data:  data$hunde_m and data$katzen_m
## t = -0.73463, df = 106, p-value = 0.4642
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  -1.0716017  0.4921625
## sample estimates:
## mean difference 
##      -0.2897196

Wir setzen also nur den Parameter paired auf TRUE und schon haben wir den Test von unabhängig auf abhängig geändert. Hier zeigt sich kein Unterschied in den AVs.

Rechne nun einen Test für den Unterschied zwischen den Deutsch- und Mathepunkten (diese sind natürlich abhängig). Vergleiche diesen anschließend mit der Version für unabhängige Stichproben. Gehe stets von gleichen Varianzen aus.

t.test(data$deutsch, data$mathe, paired = TRUE, var.equal = TRUE)
t.test(data$deutsch, data$mathe, paired = FALSE, var.equal = TRUE)

Es macht also einen gewaltigen Unterschied, ob der Test abhängig oder unabhängig ist!

\(t\)-Test für Korrelation

Man kann auch für Korrelationen ein \(t\)-Test rechnen. Das geht am einfachsten über cor.test

cor.test(data$mathe, data$deutsch)
## 
##  Pearson's product-moment correlation
## 
## data:  data$mathe and data$deutsch
## t = 4.9731, df = 105, p-value = 2.582e-06
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2690643 0.5785201
## sample estimates:
##       cor 
## 0.4366185

Standardmäßig wird gegen eine Korrelation von 0 getestet. Hier sehen wir, dass die Korrelation zwischen Mathe- und Deutschpunkten (0.48) eine extrem kleine Auftretens-Wahrscheinlichkeit hat sofern die Korrelation in der Population tatsächlich 0 ist.

Probier das ganze nun selbst für die Korrelation zwischen den Variablen Sport und Lebenszufriedenheit:

cor.test(data$sport, data$lebenszufriedenheit)

Konfidenzintervalle

Konfidenzintervalle haben wir bei allen bisherigen Tests stets angezeigt bekommen. Deshalb verzichte ich hier auf eine gesonderte Behandlung. Man kann auch immer die Konfidenz festlegen (Parameter conf.level). Es gibt sicher ein Dutzend Pakete, die Konfidenzintervalle extra berechnen können. Aber bisher haben wir keine Extrawünsche, also benutzen wir base R. Nur zur Übung, berechne mir das 99%-Konfidenzintervall für den Mittelwertsunterschied in der Lebenszufriedenheit zwischen weiblichen und männlichen Studierenden über die Funktion t.test. Geh von Varianzgleichheit aus. Hinweis: Es geht um das Konfidenzintervall für die Differenz weiblich-männlich, nicht männlich-weiblich.

t.test(data$lebenszufriedenheit[data$geschlecht == "weiblich"],
       data$lebenszufriedenheit[data$geschlecht == "männlich"],
       var.equal = TRUE, conf.level = .99)
Quiz

ANOVA

Am einfachsten und konsistentesten ist die ANOVA im ez-Package implementiert. Es gibt zwar auch aov und mit lm geht es auch, aber dort kommt man schnell durcheinander oder bekommt nicht den Output, den man gerne hätte. Das Paket müssen wir natürlich erst mal installieren und laden, was Du ja aber schon von den vorherigen Tagen kennst:

install.packages("ez")
library(ez)

Unabhängige Stichproben

Nun rechnen wir die erste ANOVA. Wir schauen uns an ob die Abinote vom Geschlecht und dem Ernährungsstil abhängt:

ezANOVA(data = data, wid = id, between = c(vegetarier, geschlecht), dv = abi)
## Warning: Converting "id" to factor for ANOVA.
## Warning: Converting "vegetarier" to factor for ANOVA.
## Warning: Converting "geschlecht" to factor for ANOVA.
## Warning: Data is unbalanced (unequal N per group). Make sure you specified a
## well-considered value for the type argument to ezANOVA().
## Coefficient covariances computed by hccm()
## $ANOVA
##                  Effect DFn DFd          F         p p<.05          ges
## 1            vegetarier   1 103 0.23380334 0.6297443       0.0022647944
## 2            geschlecht   1 103 4.93779165 0.0284627     * 0.0457466433
## 3 vegetarier:geschlecht   1 103 0.05298053 0.8184123       0.0005141097
## 
## $`Levene's Test for Homogeneity of Variance`
##   DFn DFd       SSn      SSd        F        p p<.05
## 1   3 103 0.9819572 18.91318 1.782559 0.155138

ezANOVA warnt uns vor ein paar Dingen. Es transformiert von alleine die Variablen in Faktoren und sagt uns, dass unser Design nicht balanciert ist. Wir kommen später nochmal darauf zu sprechen.

Interpretieren wir erst mal das Ergebnis und schauen uns anschließend die Syntax an. Zu erkennen ist ein Haupteffekt des Geschlechts, mit einem großen \(F\)-Wert, einem kleinen \(p\)-Wert und einer Varianzaufklärung von ungefähr 5% (hier ges). Levens Test für Varianzhomogenität ist nett, brauchen wir aber üblicherweise nicht. Wenn man nun wissen möchte, welches Geschlecht im Schnitt eine bessere Abiturnote hat, muss man sich die Daten genauer anschauen. Man wird üblicherweise einfach eine Abbildung erstellen. Welche genau, hängt von verschiedenen Faktoren ab. Wir machen hier einen Boxplot:

boxplot(abi ~ vegetarier + geschlecht, data = data)

Die Männer scheinen etwas schlechter abzuschneiden.

Nun zur Syntax, schauen wir uns diese nochmal genau an:

ezANOVA(data = data, wid = id, between = c(vegetarier, geschlecht), dv = abi)

Der Parameter wid gibt die ID für die Person an. Diese ist zwingend notwendig, da bei Within-Designs mehrere Messungen pro Person vorhanden sind. Um alles konsistent zu halten wird sie auch bei einer reinen between-ANOVA benötigt. between nimmt die UVs auf und dv (dependent variable) die AV. Über den Parameter data spezifizieren wir den Dataframe in dem die Variablen id, Vegetarier, Geschlecht und Abi vorhanden sind. Tatsächlich ist das eine Besonderheit, denn bisher haben wir Variablennamen eher in Anführungszeichen geschrieben: z. B. data[, c("vegetarier", "geschlecht")]. Bei der ez-Syntax ist das nicht notwendig, man kann direkt die Variablennamen hinschreiben. Falls Du mal Fehlermeldungen bekommen solltest, prüfe in beide Richtungen, ob Du Anführungszeichen eventuell vergessen oder fälschlicherweise gesetzt hast (bei anderen Befehlen als ez).

Das Folgende ist falsch, da wid nicht in Anführungszeichen gesetzt werden darf:

ezANOVA(data = data, wid = "id", between = c(vegetarier, geschlecht), dv = abi)
## Error in table(temp[, names(temp) == wid]): nothing to tabulate

Auch das Folgende ist falsch, da hier die Variablen in Anführungszeichen gesetzt werden müssen.

data[, c(vegetarier, geschlecht)]
## Error in `[.data.frame`(data, , c(vegetarier, geschlecht)): object 'vegetarier' not found

Warum ist R so kompliziert? Weil Flexibilität ihren Preis hat!

Die Aufmerksamen unter Euch fragen Sich nun vielleicht noch warum beim ANOVA-Output ges der Effekt ist (letzte Spalte im Output). ges ist das generalized Eta-Squared. Wenn Du altbekannte Effektgrößen berechnen willst, dann stell noch detailed=TRUE ein:

ezANOVA(data = data, wid = id, between = c(vegetarier, geschlecht), dv = abi,
        detailed = TRUE)
## Warning: Converting "id" to factor for ANOVA.
## Warning: Converting "vegetarier" to factor for ANOVA.
## Warning: Converting "geschlecht" to factor for ANOVA.
## Warning: Data is unbalanced (unequal N per group). Make sure you specified a
## well-considered value for the type argument to ezANOVA().
## Coefficient covariances computed by hccm()
## $ANOVA
##                  Effect DFn DFd        SSn      SSd          F         p p<.05
## 1            vegetarier   1 103 0.06377530 28.09564 0.23380334 0.6297443      
## 2            geschlecht   1 103 1.34689747 28.09564 4.93779165 0.0284627     *
## 3 vegetarier:geschlecht   1 103 0.01445167 28.09564 0.05298053 0.8184123      
##            ges
## 1 0.0022647944
## 2 0.0457466433
## 3 0.0005141097
## 
## $`Levene's Test for Homogeneity of Variance`
##   DFn DFd       SSn      SSd        F        p p<.05
## 1   3 103 0.9819572 18.91318 1.782559 0.155138

Jetzt kannst Du über die SSn (Sum of Squares numerator) \(\eta^2\) und \(\eta_p^2\) per Hand berechnen.

Nun, um ganz ehrlich zu sein haben wir hier eine unbalancierte ANOVA und davor warnt uns ezANOVA auch. \(\eta^2\) ist somit nicht genau der Wert, den wir bei einer Berechnung per Hand bekämen. Das kannst Du nachprüfen, in dem Du mal aus dem \(F\)-Wert \(\eta^2\) berechnest (klar geht das!) und mal aus den Quadratsummen. Die Formelsammlung ist Dein Freund. Zugriff auf die Werte bekommst Du folgendermaßen:

meineanova <- ezANOVA(data = data, wid = id, between = c(vegetarier, geschlecht), 
                      dv = abi, detailed = TRUE)
meineanova$ANOVA$F
## [1] 0.23380334 4.93779165 0.05298053
meineanova$ANOVA$SSn
## [1] 0.06377530 1.34689747 0.01445167
meineanova$ANOVA$SSd
## [1] 28.09564 28.09564 28.09564

Dann rechne mal den Effekt für den Faktor Geschlecht (1) über den \(F\)-Wert und (2) über die Quadratsummen. Falls die Formeln hierfür nicht in Deiner Formelsammlung stehen, dann schau mal hier nach: https://stats.stackexchange.com/questions/41861/calculating-eta-squared-from-f-and-df

meineanova <- ezANOVA(data = data, wid = id, between = c(vegetarier, geschlecht), 
                      dv = abi, detailed = TRUE)
meineanova <- ezANOVA(data = data, wid = id, between = c(vegetarier, geschlecht), 
                      dv = abi, detailed = TRUE)
# F/(F+df_inn)
meineanova$ANOVA$F[2] / (meineanova$ANOVA$F[2] + 103)
# QS_Geschlecht/(QS_Gesamt)
meineanova$ANOVA$SSn[2] / (sum(meineanova$ANOVA$SSn) + meineanova$ANOVA$SSd[1])

Ja, der Unterschied ist nicht groß, aber er ist vorhanden und man muss ihn irgendwie erklären. Des Rätsels Lösung liegt, wie schon angedeutet, darin, dass unsere ANOVA nicht balanciert ist. Wir haben nicht gleich viele Personen in den vier Bedingungen. Wenn wir jetzt diskutieren was man da machen kann, sitzen wir noch morgen hier. Merk Dir: Du machst Dir und allen anderen Menschen das Leben viel leichter, wenn Du ein balanciertes Design hast. Das erreichst Du durch ein richtiges Experiment (UV manipulieren, AV messen, zufällige Zuweisung der Probanden auf die Bedingungen), bei dem alle Zellen gleich viele Probanden haben. Fertig!

Okay, genug geredet. Rechne nun eine ANOVA für die Lebenszufriedenheit in Abhängigkeit von den Faktoren Meditation und Haustier.

ezANOVA(data = data, wid = id, between = c(meditation, haustier),
        dv = lebenszufriedenheit,
        detailed = TRUE)

Abhängige Stichproben

Wie sieht’s mit einer abhängigen ANOVA aus? Wir können diesmal die Daten aus der Übung zur Methodenlehre verwenden:



Datenerstellung in R und eine Within-ANOVA:

d <- data.frame(dv_lordose = c(30, 28, 27, 34, 14, 16, 16, 18, 4, 6, 5, 9),
                wid =  paste("Weibchen", 1:4),
                iv_pos = paste("Männchen", rep(1:3, each = 4)))
ezANOVA(data = d, wid = wid, dv = dv_lordose, within = iv_pos, detailed = T)
## Warning: Converting "wid" to factor for ANOVA.
## Warning: Converting "iv_pos" to factor for ANOVA.
## $ANOVA
##        Effect DFn DFd     SSn      SSd        F            p p<.05       ges
## 1 (Intercept)   1   3 3570.75 38.91667 275.2612 4.766529e-04     * 0.9859865
## 2      iv_pos   2   6 1137.50 11.83333 288.3803 1.091398e-06     * 0.9572901
## 
## $`Mauchly's Test for Sphericity`
##   Effect         W         p p<.05
## 2 iv_pos 0.1571117 0.1571117      
## 
## $`Sphericity Corrections`
##   Effect       GGe        p[GG] p[GG]<.05      HFe        p[HF] p[HF]<.05
## 2 iv_pos 0.5426265 0.0002647808         * 0.611311 0.0001151708         *

Genau das Selbe kommt in der Übung (per Hand) heraus. Das heißt, von nun an brauchst Du die Lösungen nicht mehr auf dem Lösungsblatt nachzuprüfen, sondern kannst sie alle direkt in R nachrechnen. Besonders praktisch, wenn die Dozenten so extrem langsam sind beim Hochladen von Lösungen!

Jetzt bist Du dran. Ich habe Dir einen Datensatz mit Namen selfesteem vorbereitet.

selfesteem

Zu drei Messzeitpunkten während einer Diät wurde das Selbstbewusstsein für 10 Personen erfasst. Beachte wie die Daten angeordnet sind. Die drei Messungen sind nicht in verschiedenen Spalten. Stattdessen gibt es eine Variable, die die Messung kodiert (time) und eine die die AV kodiert (score), genau so wie wir es für ezANOVA brauchen. Rechne nun eine within-ANOVA und gib zusätzlich Boxplots pro Bedingung an.

ezANOVA(data = selfesteem, wid = id, dv = score, within = time,
        detailed = T)
boxplot(score~time, data = selfesteem)

Übrigens: Mit ezANOVA ist es auch kein Problem gemischte Designs (between und within kombiniert) zu rechnen, Du musst nur within und between gemeinsam spezifizieren.

Kontrastanalyse

Bleibt nur noch die Kontrast-Analyse. Wir schauen uns zunächst ein Beispiel aus der Übung zu unabhängigen Stichproben an.

Unabhängige Stichproben

Das Lehrergeschlecht (männlich, weiblich) und die Schülerzusammensetzung (nur männlich, nur weiblich, männlich und weiblich) sind UVs:

In R erstellen wir erst mal die Daten:

Der erste Buchstabe steht für das Lehrergeschlecht, der zweite für die Zusammensetzung der Schüler (Beispiel “mw” = männlicher Lehrer, weibliche Schüler).

In der Übung kamen wir auf ein \(r_\mathrm{effect size}\) von 0.93. Wir schauen erst mal, ob wir das reproduzieren können. Dafür erstellen wir uns die Lambdas, die sich aus folgenden hypothetischen Mittelwerten ergeben:

group_means <- c(15, 17, 13, 15, 23, 19)
lambda <- rep(group_means - mean(group_means), each = 5)
lambda
##  [1] -2 -2 -2 -2 -2  0  0  0  0  0 -4 -4 -4 -4 -4 -2 -2 -2 -2 -2  6  6  6  6  6
## [26]  2  2  2  2  2

Das rep mit each=5 brauchen wir, da wir für jede Person ein Lambda benötigen – dieses ist für die einzelnen Gruppen konstant (5 Personen pro Gruppe). Nun korrelieren wir die Lambdas mit den Werten der AV:

cor(av, lambda)
## [1] 0.9280273

Hier sieht man ganz konkret, dass \(r_\mathrm{effect size}\) die Korrelation zwischen Lambdas und der abhängigen Variable ist (auf Individumebene).

Um die Kontrastanalyse normal zu berechnen können wir das Paket cofad benutzen:

install.packages("cofad")
library(cofad)

Und nun die Berechnung:

calc_contrast(dv = av, between = group, 
              lambda_between = c("mw" = -1, "ww" = 0, "mg" = -2, "wg" = -1, 
                                 "mm" = 3, "wm" = 1), data = d)
## 
## Contrast Analysis for between factor design
## 
## F(1,24) = 176.654; p < .00000001
## Contrasts:  mg = -2; mm = 3; mw = -1; wg = -1; wm = 1; ww = 0
## r_effectsize = 0.928

Die Syntax hat eine Besonderheit: die Lambdas werden mit dem entsprechenden Namen der Subgruppe angegeben. Zum Beispiel soll Subgruppe mw das Lambda -1 bekommen ("mw" = -1). Diese Syntax verhindert eine falsche Zuordnung der Lambdas, was ansonsten schnell mal passieren könnte. Der Output ist im Normalfall nicht besonders ausführlich, aber wir können uns auch Quadratsummen anzeigen lassen über die summary-Funktion:

summary(calc_contrast(av, between = group, 
                      lambda_between = c("mw" = -1, "ww" = 0, "mg" = -2,
                                         "wg" = -1, "mm" = 3, "wm" = 1),
                      data = d))
## $`F-Table`
##               SS df      MS       F  p
## contrast 300.312  1 300.312 176.654  0
## within    40.800 24   1.700      NA NA
## total    348.700 29      NA      NA NA
## 
## $Effects
##              effects
## r_effectsize   0.928
## r_contrast     0.938
## r_alerting     0.988

Nun bist du an der Reihe. Ich habe Dir Daten aus der Vorlesung vorbereitet (Folie 13):



In R sieht der Dataframe so aus:

vl <- data.frame(
  av = c(18, 18, 20, 13, 15, 9, 17, 9, 16, 15, 17, 22, 25, 24, 16, 17, 12, 18),
  group = factor(rep(c("mp", "fp", "m1", "f1", "m2", "f2"), each = 3))
)
vl

Es geht um die Wirkung eines Medikaments in Abhängigkeit des Geschlechts und der Dosis (m und f steht für Männer und Frauen, p ist Placebo, 1 und 2 sind einfache und doppelte Dosis)

Rechne dafür eine Kontrast-Analyse. Die Kontraste sollen sein: mp = 0, fp = -1, m1 = -1, f1 = 1, m2 = 1 und f2 = 0.

calc_contrast(dv = av, between = group, 
              lambda_between = c("mp" = 0, "fp" = -1, "m1" = -1, "f1" = 1,
                                 "m2" = 1, "f2" = 0),
              data = vl)

Abhängige Stichproben

Für abhängige Stichproben ist die Kontrast-Analyse viel einfacher – sowohl konzeptuell als auch in der Berechnung. Wir können diese direkt per Hand berechnen. Als Beispiel nehmen wir die Aufgabe aus der Übung:

Sie haben in einer Untersuchung bei vier Probanden das Ausmaß körperlicher Symptome (auf einer Skala von 0 (keine Symptome) bis 10 (sehr starke Symptome)) unter verschiedenen Stressbedingungen bestimmt. Laut ihrer Hypothese sollte die Stärke der Symptome von der Bedingung ohne Stress zur Bedingung mit niedrigem Stress um 10% zunehmen. Von der Bedingung mit niedrigem Stress zu der mit hohem Stress sollte sich die Stärke der Symptome verdoppeln.

Die Daten sind:

In R erstellen wir uns den Dataframe und führen die Berechnung durch:

av <- matrix(c(3, 2, 4, 1, 5, 6, 5, 2, 6, 6, 7, 5), ncol = 3)
lambdas <- c(-2.6, -2, 4.6)
lk <- av %*% lambdas
t.test(lk)
## 
##  One Sample t-test
## 
## data:  lk
## t = 8.1028, df = 3, p-value = 0.003929
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##   7.347594 16.852406
## sample estimates:
## mean of x 
##      12.1

Was wir hier machen ist einfach die Lambdas mit den Werten der Personen zu multiplizieren und pro Person die Summe zu bilden. Das ist die Kovariation zwischen Lambdas und den Werten der Probanden. Mit dem \(t\)-Test testen wir anschließend ob diese Kovariation überzufällig größer ist als 0.

Das einzig neue ist der Operator %*%, das ist das Symbol für Matrix-Multiplikation und kürzt die Berechnung deutlich ab.

Wir können natürlich auch wieder cofad verwenden:

stress <- data.frame(av = c(3, 2, 4, 1, 5, 6, 5, 2, 6, 6, 7, 5),
                     group = factor(rep(c("t1", "t2", "t3"), each = 4)),
                     participant = factor(rep(1:4, 3)))
calc_contrast(dv = av, 
              within = group,
              lambda_within = c("t1" = -2.6, "t2" = -2, "t3" = 4.6),
              ID = participant,
              data = stress)
## Warning in calc_contrast(dv = av, within = group, lambda_within = c(t1 = -2.6,
## : lambdas are centered and rounded to 3 digits
## 
## Contrast Analysis for within factor design
## 
## L-Values: Mean =  12.1 ; SD =  2.987
## t(3) = 8.103; p = 0.00196439
## Contrasts:  t1 = -2.6; t2 = -2; t3 = 4.6
## g_contrast = 4.051

Es kommt der gleiche \(t\)-Wert heraus (8.1).

Jetzt kannst Du es probieren. Ich habe Dir aus dem Buch von Prof. Sedlmeier ein Beispiel vorbereitet (Tabelle 16.5):

musik <- data.frame(reading_test = c(27, 25, 30, 29, 30, 33, 31, 35,
                                     25, 26, 32, 29, 28, 30, 32, 34,
                                     21, 25, 23, 26, 27, 26, 29, 31, 
                                     23, 24, 24, 28, 24, 26, 27, 32),
                    participant = as.factor(rep(1:8, 4)),
                    music = as.factor(rep(c("without music", "white noise",
                                            "classic", "jazz"), each = 8)))
musik

Die Lesefähigkeit wurde von 8 Probanden unter verschiedenen Bedingungen erfasst. Die Hypothese ist, dass man ohne Musik am besten lesen kann, mit weißem Rauschen etwas schlechter und mit Musik noch schlechter. Rechne hierfür eine Kontrastanalyse für abhängige Stichproben. Die Lambdas sind 1.25, 0.25, -0.75, -0.75.

calc_contrast(dv = reading_test, within = music,
              lambda_within = c("without music" = 1.25, 
                                "white noise" = 0.25,
                                "classic" = -0.75,
                                "jazz" = -0.75),
              ID = participant, data = musik)

Gut gemacht! Der Tag war ziemlich “intense”. Wir haben den Großteil der Signifikanztests aus der Methodenlehre behandelt – in nur einer Sitzung! Ziemlich trocken, aber vielleicht hast Du auch hier und da gemerkt was man aus Daten rauskitzeln kann. Zum Beispiel sind Männer signifikant größer als Frauen und das Abitur in unserer Stichprobe ist abhängig vom Geschlecht. Das sind keine überragenden Erkenntnisse, aber von nun an hast Du das Werkzeug um eigene Fragestellungen statistisch zu untersuchen. Wolltest Du nicht schon immer mal wissen welche Unterschiede und Gemeinsamkeiten es zwischen Menschen gibt? Mach eine Umfrage unter Deinen Freunden. Oder vermesse Dich selbst: Fang an zu laufen und tracke die Geschwindigkeit über die Zeit. Wirst Du signifikant besser? Fang an zu meditieren und tracke Dein Stressniveau! Wie groß ist der Effekt? Du bist längst so weit eigenständig Daten zu sammeln und auszuwerten.

Falls Du gerade keine Ideen für eigene Projekte hast, kannst Du natürlich auch noch ein paar Wiederholungsaufgaben lösen. :)

Übungsaufgaben Tag 4

\(t\)-Test

In Methodenlehre I haben wir einen \(t\)-Test für folgende Tabelle gerechnet:

EG KG
-0.09 -0.26
0.01 -0.26
0.03 -0.21
-0.31 -0.08
0.34

Die Experimentalgruppe bekam ein Medikament, die Kontrollgruppe ein Placebo. Die AV ist die Flugleistung in einem Simulator. Die Probanden waren erfahrene Piloten.

Rechne den Test in R nach (kleine Abweichungen zur Berechnung per Hand können durch Rundungsfehler entstehen). Geh von Varianzhomogenität aus.

t.test(c(-.09, .01, .03, -.31, .34), c(-.26, -.26, -.21, -.08), var.equal=TRUE)

Eigene Funktion für \(t\)-Test

Schreibe eine eigene Funktion um den \(t\)-Wert zu berechnen. Nutze dafür notfalls die Formeln aus der Formelsammlung. Die Funktion sollte als Parameter zwei Vektoren haben. Als Rückgabewert den \(t\)-Wert. Du kannst natürlich die Funktionen mean und var einsetzen. Hilfreich könnten auch sqrt und length sein. Zur Überprüfung, ob Deine Funktion funktioniert, rechne nochmal den \(t\)-Test aus der vorherigen Aufgabe.

mein_t_test <- function(x, y){
  diff <- mean(x)-mean(y)
  n1 <- length(x)
  n2 <- length(y)
  se_pooled <- sqrt(((n1-1)*var(x)+(n2-1)*var(y))/(n1+n2-2)*(1/n1+1/n2))
  diff/se_pooled
}
mein_t_test(c(-.09, .01, .03, -.31, .34), c(-.26, -.26, -.21, -.08))

Kontrastanalyse

Rechne die Kontrastanalyse aus der Vorlesung auf Folie 21 mit cofad nach:



Hinweis: cofad erwartet, dass die ID-Variable und Gruppen-Variable ein factor ist. Benutze also as.factor bei der Erstellung dieser Variablen.

therapie <- data.frame(av = c(0, 1, 3, 4, 7, 7, 8, 8, 3, 4, 5, 6),
                       participant = as.factor(rep(1:4, 3)),
                       group = as.factor(rep(c("A", "B", "C"), each = 4)))
calc_contrast(dv = av, within = group,
              lambda_within = c("A" = -1, "B" = 1, "C" = 0),
              ID = participant, data = therapie)

ANOVA

Rechne die ANOVA aus der Vorlesung auf Folie 12 nach:



vlf12 <- data.frame(av = c(18, 18, 20, 13, 15, 9, 17, 9, 16, 15, 17, 22, 25, 
                           24, 16, 17, 12, 18),
                    wid = as.factor(1:18),
                    geschlecht = factor(rep(c(c("m", "m", "m"), c("f", "f", "f")), 3)),
                    medikament = factor(rep(c("p", "1", "2"), each = 6)))
ezANOVA(data = vlf12, dv = av, between = c(geschlecht, medikament), wid = wid)

4. t-Test, ANOVA, KA