# about a p-value < 2.2e-16 [duplicate]

Although the question has been asked before, I hope that you do not mind if I am asking it again in our specific circumstances / context.

in R, the wilcox.test() provides "a p-value < 2.2e-16", when we compare sets of 1,000 genes expression (in the genomics field).

However, the journal asks us to provide the exact $$p$$-value.

Would it be legitimate to write : "p-value = 0" ?

• I understand the journal want the exact p-value but I suspect you have access to the exact test statistic? They might be willing to accept the test statistic with the statement $p < 2.2 \times 10^{-16}$ Mar 19, 2021 at 8:15
• Not related to the question, but the journal is wrong and there is no sense in providing the p-value (what can one do with the information that the p-value was actually 2.1e-16, not 2.2e-16?). Mar 19, 2021 at 11:28
• Have you tried stating p<2.2e-16? This is about as exact as it gets. Surely it's more exact than something like 0.224, which the journal would probably happily accept. If they're not happy with p<2.2e-16, they basically demonstrate that they're clueless and should be boycotted... ;-) Mar 19, 2021 at 11:29
• p < 2.2e-16 may not be exact, but it's much more accurate that p = 0
– mkt
Mar 19, 2021 at 12:03

You would hope the editors are sensible people and they are not going to insist on the exact p-value for something in the region of 1e-16. I would just report p < 2.2e-16 in the manuscript with a note to the editor saying that you cannot be more precise than that and it probably you don't need to.

I would much prefer that than reporting 'p = 0' since that is not really meaningful and it can be misleading since it's not clear how close you were to zero.

After all, what does it even mean exact value? How many decimal places? What it is the exact value of $$\pi$$? As far as your computing facilities go, your exact p-value is 'p < 1e-16' because you cannot do better than that.

Regarding the statistics, you don’t what the exact p-value is. Remember that the p-value is some kind of integral of a density. When you get out that far in the tail of a density, the numerical methods break down, and the value gets sensitive to violations of test assumptions. Is is $$10^{-16}$$ or $$10^{-17}$$ or $$10^{-14}?$$ Who knows!? But it also does not matter. The number you’re getting is R’s way of telling you that the answer is basically zero.

You should be able to access the exact p-value no problem in R! Here is a reproducible example showing what I mean (the data comes from the documentation, see ?wilcox.test):

x <- c(1.83,  0.50,  1.62,  2.48, 1.68, 1.88, 1.55, 3.06, 1.30)
y <- c(0.878, 0.647, 0.598, 2.05, 1.06, 1.29, 1.06, 3.14, 1.29)
result=wilcox.test(x, y, paired = TRUE, alternative = "greater")

print(result)
# It prints p-value = 0.02

print(result$p.value) #  0.0195  You'll get some rounded form of the p-value if you print(result) because it looks better formatted that way, but you can access the exact value as shown in the snippet. PS: The p-value cannot be exactly equal to 0 in this case. At best it will be numerically equal to 0 if the number is too small for the software to handle (see the link below). I would report the exact p-value as asked by the journal (even it's not the most sensible thing, so long it makes them happy) ; and if it shows 0 I would at least write numerically equal to 0. Relevant with a great answer: How should tiny$p$-values be reported? (and why does R put a minimum on 2.22e-16?) • This is the correct answer. Mar 19, 2021 at 11:53 • @mdewey With all respect, I think Dave's answer is more to the point. In many cases the p-value cannot be computed with accuracy greater than c.$10^{-12}$(if one is lucky). Insisting on reporting any value less than that amounts to misunderstanding how statistical computations work. Thus, when I see people report p-values like "$0.0000\cdots00017\$" (sometimes with hundreds of zeros written!), two red flags go up: one concerning ignorance of the calculation and another concerning an undue emphasis on the "astronomically small" size of the p-value.
– whuber
Mar 19, 2021 at 13:39
• @whuber the core problem is that the print method for objects of class htest prints the results in a neat format but the underlying stored result is also available. Ridiculously precise miniscule p-values are the norm in the field in which the OP works. Mar 19, 2021 at 14:05
• @mdewey Good point; understood. But then it seems Glen_b has given a thorough answer in the duplicate.
– whuber
Mar 19, 2021 at 14:23
• I agree with above discussion. My answer was trying to give OP what he wanted (i.e. the "exact" p-value the journal asked for) although I agree it's not very sensible. That is why I linked Glen_b's answer calling for caution. With "numerically equal to 0", I meant to say that R can show a 0 p-value when you pull it out of the result object, but that's just because it's too small; i.e. R's meterstick isn't precise enough to go along with your analogy Mar 19, 2021 at 14:52