## ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
##                     Multilevel-Modelle
## ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#### ++ Import der Daten und wichtige Pakete laden ####

# setwd("")
daten <- read.table( "SnijdersBosker2012.txt", header = TRUE )

# ggf. Pakete installieren:
#install.packages("lme4")
#install.packages("lmerTest")
#install.packages("sjPlot")

library( lme4 )      # zur Schaetzung von Multilevel-Modellen
## Lade nötiges Paket: Matrix
library( lmerTest )  # fuer die Signifikanztests der festen Effekte
## 
## Attache Paket: 'lmerTest'
## Das folgende Objekt ist maskiert 'package:lme4':
## 
##     lmer
## Das folgende Objekt ist maskiert 'package:stats':
## 
##     step
library( sjPlot )      # berichten eines LMMs

#### ++ Beispiel ###
# mit N = 3758 Schüler*innen (Level 1) an 211 Schulen (Level 2) in den 
# Niederlanden wurde ein Sprachtest durchgeführt, zusätzlich dazu liegen Daten 
# zur verbalen Intelligenz und zum sozialen Status der Schule vor.
# school: Nummer der Schule (i = 1, …, 211)
# sprache: Ergebnisse der Schüler*innen im Sprachtest          → Level 1-Prädiktor
# iq_verb: Ergebnisse der Schüler*innen im IQ-Test (zentriert) → Level 1-Prädiktor
# school_ses: sozialer Status der Schule (zentriert)           → Level 2-Prädiktor

###############################

# Berechnung ICC ----
# Schritt 1: Random Intercept-Only Modell fitten

# Kurzbeschreibung zu Schritt 1 
# In unserem Beispiel haben wir Schueler*innen in Klassen erfasst und die 
# Klassenvariable heisst "school". 
# Regressionskonstanten werden in R mit der "1" angeschrieben, wenn Random 
# Intercept. Die lmer Funktion erlaubt es uns das Modell zu berechnen.

m1 <- sprache ~ 1 + (1 | school) # 1 steht für Intercept  
fit1 <- lme4::lmer( m1, data = daten, REML = TRUE )
summary( fit1 )  
## Linear mixed model fit by REML ['lmerMod']
## Formula: sprache ~ 1 + (1 | school)
##    Data: daten
## 
## REML criterion at convergence: 26595.7
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -4.1850 -0.6417  0.0905  0.7226  2.5281 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  school   (Intercept) 18.24    4.271   
##  Residual             62.85    7.928   
## Number of obs: 3758, groups:  school, 211
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept)  41.0038     0.3257   125.9
# Schritt 2: ICC ablesen 
tab_model(fit1) 
  sprache
Predictors Estimates CI p
(Intercept) 41.00 40.37 – 41.64 <0.001
Random Effects
σ2 62.85
τ00 school 18.24
ICC 0.22
N school 211
Observations 3758
Marginal R2 / Conditional R2 0.000 / 0.225
# alternativ per 'Hand' mit ANgaben aus der Summary:
(icc <- 18.24/(18.24+62.85))
## [1] 0.2249353
# Interpretation: → bedeutet das 22,49% der Unterschiede von Y (= hier der 
#                   Sprachtestvariable) auf Unterscheide zwischen den Schulen 
#                   zurückgehen.

###############################

# Random Intercept-Fixed Slopes Modell mit Level 1 & Level 2 -Prädiktoren ----

# In diesem Modell wird iq_verb und school_ses zur Vorhersage der Punktzahl im 
# Sprachtest benutzt. Die Regressionskonstante zwischen den Schulen darf zufällig 
# variieren.

#Schritt 1: Modell definieren und fitten.
m2 <- sprache ~ 1 + iq_verb + school_ses + (1 |school)  
fit2 <- lmer( m2, data = daten, 
              REML = TRUE, 
              lmerControl(optimizer = "bobyqa") ) # hilft bei Konvergenzproblemen
summary( fit2 )
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: m2
##    Data: daten
## Control: lmerControl(optimizer = "bobyqa")
## 
## REML criterion at convergence: 24905.8
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -4.2285 -0.6403  0.0661  0.7122  3.2056 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  school   (Intercept)  9.162   3.027   
##  Residual             40.455   6.360   
## Number of obs: 3758, groups:  school, 211
## 
## Fixed effects:
##              Estimate Std. Error        df t value Pr(>|t|)    
## (Intercept) 4.111e+01  2.369e-01 2.006e+02 173.561  < 2e-16 ***
## iq_verb     2.485e+00  5.466e-02 3.707e+03  45.469  < 2e-16 ***
## school_ses  1.538e-01  3.793e-02 2.120e+02   4.054 7.07e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##            (Intr) iq_vrb
## iq_verb    -0.003       
## school_ses  0.049 -0.112
tab_model(fit2)
  sprache
Predictors Estimates CI p
(Intercept) 41.11 40.64 – 41.57 <0.001
iq verb 2.49 2.38 – 2.59 <0.001
school ses 0.15 0.08 – 0.23 <0.001
Random Effects
σ2 40.45
τ00 school 9.16
ICC 0.18
N school 211
Observations 3758
Marginal R2 / Conditional R2 0.365 / 0.483
# Schritt 2: Interpretation

# Fixed Effects 
# Intercept c00: Die vorhergesagte Testleistung im Sprachtest bei einem durchschnittlichen 
#       Ergebnis des IQ-Tests (da zentriert) beträgt über alle Schulen mit einem
#       mittleren SES hinweg 41.11 Punkte.
#       
# iq verb c10: Die vorhergesagte Testleistung im Sprachtest steigt über alle Schulen 
#       hinweg um 2.49 Punkte, wenn Schüler:innen einen um einen Punkt höheren 
#       verbalen IQ haben unter Kontrolle für den SES der Schule.
#
# school ses c01: Die erwartete Testleistung im Sprachtest steigt über alle Schulen  
#       hinweg um 0.15, wenn der SES einer Schule sich um 1 Einheit erhöht 
#       bei Konstanthaltung des verbalen IQs. 
#

# Random Effects
#
# intercept u0j : Die Schulen unterscheiden sich mit einer Varianz von 9.162 in ihrer 
#       vorhergesagten Testleistung im Sprachtest bei durchschnittlicher Leistung 
#       im IQ-Tests und SES.


####### BEARBEITUNGSNOTIZ 

###############################

## Random Intercept-Random Slopes mit Level 1 Prädiktor & Level 2 -Prädiktoren ----

# Unser Ziel ist es nun Unterschiede (= Variabilität) zwischen den Regressions-
# koeffizienten der Level-2 Einheiten (= hier Schulen) durch den SES der Schule 
# (= school_ses), also dem Level 2 Prädiktor zu erklären. 

#Schritt 1: Modell definieren und fitten.
m3 <- sprache ~ 1 + iq_verb + school_ses + iq_verb*school_ses + (1 + iq_verb |school)  
fit3 <- lmer( m3, data = daten, REML = TRUE, lmerControl(optimizer = "bobyqa") )
summary( fit3 )
## Linear mixed model fit by REML. t-tests use Satterthwaite's method [
## lmerModLmerTest]
## Formula: m3
##    Data: daten
## Control: lmerControl(optimizer = "bobyqa")
## 
## REML criterion at convergence: 24880.1
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -4.2680 -0.6263  0.0698  0.7081  2.7911 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev. Corr 
##  school   (Intercept)  9.0572  3.0095        
##           iq_verb      0.1809  0.4253   -0.72
##  Residual             39.7556  6.3052        
## Number of obs: 3758, groups:  school, 211
## 
## Fixed effects:
##                      Estimate Std. Error         df t value Pr(>|t|)    
## (Intercept)         41.208027   0.236815 206.710183 174.009  < 2e-16 ***
## iq_verb              2.492022   0.062884 173.594666  39.629  < 2e-16 ***
## school_ses           0.143460   0.037706 214.471488   3.805 0.000185 ***
## iq_verb:school_ses  -0.023333   0.009534 152.970729  -2.447 0.015524 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Correlation of Fixed Effects:
##             (Intr) iq_vrb schl_s
## iq_verb     -0.321              
## school_ses   0.051 -0.115       
## iq_vrb:sch_ -0.110  0.061 -0.289
tab_model(fit3)
  sprache
Predictors Estimates CI p
(Intercept) 41.21 40.74 – 41.67 <0.001
iq verb 2.49 2.37 – 2.62 <0.001
school ses 0.14 0.07 – 0.22 <0.001
iq verb × school ses -0.02 -0.04 – -0.00 0.014
Random Effects
σ2 39.76
τ00 school 9.06
τ11 school.iq_verb 0.18
ρ01 school -0.72
ICC 0.20
N school 211
Observations 3758
Marginal R2 / Conditional R2 0.369 / 0.493
#Schritt 2: Interpretation

# Fixed Effects 
# intercept c00 : Die vorhergesagte Testleistung im Sprachtest bei einem durchschnittlichen  
#       Ergebnis des IQ-Tests beträgt über alle Schulen mit einem mittleren SES hinweg
#       41.20 Punkte.
#       
# iq verb c10: Die vorhergesagte Testleistung im Sprachtest steigt um 2.49 Punkte,
#       wenn man den verbalen IQ um eine Einheit erhöht, über alle Schulen 
#       mit mittlerem SES hinweg.
#
# school ses c01: Die vorhergesagte Testleistung im Sprachtest steigt für Schüler:innen
#       mit durchschnittlichem Verbalen IQ bei Erhöhung des SES um eine Einheit um 
#       0.14 Punkte an. 
#
# iq x ses c11: signifikant, d.h.  der SES scheint Unterschiede in den Regressionsgewichten 
#       erklären zu koennen!
#       Wenn der SES um eine Einheit erhöht, dann verringert sich der erwartetete 
#       Einfluss des verbalen IQ pro IQ Punkt um 0.02 Punkte über alle Schulen hinweg. 

# Random Effects
#
# intercept u0j : Die Schulen mit durchschnittlichem SES unterscheiden sich mit einer  
#       Varianz von 9.06 in ihrer vorhergesagten Testleistung im Sprachtest bei  
#       durchschnittlicher Leistung im IQ-Test.
#
# iq verb u1j : Die Schulen unterscheiden sich mit einer Varianz von 0.18 darin, inwiefern 
#       eine Erhöhung im IQ-Test zu einer Steigung der vorhergesagten Testleistung 
#       im Sprachtest führt (über die vorhergesagten Unterschiede durch SES hinaus).


# Hilfreiche Visualisierung der Interaktion
install.packages("interactions")
## Installiere Paket nach '/home/slk/R/x86_64-pc-linux-gnu-library/4.3'
## (da 'lib' nicht spezifiziert)
library(interactions)
interact_plot(fit3, pred = iq_verb, modx = school_ses, interval = TRUE )