如何传递向量集成函数

时间:2012-08-21 15:36:19

标签: r

我想整合一个具有向量fun_integrate的函数vec作为输入参数:

fun_integrate <- function(x, vec) { 
  y <- sum(x > vec)
  dnorm(x) + y
}

#Works like a charm
fun_integrate(0, rnorm(100))

integrate(fun_integrate, upper = 3, lower = -3, vec = rnorm(100))
300.9973 with absolute error < 9.3e-07
Warning message:
  In x > vec :
  longer object length is not a multiple of shorter object length

据我所知,问题如下:integrate调用fun_integratex的向量,它根据upper和{{1}进行计算}}。这个向量化调用似乎不适用于作为附加参数传递的另一个向量。我想要的是lower为内部计算的每个integrate调用fun_integrate,并将该单x与向量x进行比较,我就是{m}非常确定我的上述代码不会这样做。

我知道我自己可以实现集成例程,即在veclower之间计算节点,并分别评估每个节点上的函数。但这不是我的首选解决方案。

另请注意,我检查了upper,但这似乎适用于另一个问题,即函数不接受Vectorize的向量。我的问题是我想要一个额外的矢量作为参数。

2 个答案:

答案 0 :(得分:3)

integrate(Vectorize(fun_integrate,vectorize.args='x'), upper = 3, lower = -3, vec = rnorm(100),subdivisions=10000)

304.2768 with absolute error < 0.013


#testing with an easier function
test<-function(x,y) {
  sum(x-y)
}

test(1,c(0,0))
[1] 2

test(1:5,c(0,0))
[1] 15
Warning message:
In x - y : 
longer object length is not a multiple of shorter object length

Vectorize(test,vectorize.args='x')(1:5,c(0,0))
[1]  2  4  6  8 10

#with y=c(0,0) this is f(x)=2x and the integral easy to solve
integrate(Vectorize(test,vectorize.args='x'),1,2,y=c(0,0))
3 with absolute error < 3.3e-14 #which is correct

答案 1 :(得分:2)

罗兰的回答看起来不错。只是想指出它是sum,而不是integrate抛出警告信息。

Rgames> xf <- 1:10
Rgames> vf <- 4:20
Rgames> sum(xf>vf)
[1] 0
Warning message:
In xf > vf :
 longer object length is not a multiple of shorter object length

您得到的答案不正确的事实表明integrate没有向您的函数发送您期望的x向量。