我已经建立了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,...)
吗?