积分错误:“upper”的长度必须为1

jecbmhm3  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(116)
fl=function(q,a=-23.0344,b=10.0249) (b/q)*dnorm((a+b*log(q)),0,1)

Fl=function(h) integrate(fl,lower=0,upper=h)$value

Fz=function(z){
  integrand=function(x){
    Fl((x-z)*10)*fl(10*x)
  }
  1-10*integrate(integrand,0,Inf)$value
}
library(GoFKernel)
inv=inverse(Fz,lower=-100000,upper=100000)

为什么会出现此错误?“积分错误(fl,下限= 0,上限= h):'upper'的长度必须为1”
我该怎么解决呢?

iszxjhcz

iszxjhcz1#

正如注解中所建议的那样,当您运行integrate()时,它会尝试计算被积函数的值向量。

> traceback()
9: stop(simpleError(msg, call = if (p <- sys.parent(1L)) sys.call(p)))
8: stopifnot(length(lower) == 1, length(upper) == 1)
7: integrate(fl, lower = 0, upper = h) at #1
6: Fl((x - z) * 10) at #3
5: f(x, ...)
4: (function (x) 
   f(x, ...))(c(1, 233.065168689948, 0.00429064542600244, 38.2988398013854, 
   0.0261104515224461, 13.7999516465199, 0.072464022020844, 6.73787740945863, 
   0.148414691931943, 3.83193602946711, 0.260964690514175, 2.36612585866545, 
   0.422631787036055, 1.52456705113438, 0.655923922306948))
3: integrate(integrand, 0, Inf) at #5
2: f(lower)
1: inverse(Fz, lower = -1e+05, upper = 1e+05)

我尝试对Fl函数进行矢量化(有多种方法可以做到这一点:VectorizeMappurrr::mapvapply() ......但我使用了一个很好的老式for循环)

Fl <- function(h) {
   res <- numeric(length(h))
   for (i in seq_along(h)) {  
      res[i] <- integrate(fl,lower=0,upper=h[i])$value
   }
   res
}

一旦这是固定的,我们打。
积分误差(fl,下限= 0,上限= h[i]):非有限函数值
我们还得到一个警告,即log(q)是为q的负值调用的,这将产生一个NaN,它将使下游的一切都变得混乱。
我们可以设置options(error = browser),但是我在这方面遇到了麻烦,相反,我设置了一个检查点,如果q使用负值(这将不可避免地导致麻烦):

fl=function(q,a=-23.0344,b=10.0249) {
   if (any(q <= 0)) browser()
   (b/q)*dnorm((a+b*log(q)),0,1)
}

当我被扔到浏览器中时,我尝试:

print(q)
 [1] -499995.000  -13046.605 -986943.395  -67467.642 -932522.358 -160293.613
 [7] -839696.387 -283299.470 -716690.530 -425558.575 -574431.425   -2171.397
[13] -997818.603  -34920.905 -965069.095 -109590.041 -890399.959 -218619.246
[19] -781370.754 -352800.041 -647189.959

所以你必须考虑你在做什么(TBH我还没有试图弄清楚你代码的逻辑),以及你是否无意中在不允许的情况下在负范围上计算表达式。

相关问题