我正在做一个EM估计,在M步骤中我需要最大似然估计,它有24个参数。我在R中尝试了nlm / optim / maxLik函数。它们都很慢。欢迎任何建议。谢谢。这是LogL函数:(选择,M,S,K,N和Alpha都是已知的。)
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)
答案 0 :(得分:9)
我建议你让你的代码更整洁。始终如一。您可以更轻松地阅读代码并进行改进。
据我所知,你有三个循环。所有这些都可以并行完成,不是吗?你为什么用for
做一个循环,用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)))
}