私はMarkov Chain Monte CarloサンプラーをRで構築しています。その背景には、並列に(独立して)更新され、ある時点で相互作用するChainsの集団があります。 私がしたいのは、コード全体が実行に時間がかかるため、独立した更新を並列化することです。 しかし、foreachは値を返さなければならないので適切ではないようですが、私はそれらを更新する必要があります。誰もこの問題を抱えていて、スマートな解決策を考え出しましたか?R関数のinner forループを並列化する
population_MCMC <- function(niter, burnin,thin ,th0, T_N ,Sig, y0, log_target)
{
# th0 will be updated at each step, th will contain the output of interest (that is, when T_N = 1)
th <- matrix(nrow= ceiling((niter-burnin)/thin), ncol=2)
nacp = 0 # number of accepted moves
for(i in 1:(niter))
{
for(j in 1:length(T_N)){ # <-- THIS IS THE FOR LOOP I WANT TO PARALLELIZE!
#this is the local change
delta = as.vector(rmvnorm(1, mean = th0[j,], sig = Sig))
lacp <- log_target(th = delta, y_obs = y_obs, y0 = y0, t_n=T_N[j])
lacp <- lacp - log_target(th = th0[j,], y_obs = y_obs, y0 = y0, t_n=T_N[j])
#cat(lacp,"\n")
lgu <- log(runif(1))
if(!(is.na(lacp)) & lgu < lacp)
{
th0[j,] <- delta
nacp = nacp + 1
}
}
# Try to exchange theta_l and theta_m where m = l+1 or m= l-1 if l=! 1 and l=! length(T_N)
..... some other markovian stuff .....
if(i>burnin & (i-burnin)%%thin==0){
th[(i-burnin)/thin,] = th0[length(T_N),]
}
if(i%%1000==0) cat("*** Iteration number ", i,"/", niter, "\n")
}
cat("Acceptance rate =", nacp/niter, "\n")
return(th)
}
EDIT:それは、ベンチマークのために役立つことができた場合、あなたは特に問題はありません
https://github.com/mariob6/progetto_bayes/blob/master/population_basedMC.R
は、このソースファイル https://github.com/mariob6/progetto_bayes/blob/master/simple_oscillator.R
パラレルパッケージの 'parLapply'はどうですか? – snaut