我在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
是否可以在不手动选择间隔的情况下整合此密度?
谢谢
答案 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)
与所有数值积分程序一样,这些程序会评估函数 在一组有限的点上。如果函数大致恒定 (特别是零)在几乎所有范围内都有可能 结果和错误估计可能是严重错误。
所以,答案是否。
你真的需要了解正确计算积分的函数 - 对于任何检测支持的自动算法,它都有一个失败的函数。