# How to interpret a QQ-plot of p-values

With association results I get p-values for all the SNPs that was analyzed. Now, I use a QQ-plot of those p-values to show if a very low p-value differs from the expected distribution of p-values (a uniform distribution). If a p-value deviates from the expected distribution one "may" call that p-value for statistic significant.

As you can see in the QQ-plot, at the top tail end, the last 4 points are somewhat hard to interpret. Two of the last points in the grey suggests that those p-values are in the expected distribution of p-values, whilst the other two are not.

Now, how to interpret this, the last two points have lower p-values but are not "significant" according to the QQ-plot, whilst the other two points with higher p-values are "significant"? How can this be true?

• One problem with using QQ plots to interpret GWAS is that the p-values are not independent of each other, and, in fact, the most extreme p-values are very likely correlated. I would guess that your top four hits are likely on the same chromosome and are close enough to each other that LD is causing correlation between them. If you were to run the test that gave the second lowest p-value conditional on the SNP with the lowest p-value I'm guessing its p-value would drop into the unexceptional range. The same would likely happen with many of the other apparent hits. – Sam Dickson Apr 1 '14 at 18:23
• I already did that, I pruned the SNP data set to get independent SNPs only (using a r-square of 0.8 as cutoff). This QQ-plot shows the results of independent SNPs, or SNPs in LD < 0.8. – eXpander Apr 7 '14 at 6:47
• The lowest SNP correspond to chromosome 6, the second to chromosome 2, the third to chromosome 5, the fourth to chromosome 9, so I'm not so sure LD is a problem here. – eXpander Apr 7 '14 at 6:54
• Could I ask you how you did that plot? I can get something similar but with chi-square values or with p-values but without the grey shadow and I need one with p-values and the grey shadow. If you could share the code you used would be great. Thanks. – Aleix Arnau May 15 '15 at 18:25
• Here folk.uio.no/tores/Publications_files/… is a clasic paper on this problem. – kjetil b halvorsen Aug 30 '15 at 13:04

A good reference on the analysis of p-value plots is [1].

The result you are seeing may be driven by the fact the signal/effects exist only at some subset of tests. These are driven above the acceptance bands. Rejecting only the p-value outside the bands can indeed be justified, but perhaps more importantly, you should decide what is the error criterion you want to control when selecting your selection procedure (FWER, FDR). You can consult [2] for that choice, and references therein for choosing the appropriate multiple testing procedure.

[1] Schweder, T., and E. Spjotvoll. “Plots of P-Values to Evaluate Many Tests Simultaneously.” Biometrika 69, no. 3 (December 1982): 493–502. doi:10.2307/2335984.

[2] Rosenblatt, Jonathan. “A Practitioner’s Guide to Multiple Testing Error Rates.” ArXiv e-print. Tel Aviv University, April 17, 2013. http://arxiv.org/abs/1304.4920.

This is an older question, but I found it helpful when trying to interpret QQPlots for the first time. I thought I'd add to these answers in case more people stumble across this in the future.

The thing I found a little tricky to understand is what are those points exactly? I found going to the code made it easy to figure out.

Here is some R code that I adapted from GWASTools::qqPlot that implements a QQPlot in 3 lines:

simpleQQPlot = function (observedPValues) {
plot(-log10(1:length(observedPValues)/length(observedPValues)),
-log10(sort(observedPValues)))
abline(0, 1, col = "red")
}


Here's an example. You have 5 p-values. simpleQQPlot will generate 5 corresponding pvalues from a normal distribution. These will be: .2 .4 .6 .8 and 1. So simpleQQPlot expects your lowest p-value to be around .2, and your highest to be around 1. simpleQQPlot will sort your pvalues and pair each to the corresponding generated value. So .2 will be paired with your lowest pvalue, 1 with your highest, and so on. Then, these paired values are plotted (after taking the negative logs), with X being the generated pvalue, and Y being the paired observed value. If your observed values were also pulled from a normal distribution, then the points should roughly lie on the straight line. Because of the sorting, the points will always increase monotonically. So each subsequent point will have a greater X, and a greater than or equal Y. The jump between Y values depends on your data, but with the log transformation, you'll see a larger jump in X as you move further to the right.

So in the original example above, the 9,997th sorted p-value was around 5.2 but was expected to be around 4.1 if following a normal distribution. (Note: I'm not actually sure how many p-values were plotted above--I just guessed 10k).