我正在尝试从R中并行运行EasyABC包中的ABC_sequential()函数。但是我遇到了错误:
checkForRemoteErrors(val)中的错误:2个节点产生了错误;第一个错误:找不到函数“ f”
我认为这是因为ABC_sequential()最终会调用parLapplyLB()(https://github.com/cran/EasyABC/blob/master/R/EasyABC-internal.R),我必须使用clusterExport()导出函数?(parSapply在全局环境中找不到对象)
因为该函数在其中调用了makeCluster(),所以看来我可能需要修改软件包才能添加clusterExport(cl, "f")
?但是,由于我是一个新手,所以我没有考虑根据自己的需要修改软件包(而且我怀疑它可能比添加一行代码要复杂得多)。我想知道是否有更好/更轻松的解决方法来使我的功能进入并行节点?以下是基于R帮助中ABC_sequential给出的并行示例的简化可复制示例:
library(EasyABC)
f <- function(x){
x = x^2
}
toy_model_parallel <- function(x){
set.seed(x[1])
2 * x[2] + f(2) + rnorm(1,0,0.1)
}
sum_stat_obs <- 6.5
pacc <- .4
toy_prior <- list(c("unif",0,1)) # a uniform prior distribution between 0 and 1
# this line of code gives the checkForRemoteErrors(val) error
ABC_Lenormand <- ABC_sequential(method="Lenormand", model=toy_model_parallel, prior=toy_prior, nb_simul=20, summary_stat_target=sum_stat_obs, p_acc_min=pacc, use_seed=TRUE, n_cluster=2)
}
任何意见是极大的赞赏。
您可以在模型函数中定义任何必要的辅助函数。在这种情况下:
toy_model_parallel <- function(x){
f <- function(x){
x = x^2
}
set.seed(x[1])
2 * x[2] + f(2) + rnorm(1,0,0.1)
}
看来您需要在此函数的开头进行任何工作程序初始化。因此,如果您的函数需要从另一个包中调用函数,则还需要在模型函数的开头加载该包。
我建议您向软件包开发人员发送电子邮件,以查看他们是否有更好的解决方案。如果没有,您可能会要求他们添加对用户指定的集群对象的支持。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句