そのため、具体的に 4 つのパラメーターに基づいて対数尤度を計算し、それらを特定の対数関数に入れるスクリプトに取り組んできました。そのスクリプトは問題ありません。問題はそれを最適化することです-私が試みるたびに、(問題のパラメーターの) オブジェクトが見つからないと言われます。簡単にするために、optim() 関数を使用すると同じエラーが発生する、はるかに単純なスクリプトを使用します。おもしろいのは、このスクリプトを「 MLE in R」チュートリアルから実際に引き出したことです。私はそれを書き直すことさえしませんでした.PDFから文字通りコピー/貼り付けしました. チュートリアルの尤度関数は次のとおりです。
normal.lik1<-function(theta,y){
mu<-theta[1]
sigma2<-theta[2]
n<-nrow(y)
logl<- -.5*n*log(2*pi) -.5*n*log(sigma2) - (1/(2*sigma2))*sum((y-mu)**2)
return(-logl)
}
この機能は、それ自体で完全に正常に機能します。ただし、最適化しようとすると、最適化しようとしているパラメーターであるオブジェクトが見つからないというエラーが表示されます。この次の行もチュートリアルからコピー/貼り付けされています。
optim(c(0,1),normal.lik1,y=y,method="BFGS")
この行を実行すると、R から次のエラーが表示されます。
Error in nrow(y) : object 'y' not found
これは、y が関数内の具体的なオブジェクトであり、グローバル オブジェクトではなく、同時に optim() がまさにその関数を評価することになっていることについて話していることにすぐに気付きました! だから、yが存在しないように振る舞う理由がわかりません。
編集:
今、私はそれがどのように機能するかを理解しています。しかし、全体的な目標にはまだ問題があります。より大局的に見るために、ここに私が現在取り組んでいるコードがあります:
w.loglik<-function(w){
# w is just a vector with 4 values: two means (w(1) and w(2) below) and the position
# of two decision bounds (w(3) and w(4))
#create data matrix
data<-matrix(c(140,36,34,40,89,91,4,66,85,5,90,70,20,59,8,163),nrow=4,ncol=4,byrow=TRUE)
# get means
means<-matrix(0,4,2,byrow=TRUE)
means[2,1]<-w[1]
means[3,2]<-w[2]
means[4,1]<-w[1]
means[4,2]<-w[2]
# get covariance matrices (fix variances to 1)
covmat<-list()
covmat[[1]]<-diag(2)
covmat[[2]]<-diag(2)
covmat[[3]]<-diag(2)
covmat[[4]]<-diag(2)
# get decision bound parameters
b<-diag(2)
c<-matrix(c(w[3],w[4]),2,1)
L<-matrixloglik(data,means,covmat,b,c)
return(L)
}
matrixloglik は、対数尤度を出力する単なる関数です (正常に動作します)。ベクトル w を最適化するために optim() を実行するにはどうすればよいですか?