The qqplot

*Blog post
2014
Checking assumptions
Linear regression
R software
Rmarkdown graphs
Author

Steve Simon

Published

January 1, 2014

Many statistical procedures are based on the assumption that your data has a normal distribution. The normal probability plot is a useful graphical tool for asessing this assumption. This plot is also called the qqplot (quantile-quantile plot).

You can use the housing data set to illustrate the use of the normal probability plot.

fn <- "http://www.pmean.com/00files/housing.txt"
al <- read.table(file=fn,header=TRUE)
head(al)
   Price SquareFeet AgeYears NumberFeatures Northeast CustomBuild CornerLot
1 205000       2650       13              7       Yes         Yes        No
2 208000       2600        *              4       Yes         Yes        No
3 215000       2664        6              5       Yes         Yes        No
4 215000       2921        3              6       Yes         Yes        No
5 199900       2580        4              4       Yes         Yes        No
6 190000       2580        4              4       Yes          No        No
tail(al)
    Price SquareFeet AgeYears NumberFeatures Northeast CustomBuild CornerLot
112 87400       1236        3              4        No          No        No
113 87200       1229        6              3        No          No        No
114 87000       1273        4              4        No          No        No
115 86900       1165        7              4        No          No        No
116 76600       1200        7              4        No          No       Yes
117 73900        970        4              4        No          No       Yes
al$age <- as.numeric(al$AgeYears)
Warning: NAs introduced by coercion
summary(al$Price)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  54000   78000   96000  106274  120000  215000 
summary(al$SquareFeet)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    837    1280    1549    1654    1894    3750 
summary(al$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   1.00    5.75   13.00   14.97   19.25   53.00      49 
summary(al$NumberFeatures)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00    3.00    4.00    3.53    4.00    8.00 
summary(al$Northeast)
   Length     Class      Mode 
      117 character character 
summary(al$CustomBuild)
   Length     Class      Mode 
      117 character character 
summary(al$CornerLot)
   Length     Class      Mode 
      117 character character 

The qqplot compares the data values to evenly spaced percentiles of the normal distribution. A straight line indicates that the normality assumption is reasonable. You should not over interpret minor deviations from linearity. A large deviation from linearity is an indication that the normality assumption may be questionable.

You can read more about this on my 2009 blog entry about normal probability plots.

qqnorm(al$Price)

Figure 1. Normal probability plot for house prices.

In a linear model, the critical assumption is NOT that the predictor (independent) variables are normally distributed. It is NOT that the outcome (dependent) variable is normally distributed. It is that the residuals are normally distributed.

al.model <- lm(Price~SquareFeet+CustomBuild,data=al)
summary(al.model)

Call:
lm(formula = Price ~ SquareFeet + CustomBuild, data = al)

Residuals:
    Min      1Q  Median      3Q     Max 
-103813   -9596     738    8784   67151 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)    11413.482   6549.924   1.743  0.08411 .  
SquareFeet        55.364      4.123  13.428  < 2e-16 ***
CustomBuildYes 14285.993   5103.019   2.800  0.00601 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 19860 on 114 degrees of freedom
Multiple R-squared:  0.7321,    Adjusted R-squared:  0.7274 
F-statistic: 155.8 on 2 and 114 DF,  p-value: < 2.2e-16
qqnorm(resid(al.model))

Figure 2. Normal probability plot of residuals

Earlier versions are here and here. Also look at a closely related file.