我有一个关于使用 foreach 进行并行模拟的问题,我非常感谢您提前提供的帮助,因为我已经花费了数小时和数小时,并且不断出现错误。
我正在使用 foreach() 进行模拟研究,在每次迭代中我运行一个函数,该函数本身具有一些“常规”循环。当我按顺序运行它时,它工作得非常好。在 linux 服务器上,当我在 R 中使用 foreach 并行运行它时,它工作正常,但是一旦我使用“nohup R CMD BATCH”命令在批处理模式下运行它,它就会开始返回错误。我为每个模拟手动设置种子编号,这意味着无论在 R 内部并行运行它们、在批处理模式下并行运行以及在 R 内部顺序运行它们,我的代码基本上都是在相同的模拟数据上运行,因此如果一种方式不产生任何错误,其他人也不应该导致错误,但奇怪的是,事实并非如此。有没有人有同样的挑战?
我花了好几个小时,进行异常处理,但什么也没发生。
这是我的代码:
dataSim <- function(seedNum, n, mi, beta0FE, beta1, beta0RE){
# Setting the seed number:
set.seed(seedNum)
# Generating covariates:
x <- rnorm(n, mean = 0, sd = 1)
# Generating Y:
data <- data.frame(id = rep(1:n, each = mi), x = rep(x, each = mi),
beta0_RE = rep(beta0RE, each = mi))
etaTmp <- data$beta0_RE + beta0FE + beta1*data$x
piTmp <- exp(etaTmp)/(1 + exp(etaTmp))
data$Y <- sapply(piTmp, rbinom, n = 1, size = 1)
return(data)
}
# Data Simulation Parameters:
n <- 100
mi <- 30
beta0FE <- 0.3
beta1 <- 1
beta0RE <- rnorm(n, 0, 1)
# Simulation Parameters:
nSim <- 10000
nIter <- 4000
LME_Freq_Fun <- function(data){
fit.LME <- try(glmmPQL(Y ~ x, random = ~ 1 | id,
family = binomial, data = data))
print(class(fit.LME)[1])
if (class(fit.LME)[1] == "try-error"){
return(list(coef.FE.LME = rep(NA, 3),
coef.RE.LME = rep(NA, n)))
}else{
return(list(coef.FE.LME = fit.LME$coefficients$fixed,
coef.RE.LME = fit.LME$coefficients$random$id))
}
}
LME_Freq_RSLT <- foreach (i = 1:nSim) %dopar%{
print(paste("i=", i))
print("-------")
data <- dataSim(i, n, mi, beta0FE, beta1, beta0RE)
LME_Freq_Fun(data)
}
# Extracting elements from foreach:
Coef.Fixed.LME <- t(sapply(1:nSim ,function (i)
return(LME_Freq_RSLT[[i]][[1]] )))
Coef.Rand.LME <- t(sapply(1:nSim ,function (i)
return(LME_Freq_RSLT[[i]][[2]] )))
没有“尝试”,我不断收到:任务 3527 失败 - “$ 运算符对原子向量无效”
通过尝试,我的 Coef.Fixed.LME 对于所有元素“numeric.2”变得非常奇怪!