On Fri, 12 Jan 2001, Torsten Hothorn wrote:
I tried to integrate numerically a function wich is similar to the
following:
dummy <- function(x) { exp(-1*x) * dnorm(x) }
dummy(-100)
[1] NaN
If I choose the lower boundary to be too small integrate causes a
segmentation fault:
library(integrate)
integrate(dummy, -100, 0)$value
integrate(dummy, -1000, 0)$value
[1] NaN
Warning message:
Ifail=1, maxpts was too small. Check the returned relerr! in: adapt(1,
lower, upper, minpts, maxpts, functn, eps, ...)
integrate(dummy, -10000, 0)$value
Running Version 1.2.0 Patched (2001-01-07) and integrate Version 2.2-3
on SuSE 6.4 gives:
integrate(dummy, -1000000, 0)$value
[1] NaN
Warning message:
Ifail=1, maxpts was too small. Check the returned relerr! in: adapt(1,
lower, upper, minpts, maxpts, functn, eps, ...)
I has not able to reproduce the segfault ;-)
BTW: if one uses
dummy <- function(x) { a <- exp(-1*x) * dnorm(x); ifelse(is.na(a), 0,
integrate(dummy, -100, 0)$value
integrate(dummy, -1000, 0, maxpts=1000)$value
Better, try
dummy <- function(x) { exp(-1*x + dnorm(x, log=TRUE))}
that is, do your calculations on log scale as far as possible. This is
more accurate than cop-ing out at Inf*0.
Even better, you can adjust the normal mean to cancel the linear term
exactly: dnorm(x, mu) has linear term -mu*x. So use
dummy <- function(x) exp(0.5)*dnorm(x, -1)
You will still need to adjust maxpts or find a sensible lower end.
(BTW, I don't get a segfault either, and we need you to debug it
on your system, I am afraid.)