Code
using CairoMakie
using DataFrames
using LinearAlgebra
using MixedModels
using SMLP2026: dataset
using MixedModelsMakie
using Random
using ProgressMeter
const progress = isinteractive()false
Douglas Bates
Phillip Alday
2026-06-21
After working through this page you will be able to:
Prerequisites: Analysis of the sleepstudy data; Convergence, singularity and all that is helpful.
Datasets used: kb07 (see the dataset catalog).
false
Load the kb07 data set.
Arrow.Table with 1789 rows, 7 columns, and schema:
:subj String
:item String
:spkr String
:prec String
:load String
:rt_trunc Int16
:rt_raw Int16
| Column | Variance | Std.Dev | Corr. | |||
|---|---|---|---|---|---|---|
| subj | (Intercept) | 91064.7403 | 301.7693 | |||
| spkr: old | 1850.5250 | 43.0177 | +0.78 | |||
| prec: maintain | 3843.8825 | 61.9991 | -0.59 | +0.03 | ||
| load: yes | 4246.0532 | 65.1617 | +0.36 | +0.83 | +0.53 | |
| item | (Intercept) | 131173.0381 | 362.1782 | |||
| spkr: old | 1656.7129 | 40.7027 | +0.44 | |||
| prec: maintain | 60946.6098 | 246.8737 | -0.69 | +0.35 | ||
| load: yes | 1795.0255 | 42.3677 | +0.32 | +0.16 | -0.14 | |
| Residual | 446886.0133 | 668.4953 |
Linear mixed model fit by maximum likelihood
rt_trunc ~ 1 + spkr + prec + load + spkr & prec + spkr & load + prec & load + spkr & prec & load + (1 + spkr + prec + load | subj) + (1 + spkr + prec + load | item)
logLik -2 logLik AIC AICc BIC
-14318.5613 28637.1227 28695.1227 28696.1119 28854.3156
Variance components:
Column Variance Std.Dev. Corr.
subj (Intercept) 91064.7403 301.7693
spkr: old 1850.5250 43.0177 +0.78
prec: maintain 3843.8825 61.9991 -0.59 +0.03
load: yes 4246.0532 65.1617 +0.36 +0.83 +0.53
item (Intercept) 131173.0381 362.1782
spkr: old 1656.7129 40.7027 +0.44
prec: maintain 60946.6098 246.8737 -0.69 +0.35
load: yes 1795.0255 42.3677 +0.32 +0.16 -0.14
Residual 446886.0133 668.4953
Number of obs: 1789; levels of grouping factors: 56, 32
Fixed-effects parameters:
───────────────────────────────────────────────────────────────────────────────
Coef. Std. Error z Pr(>|z|)
───────────────────────────────────────────────────────────────────────────────
(Intercept) 2181.67 77.299 28.22 <1e-99
spkr: old 67.7485 18.2934 3.70 0.0002
prec: maintain -333.921 47.1493 -7.08 <1e-11
load: yes 78.7703 19.5383 4.03 <1e-04
spkr: old & prec: maintain -21.9657 15.806 -1.39 0.1646
spkr: old & load: yes 18.3843 15.806 1.16 0.2448
prec: maintain & load: yes 4.53389 15.806 0.29 0.7742
spkr: old & prec: maintain & load: yes 23.6074 15.806 1.49 0.1353
───────────────────────────────────────────────────────────────────────────────
Earlier today we mentioned that the parameters being optimized are from a “matrix square root” of the covariance matrix for the random effects. There is one such lower triangular matrix for each grouping factor.
4×4 LowerTriangular{Float64, Matrix{Float64}}:
0.451416 ⋅ ⋅ ⋅
0.0502725 0.0401697 ⋅ ⋅
-0.0550321 0.0726579 0.01714 ⋅
0.0351643 0.0850281 0.0321733 0.0
Notice the zero on the diagonal. A triangular matrix with zeros on the diagonal is singular.
4×4 LowerTriangular{Float64, Matrix{Float64}}:
0.541781 ⋅ ⋅ ⋅
0.0268651 0.0546398 ⋅ ⋅
-0.253039 0.268006 0.0229063 ⋅
0.0200358 0.00129292 0.0601135 0.0
To regenerate the covariance matrix we need to know that the covariance is not the square of l1, it is l1 * l1' (so that the result is symmetric) and multiplied by σ̂²
4×4 Matrix{Float64}:
91064.7 10141.5 -11101.7 7093.74
10141.5 1850.52 67.9472 2316.37
-11101.7 67.9472 3843.88 2142.48
7093.74 2316.37 2142.48 4246.05
4-element Vector{Float64}:
91064.74027228545
1850.5249616692
3843.882496563724
4246.0532111504635
:subj grouping term
The upper left panel shows the perfect negative correlation for those two components of the random effects.
:item grouping term
8×1789 Matrix{Int64}:
1 1 1 1 1 1 1 1 1 1 … 1 1 1 1 1 1 1 1 1
-1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1
-1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1
1 -1 -1 -1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 1
1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1
-1 -1 -1 1 1 1 1 -1 -1 -1 … 1 -1 -1 -1 -1 1 1 1 1
-1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1
1 -1 1 1 -1 1 -1 -1 1 -1 -1 -1 1 -1 1 1 -1 1 -1
subj appears to be contributing explanatory poweritem both the intercept and the spkr appear to be contributing| Column | Variance | Std.Dev | Corr. | |
|---|---|---|---|---|
| item | (Intercept) | 133027.438 | 364.729 | |
| prec: maintain | 63841.835 | 252.669 | -0.70 | |
| subj | (Intercept) | 88870.014 | 298.111 | |
| Residual | 460948.573 | 678.932 |
| Column | Variance | Std.Dev | Corr. | |
|---|---|---|---|---|
| item | (Intercept) | 133014.905 | 364.712 | |
| prec: maintain | 63768.184 | 252.524 | -0.70 | |
| subj | (Intercept) | 88819.302 | 298.026 | |
| Residual | 462443.261 | 680.032 |
| Row | type | group | names | lower | upper |
|---|---|---|---|---|---|
| String | String? | String? | Float64 | Float64 | |
| 1 | β | missing | (Intercept) | 2022.91 | 2334.0 |
| 2 | β | missing | prec: maintain | -430.239 | -239.802 |
| 3 | β | missing | spkr: old | 34.0592 | 96.72 |
| 4 | β | missing | load: yes | 46.5349 | 109.526 |
| 5 | σ | item | (Intercept) | 270.065 | 451.979 |
| 6 | σ | item | prec: maintain | 181.739 | 325.127 |
| 7 | ρ | item | (Intercept), prec: maintain | -0.907255 | -0.490094 |
| 8 | σ | subj | (Intercept) | 233.834 | 364.504 |
| 9 | σ | residual | missing | 657.341 | 702.655 |
| Row | type | group | names | lower | upper |
|---|---|---|---|---|---|
| String | String? | String? | Float64 | Float64 | |
| 1 | β | missing | (Intercept) | 2034.15 | 2335.45 |
| 2 | β | missing | prec: maintain | -427.769 | -248.337 |
| 3 | β | missing | spkr: old | 35.6938 | 97.8081 |
| 4 | β | missing | load: yes | 45.3095 | 107.368 |
| 5 | σ | item | (Intercept) | 260.498 | 451.649 |
| 6 | σ | item | prec: maintain | 179.495 | 315.414 |
| 7 | ρ | item | (Intercept), prec: maintain | -0.901831 | -0.471356 |
| 8 | σ | subj | (Intercept) | 236.684 | 360.363 |
| 9 | σ | residual | missing | 657.178 | 702.739 |
| Column | Variance | Std.Dev | Corr. | |
|---|---|---|---|---|
| item | (Intercept) | 133014.905 | 364.712 | |
| prec: maintain | 63768.184 | 252.524 | -0.70 | |
| subj | (Intercept) | 88819.302 | 298.026 | |
| Residual | 462443.261 | 680.032 |
| Row | geomdof | npar | deviance | AIC | BIC | AICc |
|---|---|---|---|---|---|---|
| Float64 | Int64 | Float64 | Float64 | Float64 | Float64 | |
| 1 | 131.599 | 29 | 28637.1 | 28695.1 | 28854.3 | 28696.1 |
| 2 | 107.543 | 13 | 28658.5 | 28684.5 | 28755.8 | 28684.7 |
| 3 | 103.478 | 9 | 28663.9 | 28681.9 | 28731.3 | 28682.0 |
sleepstudy random-slope model. How much do the points move compared with the kb07 plots above, and what does that say about the strength of the random effects?The sleepstudy random effects are well supported by the data, so the conditional modes shrink only modestly toward the origin — the points barely move. Strong subject-to-subject variation means the penalty for complexity has little to pull against.
Heavy shrinkage toward a lower-dimensional subspace (a line, or the origin) means that random-effects term is contributing little — it is close to “inert”. The likelihood gains little from letting it vary, so the estimates are pulled strongly toward zero. This is a visual cue to consider simplifying the random-effects structure.
This page was rendered from git revision e563d55 using Quarto 1.9.38 and Julia 1.12.6.