Is this something you've seen before? I'm mostly concerned because I've rarely seen such values reported in literature, and our sample sizes are not large.
This is something I've been thinking about on and off since the first time I ran through a full microarray differential expression workflow in R a few months ago.
I noticed that applying lmFit and eBayes resulted in a number of p-values that are 0. While I acknowledge that there are very many different ways of calculating p-values and that 0 is potentially valid, I have not seen instances in the literature of p-values of 0. It seems more like an artifact from rounding, or something other setting somewhere that I'm missing. I haven't set the number of display significant digits, and everything else is default environment-wise. I see the same values when I write out the results using write.fit.
Please let me know if I'm crazy or just missing something. It's a little awkward doing p-value histograms and such on this data, and then trying to figure out how so many values could be exactly 0 in order to explain the results to others.
Thank you
1 answer
There is a limit to the accuracy of floating point representations inside of a computer. Zero is most likely the indication that this limit has been reached and from that point of view the value that you get is indistinguishable from all other small values.
The limit is around 1E-16 so your p-values are all smaller than that.
I've seen this before in R with an unrelated package and I believe it to be an underflow type error. Of course you should not report 0 for you p-values as it would be incorrect.
I think I have seen publications reporting p-values as smaller than some value. Maybe this is an option for you? Does anyone know how to find out the smallest value my computer can handle? I came across this http://stat.ethz.ch/R-manual/R-devel/library/base/html/zMachine.html but I am not sure about $double.eps and $double.xmin
Log in to answer this question.
Update: investigating further, it seems to be only in the output of write.fit, even though I'm not trying to output corrected p-values. If I take the actual output of eBayes and output the uncorrected p-values using another method, it looks like they don't end up being rounded.
Update2: write.fit defaults to rounding to 3 digits, which doesn't seem to match the behavior of similar methods like topTable. I somehow missed that there's an argument in write.fit to specify the number to round to. Closing since it turns out this wasn't a great question.