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)
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)