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 .

Versionshistory:

  • v1.0: erste online-gestellte Version (04.03.2023)

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