首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的MLE非常慢

R中的MLE非常慢
EN

Stack Overflow用户
提问于 2012-12-12 16:36:58
回答 1查看 865关注 0票数 0

我正在做EM估计,在M步,我需要最大似然估计,它有24个参数。我在R中尝试了nlm/optim/maxLik函数,它们都非常慢。欢迎提出任何建议。谢谢。这是LogL函数:(选项M、S、K、N和Alpha是已知的。)

代码语言:javascript
复制
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)}

我想要得到的是:

代码语言:javascript
复制
ops=nlm(logl,theta.start,choices=choices,M=M,S=2,K=11,N=3,Alpha=Alpha,hessian=TRUE)
EN

回答 1

Stack Overflow用户

发布于 2012-12-12 21:52:09

我建议你让你的代码更加整洁。保持一致。这将使您更容易阅读代码并对其进行改进。

据我所知,你有三个循环。所有这些都可以并行完成,不是吗?为什么你要用for做一个循环,用foreach做另外两个循环?这有什么原因吗?

这个assignment loglik <- for (n in 1:N)是做什么用的?

这里可以使用foreach中的.combine参数。有一个用于嵌套循环的%:%运算符。

试图改进代码。然而,我不确定我是否理解正确。并且不确定它是否比你的更快。可重复的例子是必要的,以给出更准确的答案与时间。

代码语言:javascript
复制
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)))
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13844361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档