在 R 中设置种子的并行处理
Parallel Processing for Setting Seed in R
我有一个 R
代码可以帮助我知道 seed
当我使用 arima.sim()
函数模拟 ARIMA(1, 0, 0)
时它实际上会模拟 ARIMA
的 order 1, 0, 0
当 auto.arima()
函数用于检查时。
MWE
library(forecast)
SEED_vector <- 1:10
arima_order_results <- data.frame()
flag <- TRUE
i <- 1
seed_out <- c()
while(flag){
set.seed(SEED_vector[i])
ar1 <- arima.sim(n = 20, model=list(ar=0.8, order = c(1, 0, 0)), sd = 1)
ar2 <- auto.arima(ar1, ic = "aicc")
if(all(arimaorder(ar2)==c(1,0,0))) {
#print(arima_order_results)
print(paste0('arimaorder', SEED_vector[i], ' ' ,
paste(arimaorder(ar2), collapse=" ")))
seed_out <- c(seed_out, SEED_vector[i])
}
arima_order = arimaorder(ar2)
arima_order = t(as.data.frame(arima_order))
arima_order_results = rbind(arima_order_results,arima_order)
i <- i+1
if(i == length(SEED_vector)) {
flag <- FALSE
}
}
我对设置什么种子很感兴趣,这样当我 运行
set.seed(seed_out)
ar1 <- arima.sim(n = 20, model=list(ar=0.8, order = c(1, 0, 0)), sd = 1)
auto.arima(ar1, ic = "aicc")
它将给我 arimaorder
的 (1, 0, 0). In my
MWEthe seeds are
2and
3`。
我想要的
我想要这个我的 MWE
在 parallel processing
因为我实际上 运行 正在寻找 1 到 100,000 的种子,这需要 3 个小时。
我 运行宁 R
windows
您可以设置一个 FUN
函数来与 parallel::parSapply
并行化。我相信 print
ing 不会那么容易工作(类似于进度条之类的东西)所以我把它放在一边了。 FUN()
将 ar2
的 arima 顺序与种子连接起来,因此 parSapply
的结果将是一个很好的矩阵 res
,您可以在其中检查 arima 顺序和 seed
之后。
FUN <- function(i) {
set.seed(i)
ar1 <- arima.sim(n=20, model=list(ar=0.8, order=c(1, 0, 0)), sd=1)
ar2 <- auto.arima(ar1, ic="aicc")
c(arimaorder(ar2), seed=i)
}
要并行化,请设置一个种子向量,您将在其上循环 parSapply
。 "FUN"
和 "forecast"
包需要导出到集群。
R <- 1e2 ## this would be your 1e5
seedv <- 1:R
library(parallel)
cl <- makeCluster(detectCores() - 1)
clusterExport(cl, c("FUN"), envir=environment())
clusterEvalQ(cl, suppressPackageStartupMessages(library(forecast)))
res <- parSapply(cl, seedv, "FUN")
stopCluster(cl)
在结果矩阵中res
,
res
# [,1] [,2] [,3] [,4] [,5] [,6]
# p 2 1 1 0 2 ...
# d 0 0 0 1 0 ...
# q 0 0 0 0 0 ...
# seed 1 2 3 4 5 ...
您可以查找 "seed"
的 arima 顺序是 c(1, 0, 0)
。
res["seed", which(apply(res, 2, function(x) all(x[1:3] == c(1, 0, 0))))]
# [1] 2 3 11 16 17 23 24 25 28 30 33 34 42 43 45 50 51 54 59 60 63 64 66 67
# [25] 71 72 77 79 84 91 96 97
我用我的机器检查了 seedv
长度 1e3,预计 1e5 的预计长度的执行时间小于 30 分钟。
seedv <- 1:1e3
system.time(parSapply(cl, seedv, "FUN"))
# user system elapsed
# 0.00 0.00 17.05
我有一个 R
代码可以帮助我知道 seed
当我使用 arima.sim()
函数模拟 ARIMA(1, 0, 0)
时它实际上会模拟 ARIMA
的 order 1, 0, 0
当 auto.arima()
函数用于检查时。
MWE
library(forecast)
SEED_vector <- 1:10
arima_order_results <- data.frame()
flag <- TRUE
i <- 1
seed_out <- c()
while(flag){
set.seed(SEED_vector[i])
ar1 <- arima.sim(n = 20, model=list(ar=0.8, order = c(1, 0, 0)), sd = 1)
ar2 <- auto.arima(ar1, ic = "aicc")
if(all(arimaorder(ar2)==c(1,0,0))) {
#print(arima_order_results)
print(paste0('arimaorder', SEED_vector[i], ' ' ,
paste(arimaorder(ar2), collapse=" ")))
seed_out <- c(seed_out, SEED_vector[i])
}
arima_order = arimaorder(ar2)
arima_order = t(as.data.frame(arima_order))
arima_order_results = rbind(arima_order_results,arima_order)
i <- i+1
if(i == length(SEED_vector)) {
flag <- FALSE
}
}
我对设置什么种子很感兴趣,这样当我 运行
set.seed(seed_out)
ar1 <- arima.sim(n = 20, model=list(ar=0.8, order = c(1, 0, 0)), sd = 1)
auto.arima(ar1, ic = "aicc")
它将给我 arimaorder
的 (1, 0, 0). In my
MWEthe seeds are
2and
3`。
我想要的
我想要这个我的 MWE
在 parallel processing
因为我实际上 运行 正在寻找 1 到 100,000 的种子,这需要 3 个小时。
我 运行宁 R
windows
您可以设置一个 FUN
函数来与 parallel::parSapply
并行化。我相信 print
ing 不会那么容易工作(类似于进度条之类的东西)所以我把它放在一边了。 FUN()
将 ar2
的 arima 顺序与种子连接起来,因此 parSapply
的结果将是一个很好的矩阵 res
,您可以在其中检查 arima 顺序和 seed
之后。
FUN <- function(i) {
set.seed(i)
ar1 <- arima.sim(n=20, model=list(ar=0.8, order=c(1, 0, 0)), sd=1)
ar2 <- auto.arima(ar1, ic="aicc")
c(arimaorder(ar2), seed=i)
}
要并行化,请设置一个种子向量,您将在其上循环 parSapply
。 "FUN"
和 "forecast"
包需要导出到集群。
R <- 1e2 ## this would be your 1e5
seedv <- 1:R
library(parallel)
cl <- makeCluster(detectCores() - 1)
clusterExport(cl, c("FUN"), envir=environment())
clusterEvalQ(cl, suppressPackageStartupMessages(library(forecast)))
res <- parSapply(cl, seedv, "FUN")
stopCluster(cl)
在结果矩阵中res
,
res
# [,1] [,2] [,3] [,4] [,5] [,6]
# p 2 1 1 0 2 ...
# d 0 0 0 1 0 ...
# q 0 0 0 0 0 ...
# seed 1 2 3 4 5 ...
您可以查找 "seed"
的 arima 顺序是 c(1, 0, 0)
。
res["seed", which(apply(res, 2, function(x) all(x[1:3] == c(1, 0, 0))))]
# [1] 2 3 11 16 17 23 24 25 28 30 33 34 42 43 45 50 51 54 59 60 63 64 66 67
# [25] 71 72 77 79 84 91 96 97
我用我的机器检查了 seedv
长度 1e3,预计 1e5 的预计长度的执行时间小于 30 分钟。
seedv <- 1:1e3
system.time(parSapply(cl, seedv, "FUN"))
# user system elapsed
# 0.00 0.00 17.05