# How do I perform a regression on non-normal data which remain non-normal when transformed?

I've got some data (158 cases) which was derived from a Likert scale answer to 21 questionnaire items. I really want/need to perform a regression analysis to see which items on the questionnaire predict the response to an overall item (satisfaction). The responses are not normally distributed (according to K-S tests) and I've transformed it in every way I can think of (inverse, log, log10, sqrt, squared) and it stubbornly refuses to be normally distributed. The residual plot looks all over the place so I believe it really isn't legitimate to do a linear regression and pretend it's behaving normally (it's also not a Poisson distribution). I think this is because the answers are very closely clustered (mean is 3.91, 95% CI 3.88 to 3.95).

So, I am thinking I either need a new way of transforming my data or need some sort of non-parametric regression but I don't know of any that I can do in SPSS.

• Consider a Box-Cox transformation (en.wikipedia.org/wiki/…). Adding the residual plot to your question may be helpful. – M. Berk Nov 9 '13 at 16:24
• Yes, please show us your residuals plot. maybe also a qq plot. – David Marx Nov 9 '13 at 16:29
• If your values are discrete, especially if they're squished up one end, there may be no transformation that will make the result even roughly normal. But formal hypothesis tests of normality don't answer the right question, and cause your other procedures that are undertaken conditional on whether you reject normality to no longer have their nominal properties. – Glen_b Nov 9 '13 at 17:52
• proportional odds logistic regression would probably be a sensible approach to this question, but I don't know if it's available in SPSS. – Ben Bolker Nov 9 '13 at 21:06
• I'm not convinced that the regression is right approach, and not because of the normality concerns. Your questionnaire answers may not even be cardinal. For instance, if you ask a guy 'Are you happy?" and get answer 3, while last month it was 4, does this mean that he's 25% less happy? Most likely not. So, before even starting to think of normality, you need to figure out whether you're even dealing with cardinal numbers and not just ordinal. There are special ways of dealing with thinks like surveys, and regression is not the default choice. You have to show it's appropriate first. – Aksakal Jul 11 '16 at 15:43

You don't need to assume Normal distributions to do regression. Least squares regression is the BLUE estimator (Best Linear, Unbiased Estimator) regardless of the distributions. See the Gauss-Markov Theorem (e.g. wikipedia) A normal distribution is only used to show that the estimator is also the maximum likelihood estimator. It is a common misunderstanding that OLS somehow assumes normally distributed data. It does not. It is far more general.

• This is so true. To many people often ignore this FACT. – Repmat Jul 11 '16 at 15:53
• agree with @Repmat. I'm not sure I've ever passed a normality test...but my models work. – HEITZ Nov 23 '16 at 5:15

First, OLS regression makes no assumptions about the data, it makes assumptions about the errors, as estimated by residuals.

Second, transforming data to make in fit a model is, in my opinion, the wrong approach. You want your model to fit your problem, not the other way round. In the old days, OLS regression was "the only game in town" because of slow computers, but that is no longer true.

Third, I don't use SPSS so I can't help there, but I'd be amazed if it didn't offer some forms of nonlinear regression. Some possibilities are quantile regression, regression trees and robust regression.

I really want/need to perform a regression analysis to see which items on the questionnaire predict the response to an overall item (satisfaction)

If the items were summed or somehow combined to make the overall scale, then regression is not the right approach at all. You probably want factor analysis.

• you suggested that he may want factor analysis, but isn't factor analysis also affected if the data is not normally distributed? – streamline Jan 7 '19 at 18:38
• You can do factor analysis on data that isn't even continuous. But that's a separate discussion - and it's been discussed here. – Peter Flom Jan 7 '19 at 19:50
• Hi Peter, I appreciate your expertise and I value your advice greatly. Thanks for taking the time to answer. Just to clarify, I know that one can do FA on non-normally distributed items (as well as the discussion about the normality of the residuals). I was just curious to learn (from someone with your expertise) if the OP wouldn't get into the same dilemma. But, I assume you already answered :) – streamline Jan 8 '19 at 7:28

Rather than relying on a test for normality of the residuals, try assessing the normality with rational judgment. Normality tests do not tell you that your data is normal, only that it's not. But given that the data are a sample you can be quite certain they're not actually normal without a test. The requirement is approximately normal. The test can't tell you that. Tests also get very sensitive at large N's or more seriously, vary in sensitivity with N. Your N is in that range where sensitivity starts getting high. If you run the following simulation in R a number of times and look at the plots then you'll see that the normality test is saying "not normal" on a good number of normal distributions.

# set the plot area to show two plots side by side (make the window wide)
par(mfrow = c(1, 2))
n <- 158 # use the N we're concerned about

# Run this a few times to get an idea of what data from a
# normal distribution should look like.
# especially note how variable the histograms look
y <- rnorm(n) # n numbers from normal distribution
# view the distribution
hist(y)
qqnorm(y);qqline(y)

# run this section several times to get an idea what data from a normal
# distribution that fails the normality test looks like
# the following code block generates random normal distributions until one
# fails a normality test
p <- 1 # set p to a dummy value to start with
while(p >= 0.05) {
y <- rnorm(n)
p <- shapiro.test(y)\$p.value }
# view the distribution that failed
hist(y)
qqnorm(y);qqline(y)


Hopefully, after going through the simulations you can see that a normality test can easily reject pretty normal looking data and that data from a normal distribution can look quite far from normal. If you want to see an extreme value of that try n <- 1000. The distributions will all look normal but still fail the test at about the same rate as lower N values. And conversely, with a low N distributions that pass the test can look very far from normal.

The standard residual plot in SPSS is not terribly useful for assessing normality. You can see outliers, the range, goodness of fit, and perhaps even leverage. But normality is difficult to derive from it. Try the following simulation comparing histograms, quantile-quantile normal plots, and residual plots.

par(mfrow = c(1, 3)) # making 3 graphs in a row now

y <- rnorm(n)
hist(y)
qqnorm(y); qqline(y)
plot(y); abline(h = 0)


It's extraordinarily difficult to tell normality, or much of anything, from the last plot and therefore not terribly diagnostic of normality.

In summary, it's generally recommended to not rely on normality tests but rather diagnostic plots of the residuals. Without those plots or the actual values in your question it's very hard for anyone to give you solid advice on what your data need in terms of analysis or transformation. To get the best help, provide the raw data.

• Hi.Thanks to all for the suggestions. I ended up looking at my residuals as suggested and using the syntax above with my variables. My data was not as disasterously non-normal as I'd thought so I've used my parametric linear regressions with a lot more confidence and a clear conscience! Thanks again. – rachel S Nov 11 '13 at 21:41

Broadly, there are two possible approaches to your problem: one which is well-justified from a theoretical perspective, but potentially impossible to implement in practice, while the other is more heuristic.

The theoretically optimal approach (which you probably won't actually be able to use, unfortunately) is to calculate a regression by reverting to direct application of the so-called method of maximum likelihood. The connection between maximum likelihood estimation (which is really the antecedent and more fundamental mathematical concept) and ordinary least squares (OLS) regression (the usual approach, valid for the specific but extremely common case where the observation variables are all independently random and normally distributed) is described in many textbooks on statistics; one discussion that I particularly like is section 7.1 of "Statistical Data Analysis" by Glen Cowan. In cases where your observation variables aren't normally distributed, but you do actually know or have a pretty strong hunch about what the correct mathematical description of the distribution should be, you simply avoid taking advantage of the OLS simplification, and revert to the more fundamental concept, maximum likelihood estimation.

In this case, since you don't appear to actually know the underlying distribution that governs your observation variables (i.e., the only thing known for sure is that it's definitely not Gaussian, but not what it actually is), the above approach won't work for you. Usually, when OLS fails or returns a crazy result, it's because of too many outlier points. The outlier points, which are what actually break the assumption of normally distributed observation variables, contribute way too much weight to the fit, because points in OLS are weighted by the squares of their deviation from the regression curve, and for the outliers, that deviation is large. The usual heuristic approach in this case is to develop some tweak or modification to OLS which results in the contribution from the outlier points becoming de-emphasized or de-weighted, relative to the baseline OLS method. Collectively, these are usually known as robust regression. A list containing some examples of specific robust estimation techniques that you might want to try may be found here.