为什么我的最终函数在 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。
我有一个关于 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。