qqPlot {EnvStats}  R Documentation 
Produces a quantilequantile (QQ) plot, also called a probability plot.
The qqPlot
function is a modified version of the R functions
qqnorm
and qqplot
.
The EnvStats function qqPlot
allows the user to specify a number of
different distributions in addition to the normal distribution, and to optionally
estimate the distribution parameters of the fitted distribution.
qqPlot(x, y = NULL, distribution = "norm", param.list = list(mean = 0, sd = 1),
estimate.params = plot.type == "Tukey MeanDifference QQ",
est.arg.list = NULL, plot.type = "QQ", plot.pos.con = NULL, plot.it = TRUE,
equal.axes = qq.line.type == "01"  estimate.params, add.line = FALSE,
qq.line.type = "least squares", duplicate.points.method = "standard",
points.col = 1, line.col = 1, line.lwd = par("cex"), line.lty = 1,
digits = .Options$digits, ..., main = NULL, xlab = NULL, ylab = NULL,
xlim = NULL, ylim = NULL)
x 
numeric vector of observations. When 
y 
optional numeric vector of observations (not necessarily the same lenght as 
distribution 
when 
param.list 
when 
estimate.params 
when 
est.arg.list 
when 
plot.type 
a character string denoting the kind of plot. Possible values are 
plot.pos.con 
numeric scalar between 0 and 1 containing the value of the plotting position constant.
The default value of 
plot.it 
a logical scalar indicating whether to create a plot on the current graphics device.
The default value is 
equal.axes 
a logical scalar indicating whether to use the same range on the 
add.line 
a logical scalar indicating whether to add a line to the plot. If 
qq.line.type 
character string determining what kind of line to add to the QQ plot. Possible values are

duplicate.points.method 
a character string denoting how to plot points with duplicate 
points.col 
a numeric scalar or character string determining the color of the points in the plot.
The default value is 
line.col 
a numeric scalar or character string determining the color of the line in the plot.
The default value is 
line.lwd 
a numeric scalar determining the width of the line in the plot. The default value is

line.lty 
a numeric scalar determining the line type of the line in the plot. The default value is

digits 
a scalar indicating how many significant digits to print for the distribution parameters.
The default value is 
main , xlab , ylab , xlim , ylim , ... 
additional graphical parameters (see 
If y
is not supplied, the vector x
is assumed to be a sample from the probability
distribution specified by the argument distribution
(and param.list
if
estimate.params=FALSE
). When plot.type="QQ"
, the quantiles of x
are
plotted on the y
axis against the quantiles of the assumed distribution on the x
axis.
If y
is supplied and plot.type="QQ"
, the empirical quantiles of y
are
plotted against the empirical quantiles of x
.
When plot.type="Tukey MeanDifference QQ"
, the difference of the quantiles is plotted on
the y
axis against the mean of the quantiles on the x
axis.
Special Distributions
When y
is not supplied and the argument distribution
specifies one of the
following distributions, the function qqPlot
behaves in the manner described below.
"lnorm"
Lognormal Distribution. The logtransformed quantiles are plotted against quantiles from a Normal (Gaussian) distribution.
"lnormAlt"
Lognormal Distribution (alternative parameterization). The untransformed quantiles are plotted against quantiles from a Lognormal distribution.
"lnorm3"
ThreeParameter Lognormal Distribution. The quantiles of
log(xthreshold)
are plotted against quantiles from a Normal (Gaussian) distribution.
The value of threshold
is either specified in the argument param.list
, or,
if estimate.params=TRUE
, then it is estimated.
"zmnorm"
ZeroModified Normal Distribution. The quantiles of the
nonzero values (i.e., x[x!=0]
) are plotted against quantiles from a Normal
(Gaussian) distribution.
"zmlnorm"
ZeroModified Lognormal Distribution. The quantiles of the
logtransformed positive values (i.e., log(x[x>0])
) are plotted against quantiles
from a Normal (Gaussian) distribution.
"zmlnormAlt"
Lognormal Distribution (alternative parameterization).
The quantiles of the untransformed positive values (i.e., x[x>0]
) are
plotted against quantiles from a Lognormal distribution.
Explanation of QQ Plots
A probability plot or quantilequantile (QQ) plot
is a graphical display invented by Wilk and Gnanadesikan (1968) to compare a
data set to a particular probability distribution or to compare it to another
data set. The idea is that if two population distributions are exactly the same,
then they have the same quantiles (percentiles), so a plot of the quantiles for
the first distribution vs. the quantiles for the second distribution will fall
on the 01 line (i.e., the straight line y = x
with intercept 0 and slope 1).
If the two distributions have the same shape and spread but different locations,
then the plot of the quantiles will fall on the line y = x + b
(parallel to the 01 line) where b
denotes the difference in locations.
If the distributions have different locations and differ by a multiplicative
constant m
, then the plot of the quantiles will fall on the line
y = mx + b
(D'Agostino, 1986a, p. 25; Helsel and Hirsch, 1986, p. 42).
Various kinds of differences between distributions will yield various kinds of
deviations from a straight line.
Comparing Observations to a Hypothesized Distribution
Let \underline{x} = x_1, x_2, \ldots, x_n
denote the observations
in a random sample of size n
from some unknown distribution with
cumulative distribution function F()
, and let
x_{(1)}, x_{(2)}, \ldots, x_{(n)}
denote the ordered observations.
Depending on the particular formula used for the empirical cdf
(see ecdfPlot
), the i
'th order statistic is an
estimate of the i/(n+1)
'th, (i0.5)/n
'th, etc., quantile.
For the moment, assume the i
'th order statistic is an estimate of the
i/(n+1)
'th quantile, that is:
\hat{F}[x_{(i)}] = \hat{p}_i = \frac{i}{n+1} \;\;\;\;\;\; (1)
so
x_{(i)} \approx F^{1}(\hat{p}_i) \;\;\;\;\;\; (2)
If we knew the form of the true cdf F
, then the plot of
x_{(i)}
vs. F^{1}(\hat{p}_i)
would form approximately
a straight line based on Equation (2) above. A probability plot is a plot of
x_{(i)}
vs. F_0^{1}(\hat{p}_i)
, where F_0
denotes the
cdf associated with the hypothesized distribution. The probability plot
should fall roughly on the line y=x
if F=F_0
. If F
and F_0
merely differ by a shift in location and scale, that is, if
F[(x  \mu) / \sigma] = F_0(x)
, then the plot should fall roughly on the
line y = \sigma x + \mu
.
The quantity \hat{p}_i = i/(n+1)
in Equation (1) above is called the
plotting position for the probability plot. This particular
formula for the plotting position is appealing because it can be shown that
for any continuous distribution
E\{F[x_{(i)}]\} = \frac{i}{n+1} \;\;\;\;\;\; (3)
(Nelson, 1982, pp. 299300; Stedinger et al., 1993). That is, the i
'th
plotting position defined as in Equation (1) is the expected value of the true
cdf evaluated at the i
'th order statistic. Many authors and practitioners,
however, prefer to use a plotting position that satisfies:
F^{1}(\hat{p}_i) = E[x_{(i)}] \;\;\;\;\;\; (4)
or one that satisfies
F^{1}(\hat{p}_i) = M[x_{(i)}] = F^{1}\{M[u_{(i)}]\} \;\;\;\;\;\; (5)
where M[x_{(i)}]
denotes the median of the distribution of the i
'th
order statistic, and u_{(i)}
denotes the i
'th order statistic in a
random sample of n
uniform (0,1) random variates.
The plotting positions in Equation (4) are often approximated since the expected
value of the i
'th order statistic is often difficult and timeconsuming
to compute. Note that these plotting positions will differ for different
distributions.
The plotting positions in Equation (5) were recommended by Filliben (1975) because
they require computing or approximating only the medians of
uniform (0,1) order statistics, no matter what the form
of the assumed cdf F_0
. Also, the median may be preferred as a measure of
central tendency because the distributions of most order statistics are skewed.
Most plotting positions can be written as:
\hat{p}_i = \frac{i  a}{n  2a + 1} \;\;\;\;\;\; (6)
where 0 \le a \le 1
(D'Agostino, 1986a, p.25; Stedinger et al., 1993).
The quantity a
is sometimes called the “plotting position constant”, and
is determined by the argument plot.pos.con
in the function qqPlot
.
The table below, adapted from Stedinger et al. (1993), displays commonly used
plotting positions based on equation (6) for several distributions.
Distribution  
Often Used  
Name  a  With  References 
Weibull  0  Weibull,  Weibull (1939), 
Uniform  Stedinger et al. (1993)  
Median  0.3175  Several  Filliben (1975), 
Vogel (1986)  
Blom  0.375  Normal  Blom (1958), 
and Others  Looney and Gulledge (1985)  
Cunnane  0.4  Several  Cunnane (1978), 
Chowdhury et al. (1991)  
Gringorten  0.44  Gumbel  Gringorton (1963), 
Vogel (1986)  
Hazen  0.5  Several  Hazen (1914), 
Chambers et al. (1983),  
Cleveland (1993) 
For moderate and large sample sizes, there is very little difference in
visual appearance of the QQ plot for different choices of plotting positions.
Comparing Two Data Sets
Let \underline{x} = x_1, x_2, \ldots, x_n
denote the observations
in a random sample of size n
from some unknown distribution with
cumulative distribution function F()
, and let
x_{(1)}, x_{(2)}, \ldots, x_{(n)}
denote the ordered observations. Similarly,
let \underline{y} = y_1, y_2, \ldots, y_m
denote the observations
in a random sample of size m
from some unknown distribution with
cumulative distribution function G()
, and let
y_{(1)}, y_{(2)}, \ldots, y_{(m)}
denote the ordered observations.
Suppose we are interested in investigating whether the shape of the distribution
with cdf F
is the same as the shape of the distribution with cdf G
(e.g., F
and G
may both be normal distributions but differ in mean
and standard deviation).
When n = m
, we can visually explore this question by plotting
y_{(i)}
vs. x_{(i)}
, for i = 1, 2, \ldots, n
.
The values in \underline{y}
are spread out in a certain way depending
on the true distribution: they may be more or less symmetric about some value
(the population mean or median) or they may be skewed to the right or left;
they may be concentrated close to the mean or median (platykurtic) or there may
be several observations “far away” from the mean or median on either side
(leptokurtic). Similarly, the values in \underline{x}
are spread out in a
certain way. If the values in \underline{x}
and \underline{y}
are
spread out in the same way, then the plot of y_{(i)}
vs. x_{(i)}
will be approximately a straight line. If the cdf F
is exactly the same
as the cdf G
, then the plot of y_{(i)}
vs. x_{(i)}
will fall
roughly on the straight line y = x
. If F
and G
differ by a
shift in location and scale, that is, if F[(x\mu)/\sigma] = G(x)
, then
the plot will fall roughly on the line y = \sigma x + \mu
.
When n > m
, a slight adjustment has to be made to produce the plot. Let
\hat{p}_1, \hat{p}_2, \ldots, \hat{p}_m
denote the plotting positions
corresponding to the m
empirical quantiles for the y
's and let
\hat{p}^*_1, \hat{p}^*_2, \ldots, \hat{p}^*_n
denote the plotting positions
corresponding the n
empirical quantiles for the x
's. Then we plot
y_{(j)}
vs. x^*_{(j)}
for j = 1, 2, \ldots, m
where
x^*_{(j)} = (1  r) x_{(i)} + r x_{(i+1)} \;\;\;\;\;\; (7)
r = \frac{\hat{p}_j  \hat{p}^*_i}{\hat{p}^*_{i+1}  \hat{p}^*_i} \;\;\;\;\;\; (8)
\hat{p}^*_i \le \hat{p}_j \le \hat{p}^*_{i+1} \;\;\;\;\;\; (9)
That is, the values for the x^*_{(j)}
's are determined by linear interpolation
based on the values of the plotting positions for \underline{x}
and
\underline{y}
.
A similar adjustment is made when n < m
.
Note that the R function qqplot
uses a different method than
the one in Equation (7) above; it uses linear interpolation based on
1:n
and m
by calling the approx
function.
qqPlot
returns a list with components x
and y
, giving the (x,y)
coordinates of the points that have been or would have been plotted. There are four cases to
consider:
1. The argument y
is not supplied and plot.type="QQ"
.
x 
the quantiles from the theoretical distribution. 
y 
the observed quantiles (order statistics) based on the data in the argument 
2. The argument y
is not supplied and plot.type="Tukey MeanDifference QQ"
.
x 
the averages of the observed and theoretical quantiles. 
y 
the differences between the observed quantiles (order statistics) and the theoretical quantiles. 
3. The argument y
is supplied and plot.type="QQ"
.
x 
the observed quantiles based on the data in the argument 
y 
the observed quantiles based on the data in the argument 
4. The argument y
is supplied and plot.type="Tukey MeanDifference QQ"
.
x 
the averages of the quantiles based on the argument 
y 
the differences between the quantiles based on the argument 
A quantilequantile (QQ) plot, also called a probability plot, is a plot of the observed
order statistics from a random sample (the empirical quantiles) against their (estimated)
mean or median values based on an assumed distribution, or against the empirical quantiles
of another set of data (Wilk and Gnanadesikan, 1968). QQ plots are used to assess whether
data come from a particular distribution, or whether two datasets have the same parent
distribution. If the distributions have the same shape (but not necessarily the same
location or scale parameters), then the plot will fall roughly on a straight line. If the
distributions are exactly the same, then the plot will fall roughly on the straight line y=x
.
A Tukey meandifference QQ plot, also called an md plot, is a modification of a
QQ plot. Rather than plotting observed quantiles vs. theoretical quantiles or observed
y
quantiles vs. observed x
quantiles, a Tukey meandifference QQ plot plots
the difference between the quantiles on the y
axis vs. the average of the quantiles on
the x
axis (Cleveland, 1993, pp.2223). If the two sets of quantiles come from the same
parent distribution, then the points in this plot should fall roughly along the horizontal line
y=0
. If one set of quantiles come from the same distribution with a shift in median, then
the points in this plot should fall along a horizontal line above or below the line y=0
.
A Tukey meandifference QQ plot enhances our perception of how the points in the QQ plot deviate
from a straight line, because it is easier to judge deviations from a horizontal line than from a
line with a nonzero slope.
In a QQ plot, the extreme points have more variability than points toward the center. A Ushaped
QQ plot indicates that the underlying distribution for the observations on the y
axis is
skewed to the right relative to the underlying distribution for the observations on the x
axis.
An upsidedownUshaped QQ plot indicates the y
axis distribution is skewed left relative to
the x
axis distribution. An Sshaped QQ plot indicates the y
axis distribution has
shorter tails than the x
axis distribution. Conversely, a plot that is bent down on the
left and bent up on the right indicates that the y
axis distribution has longer tails than
the x
axis distribution.
Steven P. Millard (EnvStats@ProbStatInfo.com)
Chambers, J.M., W.S. Cleveland, B. Kleiner, and P.A. Tukey. (1983). Graphical Methods for Data Analysis. Duxbury Press, Boston, MA, pp.1116.
Cleveland, W.S. (1993). Visualizing Data. Hobart Press, Summit, New Jersey, 360pp.
D'Agostino, R.B. (1986a). Graphical Analysis. In: D'Agostino, R.B., and M.A. Stephens, eds. Goodnessof Fit Techniques. Marcel Dekker, New York, Chapter 2, pp.762.
ppoints
, ecdfPlot
, Distribution.df
,
qqPlotGestalt
, qqPlotCensored
, qqnorm
.
# The guidance document USEPA (1994b, pp. 6.226.25)
# contains measures of 1,2,3,4Tetrachlorobenzene (TcCB)
# concentrations (in parts per billion) from soil samples
# at a Reference area and a Cleanup area. These data are strored
# in the data frame EPA.94b.tccb.df.
#
# Create an QQ plot for the reference area data first assuming a
# normal distribution, then a lognormal distribution, then a
# gamma distribution.
# Assume a normal distribution
#
dev.new()
with(EPA.94b.tccb.df, qqPlot(TcCB[Area == "Reference"]))
dev.new()
with(EPA.94b.tccb.df, qqPlot(TcCB[Area == "Reference"], add.line = TRUE))
dev.new()
with(EPA.94b.tccb.df, qqPlot(TcCB[Area == "Reference"],
plot.type = "Tukey", add.line = TRUE))
# The QQ plot based on assuming a normal distribution shows a Ushape,
# indicating the Reference area TcCB data are skewed to the right
# compared to a normal distribuiton.
# Assume a lognormal distribution
#
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "lnorm",
digits = 2, points.col = "blue", add.line = TRUE))
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "lnorm",
digits = 2, plot.type = "Tukey", points.col = "blue",
add.line = TRUE))
# Alternative parameterization
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "lnormAlt",
estimate.params = TRUE, digits = 2, points.col = "blue",
add.line = TRUE))
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "lnormAlt",
digits = 2, plot.type = "Tukey", points.col = "blue",
add.line = TRUE))
# The lognormal distribution appears to be an adequate fit.
# Now look at a QQ plot assuming a gamma distribution.
#
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "gamma",
estimate.params = TRUE, digits = 2, points.col = "blue",
add.line = TRUE))
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "gamma",
digits = 2, plot.type = "Tukey", points.col = "blue",
add.line = TRUE))
# Alternative Parameterization
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "gammaAlt",
estimate.params = TRUE, digits = 2, points.col = "blue",
add.line = TRUE))
dev.new()
with(EPA.94b.tccb.df,
qqPlot(TcCB[Area == "Reference"], dist = "gammaAlt",
digits = 2, plot.type = "Tukey", points.col = "blue",
add.line = TRUE))
#
# Generate 20 observations from a gamma distribution with parameters
# shape=2 and scale=2, then create a normal (Gaussian) QQ plot for these data.
# (Note: the call to set.seed simply allows you to reproduce this example.)
set.seed(357)
dat < rgamma(20, shape=2, scale=2)
dev.new()
qqPlot(dat, add.line = TRUE)
# Now assume a gamma distribution and estimate the parameters
#
dev.new()
qqPlot(dat, dist = "gamma", estimate.params = TRUE, add.line = TRUE)
# Clean up
#
rm(dat)
graphics.off()