From murdoch at stats.uwo.ca  Tue Jul  3 03:56:23 2007
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Mon, 02 Jul 2007 21:56:23 -0400
Subject: [Rd] minor flaw in integrate()
In-Reply-To: <46842286.8080402@uni-bayreuth.de>
References: <46842286.8080402@uni-bayreuth.de>
Message-ID: <4689ACC7.6010005@stats.uwo.ca>

On 28/06/2007 5:05 PM, Peter Ruckdeschel wrote:
> Hi,
> 
> I noticed a minor flaw in integrate() from package stats:
> 
> Taking up arguments lower and upper from integrate(),
> 
>    if (lower ==  Inf) && (upper ==  Inf)
> 
>        or
> 
>    if (lower == -Inf) && (upper == -Inf)
> 
> integrate() calculates the value for (lower==-Inf) && (upper==Inf).
> 
> Rather, it should return 0.

Wouldn't it be better to return NA or NaN, for the same reason Inf/Inf 
doesn't return 1?

Duncan Murdoch

> 
> Quick fix:
> 
> ### old code ###
> ### [snip]
>     else {
>             if (is.na(lower) || is.na(upper))
>                 stop("a limit is missing")
>             if (is.finite(lower)) {
>                 inf <- 1
>                 bound <- lower
>             }
>             else if (is.finite(upper)) {
>                 inf <- -1
>                 bound <- upper
>             }
>             else {
>                 inf <- 2
>                 bound <- 0
>             }
>             wk <- .External("call_dqagi", ff, rho = environment(),
>                 as.double(bound), as.integer(inf), as.double(abs.tol),
>                 as.double(rel.tol), limit = limit, PACKAGE = "base")
>     }
> ### [snip]
> 
> ### new code  to replace the old one ###
> 
> ### [snip]
>     else {
>             if (is.na(lower) || is.na(upper))
>                 stop("a limit is missing")
> 
>             if (lower == upper){
> 
>                 wk <- list("value" = 0, "abs.error" = 0,
>                         "subdivisions" = subdivisions,
>                         "ierr" = 0 )
> 
>             } else {
>                     if (is.finite(lower)) {
>                         inf <- 1
>                         bound <- lower
>                     }
>                     else if (is.finite(upper)) {
>                             inf <- -1
>                         bound <- upper
>                     }
>                     else {
>                         inf <- 2
>                         bound <- 0
>                     }
>                     wk <- .External("call_dqagi", ff, rho = environment(),
>                             as.double(bound), as.integer(inf),
>                             as.double(abs.tol), as.double(rel.tol),
>                             limit = limit, PACKAGE = "base")
> 
>             }
>     }
> ### [snip]
> 
> Best, Peter
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] minor flaw in integrate()
Duncan Murdoch