glm() Output Interpreter
R's glm() fits logistic, Poisson, and other generalized linear models. Paste a summary(glm(...)) block to get a per-coefficient plain-English read on the right scale (odds ratios for logistic, rate ratios for Poisson), a deviance / AIC / pseudo-R2 fit verdict, overdispersion checks, and a Compare-models view with likelihood-ratio tests.
New to reading glm() output? Read the 4-min primer▾
What glm() does. R's glm() fits a generalized linear model: a linear predictor on a transformed (link) scale that maps to a non-Gaussian outcome. The family sets the distribution (binomial, poisson, Gamma, ...) and the link sets the transform (logit, log, identity, ...). summary() prints the call, a coefficient table, a dispersion note, the null and residual deviance lines, and the AIC.
Reading the coefficient table. Each estimate lives on the link scale. For a logit link, exponentiating gives an odds ratio; for a log link, a rate ratio. The third column is a z value (binomial / Poisson, dispersion fixed at 1) or a t value (quasi / Gamma / Gaussian, dispersion estimated), and the last column is the two-sided p-value with significance stars.
What deviance and AIC mean. Null deviance is the misfit of an intercept-only model; residual deviance is the misfit of your model. Their difference is a likelihood-ratio chi-square for "do the predictors matter?". A residual-deviance / df ratio far above 1 signals overdispersion. AIC trades fit against complexity for comparing models (lower is better); it reads NA for quasi families.
Picking which model to trust. For nested models, a likelihood-ratio test on the deviance difference (or an F-test for quasi families) asks whether the extra terms earn their keep. For non-nested models on the same data and family, compare AIC or BIC. Always sanity-check overdispersion and separation before trusting the standard errors.
Try a real-world example to load.
summary(glm(...)) block on the left for a plain-English interpretation.No data leaves your browser · Verified against R's glm(), confint.default() & anova() · Free
We're reading your GLM output and translating each coefficient onto the odds / rate scale.
Read moreAnatomy of summary(glm)
g(mu). For a logit link, exponentiating turns the additive log-odds into a multiplicative odds ratio; for a log link, into a rate ratio. Probit and cloglog links do not exponentiate to a simple ratio, so this tool reports them on the link scale.confint.default() returns, then exponentiated for ratio-scale families.quasipoisson, quasibinomial, or glm.nb(). Quasi families estimate a dispersion phi; SEs scale by sqrt(phi) while point estimates stay put.CaveatsWhen this is the wrong tool
- If you have…
- Use instead
- A continuous, roughly Gaussian outcome
- Use the lm() output interpreter. A Gaussian-identity glm equals
lm(), but the lm interpreter gives you cleaner R-squared and F-test output. - Clustered or repeated-measures data
- Use a generalized linear mixed model (
lme4::glmer) so within-cluster correlation does not deflate the standard errors. A plain glm() treats every row as independent. - Probability-scale (marginal) effects
- Odds and rate ratios are multiplicative on the link scale. For average marginal effects on the probability scale use
marginsormarginaleffects; a logit coefficient is not a probability change. - Perfect separation in a logistic fit
- When a predictor perfectly splits the outcome, estimates and SEs explode. Use penalized methods:
brglm2,logistf(Firth), or a Bayesian prior. The tool flags likely separation but cannot refit for you. - Ordinal or multinomial outcomes
- Use
MASS::polr(ordinal) ornnet::multinom/VGAM(multinomial). Binary logistic glm() only handles two categories.
How do I interpret a logistic regression coefficient in R?
A binomial(logit) coefficient is a change in log-odds. Exponentiate it to get an odds ratio: exp(coef) is the multiplicative change in the odds of the outcome for a one-unit increase in that predictor, holding the others fixed. An odds ratio above 1 raises the odds, below 1 lowers them. The tool exponentiates every coefficient and its confidence interval for you and labels the column "OR".
What does the residual deviance tell me, and how do I check for overdispersion?
Residual deviance measures lack of fit; under a well-specified model it is roughly chi-squared on its residual degrees of freedom. If residual deviance / df is much larger than 1 (say above 1.5) in a Poisson or binomial model you likely have overdispersion, and the standard errors are too small. Switch to quasipoisson, quasibinomial, or glm.nb(). The tool reports the deviance / df ratio and a goodness-of-fit p-value.
Why is AIC reported as NA for a quasipoisson or quasibinomial model?
Quasi families specify only a mean-variance relationship, not a full likelihood, so there is no log-likelihood and therefore no AIC or BIC. That is expected, not an error. To compare nested quasi models use the F-test, which divides the deviance difference by the estimated dispersion; the tool reports the F statistic and p-value for nested pairs.
- Logistic regression in R, end-to-end - fitting, odds ratios, thresholds, and evaluation.
- Generalized linear models - families, links, and when to use each.
- Poisson and negative-binomial regression - count models and overdispersion.
- Model selection - AIC, BIC, and likelihood-ratio tests.
- lm() output interpreter - the Gaussian sibling of this tool.
- Confidence interval calculator - CIs for a single estimate.
Numerical notes: the parser handles "< 2e-16", scientific notation, NA, and Signif. codes lines. Coefficient statistics, p-values, Wald confidence intervals, the likelihood-ratio chi-square, the deviance goodness-of-fit p, BIC, and nested tests are recomputed with a math library verified against R 4.6.0 (glm, summary, confint.default, anova, AIC, BIC, pchisq, pf) to better than 1e-6 relative error. The "Reproduce in R" snippet is copy-ready and reproduces every number shown; run it in the R session where you already fit the model rather than here. Confidence intervals are the Wald normal intervals from confint.default; for dispersion-estimated families a t-based interval would be slightly wider.