为什么我的最终功能在R中“标准化”时没有集成到“1”?

时间:2017-05-01 15:26:17

标签: r function statistics bayesian integral

我有关于integrate()的编码问题。它来自几个步骤:

首先,我有一个名为Like的初始函数。 第二次,我得到Like的积分并调用结果norm.cons第三,我将Like除以norm.cons并调用结果Like.2最后,我得到Like.2的积分。 ( 以下提供所有R代码。

问题:

根据定义,我上面最后一步的答案应该是“1”。但为什么我会得到以下答案? 4.573253e-12

这是我的R代码:

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" ?

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。