【问题标题】:Parallel Processing for Setting Seed in R在 R 中设置种子的并行处理
【发布时间】:2021-03-31 21:53:28
【问题描述】:

我有一个R 代码,当我使用arima.sim() 函数来模拟ARIMA(1, 0, 0) 时,它可以帮助我了解seed 是什么,当使用auto.arima() 函数时,它实际上会模拟order 1, 0, 0ARIMA检查。

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 are2and3`。

我想要什么

我想要我的MWE parallel processing,因为我实际上是在为 1 到 100,000 个种子而奔跑,这需要 3 个小时。

我在 Windows 上运行 R

【问题讨论】:

    标签: r windows while-loop parallel-processing arima


    【解决方案1】:

    您可以设置FUNction 与parallel::parSapply 并行化。我相信printing 不会那么容易工作(类似于进度条等),所以我把它省略了。 FUN()ar2 的有马顺序与种子连接起来,因此parSapply 的结果将是一个很好的矩阵res,您可以在其中检查有马顺序和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 的预计长度执行时间

    seedv <- 1:1e3
    system.time(parSapply(cl, seedv, "FUN"))
    # user  system elapsed 
    # 0.00    0.00   17.05
    

    【讨论】:

    • 我真希望我能在一个房间里引起你的注意?您提供的解决方案适用于我提供的唯一示例,但不适用于另一个示例
    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 2022-11-28
    • 2016-04-13
    • 2013-01-27
    • 2020-11-21
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多