更新:使用R的并行计算导致“尝试复制'闭包'类型的对象'”

时间:2015-05-12 15:46:59

标签: r mcmc parallel-foreach doparallel

我已经建立了Metropolis-Hastings算法,现在我尝试使用并行计算来运行算法。我已经设置了单链函数

library(parallel)
library(foreach)
library(mvtnorm)
library(doParallel)

n<-100
mX <- 1:n
vY <- rnorm(n)
chains <- 4
iter <- n
p <- 2

#Loglikelihood
post <- function(y, theta)  dmvnorm(t(y), rep(0,length(y)), theta[1]*exp(-         abs(matrix(rep(mX,n),n) - matrix(rep(mX,each=n),n))/theta[2]),log=TRUE)

geninits <- function()  list(theta = runif(p, 0, 1))

dist <- 0.01
jump <- function(x, dist)  exp(log(x) + rmvnorm(1,rep(0,p),diag(rep(dist,p))))

MCsingle <- function(){ # This is part of a larger function, so no input are needed
 inits <- geninits()
 theta.post <- matrix(NA,nrow=p,ncol=iter)
 for (i in 1:p) theta.post[i,1] <- inits$theta[i]
 for (t in 2:iter){
  theta_star <- c(jump(theta.post[, t-1],dist))
  pstar <- post(vY, theta = theta_star) # post is the loglikelihood using dmvnorm.
  pprev <- post(vY, theta = theta.post[,t-1])
  r <- min(exp(pstar - pprev) , 1)
  accept <- rbinom(1, 1, prob = r)
  if (accept == 1){
   theta.post[, t] <- theta_star
   } else {
    theta.post[, t] <- theta.post[, t-1]
   }
 }
return(theta.post)
}

,返回带有p参数和 iter 迭代的 p x iter 矩阵。

cl<-makeCluster(4)
registerDoParallel(cl)
posterior <- foreach(c = 1:chains) %dopar% {
MCsingle()  }

更新:当我试图简化问题时,代码突然似乎有效。尽管我故意试图犯错误,但代码运行得很完美,结果也是如此。因此,对于有类似问题的其他人,我不能给出答案。

后续问题: 我最初的目的是建立一个完整的功能,例如

MCmulti <- function(mX,vY,iter,chains){
    posterior <- foreach(c = 1:chains) %dopar% {
    MCsingle()  }
    return(posterior)
   }

但foreach-loop似乎没有读取所有必需的函数,如:

Error in FUN() : task 1 failed - "could not find function "geninits"" 

有人可以回答如何在foreach循环中实现自定义函数吗?我要将其输入MCmulti <- function(FUN,...) FUN()并致电MCmulti(MCsingle,...)吗?

0 个答案:

没有答案