Re: A very small p-value
Spencer Graves <[email protected]>
| Newsgroups | gmane.comp.lang.r.general |
|---|---|
| Message-ID | <[email protected]> |
Similarly, > .Machine$double.xmin [1] 2.225074e-308 is NOT really the smallest number currently available on my computer, but it's moderately close, e.g., > .Machine$double.xmin/2 [1] 1.112537e-308 > .Machine$double.xmin^1.1 [1] 0 To maximize likelihood, I routinely use log or log.p = TRUE in functions like dt and pt, because nonlinear optimization too often throws and error with a likelihood of 0, whose logarithm is -Inf but does not have a problem on a log scale: > log(.Machine$double.xmin) [1] -708.3964 > log(.Machine$double.xmin)*2 [1] -1416.793 Spencer Graves On 10/26/25 09:41, Richard O'Keefe wrote: > No, 0 and 5-19 are not "equalled". THey are quite distinct. > As for pt() returning something smaller than double.eps, why wouldn't it? > If I calculate 10^-30, I get 1e-30, which is much smaller than double.eps, > but is still correct. It would be a serious error to return 0 for 10^-30. > Welcome to the wonderful world of floating-point arithmetic. > This really has nothing to do with R. > > On Sun, 26 Oct 2025 at 09:38, Christophe Dutang <[email protected]> wrote: >> >> Thanks for your answers. >> >> I was not aware of the R function expm1(). >> >> I’m completely aware that 1 == 1 - 5e-19. But I was wondering why pt() returns something smaller than double.eps. >> >> For students who will use this exercise, it is disturbing to find 0 or 5e-19 : yet it will be a good exercise to find that these quantities are equalled. >> >> Regards, Christophe >> >>> Le 25 oct. 2025 à 12:14, Ivan Krylov <[email protected]> a écrit : >>> >>> В Sat, 25 Oct 2025 11:45:42 +0200 >>> Christophe Dutang <[email protected]> пишет: >>> >>>> Indeed, the p-value is lower than the epsilon machine >>>> >>>>> pt(t_score, df = n-2, lower=FALSE) < .Machine$double.eps >>>> [1] TRUE >>> >>> Which means that for lower=TRUE, there will not be enough digits in R's >>> numeric() type to represent the 5*10^-19 subtracted from 1 and >>> approximately 16 zeroes. >>> >>> Instead, you can verify your answer by asking for the logarithm of the >>> number that is too close to 1, thus retaining more significant digits: >>> >>> print( >>> -expm1(pt(t_score, df = n-2, lower=TRUE, log.p = TRUE)), >>> digits=16 >>> ) >>> # [1] 2.539746620181249e-19 >>> print(pt(t_score, df = n-2, lower=FALSE), digits=16) >>> # [1] 2.539746620181248e-19 >>> >>> expm1(.) computes exp(.)-1 while retaining precision for numbers that >>> are too close to 0, for which exp() would otherwise return 1. >>> >>> See the links in >>> https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f >>> for a more detailed explanation. >>> >>> -- >>> Best regards, >>> Ivan >>> (flipping the "days since referring to R FAQ 7.31" sign back to 0) >> >> ______________________________________________ >> [email protected] mailing list -- To UNSUBSCRIBE and more, see >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide https://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. > > ______________________________________________ > [email protected] mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide https://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.