Home / Tools / lmer Output Interpreter

lmer() Output Interpreter

An lme4 summary is dense, and it withholds the one column most people go looking for. Paste the output of summary(model) from any lmer(), glmer() or lmerTest fit and every block gets labelled and explained: what each variance component means in the units of your outcome, the ICC worked through with its formula, each fixed effect in plain English, and the honest answer to where the p-values went.

Try a real summary:
Paste summary(model) here

Copy the whole summary, first line to last. Keep the spacing as R printed it.

Waiting for a paste

Paste an lme4 summary to decode it

Or load one of the four real model outputs above.

How this is computed
1Paste an lme4 summary and this fills in with your model's own numbers.
2
3
4Everything on this page is read from the printed text alone. Your console rounds what it prints, so a figure derived from a paste carries the precision R showed, typically five decimals. The arithmetic is exact; the input is what was printed.
The same reading, from the model object in R

Nothing you paste leaves your browser ICC verified against R's performance::icc() Free, no sign-up

The block that makes it a mixed model

Everything above Random effects: is scene setting. That table is the model.

A plain lm() gives every observation one shared error term. A mixed model splits that error in two: a piece that is stable within a group and a piece that is not. The random effects table is where that split is reported, and it is the only part of the output that a non-mixed model could not produce.

Read it in the Std.Dev. column, never the Variance column. Variance is in squared units, and nobody has intuition for 1378.2 squared milliseconds. The standard deviation, 37.1 ms, is a sentence you can say out loud: a typical subject's average reaction time sits about 37 ms away from the overall average. The residual standard deviation, 31.0 ms, says a typical single measurement sits about 31 ms away from its own subject's line. The two numbers are directly comparable because they are in the same units, and comparing them is exactly what the ICC does.

The Number of obs: line underneath deserves more attention than it gets. It carries two counts, and the second one is your real sample size for anything happening at the group level. 180 observations from 18 subjects is not 180 independent data points about subjects; it is closer to 18.

The ICC, and the one case where it is not a single number

The intraclass correlation is a ratio of the two standard deviations you just read, squared.

For a random-intercept model it is as simple as it looks:

ICC = tau00 / (tau00 + sigma^2)

where tau00 is the group variance and sigma^2 the residual variance. On the sleepstudy random-intercept fit that is 1378.2 / (1378.2 + 960.5) = 0.589. Two readings, both true and both worth having: 59% of the variance the fixed effects left behind is a stable difference between subjects, and two measurements from the same subject correlate about 0.59. This page reproduces performance::icc()'s adjusted ICC exactly for these models.

Now the honest part. Add a random slope and the ICC stops being one number. Once subjects differ in both intercept and slope, the between-subject variance depends on where you stand on the predictor: at Day 0 subjects differ by one amount, at Day 9 by a different, larger amount. There is no single "between-subject variance" left to divide by.

performance::icc() resolves this by averaging the random-effect variance over the covariate values that were actually observed, which works out to v_int + 2·mean(x)·cov + mean(x²)·v_slope. That formula needs mean(x) and mean(x²), and those are properties of your data, not of the printed summary. On the sleepstudy random-slope fit it gives 0.722, while the intercept variance alone gives 0.483 and naively adding the variance components gives 0.497. Neither shortcut is the right answer.

So when your paste contains a random slope, this page reports the ICC at the covariate's zero point, says so on the number, and points you at performance::icc(model) for the data-averaged value. It will not print a number that pretends to be something it cannot be.

Where the p-values went

The missing column is a deliberate statement, not an oversight.

A t value is just an estimate divided by its standard error, and lmer() prints it happily. Turning that into a p-value needs one more thing: the degrees of freedom of the reference distribution. For a mixed model with unbalanced data, or crossed random effects, the statistic does not follow an exact t distribution with any particular df. There is no agreed answer, so lme4 declines to invent one.

The |t| > 2 rule of thumb people fall back on is the normal approximation: pretending df is infinite. It is anti-conservative, and it is worst exactly when you can least afford it, with few groups. With 18 subjects and 180 observations it barely matters. With 5 groups it matters a lot.

RouteWhat it doesIn RWhen to reach for it
lmerTestAdds Satterthwaite df and a p-value column to the same summarylibrary(lmerTest) then refitThe default answer; what most reviewers expect
Likelihood ratio testCompares nested models fitted with MLanova(m0, m1)Testing a term, or a set of terms, as a block
Profile intervalAn interval from the likelihood surface, no df neededconfint(m, method = "profile")The safest option, and the one to report with few groups
Wald intervalEstimate ± 1.96 × SEconfint(m, method = "Wald")Quick and symmetric; same infinite-df assumption as |t| > 2
Parametric bootstrapSimulates from the fitted modelconfint(m, method = "boot")Small samples, when you can afford the wait

The intervals this page shows are Wald intervals, because they are the only kind recoverable from a printed summary: they need nothing but the estimate and its standard error. They reproduce confint(model, method = "Wald") exactly. If the decision is close, refit and profile it.

The correlation table that worries people for no reason

Correlation of Fixed Effects is not about your variables.

It reports how the coefficient estimates co-vary, which is a fact about the design matrix rather than about the data-generating process. The classic sighting is a large negative correlation between the intercept and a slope, like the -0.371 in the sleepstudy fit. It means only that the predictor is not centred: with Days starting at 0, the intercept is pinned to the first day, so any change in the slope forces a compensating change in the intercept. They are estimated as a trade-off, so their errors correlate.

Centre the predictor and it mostly disappears. Nothing about the fit was wrong. The table becomes worth reading only when values approach ±1, which is a hint that two terms are nearly redundant and the model cannot tell them apart.

Frequently asked questions

Why does lmer() not print p-values?

Because a p-value needs a reference distribution, and for a mixed model nobody agrees on the denominator degrees of freedom. With unbalanced data and crossed random effects the t statistic does not follow an exact t distribution with any particular df, so lme4 leaves the column out rather than print a number it cannot defend. It is a statement about the state of the theory.

How do I get p-values for a mixed model?

Load lmerTest and refit: it adds Satterthwaite degrees of freedom and a p-value column to the same summary. Or run a likelihood ratio test on nested models with anova(m0, m1), fitting both with REML = FALSE. Or report confint(m, method = "profile") instead of a p-value. With many groups all three agree; with few groups the profile interval is the safest.

What is the ICC and how do I read it?

It is the share of leftover variance that lives between groups: tau00 / (tau00 + sigma^2). An ICC of 0.59 says 59% of the variance the fixed effects did not explain is a stable difference between groups, and that two observations from the same group correlate about 0.59. It is also a direct measure of how far from independent your rows are.

What is the difference between the Variance and Std.Dev. columns?

Std.Dev. is the square root of Variance and carries no extra information. It is worth reading because of units: variance is in squared outcome units, the standard deviation is back in the units you can talk about. It is not a standard error, and it says nothing about how precisely the variance was estimated.

Why does the Correlation of Fixed Effects show large values?

Because it describes how the estimates co-vary, not how your variables correlate. A large intercept-slope correlation usually just means the predictor is not centred, so the two estimates trade off against each other. Centring typically removes it, and nothing was wrong with the fit.

What does a variance of zero or a singular fit mean?

The optimiser pushed a variance component to the boundary: the data show no evidence that this grouping factor or random slope varies. The model is over-specified rather than broken. The usual fix is to simplify the random effects, most often by dropping a random slope or a correlation term.

Does this page match performance::icc?

For random-intercept models, crossed grouping factors, and glmer fits with a logit or probit link, yes, to machine precision, limited only by the digits your console printed. For a model with a random slope it deliberately does not: performance::icc() averages the random-effect variance over your observed covariate values, which needs the data, and a printed summary does not contain the data. There the page reports the ICC at covariate = 0, labels it, and sends you to performance::icc().

Go deeper