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.

iNew 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.

Awaiting paste…
Paste a summary(glm(...)) block on the left for a plain-English interpretation.
R code COPY-READY
RReproduce in R
Coefficient forest plot VISUAL
Estimate ± 95% CI per predictor (intercept omitted) on the link scale; the dashed line marks no effect.
Paste a summary(glm()) block to render.

No data leaves your browser · Verified against R's glm(), confint.default() & anova() · Free

Inference

We're reading your GLM output and translating each coefficient onto the odds / rate scale.

Read moreAnatomy of summary(glm)
Link + coefficient scale: eta = b0 + b1*x1 + b2*x2 + ... (linear predictor) g(mu) = eta (link function g) logit: g(mu) = log(mu / (1 - mu)) -> exp(b) = odds ratio log: g(mu) = log(mu) -> exp(b) = rate ratio
Coefficients live on the link scale. Each estimate is additive on 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.
Wald statistic + p-value: stat = estimate / SE p = 2 * pnorm(-|stat|) (binomial / Poisson, dispersion = 1) p = 2 * pt(-|stat|, df_resid) (quasi / Gamma / Gaussian) CI = estimate +/- q * SE (q = qnorm; confint.default)
Where significance comes from. Dividing the estimate by its standard error gives a Wald statistic. When the dispersion is fixed at 1 (binomial, Poisson) the reference is the normal; when it is estimated (quasi, Gamma, Gaussian) it is Student-t on the residual df. The confidence interval is the Wald normal interval that confint.default() returns, then exponentiated for ratio-scale families.
Deviance + likelihood-ratio test: LR = null deviance - residual deviance df = df_null - df_resid p = pchisq(LR, df, lower.tail = FALSE) pseudoR2 = 1 - residual deviance / null deviance
Model-level fit. The drop from null to residual deviance is a likelihood-ratio chi-square: does the set of predictors beat an intercept-only model? The deviance-ratio (1 - residual/null) is a pseudo-R2 (related to, but not identical to, McFadden's log-likelihood version). A significant LR test with a non-trivial pseudo-R2 is a healthy model.
Overdispersion / goodness of fit: ratio = residual deviance / df_resid GOF p = pchisq(residual deviance, df_resid, lower.tail = FALSE) dispersion phi (quasi): reported directly by R
Are the standard errors trustworthy? For Poisson and binomial models the dispersion is assumed to be 1. If residual deviance / df is well above 1, the data are overdispersed and the SEs are too small: switch to quasipoisson, quasibinomial, or glm.nb(). Quasi families estimate a dispersion phi; SEs scale by sqrt(phi) while point estimates stay put.
Comparing models: AIC = -2*logLik + 2*k (lower is better; NA for quasi) BIC = -2*logLik + log(n)*k nested LR = dev_small - dev_big ~ chi-sq(df_small - df_big) nested F = (LR / df) / phi_big (quasi families)
Which model wins. AIC and BIC trade fit against parameter count; compare only across the same family and data. For nested models the likelihood-ratio test uses the deviance difference (chi-square), or an F-test dividing by the estimated dispersion for quasi families. AIC is NA for quasi families because they have no full likelihood.
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 margins or marginaleffects; 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) or nnet::multinom / VGAM (multinomial). Binary logistic glm() only handles two categories.
FAQ
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.

Further reading

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.