Zunächst installieren wir Pakete, die wir benötigen, um die folgenden Analysen durchzuführen.

if (!require('rstudioapi')) install.packages('rstudioapi')
if (!require('lme4')) install.packages('lme4')
if (!require('lmerTest')) install.packages('lmerTest')

Jetzt laden wir die installierten Pakete. Das Paket “rstudioapi” enthält die Funktion getActiveDocumentContext(), die es uns später erleichtert, das Working Directory zu setzen. Das Paket “lme4” benötigen wir, um hierarchische lineare Modelle (HLM) berechnen zu können. Das Paket “lmerTest” liefert Freiheitsgrade und p-Werte für die Tests der HLM-Analysen. Diese würde das Paket lme4 alleine nicht ausgeben (siehe Buchkapitel).

library(rstudioapi)
library(lme4)
library(lmerTest)

Nun schalten wir die wissenschaftliche Notation ab, um möglichst viele Nachkommastellen im Output zu erhalten (das kann vor allem für p-Werte wichtig sein, die sonst schwer zu interpretieren sind).

options(scipen=999)

Hier setzen wir das Working Directory auf den Pfad, in dem sich auch dieses Notebook befindet. Dadurch findet R alle nötigen Dateien, so lange sich diese im selben Ordner wie dieses Notebook auf Ihrem Rechner befinden.

setwd(dirname(getActiveDocumentContext()$path))

Heranführung an hierarchische lineare Modelle

Wir laden den Datensatz “mathe.RData” ein (erste Zeile) und lassen ihn uns ausgeben (zweite Zeile), um ihn zu inspizieren.

load('mathe.RData')
mathe

Zunächst rechnen wir eine einfache Regression, bei der die Mathematikleistung der Schüler (ml) durch deren Intelligenz (int) und Motivation (mot) vorhergesagt werden soll. Wir rechnen die Regression dabei über alle Versuchspersonen hinweg ohne die Berücksichtigung der hierarchischen Struktur (also der Tatsache, dass die Schüler in Klassen genestet sind). Wir können dazu wieder die uns mittlerweile gut bekannte Funktion lm() verwenden.

mathe.reg <- lm(ml ~ int + mot, data= mathe)
summary(mathe.reg)
## 
## Call:
## lm(formula = ml ~ int + mot, data = mathe)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -44.245  -4.338   5.285   8.547  22.859 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.49583   10.79227   1.158    0.248
## int          0.14394    0.09235   1.559    0.120
## mot         -0.02390    0.33164  -0.072    0.943
## 
## Residual standard error: 14.58 on 397 degrees of freedom
## Multiple R-squared:  0.006084,   Adjusted R-squared:  0.001077 
## F-statistic: 1.215 on 2 and 397 DF,  p-value: 0.2978

Wie wir sehen, zeigt sich hierbei weder ein signifikanter Effekt von Intelligenz noch von Motivation.

Wie im Buchkapitel beschrieben, ist es aber problematisch, die Klassenstruktur der Daten vollständig zu vernachlässigen. Deswegen rechnen wir nun eine Vorstufe der hierarchischen linearen Modelle, nämlich eine lineare Regression, bei der die Variablen int und mot sowie die Dummy-kodierte Variable Klasse als Prädiktoren zur Vorhersage der Mathematikleistung herangezogen werden. Wir wissen, dass R eine nominalskalierte Variable (in unserem Fall die Klasse) automatisch dummy-kodiert. Aber R weiß nicht, dass es sich bei der Variable Klasse um eine nominalskalierte Variable handelt. Da diese Variable die Werte 1 bis 20 annimmt, denkt R automatisch, dass es sich hierbei um eine numerische Variable handelt. Mit der Funktion as.factor() sagen wir R also zunächst, dass es eine neue, nominalskalierte Klassenvariable namens “Klasse_nom” bilden soll.

mathe$Klasse_nom <- as.factor(mathe$Klasse)

Jetzt können wir die gewünschte Regression nach den bekannten Regeln rechnen.

mathe.reg2 <- lm(ml ~ Klasse_nom + int + mot, data= mathe)
summary(mathe.reg2)
## 
## Call:
## lm(formula = ml ~ Klasse_nom + int + mot, data = mathe)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.1487 -0.8821 -0.0777  0.8987  6.3557 
## 
## Coefficients:
##                Estimate Std. Error t value             Pr(>|t|)    
## (Intercept)    8.922736   1.215169   7.343      0.0000000000013 ***
## Klasse_nom2  -20.801145   0.519060 -40.075 < 0.0000000000000002 ***
## Klasse_nom3   11.271941   0.535417  21.053 < 0.0000000000000002 ***
## Klasse_nom4  -12.322548   0.488146 -25.244 < 0.0000000000000002 ***
## Klasse_nom5    0.424749   0.491980   0.863             0.388495    
## Klasse_nom6  -47.771597   0.532389 -89.731 < 0.0000000000000002 ***
## Klasse_nom7  -11.685727   0.500570 -23.345 < 0.0000000000000002 ***
## Klasse_nom8   -3.131475   0.499536  -6.269      0.0000000009938 ***
## Klasse_nom9   -2.135479   0.517804  -4.124      0.0000457914404 ***
## Klasse_nom10   0.871929   0.532345   1.638             0.102274    
## Klasse_nom11   0.494206   0.531579   0.930             0.353123    
## Klasse_nom12 -20.490521   0.518127 -39.547 < 0.0000000000000002 ***
## Klasse_nom13  10.723600   0.534896  20.048 < 0.0000000000000002 ***
## Klasse_nom14 -12.010926   0.487427 -24.641 < 0.0000000000000002 ***
## Klasse_nom15   0.477927   0.491703   0.972             0.331680    
## Klasse_nom16 -47.015618   0.532060 -88.365 < 0.0000000000000002 ***
## Klasse_nom17 -12.244339   0.500380 -24.470 < 0.0000000000000002 ***
## Klasse_nom18  -2.814868   0.500133  -5.628      0.0000000355234 ***
## Klasse_nom19  -2.025210   0.518383  -3.907             0.000111 ***
## Klasse_nom20   1.313013   0.532143   2.467             0.014052 *  
## int            0.231416   0.009945  23.270 < 0.0000000000000002 ***
## mot            0.163913   0.037783   4.338      0.0000184479064 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.549 on 378 degrees of freedom
## Multiple R-squared:  0.9893, Adjusted R-squared:  0.9887 
## F-statistic:  1665 on 21 and 378 DF,  p-value: < 0.00000000000000022

Im Gegensatz zu der Analyse, bei der die hierarchische Struktur unberücksichtigt bleibt, zeigt sich hier nun ein signifikanter Einfluss von Intelligenz und Motivation.

Random-Slopes und Random-Intercepts Modelle

Da die zweite Analyse zwar nicht falsch ist, jedoch nicht mehr “state of the art” ist, wollen wir analog zur zweiten Analyse noch ein HLM berechnen. Dazu nutzen wir die Funktion lmer() (was für “linear mixed effects regression” steht) aus dem Paket “lme4”. Wie sie dem Buchkapitel entnehmen können, ist für hierarchische lineare Modelle jedoch die angemessene Zentrierung der Prädiktorvariablen essentiell. Deswegen wollen wir hier zunächst die beiden Variablen int und mot um den Klassenmittelwert der jeweiligen Versuchsperson zentrieren. Wir nutzen dazu zunächst die Funktion aggregate(), um einen Data-Frame zu erhalten, der für jede Klasse den Intelligenzmittelwert ihrer Schüler enthält. Diese Funktion erwartet drei Argumente:

Den aggregierten Data-Frame, der die Klassenmittelwerte der Intelligenz enthält, nennen wir int_Klassenmittelwerte

int_Klassenmittelwerte <- aggregate(x = mathe$int, by = list(mathe$Klasse), FUN = mean)

Der resultierende Data-Frame int_Klassenmittelwerte hat keine sinnvollen Variablennamen. Deswegen ändern wir hier die Variablennamen.

names(int_Klassenmittelwerte) <- c('Klasse','int_kmw')

Jetzt können wir die beiden Datensätze mathe und int_Klassenmittelwerte so miteinander vereinen, dass jede Zeile des Datensatzes mathe auch den Klassenmittelwert für Intelligenz der jeweiligen Versuchsperson enthält.Dazu nutzen wir die Funktion merge(). Diese Funktion erwartet drei Argumente:

Den verknüpften Datensatz nennen wir einfach wieder mathe. Dadurch überschreiben wir den alten Datensatz mathe und fügen somit dem alten Datensatz mathe letztlich einfach eine zusätzliche Spalte mit den Klassenmittelwerten hinzu.

mathe <- merge(x = mathe, y = int_Klassenmittelwerte, by = 'Klasse')

Schließlich ziehen wir noch vom Intelligenzwert jeder einzelnen Versuchsperson den Intelligenzmittelwert der Klasse der jeweiligen Versuchsperson ab. Die so zentrierte Variable nennen wir “intcwc”.

mathe$intcwc <- mathe$int - mathe$int_kmw

Die gleiche Prozedur führen wir nun (in einem Code-Block) für die Variable mot durch.

mot_Klassenmittelwerte <- aggregate(x = mathe$mot, by = list(mathe$Klasse), FUN = mean)
names(mot_Klassenmittelwerte) <- c('Klasse','mot_kmw')
mathe <- merge(x = mathe, y = mot_Klassenmittelwerte, by = 'Klasse')
mathe$motcwc <- mathe$mot - mathe$mot_kmw

Jetzt können wir endlich unser Random-Slopes Modell mit Schülern als Level-1 Beobachtungseinheit und Klassen als Level-2 Beobachtungseinheit fitten. Beim Random-Slopes Modell gehen wir davon aus, dass sich die Klassen nicht nur in ihrem allgemeinen Mathematikniveau unterscheiden, sondern dass auch die Zusammenhänge zwischen Intelligenz und Mathematikleistung sowie zwischen Motivation und Mathematikleistung in den Klassen unterschiedlich ausfallen können. Wie im Buchkapitel beschrieben, funktioniert die Funktion ähnlich wie die Funktion lm(): Vor der Tilde steht die abhängige Variable (Mathematikleistung). Hinter der Tilde stehen die Prädiktoren Intelligenz sowie Motivation, die wir gerade zentriert haben (dazu später mehr). Die 1 gibt an, dass zusätzlich auch ein Intercept geschätzt werden soll (siehe Buchkapitel für mehr Details). Neu ist jetzt aber, dass wir innerhalb der Klammer noch eine weitere Klammer haben. Innerhalb dieser wird angegeben, welche geschätzten Effekte in Abhängigkeit der jeweiligen Klasse variieren dürfen. In unserem Fall schreiben wir:

Der Term “|Klasse” gibt an, dass alle Effekte, die vor dem senkrechten Strich stehen, in Abhängigkeit von Klasse variieren dürfen. Also in unserem Fall: Das geschätzte Intercept sowie die geschätzten Regressionsgewichte von Intelligenz und Motivation dürfen in Abhängigkeit von Klasse variieren.

rs <- lmer(ml ~ 1 + intcwc + motcwc + (1 + intcwc + motcwc|Klasse), data= mathe)
summary(rs)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: ml ~ 1 + intcwc + motcwc + (1 + intcwc + motcwc | Klasse)
##    Data: mathe
## 
## REML criterion at convergence: 1349.1
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -2.99848 -0.64293 -0.02016  0.67017  2.67840 
## 
## Random effects:
##  Groups   Name        Variance   Std.Dev. Corr       
##  Klasse   (Intercept) 247.331198 15.7268             
##           intcwc        0.021583  0.1469   1.00      
##           motcwc        0.005141  0.0717  -0.54 -0.46
##  Residual               1.081670  1.0400             
## Number of obs: 400, groups:  Klasse, 20
## 
## Fixed effects:
##             Estimate Std. Error       df t value    Pr(>|t|)    
## (Intercept) 27.83777    3.51700 19.03092   7.915 0.000000194 ***
## intcwc       0.24497    0.03353 19.01152   7.306 0.000000626 ***
## motcwc       0.14982    0.03021 17.97800   4.959    0.000102 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##        (Intr) intcwc
## intcwc  0.976       
## motcwc -0.285 -0.250

Wir sehen, dass auch im Rahmen des Random-Slopes Modells Regressionsgewichte für int und mot geschätzt werden, die signifikant von 0 verschieden sind.

Nun wollen wir noch ein Random-Intercepts Modell rechnen. Beim Random-Intercepts Modell dürfen die Intercepts zwischen den verschiedenen Klassen variieren, aber die Regressionsgewichte für unsere beiden Prädiktoren (Intelligenz und Motivation) werden als fix über die Klassen hinweg angenommen. Dementsprechend schreiben wir in der Formel nur noch den Term “1” (welcher für die Intercepts steht) vor dem Term “|Klasse”.

ri <- lmer(ml ~ 1 + intcwc + motcwc + (1|Klasse), data= mathe)
summary(ri)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: ml ~ 1 + intcwc + motcwc + (1 | Klasse)
##    Data: mathe
## 
## REML criterion at convergence: 1642.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.9824 -0.5680 -0.0478  0.5774  4.0876 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  Klasse   (Intercept) 247.520  15.733  
##  Residual               2.401   1.549  
## Number of obs: 400, groups:  Klasse, 20
## 
## Fixed effects:
##               Estimate Std. Error         df t value             Pr(>|t|)    
## (Intercept)  27.838383   3.518824  18.997696   7.911          0.000000198 ***
## intcwc        0.231416   0.009945 377.997699  23.270 < 0.0000000000000002 ***
## motcwc        0.163913   0.037783 377.997699   4.338          0.000018448 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##        (Intr) intcwc
## intcwc  0.000       
## motcwc  0.000 -0.066

Wie wir sehen, finden wir nun im Bereich “Random effects” nur noch einen random effect für die Intercepts, nicht jedoch für die beiden Regressionsgewichte von intcwc und motcwc. Im Bereich “Fixed effects” ändert sich nicht sehr viel, aber die Freiheitsgrade der Tests der beiden Prädiktoren haben sich deutlich verändert (siehe hierzu das Buchkapitel).

Wir wollen nun noch überprüfen, ob das Random-Intercepts Modell die Daten genauso gut abbildet wie das Random-Slopes Modell, obwohl es restriktiver ist. Dazu nutzen wir die Funktion anova(), die wir schon zum Vergleich einfacher Regressionsmodelle herangezogen haben. Wir übergeben dieser Funktion die beiden gefitteten HLMs sowie zusätzlich das Argument “refit = FALSE”. Dies tun wir, da sich die beiden Modelle nur im Bereich der random effects, nicht jedoch im Bereich der fixed effects unterscheiden (wir haben also keine zusätzlichen Prädiktoren mit aufgenommen).

anova(ri, rs, refit = FALSE)

Das Ergebnis des Modellvergleichs zeigt, dass das Random-Slopes Modell die Daten signifikant besser abbildet als das sparsamere Random-Intercepts Modell. Wir sollten also das komplexere Random-Slopes Modell gegenüber dem sparsameren Random-Intercepts Modell bevorzugen.

Die Hinzunahme von Level-2 Prädiktoren

Wir wollen nun überprüfen, ob die Stärke des Zusammenhangs zwischen Motivation und Mathematikleistung innerhalb der einzelnen Klassen vom Lehrstil des jeweiligen Klassenlehrers abhängt. Dazu nehmen wir in unser Modell einen Interaktionsterm zwischen motcwc und lstil (die Variable, die den Lehrstil des Lehrers kodiert) auf.

rs2 <- lmer(ml ~ 1 + intcwc + motcwc*lstil + (1 + intcwc + motcwc|Klasse), data= mathe)
## boundary (singular) fit: see help('isSingular')
summary(rs2)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: ml ~ 1 + intcwc + motcwc * lstil + (1 + intcwc + motcwc | Klasse)
##    Data: mathe
## 
## REML criterion at convergence: 1341.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -2.9973 -0.7069  0.0036  0.6951  2.7002 
## 
## Random effects:
##  Groups   Name        Variance   Std.Dev. Corr       
##  Klasse   (Intercept) 246.022038 15.68509            
##           intcwc        0.021329  0.14604  0.99      
##           motcwc        0.001757  0.04192 -0.90 -0.84
##  Residual               1.059729  1.02943            
## Number of obs: 400, groups:  Klasse, 20
## 
## Fixed effects:
##              Estimate Std. Error       df t value    Pr(>|t|)    
## (Intercept)  27.89250    4.22077 31.54205   6.608 0.000000202 ***
## intcwc        0.24482    0.03334 19.25140   7.344 0.000000538 ***
## motcwc       -0.07871    0.07172 85.88616  -1.097    0.275533    
## lstil        -0.02875    1.23554 17.32274  -0.023    0.981699    
## motcwc:lstil  0.12010    0.03514 85.23798   3.418    0.000969 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) intcwc motcwc lstil 
## intcwc       0.805                     
## motcwc      -0.152 -0.110              
## lstil       -0.556  0.004  0.098       
## motcwc:lstl  0.057 -0.001 -0.927 -0.103
## optimizer (nloptwrap) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')

Tatsächlich zeigt sich eine signifikante Interaktion zwischen Lehrstil und Motivation. Anhand der Regressionsgewichte und ihrer Vorzeichen können wir entnehmen, dass Motivation in Klassen mit einem Lehrer mit geringen Werten auf der Variable lstil kaum einen Einfluss auf die Mathematikleistung hat. In Klassen mit einem Lehrer, der hohe Werte auf der Variable lstil hat, hat die Motivation der Schüler einen substantiellen Einfluss.

Die Zentrierung der Prädiktorvariablen

Wir wollen nun verschiedene Arten der Zentrierung illustrieren. Dazu arbeiten wir mit einem Datensatz von Enders & Tofighi (2007). Wir laden diesen Datensatz zunächst ein und inspizieren ihn.

load('ETdat.RData')
ETdat

Wie Sie sehen können, ist der Datensatz sehr simpel Er besteht lediglich aus einer Gruppierungsvariable “g”, der Prädiktorvariable “x”und einer Kriteriumsvariable “y”.

Wir wollen zunächst die Methode “centering within clusters” verwenden. Diese Zentrierungsvariante haben wir auch schon im oberen Abschnitt verwendet (wo bei jedem Schüler der Klassenmittelwert der Intelligenz/Motivation vom individuellen Wert der Intelligenz/Motivation abgezogen wurde). Die folgenden Codezeilen machen das gleiche noch einmal für die Prädiktorvariable x des Datensatzes von Enders & Tofighi (2007). Der resultierenden Variable geben wir den Namen xcwc (“centered within clusters”).

group.means <- aggregate(ETdat$x, by=list (ETdat$g), mean)
colnames(group.means) <- c('g','groupm')
ETdat <- merge(ETdat, group.means)
ETdat$xcwc <- ETdat$x - ETdat$groupm

Wir rechnen nun ein Random-Intercepts Modell mit der centered-within-clusters Variable xcwc.

ri.cwc <- lmer(y ~ 1 + xcwc + (1|g),data=ETdat)
summary(ri.cwc)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: y ~ 1 + xcwc + (1 | g)
##    Data: ETdat
## 
## REML criterion at convergence: 92.5
## 
## Scaled residuals: 
##      Min       1Q   Median       3Q      Max 
## -1.71924 -0.32528 -0.01513  0.48784  1.71018 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  g        (Intercept) 139.85   11.826  
##  Residual              21.13    4.596  
## Number of obs: 15, groups:  g, 3
## 
## Fixed effects:
##             Estimate Std. Error      df t value Pr(>|t|)  
## (Intercept)  60.8000     6.9299  2.0000   8.774   0.0127 *
## xcwc         -0.4224     0.2127 11.0000  -1.986   0.0725 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##      (Intr)
## xcwc 0.000

Nun nutzen wir die Methode “grand-mean centering”. Dazu ziehen wir einfach von jedem individuellen Wert den Gesamtmittelwert unserer Stichprobe ab (dies liefert uns den gewichteten Grand Mean; siehe Buchkapitel).

ETdat$xgm <- ETdat$x - mean(ETdat$x)

Nun berechnen wir ein Random-Intercepts Modell mit der grand-mean-centered Variable xgm.

ri.cgm <- lmer(y ~ 1 + xgm + (1|g),data=ETdat)
summary(ri.cgm)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: y ~ 1 + xgm + (1 | g)
##    Data: ETdat
## 
## REML criterion at convergence: 90.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.7022 -0.4668 -0.0154  0.6594  1.7406 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  g        (Intercept) 42.50    6.519   
##  Residual             21.49    4.636   
## Number of obs: 15, groups:  g, 3
## 
## Fixed effects:
##             Estimate Std. Error      df t value Pr(>|t|)  
## (Intercept)  60.8000     3.9497  1.3687  15.394   0.0168 *
## xgm          -0.5493     0.1961 12.9204  -2.801   0.0151 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##     (Intr)
## xgm 0.000

Wie Sie sehen, ist das geschätzte Regressionsgewicht der Variable x nun deutlich verschieden zum geschätzten Regressionsgewicht im Random-Intercepts Modell mit der centered-within-clusters Variable.

Rechnen wir das Modell nun noch einmal mit der unzentrierten Variable x, erhalten wir dasselbe Ergebnis wie mit der grand-mean-centered Variable:

ri.uncentered <- lmer(y ~ 1 + x + (1|g),data=ETdat)
summary(ri.uncentered)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: y ~ 1 + x + (1 | g)
##    Data: ETdat
## 
## REML criterion at convergence: 90.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.7022 -0.4668 -0.0154  0.6594  1.7406 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  g        (Intercept) 42.50    6.519   
##  Residual             21.49    4.636   
## Number of obs: 15, groups:  g, 3
## 
## Fixed effects:
##             Estimate Std. Error      df t value  Pr(>|t|)    
## (Intercept)  88.2672    10.5705 10.6106   8.350 0.0000055 ***
## x            -0.5493     0.1961 12.9204  -2.801    0.0151 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##   (Intr)
## x -0.928

Sie sehen also, dass unterschiedliche Arten der (Nicht-) Zentrierung zu unterschiedlichen Ergebnissen führen können. Um zu überprüfen, welche Art in unserem Beispiel die angemessene Art der Zentrierung wäre, nutzen wir noch einmal die oben vorgestellte Vorstufe von HLM-Analysen, bei der die Kriteriumsvariable auf den Prädiktor und die Dummy-kodierte Gruppenvariable regrediert wird. Zunächst müssen wir R wieder mitteilen, dass es die Gruppenvariable als nominal-kodierte Variable verstehen soll. Dazu bilden wir die neue Faktor-Variable g_nom

ETdat$g_nom <- as.factor(ETdat$g)

Jetzt können wir die Regression fitten lassen.

oldschool <- lm(y ~ 1 + x + g_nom,data=ETdat)
summary(oldschool)
## 
## Call:
## lm(formula = y ~ 1 + x + g_nom, data = ETdat)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -8.234 -1.533  0.300  2.150  7.822 
## 
## Coefficients:
##             Estimate Std. Error t value    Pr(>|t|)    
## (Intercept)  88.9951     8.7525  10.168 0.000000626 ***
## x            -0.4224     0.2127  -1.986      0.0725 .  
## g_nom2       -5.7762     3.6020  -1.604      0.1371    
## g_nom3      -15.4525     5.1522  -2.999      0.0121 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.596 on 11 degrees of freedom
## Multiple R-squared:  0.8677, Adjusted R-squared:  0.8316 
## F-statistic: 24.05 on 3 and 11 DF,  p-value: 0.00003922

Wie Sie sehen können, ist das Ergebnis dieser Analyse (fast) identisch zum Ergebnis der Analyse, bei der wir die centering-within-clusters Methode gewählt haben. Tatsächlich ist diese Methode in unserem Datenbeispiel auch die angemessene Methode, da durch centering within clusters die Varianz zwischen den Gruppen egalisiert wird und nur die Varianz innerhalb der Gruppen in die Analyse eingeht. Weitere Details zu unterschiedlichen Arten der Zentrierung können Sie dem Buchkapitel entnehmen.

Tests des Gesamtmodells und Quasi-R²

Wir kehren nun noch einmal zu unserem Datenbeispiel zurück, bei dem die Mathematikleistung von Schülern vorhergesagt werden soll. Wie können wir nun - ähnlich dem globalen F-Test bei der linearen Regression - abschätzen, ob (beispielsweise) unser aufgestelltes Random-Slopes Modell insgesamt signfikant Varianz erklärt? Zu diesem Zweck fitten wir zunächst ein sog. Null-Modell, bei dem zwar zugelassen wird, dass die Klassenmittelwerte in der Mathematikleistung variieren dürfen, aber kein Prädiktor zur Vorhersage der Mathematikleistung aufgenommen wird.

r0 = lmer(ml ~ 1 + (1|Klasse), data= mathe)
summary(r0)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: ml ~ 1 + (1 | Klasse)
##    Data: mathe
## 
## REML criterion at convergence: 1982.3
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.3258 -0.6495  0.0386  0.5672  3.0535 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  Klasse   (Intercept) 247.289  15.725  
##  Residual               6.027   2.455  
## Number of obs: 400, groups:  Klasse, 20
## 
## Fixed effects:
##             Estimate Std. Error     df t value    Pr(>|t|)    
## (Intercept)   27.839      3.519 18.994   7.912 0.000000198 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wir nutzen nun die Funktion anova(), um unser oben gefittetes Random-Slopes-Modell (namens “rs”) mit dem Null-Modell zu vergleichen. Hier lassen wir das zusätzliche Argument “refit = FALSE”, welches wir oben verwendet haben, als wir das Random-Slopes Modell mit dem Random-Intercepts Modell verglichen haben, weg, da wir hier zwei Modelle vergleichen, die sich in ihrem Fixed-effects Teil unterscheiden (d.h., die Modelle haben eine unterschiedliche Anzahl an Prädiktoren).

anova(r0,rs)
## refitting model(s) with ML (instead of REML)

Wir sehen, dass wir einen signifikanten \(\chi²\)-Test haben. Also kann der durch das Gesamtmodell aufgeklärte Varianzanteil als von 0 verschieden angenommen werden. Um nun eine Effektgröße ähnlich dem globalen R² in der linearen Regression zu erhalten, können wir das sog. Quasi-R berechnen. Dieses erhalten wir, wenn wir die Residualvarianz (findet man im Ausgabeblock “Random effects” in der Zeile “Residual”) des Random-Slope Modells von der Residualvarianz des Null-Modells abziehen und die erhaltene Differenz durch die Residualvarianz des Nullmodells teilen.

(6.027 - 1.081670) / 6.027
## [1] 0.8205293

In unserem Fall werden also 82% der zu erklärenden Varianz durch die Prädiktoren aufgeklärt. Die Varianz, die auf die Level-2-Variable (hier: Schulklassen) zurückgeht, bleibt dabei außen vor. Für den Beitrag eines Level-2-Prädiktors wird das Quasi-R² analog durch die Reduktion der Intercept-Varianz vom Modell ohne den Level-2-Prädiktor zum Modell mit dem Level-2-Prädiktor bestimmt. Um dies zu verdeutlichen, nutzen wir die Variable nw, die angibt, ob die jeweilige Klasse eine mathematisch-naturwissenschaftliche Orientierung hat (nw = 1) oder nicht (nw = 0).

Wir fitten zunächst ein Modell, in das wir nur den Level-2 Prädiktor als Variable eingehen lassen.

rs_mit = lmer(ml ~ 1 + nw + (1|Klasse), data= mathe)
summary(rs_mit)
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: ml ~ 1 + nw + (1 | Klasse)
##    Data: mathe
## 
## REML criterion at convergence: 1972.9
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -3.3289 -0.6523  0.0383  0.5706  3.0503 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  Klasse   (Intercept) 212.722  14.585  
##  Residual               6.027   2.455  
## Number of obs: 400, groups:  Klasse, 20
## 
## Fixed effects:
##             Estimate Std. Error     df t value Pr(>|t|)    
## (Intercept)   20.547      4.865 17.996   4.223 0.000511 ***
## nw            13.257      6.560 17.996   2.021 0.058431 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##    (Intr)
## nw -0.742

Nun ziehen wir die Intercept-Varianz (findet man im Block “Random effects” in der Zeile “(Intercept)”) des Modells mit dem Level-2 Prädiktor von der Intercept-Varianz des Nullmodells ab und teilen das Ganze durch die Intercept-Varianz des Nullmodells.

(247.289 - 212.722) / 247.289
## [1] 0.1397838

Nun wollen wir noch die Intra-Class-Correlation (ICC) anfordern, die angibt, inwieweit die Daten innerhalb einer Gruppe (in unserem Fall Klasse) sich ähneln und somit, wie sehr die Struktur der Daten eine HLM-Analse erfordert. Zu diesem Zweck teilen wir die Varianz der Intercepts im Nullmodell durch die Summe aus der Residualvarianz im Nullmodell und der Varianz der Intercepts im Nullmodell.

247.289 / (247.289 + 6.027)
## [1] 0.9762076

Der Wert des ICC in diesem Beispiel sagt aus, dass 97.6% der Varianz der Mathematikleistung der Schüler darauf zurückzuführen sind, dass diese Schüler aus unterschiedlichen Klassen kommen. Dieser Wert ist in unserem Beispiel sehr extrem und so wohl nicht in der Realität anzutreffen (siehe Buchkapitel).

Logistische Multilevel Modellierung

Möchte man HLM-Analysen für ein binäres Outcome berechnen, so nutzt man die logistische Multilevel Modellierung. Unser Datensatz enthält eine Varialbe namens “nwstud”, die aussagt, ob ein Schüler nach seinem Abschluss einen naturwissenschaflichen Studiengang aufgenommen hat (nwstud = 1) oder nicht (nwstud = 0). Wir fitten nun ein Modell, dass die Aufnahme eines naturwissenschaftlichen Studiums durch die Intelligenz und die Motivation der Schüler vorhersagen soll. Dazu nutzen wir die Funktion glmer() (glmer steht für “generalized linear mixed effects regression”). Die generelle Formel ist dabei identisch zur Funktion lmer(). Wir fügen aber zwei weitere Argumente hinzu:

logreg <- glmer(nwstud ~ 1 + intcwc + motcwc + (1 + intcwc + motcwc|Klasse), data = mathe, family = 'binomial', control=glmerControl(optimizer = 'bobyqa'))
## boundary (singular) fit: see help('isSingular')
summary(logreg)
## Generalized linear mixed model fit by maximum likelihood (Laplace
##   Approximation) [glmerMod]
##  Family: binomial  ( logit )
## Formula: nwstud ~ 1 + intcwc + motcwc + (1 + intcwc + motcwc | Klasse)
##    Data: mathe
## Control: glmerControl(optimizer = "bobyqa")
## 
##      AIC      BIC   logLik deviance df.resid 
##    357.3    393.2   -169.6    339.3      391 
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -1.6724 -0.4330 -0.2695 -0.1565  4.3002 
## 
## Random effects:
##  Groups Name        Variance Std.Dev. Corr       
##  Klasse (Intercept) 2.317702 1.52240             
##         intcwc      0.001364 0.03693   0.06      
##         motcwc      0.029144 0.17072   0.86 -0.46
## Number of obs: 400, groups:  Klasse, 20
## 
## Fixed effects:
##             Estimate Std. Error z value   Pr(>|z|)    
## (Intercept) -1.88477    0.39349  -4.790 0.00000167 ***
## intcwc       0.05345    0.02334   2.290      0.022 *  
## motcwc       0.06518    0.09491   0.687      0.492    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##        (Intr) intcwc
## intcwc -0.095       
## motcwc  0.299 -0.111
## optimizer (bobyqa) convergence code: 0 (OK)
## boundary (singular) fit: see help('isSingular')

Wie wir sehen können, ist in unserem Beispiel Intelligenz, aber nicht Motivation ein signifikanter Prädiktor dafür, ob Schüler nach ihrem Abschluss ein naturwissenschaftliches Studium aufnehmen.