2016-03-24 10 views
5

これは私に3日以上の間悩まされていますが、まだ解決策に一歩近づいていないので、ここで私の運を試してみようと思います。過去にはRでの積分/積分:キャッチを見つける

は、私は特定の1つのソートされたデータセットのいくつかのコードを書いたのだが、このように書きます:完璧に動作

n <- length(data) 
maxobs <- max(data) 
minobs <- min(data) 
FG <- function(m=NULL, h = NULL){ 
    n<- length(data) #Number of observations 
    if (m<minobs){FG = 0} else { 
     if (m >maxobs){FG = 1} else { 
        FG = sum(pnorm((m - data)/h)-pnorm((minobs-data)/h))/sum(pnorm((maxobs - data)/h)-pnorm((minobs-data)/h)) 
    }} 
    return(FG) 
} 

f<- function(m,h){ 
    f<- FG(m,h)^n 
    return(f) 
} 

##Integration 
max <- NULL 
delta<- function(h,max=maxobs){ 
    delta <- integrate(Vectorize(f), minobs, max, h)$value 
    return (delta) 
} 

。 1のデータを選択した場合たとえば、:=のC(1,2,3,4,5)を、1は

> delta(0.1, maxobs) 
[1] 0.6300001 

ために正しい結果を得るしかし、今私は、各ソートされたデータセットのためにそれを一般化しようとしていますだったので、私がやった(明確にする:データセットxは前行使、これらすべての機能をソートする)

FG <- function(x, m=NULL, h = NULL){ 
    n<- length(x) #Number of observations 
    maxobs <- max(x) 
    minobs <- min(x) 
    if (m<minobs){FG = 0} else { 
    if (m >maxobs){FG = 1} else { 
     FG = sum(pnorm((m - x)/h)-pnorm((minobs-x)/h))/sum(pnorm((maxobs - x)/h)-pnorm((minobs-x)/h)) 
    }} 
    return(FG) 
} 

f<- function(x,m,h){ 
    n <- length(x) 
    f<- FG(x,m,h)^n 
    return(f) 
} 

##Integration 
delta<- function(x,h,maxu= max(x)){ 
minobs <- min(x) 
    delta <- integrate(Vectorize(f), minobs, maxu, h)$value 
    return (delta) 
} 

をしかし、今、delta(data,0.1)はdoesnの

delta(data,0.1) 
[1] 0. 

います私には意味がありません。同じ関数、同じデータセットですが、間違った値になりました。私は間違って何をしていますか?

ご迷惑をおかけして申し訳ございません。

EDIT: ベクタライズ機能に近い見てみると機能を統合した後、私は今まで私のデルタ関数を編集した:

delta<- function(x,h,maxu= max(x)){ 
minobs <- min(x) 
    delta <- integrate(Vectorize(f, vectorize.args= c("m","h")), minobs, maxu, h)$value 
    return (delta) 
} 

が、これは今ちょうど別のエラーが発生:

Error in integrate(Vectorize(f, vectorize.args = c("m", "h")), lower = minobs, : evaluation of function gave a result of wrong length

私はこのようなエラーを防ぐためにVectorizeが考えられましたか?

答えて

6

ここでの主な問題は、integrateは、最初の引数として統合する変数を持つことが予想されることです。最初のコードセットでは、mを使って統合しています。 2番目のセットでは、xを超えて統合しようとしています。

最短編集integrateために必要な順序で引数を配置するためにヘルパー関数を作ることです。

delta<- function(x,h,maxu= max(x)){ 
    minobs <- min(x) 
    g <- function(m) f(x,m,h) 
    return(integrate(Vectorize(g), minobs, maxu)$value) 
} 

あなたが望む結果

delta(data,0.1) 
# [1] 0.6300001 

を取得します今、私はソースを信じますあなたの2番目のエラーはhをベクトル化しようとしていたためですが、実際にはmをベクトル化するだけでした。上のヘルパー関数のアプローチは、統合したい変数を公開するだけで、この問題を解決します。

私はあなたが本当にここでやろうとしているものを言うことはできませんが、私はまた、あなたの実装と同等である必要があり、この書き換えを提供していますが、おそらく従うことが少し簡単ですよ注:

FG <- function(m, x, h) { 
    n <- length(x) 
    d <- function(t) pnorm((t-x)/h) 

    if(m < x[1]) return(0) 
    if(m > x[n]) return(1) 

    return(sum(d(m)-d(x[1]))/sum(d(x[n])-d(x[1]))) 
} 

f<- function(m, x, h){ 
    n <- length(x) 
    mapply(function(m) FG(m,x,h)^n, m) 
} 

delta<- function(x, h, lb=x[1], ub=x[length(x)]) { 
    return(integrate(f, lb, ub, x, h)$value) 
}