R:数值积分的收敛问题

时间:2018-03-13 23:55:19

标签: r integration numerical-methods convergence probability-distribution

不确定这个数值方法问题是真的应该在这里还是交叉验证,但是因为我有一个很好的可重复的例子,我会从这里开始。

我将对一些大型数据集和从类似分布中随机生成的数据集进行估算和拟合。作为此过程的一部分,我将生成各种值范围的条件均值的估计值,包括右尾的截断和非截断值。

下面的函数cr_moment,给定dfun的pdf函数,params中该函数的参数计算该分布的无条件均值。给定上限,下限或两个边界,它计算这些边界指定范围的条件均值,使用单边界或双截断边界分布。它下面的函数cr_gb2将cr_moment专门化为第二类的广义beta分布。最后,下面提供的参数值接近2000年美国人口普查/ BLS当前人口调查中未经调整的当前美元家庭收入分配。麦当劳& Ransom 2008.(另外,在此列表中获得Mikko Marttila的称赞,以帮助编写此功能)。

此函数使我无法收敛错误,在下面复制,用于各种下限和上限等于4.55e8或更高,但不是4.54e8。对于k

Error in integrate(f = prob_interval, lower = lb, upper = ub, subdivisions = 100L):
   the integral is probably divergent
<45> 4550亿将超过最高可观察收入水平,增加一到两个数量级,但考虑到更广泛的参数值,并使用爬山算法来拟合真实和模拟数据,我想我会在这个墙上碰到许多倍。我对这种情况下的数值方法知之甚少,并且不知道从哪里开始。非常感谢帮助和建议。

cr_moment <- function(lb = -Inf, ub = Inf, dfun, params, v=1, ...){
  x_pdf         <- function(X){
    X^v * do.call(what=dfun, args=c(list(x=X), params))
    }
  prob_interval <- function(X){
    do.call(what=dfun, args=c(list(x=X), params))
    }
  integral_val  <- integrate(f = x_pdf, lower = lb, upper = ub)
  integral_prob <- integrate(f = prob_interval, lower = lb, upper = ub)
  crm <-  interval_val[[1]] / interval_prob[[1]]
  out <- list(value = integral_val[[1]], probability = integral_prob[[1]],  
              cond_moment = crm)
  out
}

library(GB2)
cr_gb2 <- function(lb = -Inf, ub = Inf, v = 1, params){
  cr_moment(lb, ub, dfun = dgb2, params = get("params"))
}

GB2_params <- list(shape1 = 2.2474, scale = 58441.5, shape2 = 0.6186, shape3 = 1.118)

cr_gb2(lb=1, ub= 4.55e8, params = GB2_params)

0 个答案:

没有答案