在 R 中的 Parlapply 中创建数据框
Data frame creation inside Parlapply in R
我正在尝试一些非常简单的事情,想要 运行 并行进行一堆回归。当我使用以下数据生成器(第 1 部分)时,并行部分不起作用并给出下面列出的错误
#PART 1
p <- 20; rho<-0.7;
cdc<- diag(p)
for( i in 1:(p-1) ){ for( j in (i+1):p ){
cdc[i,j] <- cdc[j,i] <- rho^abs(i-j)
}}
my.data <- mvrnorm(n=100, mu = rep(0, p), Sigma = cdc)
以下并行部分确实有效,但如果我将数据生成为第 2 部分
# PART 2
my.data<-matrix(rnorm(1000,0,1),nrow=100,ncol=10)
我配置了我想要 运行 并行的功能...
parallel_fun<-function(obj,my.data){
p1 <- nrow(cov(my.data));store.beta<-matrix(0,p1,length(obj))
count<-1
for (itration in obj) {
my_df<-data.frame(my.data)
colnames(my_df)[itration] <- "y"
my.model<-bas.lm(y ~ ., data= my_df, alpha=3,
prior="ZS-null", force.heredity = FALSE, pivot = TRUE)
cf<-coef(my.model, estimator="MPM")
betas<-cf$postmean[-1]
store.beta[ -itration, count]<- betas
count<-count+1
}
result<-list('Beta'=store.beta)
}
所以我写了下面的方式 运行ning parlapply
{
no_cores <- detectCores(logical = TRUE)
myclusternumber<-(no_cores-1)
cl <- makeCluster(myclusternumber)
registerDoParallel(cl)
p1 <- ncol(my.data)
obj<-splitIndices(p1, myclusternumber)
clusterExport(cl,list('parallel_fun','my.data','obj'),envir=environment())
clusterEvalQ(cl, {
library(MASS)
library(Matrix)
library(BAS)
})
newresult<-parallel::parLapply(cl,obj,fun = parallel_fun,my.data)
stopCluster(cl)
}
但是每当执行第 1 部分时,我都会收到以下错误
Error in checkForRemoteErrors(val) :
7 nodes produced errors; first error: object 'my_df' not found
但这不应该发生,应该创建数据框,我不知道为什么会这样。感谢任何帮助。
将此作为一种可能的解决方法发布,看看它是否有效:
parallel_fun<-function(obj,my.data){
p1 <- nrow(cov(my.data));store.beta<-matrix(0,p1,length(obj))
count<-1
for (itration in obj) {
my_df<-data.frame(my.data)
colnames(my_df)[itration] <- "y"
my_df <<- my_df
my.model<-bas.lm(y ~ ., data= my_df, alpha=3,
prior="ZS-null", force.heredity = FALSE, pivot = TRUE)
cf<-BAS:::coef.bas(my.model, estimator="MPM")
betas<-cf$postmean[-1]
store.beta[ -itration, count]<- betas
count<-count+1
}
result<-list('Beta'=store.beta)
}
问题似乎与 BAS:::coef.bas
函数有关,该函数调用 eval
以获得 my_df
,但在并行调用时无法执行此操作。这里的“hack”是通过调用 my_df <<- my_df
.
强制 my_df
进入父环境
应该有更好的方法来执行此操作,但 <<-
可能是最快的方法。通常,<<-
可能会导致不需要的行为,尤其是在循环中使用时。在导出之前分配唯一的变量名称(并且不要忘记在使用后删除)是解决它们的一种方法。
我正在尝试一些非常简单的事情,想要 运行 并行进行一堆回归。当我使用以下数据生成器(第 1 部分)时,并行部分不起作用并给出下面列出的错误
#PART 1
p <- 20; rho<-0.7;
cdc<- diag(p)
for( i in 1:(p-1) ){ for( j in (i+1):p ){
cdc[i,j] <- cdc[j,i] <- rho^abs(i-j)
}}
my.data <- mvrnorm(n=100, mu = rep(0, p), Sigma = cdc)
以下并行部分确实有效,但如果我将数据生成为第 2 部分
# PART 2
my.data<-matrix(rnorm(1000,0,1),nrow=100,ncol=10)
我配置了我想要 运行 并行的功能...
parallel_fun<-function(obj,my.data){
p1 <- nrow(cov(my.data));store.beta<-matrix(0,p1,length(obj))
count<-1
for (itration in obj) {
my_df<-data.frame(my.data)
colnames(my_df)[itration] <- "y"
my.model<-bas.lm(y ~ ., data= my_df, alpha=3,
prior="ZS-null", force.heredity = FALSE, pivot = TRUE)
cf<-coef(my.model, estimator="MPM")
betas<-cf$postmean[-1]
store.beta[ -itration, count]<- betas
count<-count+1
}
result<-list('Beta'=store.beta)
}
所以我写了下面的方式 运行ning parlapply
{
no_cores <- detectCores(logical = TRUE)
myclusternumber<-(no_cores-1)
cl <- makeCluster(myclusternumber)
registerDoParallel(cl)
p1 <- ncol(my.data)
obj<-splitIndices(p1, myclusternumber)
clusterExport(cl,list('parallel_fun','my.data','obj'),envir=environment())
clusterEvalQ(cl, {
library(MASS)
library(Matrix)
library(BAS)
})
newresult<-parallel::parLapply(cl,obj,fun = parallel_fun,my.data)
stopCluster(cl)
}
但是每当执行第 1 部分时,我都会收到以下错误
Error in checkForRemoteErrors(val) : 7 nodes produced errors; first error: object 'my_df' not found
但这不应该发生,应该创建数据框,我不知道为什么会这样。感谢任何帮助。
将此作为一种可能的解决方法发布,看看它是否有效:
parallel_fun<-function(obj,my.data){
p1 <- nrow(cov(my.data));store.beta<-matrix(0,p1,length(obj))
count<-1
for (itration in obj) {
my_df<-data.frame(my.data)
colnames(my_df)[itration] <- "y"
my_df <<- my_df
my.model<-bas.lm(y ~ ., data= my_df, alpha=3,
prior="ZS-null", force.heredity = FALSE, pivot = TRUE)
cf<-BAS:::coef.bas(my.model, estimator="MPM")
betas<-cf$postmean[-1]
store.beta[ -itration, count]<- betas
count<-count+1
}
result<-list('Beta'=store.beta)
}
问题似乎与 BAS:::coef.bas
函数有关,该函数调用 eval
以获得 my_df
,但在并行调用时无法执行此操作。这里的“hack”是通过调用 my_df <<- my_df
.
my_df
进入父环境
应该有更好的方法来执行此操作,但 <<-
可能是最快的方法。通常,<<-
可能会导致不需要的行为,尤其是在循环中使用时。在导出之前分配唯一的变量名称(并且不要忘记在使用后删除)是解决它们的一种方法。