1

そのため、具体的に 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() を実行するにはどうすればよいですか?

4

1 に答える 1

4

yあなたのデータであり、コードでそれを指定していません。したがって、エラー Error in nrow(y) : object 'y' not found

同じ pdf ファイルの例 5 に進み、以下で定義されているようにデータ y を使用すると、出力が得られます。

X<-cbind(1,runif(100))
theta.true<-c(2,3,1)
y<-X%*%theta.true[1:2] + rnorm(100)

> optim(c(0,1),normal.lik1,y=y,method="BFGS")
$par
[1] 3.507266 1.980783

$value
[1] 176.0685

$counts
function gradient 
      49       23 

$convergence
[1] 0

$message
NULL

Warning messages:
1: In log(sigma2) : NaNs produced
2: In log(sigma2) : NaNs produced
3: In log(sigma2) : NaNs produced

注:関数の基本を理解するには、「R の紹介」を参照してください。

更新: コメントのとおり: 試してみて、何が起こるかを確認できます:

y<-X%*%theta.true++ rnorm(100)
Error in X %*% theta.true : non-conformable arguments
于 2013-08-24T17:56:06.657 に答える