整合在R中的积分

时间:2016-03-29 05:09:52

标签: r integral

我想在R中解决以下问题:

0 H [π( t )∫ t H A x )dx] dt

其中π(t)是先验,A(x)是下面定义的A函数。

prior <- function(t) dbeta(t, 1, 24)
A     <- function(x) dbeta(x, 1, 4)
expected_loss <- function(H){
  integrand     <- function(t) prior(t) * integrate(A, lower = t, upper = H)$value
  loss          <- integrate(integrand, lower = 0, upper = H)$value
  return(loss)
} 

由于π(t),A(x)> 0,expected_loss(.5)应小于expected_loss(1)。但这不是我得到的:

> expected_loss(.5)
[1] 0.2380371
> expected_loss(1)
[1] 0.0625

我不确定我做错了什么。

2 个答案:

答案 0 :(得分:8)

integrand lower = t中,t没有向量化,因此对整合的调用并没有达到预期的效果*。对expected_loss <- function(H){ integrand <- function(t) prior(t) * integrate(A, lower = t, upper = H)$value vint <- Vectorize(integrand, "t") loss <- integrate(vint, lower = 0, upper = H)$value return(loss) } expected_loss(.5) # [1] 0.7946429 expected_loss(1) # [1] 0.8571429 进行矢量化可解决此问题,

integrate

*:仔细观察crontab,我们会默默地允许将向量传递到较低和/或较高的位置,但只考虑了第一个值。当在更宽的区间内积分时,正交方案从原点进一步选择了第一个点,导致您观察到的不直观的减少。

在向r-devel报告此行为后,this user-error will now be caught by integrate感谢Martin Maechler(R-devel)。

答案 1 :(得分:6)

在这种特殊情况下,您不需要Vectorize,因为dbeta的积分已在R到pbeta中实现。试试这个:

prior <- function(t) dbeta(t, 1, 24)
#define the integral of the A function instead
Aint     <- function(x,H) pbeta(H, 1, 4) - pbeta(x,1,4)
expected_loss <- function(H){
  integrand<-function(x) Aint(x,H)*prior(x)
  loss          <- integrate(integrand, lower = 0, upper = H)$value
  return(loss)
}
expected_loss(.5)
#[1] 0.7946429
expected_loss(1)
#[1] 0.8571429