From m@echler @ending from @t@t@m@th@ethz@ch  Tue Dec  4 19:12:41 2018
From: m@echler @ending from @t@t@m@th@ethz@ch (Martin Maechler)
Date: Tue, 4 Dec 2018 19:12:41 +0100
Subject: [Rd] Bug report: Function ppois(0:20,
 lambda=0.9) does not generate a non-decreasing result.
In-Reply-To: <2787db5d-a009-40f5-bea6-8ddb10b10a50@insa-toulouse.fr>
References: <f49f51f.a07fd.16774649817.Coremail.qweytr1@mail.ustc.edu.cn>
 <CALEXWq1WFLzQBgm8oF1myry25DZEyEA_jT3kFEnLYP55-06QKg@mail.gmail.com>
 <2787db5d-a009-40f5-bea6-8ddb10b10a50@insa-toulouse.fr>
Message-ID: <23558.50073.837856.602176@stat.math.ethz.ch>

>>>>> 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 at 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 at 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 at insa-toulouse.fr
    > http://www.lisbp.fr

    > ______________________________________________
    > R-devel at r-project.org mailing list
    > https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Bug report: Function ppois(0:20, lambda=0.9) does not generate a non-decreasing result.
Martin Maechler