Willkommen bei Stats by Randolph. Hier geht es zur Hauptseite mit weiteren Informationen und Inhalten.
Autor:innen dieser Seite: An den Inhalten dieser Seite haben mitgearbeitet: Markus Janczyk und Valentin Koob. Der Inhalt dieser Seite wird in der Lehre in den Studiengängen Psychologie von der AG Forschungsmethoden und Kognitive Psychologie an der Universität Bremen verwendet, steht aber allen Interessierten zur Verfügung. Rückmeldungen/Fehler/Vorschläge können gesendet werden an randolph@uni-bremen.
Versionshistory:
Im Rahmen der Kovarianzaalyse (Teil 8 von Statistik II) haben wir den Begriff adjustierte Mittelwerte kennengelernt. Wir haben aber im Haupttext nichts dazu gesagt, wie diese tatsächlich berechnet werden. Zur Illustration benutzen wir hier noch einmal den Datensatz aus dem dortigen Beispiel 1. Wir laden die Daten hier, berechnen die Mittelwerte und dann eine Varianzanalyse als Regression und wiederholen zunächst, was die Koeffizienten bedeuten.
daten_ancova <- read.table("./Daten/ANCOVA_beispiel_1.dat",
sep = "\t",
header = TRUE)
# faktorisieren
daten_ancova$Gruppe <- as.factor(daten_ancova$Gruppe)
# die nächste Zeile sorgt dafür, dass die Kontrollgruppe als Referenz mit 0 kodiert wird
daten_ancova$Gruppe <- relevel(daten_ancova$Gruppe,
ref = "Kontrolle")
# Mittelwerte für die Gruppen ausrechnen
Tapply(Test ~ Gruppe,
fun = mean,
data = daten_ancova)
## Kontrolle Experimental
## 48.1 47.7
# Regression berechnen
lm.anova <- lm(Test ~ Gruppe,
data = daten_ancova)
coef(lm.anova)
## (Intercept) GruppeExperimental
## 48.1 -0.4
Da wir die Variable Gruppe
dummykodiert haben (was der
Standard ist), entspricht der Achsenabschnitt dem Mittelwert der (mit 0
kodierten) Kontrollgruppe, während der zweite Koeffizient den
Unterschied zwischen beiden Gruppen widerspiegelt. Mit anderen Worten:
Um wieviel muss der Achsenabschnitt verändert werden, wenn von der
Kontrollgruppe (0) zur Experimentalgruppe (1) gegangen wird?
Nun benutzen wir Pretest
als Kovariate und betrachten
die Koeffizienten der entsprechenden Kovarianzanalyse:
lm.ancova = lm(Test ~ Pretest + Gruppe,
data = daten_ancova)
coef(lm.ancova)
## (Intercept) Pretest GruppeExperimental
## 26.7571429 0.4285714 -0.5714286
Scheinbar haben sich die Koefizienten verändert und insbesondere der Achsenabschnitt ist deutlich verschieden von dem gerade mit einer normalen Varianzanalyse berechneten Wert.
Zur Interpretation hilft es als erster Schritt, die Kovariate zu
zentrieren, d.h. von jedem Wert den Mittelwert der Kovariaten zu
subtrahieren. Dies geht mit der Funktion scale()
(die wir
auch zum \(z\)-standardisieren schon
verwendet haben), wenn wir scale = FALSE
setzen. Dadurch
verändern wir nur den Achsenabschnitt, der zumindest nun auch in der
Größenordnung liegt, die wir mit der normalen Varianzanalyse berechnet
haben:
lm.ancova.zentriert <- lm(Test ~ scale(Pretest, scale = FALSE) + Gruppe,
data = daten_ancova)
coef(lm.ancova.zentriert)
## (Intercept) scale(Pretest, scale = FALSE)
## 48.1857143 0.4285714
## GruppeExperimental
## -0.5714286
Nun liegt es wieder nahe anzunehmen, der Achsenabschnitt \(48.1857143\) sei der Mittelwert der Kontrollgruppe, während sich der Mittelwert der Experimentalgruppe ergibt aus \(48.186-0.571\). Obwohl dies natürlich für beide Gruppen nicht die “richtigen” Mittelwerte sind, ist die Interpretation tatsächlich richtig. Entscheidend ist aber zu bedenken, was für Mittelwerte die Kovarianzanalyse vergleicht. Dies sind nämlich die sog. adjustierten Mittelwerte, die berechnet werden für den Fall, dass die Kovariate für alle Beobachtungen den gleichen Wert annehmen würde. Üblicherweise ist dieser Wert dann der Mittelwert der Kovariaten.
Nun sei \(X_1\) die Kovariate und \(M_{X_1}\) ihr Mittelwert. Ausgehend von der Gleichung \[\hat{Y}=a+b_1\cdot X_1+b_2\cdot X_2\] ergeben sich die adjustierten Mittelwerte dann als \[\hat{Y}_{adj}=a+b_1\cdot M_{X_1}+b_2\cdot X_2\] Nun ist der Mittelwert der zentrierten Variablen ja gerade \(M_{X_1}=0\), d.h. für die Kontrollgruppe (also \(X_2=0\)) entspricht der Achsenabschnitt \(a\) dem adjustierten Mittelwert, während für die Experimentalgruppe (also \(X_2=1\)) zu \(a\) noch \(b_2\) addiert werden muss. Zur Visualisierung können wir einmal die Kovarianzanalyse mit zentrierter Kovariate (und ohne Interaktion) plotten:
# zentrierte Variable erst speichern, um leichter weiter zu arbeiten und
# nicht scale(...) als Variablennamen zu haben
daten_ancova$Pretest.c <- as.numeric(scale(daten_ancova$Pretest, scale = FALSE))
lm.result.zentriert.2 <- lm(Test ~ Pretest.c + Gruppe,
data = daten_ancova)
interact_plot(lm.result.zentriert.2,
pred = Pretest.c,
modx = Gruppe,
plot.points = TRUE,
jitter = 0.1,
point.shape = TRUE,
interval = TRUE,
int.width = 0.95,
int.type = "confidence",
x.label = "Pretest zentriert",
y.label = "Test")
Zu sehen ist, dass beide Linien parallel laufen, da wir keinen
Interaktionsterm zwischen Gruppe
und der zentrierten
Kovariate scaled_Pretest
zugelassen haben (weshalb auch
eigentlich eine Warnung ausgegeben wird). Ziehen wir eine gedachte Linie
vom \(x\)-Wert 0 nach oben, so trifft
diese bei einem Wert von \(48.19\) die
Linie der Kontrollgruppe. Addiert man nun zu diesem Wert die \(-0.57\) (das Regressionsgewichts der
dummykodierten Gruppenzugehörigkeit), so landen wir bei der Geraden für
die Experimentalgruppe. Hier sieht man nochmal schön, warum diese
vorhergesagten Werte adjustiert heißen: sie basieren
auf dem Mittelwert der zentrierten Kovariate.
In R können wir diese adjustierten Mittelwerte wie folgt berechnen:
a <- coef(lm.ancova.zentriert)[1] # Achsenabschnitt
b1 <- coef(lm.ancova.zentriert)[2] # Koeffizient der Kovariaten
b2 <- coef(lm.ancova.zentriert)[3] # Koeffizient des Faktors
( M.adj.Kontrollgruppe <- a + b1*0 + b2*0 ) # Kontrollgruppe X2 = 0
## (Intercept)
## 48.18571
( M.adj.Experimentalgruppe <- a + b1*0 + b2*1 ) # Exp.-gruppe X2 = 1
## (Intercept)
## 47.61429
Da es sich tatsächlich um nichts anderes als eine Vorhersage von
Kriteriumswerten handelt, kann auch die Funktion predict()
genutzt werden:
predict(lm.ancova,
data.frame(Gruppe = factor(c("Kontrolle", "Experimental")),
Pretest = mean(daten_ancova$Pretest)))
## 1 2
## 48.18571 47.61429