[Rd] Integration with exchanged and infinite limits

Ralf Stubner r@||@@tubner @end|ng |rom gm@||@com
Thu Jul 11 10:26:51 CEST 2019

Dear List,

while working on an update to my post on integrating over an infinite
range using RcppNumerical [1] I have encountered erroneous behavior
from integrate() when (at least) one of the limits is infinite and
upper and lower limit are exchanged, i.e. upper < lower. For example,
integrating dnorm with upper > lower works without problems:

integrate(dnorm, 0.1, 1)
#> 0.3015169 with absolute error < 3.3e-15
integrate(dnorm, 0.1, 10)
#> 0.4601722 with absolute error < 6.2e-06
integrate(dnorm, 0.1, Inf)
#> 0.4601722 with absolute error < 2.7e-05

If we interchange the limits, we get the expected negative value of
the previous integrals as long as the limits are finite:

integrate(dnorm, 1, 0.1)
#> -0.3015169 with absolute error < 3.3e-15
integrate(dnorm, 10, 0.1)
#> -0.4601722 with absolute error < 6.2e-06

But when the lower limit is Inf, the returned value is incorrect:

integrate(dnorm, Inf, 0.1)
#> 0.5398278 with absolute error < 7.5e-05

Instead of the expected -0.4601722, it is the value one would get when
the lower limit were -Inf:

integrate(dnorm, -Inf, 0.1)
#> 0.5398278 with absolute error < 7.5e-05

Similar problems occur if the upper limit is -Inf. The reason seems to
be that integrate() assumes that if is.finite() is false for lower
then lower == -Inf (similarly for upper).

Should this be fixed?


[1] https://stubner.me/2019/07/numerical-integration-in-rcpp/

More information about the R-devel mailing list