在 integrate() 失败时集成一个平滑函数

Integrate a smooth function when integrate() fails

提问人:cdalitz 提问时间:7/5/2023 最后编辑:ThomasIsCodingcdalitz 更新时间:7/12/2023 访问量:71

问:

当尝试在 R 中集成以下平滑函数时,我总是得到一个错误,要么是“积分可能是发散的”,要么是“达到的最大细分数”:integrate()

enter image description here

问题似乎是函数在 +/-1 左右接近零,但很难适当地设置限制,增加或减少也无济于事。subdivisionsrel.tol

R(或 R 包)中是否有其他集成例程可供我尝试?例如,是否有可用于等距采样函数的简单辛普森积分的例程?

编辑:正如有人问的那样,这是该函数的实现:

a <- -1
b <- 1
sigma <- 0.1

# P(Y >= t)
PY <- function(t) {
  za <- (t-a)/sigma
  zb <- (t-b)/sigma
  1 + sigma/(b-a) * (zb*pnorm(zb) + dnorm(zb) - za*pnorm(za) - dnorm(za))
}

# P(Y >= t | X=x)
PY.x <- function(t, x) {
  1 - pnorm((t-x)/sigma)
}

# density of Y: p(y)
p.y <- function(y) {
  zb <- (b-y)/sigma
  za <- (a-y)/sigma
  1/(b-a) * (pnorm(zb) - pnorm(za))
}

# Var in numerator
Var.Yt <- function(t) {
  integrand <- function(x) {
    (PY.x(t,x) - PY(t))^2
  }
  integrate(integrand, a, b)$value
}

# THIS IS THE FUNCTION TO BE INTEGRATED
f <- function(t) {
  Var.Yt(t)*p.y(t)
}

对于任何值 ,的计算都成功,但 的积分失败,并出现上述错误。Var.Yt(t)tf

r 数学 数值方法 积分

评论

1赞 ThomasIsCoding 7/5/2023
显示您的流畅功能
0赞 cdalitz 7/5/2023
这有点复杂,因为函数本身是通过调用定义的,不过我已经检查了这种内部集成是否始终适用于任意参数。我会把它添加到我的 qusation 中。integrate
0赞 ThomasIsCoding 7/5/2023
你可以试试pracma::integral()
1赞 Robert Dodier 7/6/2023
(1)取决于你正在努力实现的目标,但无论如何,给定高斯密度及其积分(与erf成正比)的定义,也许可以用sigma为所讨论的积分计算出一个符号表达式。(2) 看起来您可能正在计算高斯分布的条件方差。如果是这样,我认为这有一个已知的结果。例如,参见理查德·冯·米塞斯(Richard von Mises),“概率与统计的数学理论”,如果我没记错的话,第八章。毫无疑问,这样的结果也在其他地方出现。
0赞 cdalitz 7/6/2023
@robert-dodier 是的,我认为积分可以用符号形式计算,因为积分是 x、phi(x) 和 Phi(x) 中的多项式,具有最高阶项 x^2 phi(x)^2 Phi(x)^2,因此它应该可以通过部分积分和 en.wikipedia.org/wiki/List_of_integrals_of_Gaussian_functions 的公式进行计算。目前我没有时间进行这项工作,所以我以失去一些精度为代价,求助于数值积分的“快车道”。数值积分的好处是,我可以针对更复杂的用例调整代码。

答:

4赞 ThomasIsCoding 7/5/2023 #1

我想你忘了在将函数推送到 or 之前对其进行矢量化fintegratepramca::integral

在这里,您可以看到如果我们申请,它们会起作用Vectorize()

> pracma::integral(Vectorize(f), -2, 2)
[1] 0.2799594

> integrate(Vectorize(f), -2, 2)
0.2799594 with absolute error < 5.4e-06

评论

1赞 cdalitz 7/5/2023
啊,是的,就是这样!现在我甚至可以使用限制和.谢谢!-InfInf