繁体   English   中英

R 中我的 for 循环 function 的并行处理

[英]Parallel Processing for my for loop function in R

我在R中有这个for loop ,它搜索了我的ARIMA(1, 0, 0) that is exactly的系数,该系数在所有与 auto-set.seed 的顺序完全相等 (1, 0, 0) 的系数中正好是 0.950`。

library(forecast)
library(dplyr)
arima_order_results = data.frame()

seed_out1 <- c(14,16,20,29,50,51,53,55,56,59,64,71,77,95,98,106,110,115,120,126,174,175,187,214,216,256,257,265,266,268,283,286,293,301,309,311,318,320,346,349,356,363,374,376,378,379,396,397,416,422,427,445,446,448,452,453,458,466,469,470,471,475,480,501,505,506,524,539,540,559,564,566,567,573,574,579,589,593,625,626,634,640,643,647,674,676,678,679,680,687,688,689,704,711,712,727,738,742,746,747,781,783,784,814,816,832,847,859,860,865,880,894,898,902,906,918,920,924,926,929,936,939,941,945,949,960,961,975)

for (my_seed in seed_out1){
  set.seed(my_seed)
  ar1 <- arima.sim(n = 15, model=list(ar = 0.95, order = c(1, 0, 0)), sd = 1)
  ar2 <- auto.arima(ar1, ic = "aicc")
  arr <- as.data.frame(t(ar2$coef))
  if(substr(as.character(arr[1]), 1, 5) == "0.950") {
    arr <- cbind(data.frame(seed=my_seed),arr)
    print(arr)
    arima_order_results = bind_rows(arima_order_results,arr)

  }
}

R代码运行良好,但我想让它在并行进程上运行。

我正在研究 Windows

一个选项与foreach parallel

library(parallel)    
library(foreach)

library(forecast)
library(dplyr)
library(doSNOW)

n <-  parallel::detectCores()
cl <- parallel::makeCluster(n, type = "SOCK")   
doSNOW::registerDoSNOW(cl)

seed_out1 <- c(14,16,20,29,50,51,53,55,56,59,64,71,77,95,98,106,110,115,120,126,174,175,187,214,216,256,257,265,266,268,283,286,293,301,309,311,318,320,346,349,356,363,374,376,378,379,396,397,416,422,427,445,446,448,452,453,458,466,469,470,471,475,480,501,505,506,524,539,540,559,564,566,567,573,574,579,589,593,625,626,634,640,643,647,674,676,678,679,680,687,688,689,704,711,712,727,738,742,746,747,781,783,784,814,816,832,847,859,860,865,880,894,898,902,906,918,920,924,926,929,936,939,941,945,949,960,961,975)


lst_out <- foreach::foreach(i = seq_along(seed_out1), 
                  .packages = c("dplyr", "forecast") ) %dopar% {

    my_seed <- seed_out1[i]
    set.seed(my_seed)
    ar1 <- arima.sim(n = 15, model=list(ar = 0.95, order = c(1, 0, 0)), sd = 1)
    ar2 <- auto.arima(ar1, ic = "aicc")
   

     arr <- as.data.frame(t(ar2$coef))
    if(substr(as.character(arr[1]), 1, 5) == "0.631") {
      
       arr <- cbind(data.frame(seed=my_seed),arr)
       

     }
    
   return(arr)
 }
parallel::stopCluster(cl)

然后绑定list元素并删除NA

out <-  lst_out %>%
            keep(~ length(.) > 0) %>%
            bind_rows

out %>%
       filter(complete.cases(.))

out
#        ar1 intercept seed
#1 0.6318504   3.30278  427

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM