首页 > 解决方案 > 在 R 中集成函数与 truncdist 的“奇怪”行为

问题描述

在数学上,以下是不可能的

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 )

我们发现第一个积分给出一个正数,第二个积分通过添加将自身积分为零的第三个区间计算为零。这是integrateor的问题truncdist吗?

我们可以通过以下方式找到更多此类问题

z=numeric()
for(i in 1:50){
  z[i]=integrate(q, L=2, R=3, lower  =0, upper = i)$value
}

我需要做什么才能找到正确的积分(从 0 到 积分时全部为 1 i>=3)?

标签: rnumerical-integrationintegrate

解决方案


来自help("integrate")

像所有数值积分例程一样,它们在有限的点集上评估函数。如果函数在其几乎所有范围内近似恒定(特别是零),则结果和误差估计可能严重错误。

你找到了一个例子:

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

结果图

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

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

推荐阅读