[R] Help with pexp( )

(Ted Harding) ted.harding at nessie.mcc.ac.uk
Wed Apr 11 21:36:50 CEST 2007


On 11-Apr-07 15:59:09, Jeann S wrote:
> Dear all,
> 
> Sorry for bringing up an old issue:
> 
>     >pexp(50, 0.5)
>     [1] 1
> 
> In some cases, pexp()  gives CDF=1. I read some discussion
> in 2002 saying it has been patched. However it's not working
> in "R2.4.1Patched". Could anyone help me out?
> 
> Thanks a lot,
> 
> Jeann

Since pexp(x,a) = 1 - exp(-a*x), you can use this expression
instead of pexp(), or exp(-a*x) instead of 1 - pexp(a*x).

Comparison of the two forms (on an older version of R but
presumably the results are the same as you are referring to):

x <- 5*(1:12); y <- pexp(x,1); z <- 1 - exp(-1*x)

-log(1-y)
    [1]  5.00000 10.00000 15.00000 20.00000 25.00000 29.99983 34.94504   
    [8]      Inf      Inf      Inf      Inf      Inf

-log(1-z)
    [1]  5.00000 10.00000 15.00000 20.00000 25.00000 29.99983 34.94504   
    [8]      Inf      Inf      Inf      Inf      Inf

so, looked at in this way, there is no difference.

However:

x <- 5*(1:12); y <- pexp(x,1,lower.tail=FALSE); z <- 1 - exp(-1*x)

-log(y)
    [1]  5 10 15 20 25 30 35 40 45 50 55 60

-log(1-z)
      [1]  5.00000 10.00000 15.00000 20.00000 25.00000 29.99983 34.94504 
      [8]      Inf      Inf      Inf      Inf      Inf

And:

x <- 5*(1:12); y <- pexp(x,1,lower.tail=FALSE); z <- exp(-1*x)

-log(y)
   [1]  5 10 15 20 25 30 35 40 45 50 55 60

-log(z)
   [1]  5 10 15 20 25 30 35 40 45 50 55 60


so clearly exactly the same problem arises with -log(1 - exp(-x))
when x is large, as arises with pexp(x) when x is large, and I
would put it down to the fact that 1 - exp(-x) is not very precise
(in "significant figure" terms).

Another way of looking at it:

pexp(x,lower.tail=FALSE)
    [1] 6.737947e-03 4.539993e-05 3.059023e-07 2.061154e-09
    [5] 1.388794e-11 9.357623e-14 6.305117e-16 4.248354e-18
    [9] 2.862519e-20 1.928750e-22 1.299581e-24 8.756511e-27

1-(1-pexp(x,lower.tail=FALSE))
    [1] 6.737947e-03 4.539993e-05 3.059023e-07 2.061154e-09
    [5] 1.388789e-11 9.359180e-14 6.661338e-16 0.000000e+00
    [9] 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00

However, the quesiton arises: Why do you need the precision
(about exp(-37) = 1e-16) in pexp(x) for large x? If you're
interested in the difference from 1, then use "lower.tail=FALSE"
in the first place, I would have thought?

Best wishes,
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <ted.harding at nessie.mcc.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 11-Apr-07                                       Time: 20:36:45
------------------------------ XFMail ------------------------------



More information about the R-help mailing list