为什么我的最终函数在 R 中 "normalized" 时不集成到“1”?

Why my final function doesn't integrate to "1" when "normalized" in R?

我有一个关于 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" ?

您的 norm.cons 变量为 0,这意味着您在 Like.2 中输入的任何内容都会导致 NaN(除以 0)。尝试,例如,

Like.2(3) # results in NaN

之所以norm.cons为0,是因为几乎除200-300左右以外的所有值都是0,数值积分太不精确,找不到区域它不是 0 的地方。例如,try:

Like(220) # 3.471218e-244
Like(300) # 2.661608e-296

# outside of that region:
Like(200) # 0
Like(320) # 0

要解决此问题,请围绕您的两个积分设置更合理的界限(这不会影响计算,因为几乎 none 函数的质量发生在该区域之外)。例如:

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。