';奇怪';R中带truncdist的积分函数的行为

';奇怪';R中带truncdist的积分函数的行为,r,numerical-integration,integrate,R,Numerical Integration,Integrate,从数学上来说,以下是不可能的 library(truncdist) q = function(x, L, R ) dtrunc(x, "exp", rate=0.1, a=L,b=R) integrate(q, L=2, R=3, lower =0, upper = 27 ) integrate(q, L=2, R=3, lower =0, upper = 29 ) integrate(q, L=2, R=3, lower =27, upper = 29 ) integrate(q, L

从数学上来说,以下是不可能的

library(truncdist)
q = function(x, L, R ) dtrunc(x, "exp", rate=0.1, a=L,b=R) 
integrate(q, L=2, R=3, lower  =0, upper = 27 )
integrate(q, L=2, R=3, lower  =0, upper = 29 )
integrate(q, L=2, R=3, lower  =27, upper = 29 )
integrate(q, L=2, R=3, lower  =0, upper = 30 )
我们发现第一个积分给出一个正数,第二个积分通过将自身积分为零的第三个区间相加而计算为零。这是
integrate
truncdist
中的问题吗

我们可以使用以下内容来查找更多此类问题

z=numeric()
for(i in 1:50){
  z[i]=integrate(q, L=2, R=3, lower  =0, upper = i)$value
}
我需要做什么才能找到正确的积分(从0积分到
I>=3
),这些积分都是1?

来自
帮助(“积分”)

与所有数值积分例程一样,这些例程在有限的点集上计算函数。如果函数在几乎所有范围内近似为常数(特别是零),则结果和误差估计可能严重错误

您发现了这样一个示例:

curve(q(x, 2, 3), from = -1, to = 30)

你不应该对分布密度函数进行数值积分。使用累积分布函数:

diff(ptrunc(c(0, 29), "exp", rate = 0.1, a = 2, b = 3))
#[1] 1

我在这篇文章中找到了另一个答案:


使用
hcubature
这个问题可以用数字来解决,这与我原来的问题更接近。

我想这样做,但在我的应用程序中,积分是通过密度与另一个函数x和x本身的乘积来定义的。所以我认为我不能这样做?没有细节我不能说。但是,如果您知道截断的界限,您只需要在这些界限内集成乘积。这避免了这个问题。