R integrated:返回错误的解决方案(使用错误的正交点?)

时间:2014-08-30 18:01:19

标签: r integrate numerical-integration

我在R中有一个函数正在尝试集成,但对于函数参数的某些(极端)值,integrate会返回不正确的解决方案。我认为问题可能是integrate为某些极端值选择了不正确的正交点,但首先我将提供证明该问题。

我希望整合的功能如下。

integrandFunc_F <- function(x, func_u, func_u_lowerBar, 
  func_u_upperBar, func_mean_v, func_sigma_v, func_sigma_epsilon, 
  func_sigma_y, func_gamma, func_rho) {
#print(x);
p <- 1 - pnorm(func_u_upperBar,x,func_sigma_y);
q <- pnorm(func_u_lowerBar,x,func_sigma_y);
p <- p*(1-func_rho); q <- q*(1-func_rho);
alpha <- ifelse(func_gamma*(p+q) == 0, 0, pmax((func_gamma*p-q)/(func_gamma*(p+q)), 0));
g <- ifelse(x > func_u, dnorm(x,func_mean_v,sqrt(func_sigma_v^2 + func_sigma_epsilon^2))/(1-pnorm(func_u,func_mean_v,sqrt(func_sigma_v^2 + func_sigma_epsilon^2))), 0);
output <- alpha*g;
output
}

当我尝试计算以下内容时,我得到1的正确解决方案:

integrate(integrandFunc_F, lower=-Inf, upper=Inf, func_u= 8, func_u_lowerBar= 8, 
  func_u_upperBar= 8, func_mean_v= 30, func_sigma_v= .1, func_sigma_epsilon= 2, 
  func_sigma_y= 1, func_gamma= 1/1.1, func_rho= .05)

但是,当我尝试计算以下内容时,我得到了错误的解决方案0:

integrate(integrandFunc_F, lower=-Inf, upper=Inf, func_u= 8, func_u_lowerBar= 8, 
  func_u_upperBar= 8, func_mean_v= 50, func_sigma_v= .1, func_sigma_epsilon= 2, 
  func_sigma_y= 1, func_gamma= 1/1.1, func_rho= .05)

上面我表示我相信这个问题可能与正交点的选择有关。如果您在上述函数中取消注释#print(x),则可以在func_mean_v = 30情况下看到integrate在相对较大/接近30的正交点上建立。但是,在{{1}中} case,经过几次迭代func_mean_v=50选择接近0的正交点。接近0的正交点不适合评估此函数,该函数包含均值为integrate的正态分布

有关如何解决此问题的任何想法?为什么func_mean_v.在某些情况下会迭代到0附近的正交点?请注意,integratefunc_mean_v = 30的选择无疑是此功能的极端参数,但我需要能够正确计算此类情况。

1 个答案:

答案 0 :(得分:1)

你可以将积分变量移动到峰值中心,

wrapper <- function(x, func_mean_v, ...)
   integrandFunc_F(x+func_mean_v, func_mean_v=func_mean_v, ...)


integrate(wrapper, rel.tol = 1e-8, lower=-Inf, upper=Inf, func_u= 8, func_u_lowerBar= 8, 
          func_u_upperBar= 8, func_mean_v= 50, func_sigma_v= .1, func_sigma_epsilon= 2, 
          func_sigma_y= 1, func_gamma= 1/1.1, func_rho= .05)
# 1 with absolute error < 1.3e-09