从命令行或脚本中使用jags.parallel很好。我可以在http://www.inside-r.org/packages/cran/R2jags/docs/jags上运行这个修改过的示例。
# An example model file is given in:
model.file <- system.file(package="R2jags", "model", "schools.txt")
#=================#
# initialization #
#=================#
# data
J <- 8.0
y <- c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2)
sd <- c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6)
jags.data <- list("y","sd","J")
jags.params <- c("mu","sigma","theta")
jags.inits <- function(){
list("mu"=rnorm(1),"sigma"=runif(1),"theta"=rnorm(J))
}
#===============================#
# RUN jags and postprocessing #
#===============================#
# jagsfit <- jags(data=jags.data, inits=jags.inits, jags.params,
# n.iter=5000, model.file=model.file)
# Run jags parallely, no progress bar. R may be frozen for a while,
# Be patient. Currenlty update afterward does not run parallelly
print("Running Parallel")
jagsfit <- jags.parallel(data=jags.data, inits=jags.inits, jags.params,
n.iter=5000, model.file=model.file)但是,如果我将它包装在一个函数中
testparallel <- functions(out){
# An example model file is given in:
.
.
.
jagsfit <- jags.parallel(data=jags.data, inits=jags.inits, jags.params,
n.iter=5000, model.file=model.file)
print(out)
return(jagsfit)
}然后我得到了错误: get中的错误(name,envir = envir):对象'y‘根据我找到的内容找不到,我知道这是导出到集群的环境中的一个问题,我已经通过更改来修复它。
J <- 8.0
y <- c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2)
sd <- c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6)至
assign("J",8.0,envir=globalenv())
assign("y",c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2),envir=globalenv())
assign("sd",c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6),envir=globalenv()) 有什么更好的办法避开这件事吗?
谢谢你,格雷格
附注:
我正在为其他人编写这段代码,所以我真的不想改变R2jags包中的内容,让我在环境中传递导出,尽管我计划向包的作者推荐它。
发布于 2015-02-10 23:02:16
因此,我联系了R2jags的作者,他在jags.parallel中添加了一个加法参数,让您可以将环境传递给clusterExport。
除了允许我的数据名称与jags.parallel函数中的变量之间发生冲突外,这是很好的。
发布于 2014-05-23 14:38:01
如果您在并行中使用密集的JAGS,我可以建议您将包rjags与包dclone相结合。我认为dclone非常强大,因为语法与rjags完全相同。我从来没见过你对这个包裹有意见。
如果您想使用R2jags,我认为您需要将变量和init函数传递给带有该函数的工作人员:
clusterExport(cl, list("jags.data", "jags.params", "jags.inits"))
发布于 2015-02-10 02:32:04
在不更改R2jags代码的情况下,仍然可以使用list2env以更简单的方式将这些数据变量分配给全局环境。
显然,人们担心这些变量名可能会在全局环境中被覆盖,但是您可能可以控制它。
下面是与最初文章中给出的示例相同的代码,但我将数据放入一个列表,并使用list2env函数将该列表的数据发送到全局环境中。(此外,我在函数中取出了未使用的" out“变量。)对于我来说,这目前运行得很好;但是,您可能需要添加更多的链和/或添加更多的迭代来查看并行性。
testparallel <- function(){
library(R2jags)
model.file <- system.file(package="R2jags", "model", "schools.txt")
# Make a list of the data with named items.
jags.data.v2 <- list(
J=8.0,
y=c(28.4,7.9,-2.8,6.8,-0.6,0.6,18.0,12.2),
sd=c(14.9,10.2,16.3,11.0,9.4,11.4,10.4,17.6) )
# Store all that data explicitly in the globalenv() as
# was previosly suggesting using the assign(...) function.
# This will do that for you.
# Now R2jags will have access to the data without you having
# to explicitly "assign" each to the globalenv.
list2env( jags.data.v2, envir=globalenv() )
jags.params <- c("mu","sigma","theta")
jags.inits <- function(){
list("mu"=rnorm(1),"sigma"=runif(1),"theta"=rnorm(J))
}
jagsfit <- jags.parallel(
data=names(jags.data.v2),
inits=jags.inits,
jags.params,
n.iter=5000,
model.file=model.file)
return(jagsfit)
}https://stackoverflow.com/questions/23790452
复制相似问题