在R中集成了一个非常尖锐的函数

时间:2013-12-18 18:28:36

标签: r integrate

我在R中使用集成功能来集成一个非常高峰的功能。 假设该函数是对数正态密度:

 xs <- seq(0,3,0.00001)
 fun <- function(xs) dlnorm(xs, meanlog=-1.057822,sdlog=0.001861871)
 plot(xs,fun(xs),type="l")

从情节来看,我知道峰值在0.3-0.4左右。

如果我将这个密度函数整合到它的支持上(增加了abs.tol和增加了细分),则积分给出零,这不应该是真的。

integrate(fun,lower=0,upper=Inf,subdivisions=10000000,abs.tol=1e-100) 
0 with absolute error < 0

但是,如果我将间隔限制在0.3和0.4,它会给我正确答案。

integrate(fun,lower=0.3,upper=0.4,subdivisions=10000000,abs.tol=1e-100) 
1 with absolute error < 1.7e-05

是否可以在不手动选择间隔的情况下整合此密度?

谢谢

2 个答案:

答案 0 :(得分:4)

不确定这是否有用 - 可能对dlnorm来说过于具体,但你可以对[0,Inf [进行分区],特别是如果你对峰值的最终位置有一个很好的了解:

integrate.dlnorm <- function(mu=0, sd=1, width=2) {
    integral.l <- integrate(f=dlnorm, lower=0, upper=exp(mu - width * sd), meanlog=mu, sdlog=sd)$value
    integral.m <- integrate(f=dlnorm, lower=exp(mu - width * sd), upper=exp(mu + width * sd), meanlog=mu, sdlog=sd)$value
    integral.u <- integrate(f=dlnorm, lower=exp(mu + width * sd), upper=Inf, meanlog=mu, sdlog=sd)$value
    return(integral.l + integral.m + integral.u)
}

integrate.dlnorm()  # 1
integrate.dlnorm(-1.05, 10^-3)  # .97
integrate.dlnorm(-1.05, 10^-3, 3)  # .998

答案 1 :(得分:2)

integrate

  

与所有数值积分程序一样,这些程序会评估函数   在一组有限的点上。如果函数大致恒定   (特别是零)在几乎所有范围内都有可能   结果和错误估计可能是严重错误。

所以,答案是

你真的需要了解正确计算积分的函数 - 对于任何检测支持的自动算法,它都有一个失败的函数。