Random Slope

Making Random Slope Model

m2 <- lmer(MATH ~ 1 + ESCS + (1 + ESCS | CNTSCHID), data = pisa)

See the result

summary(m2)
Linear mixed model fit by REML ['lmerMod']
Formula: MATH ~ 1 + ESCS + (1 + ESCS | CNTSCHID)
   Data: pisa

REML criterion at convergence: 13653.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.8809 -0.6318 -0.0380  0.6109  4.1509 

Random effects:
 Groups   Name        Variance Std.Dev. Corr
 CNTSCHID (Intercept) 2996.20  54.738       
          ESCS          61.09   7.816   0.79
 Residual             1961.08  44.284       
Number of obs: 1297, groups:  CNTSCHID, 41

Fixed effects:
            Estimate Std. Error t value
(Intercept)  367.305      9.069  40.503
ESCS           3.352      1.948   1.721

Correlation of Fixed Effects:
     (Intr)
ESCS 0.682 

Finding ICC

tab_model(m2)
  MATH
Predictors Estimates CI p
(Intercept) 367.30 349.51 – 385.10 <0.001
ESCS 3.35 -0.47 – 7.17 0.086
Random Effects
σ2 1961.08
τ00 CNTSCHID 2996.20
τ11 CNTSCHID.ESCS 61.09
ρ01 CNTSCHID 0.79
ICC 0.53
N CNTSCHID 41
Observations 1297
Marginal R2 / Conditional R2 0.003 / 0.528

Making prediction plot

pisa$m1 <- predict(m2)

pisa %>% 
  ggplot(aes(ESCS, m1, color = CNTSCHID, group = CNTSCHID)) + 
  geom_smooth(se = F, method = lm) +
  theme_bw() +
  labs(x = "ESCS", 
       y = "Matematika", 
       color = "CNTSCHID")

QQ-Plot

qqmath(ranef(m2, condVar = TRUE))
$CNTSCHID

Intercept vs Slope

koef_m2 <- coef(m2)

# print random effects and best line
koef_m2$CNTSCHID %>%
  mutate(CNTSCHID = rownames(koef_m2$CNTSCHID))  %>% 
  ggplot(aes(ESCS, `(Intercept)`, label = CNTSCHID)) + 
  geom_point() + 
  geom_smooth(se = F, method = lm) +
  geom_label(nudge_y = 0.15, alpha = 0.5) +
  theme_bw() +
  labs(x = "Slope", y = "Intersep")