How to Check Multicollinearity with VIF in SPSS, R & Stata 2026

You check multicollinearity by fitting a multiple regression, then reading the variance inflation factor (VIF) for each predictor. A VIF of 1 means no overlap between predictors, anything above 5 is worth a closer look, and above 10 usually means one predictor is largely explaining another. SPSS prints Tolerance and VIF in the coefficients table, R returns them from car::vif(), and Stata returns them from estat vif after regress.

The check takes about five minutes once you have a fitted model. What makes it fiddly is not the command, it is deciding what to do with the answer, and that depends on whether you are predicting or explaining.

Below I walk through the same workflow in all three packages, then cover the interpretation thresholds and the fix-it options. Updated for 2026.

Table of Contents
  1. 1What You Need
  2. 2Step-by-Step: How to Check Multicollinearity with VIF
  3. 3Run the Regression Model First
  4. 4Calculate VIF in SPSS
  5. 5Calculate VIF in R
  6. 6Calculate VIF in Stata
  7. 7Interpret the VIF Values
  8. 8Check for Severe Multicollinearity
  9. 9Decide What to Do Next
  10. 10Common Mistakes
  11. 11What to do about interaction terms and dummy variables
  12. 12Tips for Reporting the Results
  13. 13Frequently Asked Questions
  14. 14What VIF value indicates multicollinearity?
  15. 15Is a VIF above 5 or 10 always a problem?
  16. 16What is the difference between tolerance and VIF?
  17. 17Should I remove a predictor with a high VIF?
  18. 18How do I check multicollinearity with categorical variables?

What You Need

Three things: a fitted multiple linear regression, predictors coded the way you intend, and one of the three packages.

By predictors coded appropriately I mean dummy variables use a real coding scheme (reference category plus 0/1 columns, not 1/2/3), continuous variables are numeric rather than stored as text labels, and no dummy column duplicates another. VIF is computed on the predictor columns as they sit in the model, so a coding mistake produces a real VIF number that describes your coding error rather than your data.

One clarification worth making early: VIF says nothing about whether your model is significant or a good fit. A model with four VIFs above 40 can have a significant F-test and an R-squared of 0.9. What VIF threatens is the precision of the individual coefficients, and therefore your ability to make claims about any single predictor.

Step-by-Step: How to Check Multicollinearity with VIF

The workflow is identical in every package. Fit the model, request VIF, read the largest value, decide.

Run the Regression Model First

In SPSS, go to Analyze > Regression > Linear. Move your dependent variable into the Dependent box and every predictor into the Independent boxes, then open the Statistics button and tick Collinearity diagnostics. Without that tick, SPSS runs the regression but never calculates VIF, which is the single most common reason a student thinks the software cannot do it.

In R, fit the model with lm():

fit <- lm(wage ~ age + tenure + education + hours, data = staff)
summary(fit)

In Stata:

regress wage age tenure education hours

Keep the same predictor set for the diagnostic that you intend to report on. If you plan to drop a variable, check what happens to the others rather than guessing in advance.

Calculate VIF in SPSS

With Collinearity diagnostics ticked, press OK and read the Coefficients table. The two right-hand columns are Tolerance and VIF, printed beside the significance value for each predictor. Tolerance is the fraction of a predictor’s variance that is not shared, and VIF is its reciprocal, so a tolerance of 0.10 means a VIF of 10.

Everything above 1 in the VIF column is normal overlap. The constant is never listed. If the column is missing entirely, go back to Statistics and tick the diagnostics box rather than looking for another menu.

Calculate VIF in R

The car package handles this, including categorical predictors:

install.packages("car")   # once
library(car)
vif(fit)

The output is a data frame with one row per predictor. If all predictors are numeric you get a single VIF column. If any are factors, car::vif() returns GVIF and Df columns instead, and the comparable number is GVIF^(1/(2*Df)), which corrects the raw GVIF for how many columns each factor occupies.

Base R can do it too, one predictor at a time, which is handy when you have no extra packages:

vifs <- sapply(colnames(model.matrix(fit)[, -1]), function(x)
  1 / (1 - summary(lm(as.formula(paste(x, "~ .", sep = "")),
                     data = model.frame(fit)[, -1]))$r.squared))

Sort it whenever you have more than a handful of predictors: sort(vif(fit), decreasing = TRUE).

Calculate VIF in Stata

vif is a post-estimation command, not something you type during estimation. Right after regress, run:

regress wage age tenure education hours
estat vif

Stata prints VIF and tolerance in a table, already sorted from the largest value down. To get condition indices and the condition number in the same output, use collinear after the regression instead.

Two limits worth knowing. estat vif is only available for models that Stata supports it on, and it is not available after xtreg fixed effects. For panel work, a common route is to build the within-transformed variables and run an ordinary regress on them before asking for the diagnostic.

Interpret the VIF Values

Here is how the numbers are usually read.

VIFToleranceReading
1.001.00Perfect, only possible when a predictor has no correlation with the others
1 to 50.20 to 1.00Ordinary overlap, no action needed
5 to 100.10 to 0.20Worth investigating; check whether the coefficient still matters to your argument
above 10below 0.10Severe; standard errors are badly inflated and coefficient signs can flip between samples

The 5 and 10 cutoffs are conventions, not properties of the estimator. What a VIF actually tells you is how many times larger the standard error of that coefficient is than it would be if the predictor were uncorrelated with the rest. A VIF of 9 means a standard error roughly three times the size, because the square root of 9 is 3.

That reframing is more useful than the cutoffs, especially for small samples. A VIF of 7 in a study of 60 people can matter more than a VIF of 12 in a study of 4,000.

Check for Severe Multicollinearity

Work down the sorted list rather than reacting to the top line. In SPSS, click the VIF column header to sort descending. In R, sort the vector yourself. In Stata, it is already ordered.

Then look at which variables cluster at the top. Two VIFs that are high together point to a specific overlapping pair, and a handful of high values that all sit well above the rest usually traces back to one interaction term or one group of dummy variables pulling the same information.

Cross-check with a correlation matrix of the predictors. VIF is the more thorough test because it catches overlap that pairwise correlation misses, but a correlation matrix of 0.95 between two variables is a fast confirmation that you are looking at the right pair.

Decide What to Do Next

Start by being clear about what the model is for. If you are predicting an outcome and the coefficients are not the story, multicollinearity mostly costs you prediction accuracy, and ridge or lasso regression handles it without deleting anything. If you are estimating effects and interpreting individual coefficients, precision matters and you need to resolve the overlap rather than accept it.

Centering helps only one specific case. When you have an interaction term and a main effect, subtracting the mean from both variables before forming the interaction term drops the VIF of every term in that block, because the product term no longer shares a scale with the main effects. It does nothing for overlap that comes from the data itself.

Combining predictors is often the cleanest fix when the two measure something close. If two scales are proxies for the same construct, an index or a single factor score expresses your theory better than two columns fighting each other. Dropping a predictor is the fastest fix and the least defensible one, because the choice of which variable to drop changes the results, and reviewers ask about it.

Sequential removal by largest VIF is the standard routine, and it has a known weakness: the outcome depends on the order, so two analysts working from the same model can land on different final sets. If you go that way, report the rule you used and the full table before and after, so a reader can see what happened.

Common Mistakes

  • Reading tolerance as VIF. They are reciprocals. A tolerance of 0.05 is a VIF of 20, and reading the tolerance column as though small were bad flips the interpretation entirely.
  • Checking the wrong model. VIF depends on the predictor set. If you reported a model with six predictors and checked a different model with four, the diagnostic does not describe the model in your tables.
  • Treating VIF as a significance test. It is a descriptive diagnostic with no p-value. It does not test causation, and a high VIF does not tell you which variable is causing anything.
  • Using 1/2/3 codes for categories. This creates the dummy variable trap. SPSS will happily return a VIF for each column while quietly telling you the wrong story, so the number looks fine while the model is wrong.
  • Deleting variables until the number falls. A model that only passes because half the theory was removed is a worse result than one you report honestly with the overlap explained.
  • Reporting only the largest VIF. Give the range and the maximum, and say which predictor had the maximum. A bare “VIF was less than 10” tells a reviewer nothing they can check.

What to do about interaction terms and dummy variables

Interaction terms produce high VIF mechanically, not because your data are broken. If an interaction block shows VIFs in the dozens, centering first is worth trying, and if they stay high after centering, that overlap is coming from the underlying predictors rather than from scaling.

Dummy variables behave similarly. Someone reporting VIFs in the twenties on dummy columns whose pairwise correlations sit below 0.8 is not seeing a contradiction: a group of correlated dummies inflates each other in a way no single pairwise correlation reveals. For a factor with several levels, read the GVIF^(1/(2*Df)) value instead of the raw GVIF.

Tips for Reporting the Results

A usable reporting sentence names the software, the diagnostic, the range, and what you did next. Something like: “Collinearity diagnostics were examined in Stata using estat vif following the fitted model. VIF values ranged from 1.2 to 6.8, with total tenure (VIF = 6.8) showing the greatest overlap; no predictor exceeded the conventional threshold of 10, and no variables were removed.”

Four things belong in the write-up: the maximum VIF, the predictor it belongs to, the threshold or standard you judged it against, and the action you took. If you centred, combined, or dropped anything, say which and why.

When a reviewer pushes back on a high VIF, the strongest answer is a second table. Report the model with and without the overlapping term, or compare it with a ridge fit, and show that the substantive conclusion holds. That is far more convincing than arguing about whether 8 counts as high.

Frequently Asked Questions

What VIF value indicates multicollinearity?

A VIF of 1 means a predictor shares no variance with the others. Values from 1 to 5 are ordinary overlap, 5 to 10 are worth investigating because standard errors are clearly inflated, and values above 10 usually indicate severe multicollinearity. A VIF of 25 means the standard error is roughly five times larger than it would be if the predictor were uncorrelated with the rest of the model.

Is a VIF above 5 or 10 always a problem?

No. The cutoffs are conventions, and sample size decides how much a given VIF matters. A VIF of 8 in a small study can distort conclusions, while the same value in a large study is often harmless. Judge the diagnostic against your sample size, the number of predictors, and whether you need to interpret individual coefficients or only the fit of the model.

What is the difference between tolerance and VIF?

Tolerance and VIF are the same information reported two ways. Tolerance is the share of a predictor’s variance that is not explained by the other predictors, and VIF is one divided by tolerance. A tolerance of 0.20 equals a VIF of 5. SPSS prints both columns, Stata prints both, and car::vif() in R returns the VIF side by default.

Should I remove a predictor with a high VIF?

Not automatically. Removing predictors by largest VIF gives order-dependent results, so two analysts can reach different final models from the same starting point. Centering helps when the overlap comes from an interaction term with main effects, combining predictors helps when two measures overlap conceptually, and ridge or lasso handles the problem without deleting theory. Only drop a variable when you can justify the choice.

How do I check multicollinearity with categorical variables?

Use the generalized VIF rather than a plain VIF, because a factor with several levels occupies more than one column and inflates the raw number. In R, car::vif() returns GVIF and Df, and you read GVIF raised to the power of one divided by twice Df, which makes it comparable with the usual thresholds. For a single dummy against one reference category, an ordinary VIF is fine.

Start with the package you already use: the SPSS menu path, car::vif() in R, or estat vif in Stata will tell you in one run whether your predictors overlap. Once you have the number, the real decision is whether your analysis needs precise individual coefficients. If it does, resolve the overlap; if it mostly needs accurate predictions, regularisation is the easier answer.

Leave a Comment

Practical guides to statistics, surveys and research data

Read the latest guides