【问题标题】:'Strange' behavior of integrate function with truncdist in R在 R 中集成函数与 truncdist 的“奇怪”行为
【发布时间】:2020-06-10 06:54:24
【问题描述】:

在数学上以下是不可能的

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 )

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

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

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

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

【问题讨论】:

    标签: r numerical-integration integrate


    【解决方案1】:

    来自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
    

    【讨论】:

    • 我想,但在我的应用程序中,积分是通过密度与 x 和 x 本身的另一个函数的乘积来定义的。所以我认为我不能这样做?
    • 不能说没有细节。但是如果你知道截断的范围,你只需要在这些范围内整合产品。这样就避免了这个问题。
    【解决方案2】:

    我在这篇文章中找到了另一个答案:Integration in R with integrate function

    使用hcubature 可以用数值方式解决问题,这更接近我原来的问题。

    【讨论】:

      猜你喜欢
      • 2015-12-06
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2023-03-09
      相关资源
      最近更新 更多