[Rd] Bug report: Function ppois(0:20, lambda=0.9) does not generate a non-decreasing result.
Martin Maechler
m@echler @ending from @t@t@m@th@ethz@ch
Tue Dec 4 19:12:41 CET 2018
>>>>> 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, <qweytr1 using 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 using 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: sokol using insa-toulouse.fr
> http://www.lisbp.fr
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
More information about the R-devel
mailing list