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))
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.
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:
list()
in eine list
umwandeln.mean()
.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.
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.
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.
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).
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.