如何将自定义函数加载到 R 中的 foreach 循环中?

Posted

技术标签:

【中文标题】如何将自定义函数加载到 R 中的 foreach 循环中?【英文标题】:How can I load custom functions into foreach loop in R? 【发布时间】:2021-08-11 04:13:28 【问题描述】:

我正在尝试运行具有特定空间相关结构的 gls 模型,该结构来自于修改 nlme 包/在全局环境中从这个 post 构建新函数(这篇文章的答案创建了允许相关结构的实现)。不幸的是,当我通过 foreach 循环运行它时,我无法让这个空间相关结构工作:

#setup example data
data("mtcars")
mtcars$lon = runif(nrow(mtcars)) #include lon and lat for the new correlation structure
mtcars$lat = runif(nrow(mtcars))
mtcars$marker = c(rep(1, nrow(mtcars)/2), rep(2, nrow(mtcars)/2)) #values for iterations

#set up cluster
detectCores()
cl <- parallel::makeCluster(6, setup_strategy = "sequential")
doParallel::registerDoParallel(cl)

#run model
list_models<-foreach(i=1:2, .packages=c('nlme'), .combine = cbind,
                     .export=ls(.GlobalEnv)) %dopar% 
                    
                       .GlobalEnv$i <- i
                       
                       model_trial<-gls(disp ~ wt, 
                                             correlation = corHaversine(form=~lon+lat, 
                                                                        mimic="corSpher"),
                                             data = mtcars)
                     


stopCluster(cl)

当我运行它时,我收到错误消息:

Error in  : 
  task 1 failed - "do not know how to calculate correlation matrix of “corHaversine” object"
In addition: Warning message:
In e$fun(obj, substitute(ex), parent.frame(), e$data) :
  already exporting variable(s): corHaversine, mtcars, path_df1

该模型与添加的相关结构一起工作正常:

correlation = corHaversine(form=~lon+lat,mimic="corSpher")

在正常循环中。任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

我不确定为什么您的 foreach 方法不起作用,而且我也不确定您实际计算的是什么。无论如何,您可以使用parallel::parLapply() 尝试这种替代方法,这似乎可行:

首先,我使用rm(list=ls()) 清除了工作区,然后我运行了this answer 的整个第一个代码块,他们在其中创建了"corStruct" 类和corHaversine 方法以将其放入工作区以及Data 下面,准备好clusterExport()

library(parallel)
cl <- makeCluster(detectCores() - 1)
clusterEvalQ(cl, library(nlme))
clusterExport(cl, ls())
r <- parLapply(cl=cl, X=1:2, fun=function(i) 
  gls(disp ~ wt, 
      correlation=corHaversine(form= ~ lon + lat, mimic="corSpher"),
      data=mtcars)
)
stopCluster(cl)  ## stop cluster
r  ## result
# [[1]]
# Generalized least squares fit by REML
# Model: disp ~ wt 
# Data: mtcars 
# Log-restricted-likelihood: -166.6083
# 
# Coefficients:
#   (Intercept)          wt 
# -122.4464    110.9652 
# 
# Correlation Structure: corHaversine
# Formula: ~lon + lat 
# Parameter estimate(s):
#   range 
# 10.24478 
# Degrees of freedom: 32 total; 30 residual
# Residual standard error: 58.19052 
# 
# [[2]]
# Generalized least squares fit by REML
# Model: disp ~ wt 
# Data: mtcars 
# Log-restricted-likelihood: -166.6083
# 
# Coefficients:
#   (Intercept)          wt 
# -122.4464    110.9652 
# 
# Correlation Structure: corHaversine
# Formula: ~lon + lat 
# Parameter estimate(s):
#   range 
# 10.24478 
# Degrees of freedom: 32 total; 30 residual
# Residual standard error: 58.19052 

数据:

set.seed(42)  ## for sake of reproducibility
mtcars <- within(mtcars, 
  lon <- runif(nrow(mtcars))
  lat <- runif(nrow(mtcars))
  marker <- c(rep(1, nrow(mtcars)/2), rep(2, nrow(mtcars)/2))
)

【讨论】:

感谢@jay.sf 的帮助如果您有兴趣,我遇到了第二个问题***.com/questions/67652464/…

以上是关于如何将自定义函数加载到 R 中的 foreach 循环中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义彩色图像添加到 TabBarController 中的 tabBar?

如何配置 webpack 以将自定义字体加载到故事书中?

将自定义输出层添加到 R 中的内置(功能)keras 模型

将自定义 UITableViewCell 从 nib 加载到 Swift 中的 UIViewController

无法将自定义 application.yml 配置的子集加载到 Quarkus 中的地图

如何以编程方式将自定义 Java 视图类加载到 RelativeLayout