Mehrebenenanalyse mit R (HLM mit R)
– Modell mit drei Ebenen (mit lme4 Package)

Arndt Regorz, Dipl. Kfm. & MSc. Psychologie, 21.06.2024

Nachfolgend wird der R-Code gezeigt, den man mit dem Package lme4 für ein Mehrebenenmodell mit drei Ebenen nutzen kann.

Der Datensatz ist ein Beispieldatensatz zum Buch von Hox (Kapitel 2): nurses.

Um die Ergebnisse mit dem Buch von Hox vergleichbar zu machen, wurden einige Modellierungsentscheidungen ebenso wie dort getroffen, auch wenn man teilweise aus guten Gründen andere Entscheidungen hätte treffen können. Das betrifft zum einen das Schätzverfahren (ML statt REML), zum anderen betrifft es die Frage, welche Prädiktoren zentriert werden.

In diesem Beispieldatensatz wird der Einfluss einer Intervention auf den Stresslevel von Krankenpflegepersonal untersucht. Dabei gibt es drei Ebenen:
Ebene 1: Pflegekraft
Ebene 2: Station ("ward")
Ebene 3: Krankenhaus ("hospital")

Dabei werden folgende Packages verwendet:

library(lme4)
library(lmerTest) # p-Werte für Output
library(reghelper) # Grafik simple slopes

Nullmodell

Wie bei Mehrebenenmodellen üblich, wird zunächst ein leeres Modell (Nullmodell) betrachtet, ohne Prädiktoren. Interesant ist dabei der Teil für die Zufallseffekte.

Bei drei Ebenen gibt es zwei verschiedene, im Prinzip gleichwertige, Möglichkeiten, die Zufallseffekte zu spezifizieren.

Option 1: (1| ebene_3 /ebene_2)
[wobei ebene_3 und ebene_2 für die Variablennamen stehen, mit denen die Ebene-2- und Ebene-3-Einheiten im Datensatz bezeichnet sind.]

Option 2: (1|ebene_3) + (1|ebene_3:ebene_2)

Die zweite, ausführliche, Schreibweise zeigt dabei, was bei den Zufallseffekten geschätzt wird: Zunächst ein Zufallseffekt für die Ebene 3 (wie schwankt der Intercept zwischen verschiedenen Ebene-3-Einheiten), und dann ein Zufallseffekt für Ebene 2 innerhalb der Ebene 3 (wie schwankt der Intercept für die Ebene-2-Einheiten innerhalb einer Ebene-3-Einheit).

Bei der Option 1 ergibt sich daraus folgender Code für das Nullmodell:

# 1 Null model

fit_empty <- lmer(stress ~ 1 + (1|hospital/ward), data = nurses, REML = F)
summary(fit_empty)

Bei der ausführlicheren Option 2 ergibt sich daraus folgender Code für das Nullmodell, der zum gleichen Ergebnis führt:

# alternative longer code:

fit_empty2 <- lmer(stress ~ 1 + (1|hospital) + (1|hospital:ward), data = nurses,
REML = F)
summary(fit_empty2)

# 2 Model fixed effects

fit_fixed <- lmer(stress ~ 1 + age + gender + experien + + wardtype + Cexpcon
+ Chospsize + (1|hospital/ward), data = nurses, REML = F)
summary(fit_fixed)

# 3 Model random slope

fit_random <- lmer(stress ~ 1 + age + gender + experien + + wardtype + Cexpcon
+ Chospsize + (Cexpcon|hospital) + (1|hospital:ward),
data = nurses, REML = F)
summary(fit_random)

# 4 Model cross-level interaction

fit_cross <- lmer(stress ~ 1 + age + gender + experien + + wardtype
+ Cexpcon * Chospsize + (Cexpcon|hospital) + (1|hospital:ward),
data = nurses, REML = F)
summary(fit_cross)

graph_model(fit_cross, y = stress, x = Cexpcon, lines = Chospsize, errorbars = "none")