3

入力パラメーターとして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呼び出します。このベクトル化された呼び出しは、追加の引数として渡される別のベクトルでは機能しないようです。私が望むのは、内部で計算するfor eachを呼び出し、そのシングルをベクトルと比較することです。上記のコードではそれが行われないと確信しています。fun_integratexupperlowerintegratefun_integratexxvec

私は統合ルーチンを自分で実装できることを知っています。つまり、 と の間のノードを計算lowerupper、各ノードの関数を個別に評価します。しかし、それは私の好ましい解決策ではありません。

また、 をチェックVectorizeしましたが、これは別の問題、つまり関数が のベクトルを受け入れないという問題に当てはまるようですx。私の問題は、引数として追加のベクトルが必要なことです。

4

2 に答える 2

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
于 2012-08-21T17:45:04.733 に答える
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-vector を関数に送信していないことを示唆しています。

于 2012-08-21T17:45:12.477 に答える