0

私は EM 推定を行っています。その M ステップでは、24 個のパラメーターを持つ最大尤度推定が必要です。R で nlm/optim/maxLik 関数を試してみました。どれも非常に遅いです。どんな提案でも大歓迎です。ありがとう。これは LogL 関数です: (選択肢、M、S、K、N、およびアルファが知られています。)

logl <- function(theta,choices,M,S,K,N,Alpha){

betas <- theta[(1:(S*(K+1)))]
betas<-matrix(betas,S,K+1,byrow=TRUE)

loglik <-for (n in 1:N){
pr1s=foreach (s=1:S) %dopar%{ 
pr11=foreach (i = 1:K) %dopar%{ 
exp(sum(betas[s,]*choices[[n]][i,]))/exp(sum(M[[i]]%*%betas[s,]))}
pr11=as.numeric(pr11)
prod(pr11) 
}
pr1sn=as.numeric(pr1s) 

l[n]= sum(Alpha*pr1sn)
}
L=-sum(log((l)))
return(L)}

私が取得したいのは:

ops=nlm(logl,theta.start,choices=choices,M=M,S=2,K=11,N=3,Alpha=Alpha,hessian=TRUE)
4

1 に答える 1

9

コードをもっときれいにすることをお勧めします。一貫性を保ちます。コードを読みやすく、改善しやすくなります。

私が理解しているように、3つのループがあります。それらはすべて並行して実行できますね。forで 1 つのループを実行し、他の 2 つを で実行するのはなぜforeachですか? それには理由がありますか?

この任務loglik <- for (n in 1:N)は何のためですか?

ここで使用できる.combine議論があります。ネストされたループ用foreachの演算子があります。%:%

コードの改善を試みました。ただし、正しく理解できているかどうかはわかりません。そして、それがあなたのものより速いかどうかはわかりません。タイミングでより正確な答えを出すには、再現可能な例が必要です。

logl <- function(theta, choices, M, S, K, N, Alpha) {
  betas <- theta[(1:(S*(K+1)))]
  betas <- matrix(betas, S, K+1, byrow=TRUE)

  l <- foreach(n = 1:N, .combine = c) %:%
    foreach(s = 1:S, .combine = sum) %:%
      foreach(i = 1:K, .combine = prod) %dopar% {
        exp(sum(betas[s,] * choices[[n]][i,])) / exp(sum(M[[i]] %*% betas[s,]))
      }

  return(-sum(log(Alpha * l)))
}
于 2012-12-12T13:52:08.540 に答える