>>>>> Serguei Sokol >>>>> on Tue, 4 Dec 2018 11:46:32 +0100 writes:
> Le 04/12/2018 à 11:27, Iñaki Ucar a écrit : >> On Tue, 4 Dec 2018 at 11:12, <qwey...@mail.ustc.edu.cn> wrote: >>> function ppois is a function calculate the CDF of Poisson distribution, it should generate a non-decreasing result, but what I got is: >>> >>>> any(diff(ppois(0:19,lambda=0.9))<0) >>> [1] TRUE >>> >>> Actually, >>> >>>> ppois(19,lambda=0.9)<ppois(18,lambda=0.9) >>> [1] TRUE >>> >>> Which could not be TRUE. >> This is just another manifestation of >> >> 0.1 * 3 > 0.3 >> #> [1] TRUE >> >> This discussion returns to this list from time to time. TLDR; this is >> not an R issue, but an unavoidable floating point issue. > Well, here the request may be interpreted not as "do it without round > error" which is indeed unavoidable but rather "please cope with rounding > errors in a way that return consistent result for ppois()". You have > indicated one way to do so (I have just added exp() in the row): > any(diff(exp(ppois(0:19, lambda=0.9, log.p=TRUE))) < 0) > #[1] FALSE > But may be there is another, more economic way? Well, log probabilites *are* very economic for many such p*() functions. OTOH, I'm a bit surprised that nobody mentioned the 'lower.tail=FALSE' option which here makes so very much sense, and is I think slightly more intuitive than the log-probabilities: It gives much much much more accurate results for such outermost right tail probabilities where p*() ~= 1 : > ppois(15:19, lambda=0.9) [1] 1 1 1 1 1 > ppois(15:19, lambda=0.9, lower.tail=FALSE) [1] 3.801404e-15 2.006332e-16 1.000417e-17 4.727147e-19 2.122484e-20 > ... and if you compare with > ppois(15:19, lambda=0.9, log.p=TRUE) and notice how similar the numbers are, you may remember that indeed log(1-p) ~= -p when |p| ≪ 1 Martin > Serguei. >> Solution: >> work with log-probabilities instead. or >> >> any(diff(ppois(0:40, lambda=0.9, log.p=TRUE))<0) >> #> [1] FALSE >> >> Iñaki >> >> ______________________________________________ >> R-devel@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > -- > Serguei Sokol > Ingenieur de recherche INRA > Cellule mathématiques > LISBP, INSA/INRA UMR 792, INSA/CNRS UMR 5504 > 135 Avenue de Rangueil > 31077 Toulouse Cedex 04 > tel: +33 5 62 25 01 27 > email: so...@insa-toulouse.fr > http://www.lisbp.fr > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel