Written and maintained by CASRAI Editorial Board
Last updated
SPSS runs binary logistic regression through Analyze > Regression > Binary Logistic, and the output it prints — five separate tables by default — is where most misreadings happen. Researchers correctly find and paste the Exp(B) column, then either skip the fit statistics above it or, worse, report Exp(B) as if it were a risk ratio. This guide walks the menu path and setup, then works through each output table in the order SPSS prints it: the omnibus chi-square test, the Model Summary pseudo-R² values, the Hosmer-Lemeshow test, the classification table, and finally Variables in the Equation — where B becomes Exp(B), and what that number actually means.
Menu path and setup
Go to Analyze > Regression > Binary Logistic. The dependent variable must be coded with exactly two values (SPSS treats the higher of the two as the “event” being predicted, so check which value that is before you interpret direction). Move your predictors into the Covariates box.
If any predictor is categorical (a group variable rather than a continuous scale), click Categorical and move it into the Categorical Covariates list. This matters: SPSS does not detect categorical predictors automatically from the Covariates box — if you skip this step, a categorical variable coded 1/2/3 is entered as if it were a continuous scale, treating the jump from category 1 to 2 as numerically equal to the jump from 2 to 3. Inside the Categorical dialog, set the reference category (First or Last) explicitly rather than accepting the default without checking it, since every Exp(B) for that variable is reported relative to whichever category you pick.
Under Method, the default is Enter, which forces all covariates into a single block and is the right choice for a pre-specified confirmatory model. The stepwise options (Forward: LR, Backward: LR, and the Wald-based variants) let SPSS add or remove predictors based on statistical significance alone; they are a data-driven variable-selection tool, not a hypothesis test, and most methods reviewers expect Enter with a justified, pre-specified predictor set unless the analysis is explicitly exploratory.
Click Options and check Hosmer-Lemeshow goodness-of-fit and CI for exp(B) — neither is on by default, and both are needed for a complete write-up.
Reading the Omnibus Tests of Model Coefficients
This table reports a chi-square test comparing your fitted model to the null (intercept-only) model. A significant result (the “Model” row, not “Block” or “Step” if you entered everything in one block) means your set of predictors, taken together, explains the outcome significantly better than chance. It says nothing about which individual predictor is doing the work — that comes later, in Variables in the Equation — and it says nothing about how well the model fits in absolute terms, which is what the next two tables are for.
Reading the Model Summary: -2 Log likelihood and pseudo-R²
The Model Summary table prints -2 Log likelihood (lower is better; it has no fixed scale on its own and is mainly useful for comparing nested models), then two pseudo-R² values: Cox & Snell R² and Nagelkerke R².
Neither is the R² from linear regression, and neither should be reported as “percent of variance explained” in that sense — logistic regression has no residual variance to partition the way OLS does. Cox & Snell R² has a mathematical ceiling below 1.0 that depends on the base rate of the outcome, which makes it hard to interpret on its own. Nagelkerke R² is Cox & Snell rescaled to run from 0 to 1, which is why it is always the larger of the two numbers and why it, not Cox & Snell, is the one conventionally reported as the model’s pseudo-R². Treat both as a rough indication of effect size, not a goodness-of-fit test — that’s the Hosmer-Lemeshow table’s job.
Reading the Hosmer-Lemeshow test
The Hosmer-Lemeshow test groups cases into (by default) ten roughly equal-sized bins by predicted probability, then compares observed versus expected event counts in each bin with a chi-square statistic. Unlike most tests in this output, you want this one to come back non-significant (typically p > .05): a non-significant result means the observed and expected counts don’t differ enough to suggest poor fit, which is the outcome you’re hoping for. A significant Hosmer-Lemeshow test flags a mismatch between predicted and observed outcomes somewhere across the bins and is a signal to check for a missing interaction term or a mis-specified functional form, not necessarily to abandon the model.
Two limitations worth knowing before you lean on it: the test is sensitive to how the cases happen to fall into bins, so results can shift slightly with sample composition, and it loses power to detect real misfit in very large samples while becoming overly sensitive to trivial misfit in some data configurations. Use it alongside the classification table and residual checks, not as the sole fit criterion.
Reading the classification table
The classification table cross-tabulates observed outcome categories against the categories SPSS predicts using a default cutoff of 0.5 predicted probability. It reports an “Overall Percentage” correctly classified, plus row-wise percentages that amount to sensitivity (correctly classified events) and specificity (correctly classified non-events) at that cutoff.
Two things to check before citing the overall percentage as evidence the model works well. First, compare it to the base rate: if 85% of cases are non-events, a model that predicts “non-event” for everyone still scores 85% overall accuracy while adding no information — the overall percentage only means something relative to that baseline. Second, the 0.5 cutoff is a default, not a requirement; for an imbalanced outcome, a different cutoff (chosen with reference to what a false negative versus a false positive costs in your context) will often classify meaningfully better even though the model itself, and its Exp(B) values, haven’t changed at all.
Reading Variables in the Equation, and converting B to an odds ratio
This is the table most write-ups pull from, and it has seven columns: B (the raw logistic regression coefficient, on the log-odds scale), S.E. (its standard error), Wald (the squared ratio of B to its S.E., SPSS’s significance test for that individual coefficient), df, Sig. (the p-value for the Wald test), Exp(B), and, if you checked the Options box above, a 95% C.I. for Exp(B) with Lower and Upper columns.
Exp(B) is an odds ratio, not a risk ratio — this is the single most common misreading of this table. B is a change in log-odds; exponentiating it converts that into a multiplicative change in the odds of the outcome, not a change in its probability or its relative risk. Odds and probability diverge more the further the base rate sits from 50%, so an Exp(B) of 3.0 does not mean the outcome is three times as likely (in probability terms) for a one-unit increase in the predictor — it means the odds of the outcome are three times as high. For a rare outcome the two happen to sit close together, which is exactly the condition under which the “Exp(B) as relative risk” shorthand quietly creeps into write-ups; it stops being a safe approximation once the outcome isn’t rare.
For a continuous predictor, Exp(B) is the multiplicative change in odds for a one-unit increase in that predictor, holding the others constant. For a categorical predictor entered via the Categorical dialog, Exp(B) for each dummy-coded category is the odds ratio for that category versus whichever category you set as the reference — which is why setting the reference category deliberately, in the setup step above, is not a cosmetic choice. An Exp(B) of 1.0 means no association; check whether the 95% CI for Exp(B) crosses 1 rather than relying on the Sig. column alone, since the two will occasionally disagree slightly due to how the Wald test and the profile-based CI are each constructed.
Reporting the result
A typical APA-style reporting line pulls from three of the tables above: “A logistic regression model was statistically significant, χ²(df) = [omnibus chi-square], p [Sig. from the Omnibus test]. The model explained [Nagelkerke R² as a percentage] of the variance in [outcome] and correctly classified [Overall Percentage]% of cases. Increased [predictor] was associated with an increased likelihood of [outcome], B = [B], Wald χ²(1) = [Wald], p = [Sig.], OR = [Exp(B)], 95% CI [[Lower], [Upper]].” Report the odds ratio and its confidence interval, not the raw B, in the sentence a reader is meant to interpret — B is only useful to a reader re-deriving the model, since log-odds have no intuitive unit.
Before you trust the result: check the assumptions
- Linearity of the logit for continuous predictors — logistic regression assumes each continuous predictor is linearly related to the log-odds of the outcome, not to the outcome itself. SPSS doesn’t test this automatically; the standard check is the Box-Tidwell procedure (adding each predictor’s interaction with its own natural log to the model and checking whether that interaction term is significant).
- No severe multicollinearity among predictors — SPSS’s logistic regression procedure doesn’t print VIF directly, but you can get collinearity diagnostics by running the same predictors through a linear regression and checking VIF there as a proxy.
- Independence of observations — repeated measures on the same participant, or clustering by site/institution, violates this and calls for a mixed or clustered-error approach instead.
- Adequate events per predictor — a widely cited rule of thumb calls for at least 10 events (cases in the smaller outcome category) per predictor entered into the model; fewer than that and coefficients become unstable and standard errors inflate, even when SPSS runs the procedure without complaint.
- No influential outliers distorting the fit — SPSS can save Cook’s distance and leverage values from the Save dialog for a follow-up check.
Frequently asked questions
What does it mean if the Hosmer-Lemeshow test is significant?
It flags a mismatch between the model’s predicted probabilities and the observed outcomes across the bins SPSS forms — a sign the model may be missing an interaction or a non-linear term, not necessarily that the whole model is unusable. Check it alongside the classification table and, if you suspect a specific continuous predictor, a linearity-of-the-logit check before deciding whether to revise the model.
Why is Nagelkerke R² always higher than Cox & Snell R²?
Cox & Snell R² has a mathematical maximum below 1.0 that depends on the outcome’s base rate. Nagelkerke R² rescales Cox & Snell by that maximum so it can reach 1.0, which is why Nagelkerke is always the larger number and the one conventionally reported.
Can I report Exp(B) as a relative risk instead of an odds ratio?
Only as a rough approximation, and only when the outcome is rare (well under about 10% prevalence) — that’s the condition under which odds and probability sit close enough together for the distinction to be minor. Outside that range, an odds ratio and a risk ratio can differ substantially, and reporting Exp(B) as “times as likely” misstates what the statistic measures.
My classification table shows 90% accuracy but Hosmer-Lemeshow is significant. Which do I trust?
Neither on its own, and check the base rate first — if 90% of your sample falls in one outcome category, a model that adds nothing can still hit 90% “accuracy” by always predicting the majority class. A significant Hosmer-Lemeshow alongside a high but base-rate-driven classification percentage is a real signal the model isn’t fitting well; don’t let the classification table’s headline number override it.
Do I need to set a reference category for a binary categorical predictor?
Yes, whenever you move a variable into the Categorical Covariates list, even one with only two levels — SPSS still needs to know which level is the reference, since Exp(B) for that predictor is reported relative to it. Set it deliberately in the Categorical dialog rather than accepting whatever SPSS defaults to.
Related CASRAI resources
- Logistic Regression (the Logit Model): Interpretation, Diagnostics, and Reporting — the underlying model theory, odds-ratio/risk-ratio distinction, and variants, independent of any one software package.
- Logistic Regression in R: glm(), Odds Ratios, and Diagnostics — the same procedure run in R, for teams comparing output across software.
- What Is SPSS? IBM SPSS Statistics Explained for Researchers — an overview of the software itself.
- Multicollinearity and VIF in Regression: Detection and What to Do About It — for checking the multicollinearity assumption above.
- How to Run a T-Test in SPSS and Read the Output — the same menu-path-and-output-table format for SPSS’s t-test procedures.
- SPSS vs. Stata for Statistical Analysis — for teams deciding which package to standardize on.








