我有关于integrate()
的编码问题。它来自几个步骤:
首先,我有一个名为Like
的初始函数。 第二次,我得到Like
的积分并调用结果norm.cons
。 第三,我将Like
除以norm.cons
并调用结果Like.2
。 最后,我得到Like.2
的积分。 ( 以下提供所有R代码。 )
根据定义,我上面最后一步的答案应该是“1”。但为什么我会得到以下答案? 4.573253e-12
Like = function(x) sapply(lapply(x, dnorm, x = seq(1, 30), 2), prod) # Initial function
norm.cons = integrate(Like, -Inf, Inf)[[1]] # Integral of Initial Function
Like.2 = function(x) sapply(lapply(x, dnorm, x = seq(1, 30), 2), prod) / norm.cons # Deviding the initial function by its Integral
integrate(Like.2, -Inf, Inf)[[1]] # HERE Why Integral is not "1" ?
答案 0 :(得分:0)
您的norm.cons
变量为0,这表示您放入Like.2
的任何内容都会导致NaN
(除以0)。例如,尝试
Like.2(3) # results in NaN
norm.cons
为0的原因是几乎的所有值都是0,除了200-300左右之外的所有值,并且数值积分太不精确而找不到它不是0的区域例如,尝试:
Like(220) # 3.471218e-244
Like(300) # 2.661608e-296
# outside of that region:
Like(200) # 0
Like(320) # 0
要解决此问题,请在两个集成周围设置更合理的边界(这不会影响计算,因为几乎没有任何函数的质量发生在该区域之外)。例如:
Like = function(x) sapply(lapply(x, dnorm, x = c(250, 265, 259), 2), prod) # Initial function
norm.cons = integrate(Like, 220, 300)[[1]] # Integral of Initial Function
Like.2 = function(x) sapply(lapply(x, dnorm, x = c(250, 265, 259), 2), prod) / norm.cons
integrate(Like.2, 100, 500)[[1]]
这导致0.9999309
,非常接近您的预期值1.差异是由于数值积分的不精确以及算术下溢(某些值不是0但对于R来说太小)代表)。如果你稍微使用积分的边界,你可以使它更接近1。