R(Windows)中的并行计算:将代码从foreach%do%更改为foreach%dopar%

R(Windows)中的并行计算:将代码从foreach%do%更改为foreach%dopar%,r,parallel-processing,regression,multivariate-testing,R,Parallel Processing,Regression,Multivariate Testing,我已经编写了一个代码来运行多个证券的时间序列滚动回归。由于证券的数量超过10000,并且每个证券有200多个滚动窗口,因此顺序设置(使用foreach%do%)的运行时间约为30分钟 我想改为使用“doParallel”后端为并行计算实现foreach%dopar%。简单地在代码中用%dopar%更改%do%并不能起作用。我对这种并行计算方法非常陌生,希望能得到一些帮助 以下是foreach%do%代码: sec = ncol(ret.zoo) num.factors = 2 rows = nr

我已经编写了一个代码来运行多个证券的时间序列滚动回归。由于证券的数量超过10000,并且每个证券有200多个滚动窗口,因此顺序设置(使用foreach%do%)的运行时间约为30分钟

我想改为使用“doParallel”后端为并行计算实现foreach%dopar%。简单地在代码中用%dopar%更改%do%并不能起作用。我对这种并行计算方法非常陌生,希望能得到一些帮助

以下是foreach%do%代码:

sec = ncol(ret.zoo)
num.factors = 2
rows = nrow(ret.zoo) - 60 + 1
beta.temp = matrix(nc = num.factors + 1, nr = sec*rows)
gvkey.vec = matrix(nc = 1, nr = sec*rows)

d = 1
foreach(i=1:sec) %do% {
      df = merge(ret.zoo[,i], data)
      names(df) <- c("return", names(data))
      gvkey = substr(colnames(ret.zoo)[i],2,9)

      reg = function(z) {
          z.df = as.data.frame(z)
          ret = z.df[,which(names(z.df) ==  "return")]
          ret.no.na = ret[!is.na(ret)]
          if(length(ret.no.na) >= 30) {
             coef(lm(return ~ VAL + SIZE, data = as.data.frame(z), na.action = na.omit))
          }
          else {
             as.numeric(rep(NA,num.factors + 1))   ## the "+1" is for the intercept value
          }     
     }

     beta = rollapply(df, width = 60, FUN = reg, by.column = FALSE, align = "right")
     beta.temp[d:(d+rows-1),] = beta
     gvkey.vec[d:(d+rows-1),] = gvkey
     d = d+rows
}
beta.df = data.frame(secId = gvkey.vec, date = rep(index(beta), sec), beta.temp)
colnames(beta.df) <- c("gvkey", "date", "intercept", "VAL", "SIZE")
sec=ncol(ret.zoo)
数量系数=2
行=nrow(ret.zoo)-60+1
beta.temp=矩阵(nc=数值系数+1,nr=秒*行)
gvkey.vec=矩阵(nc=1,nr=sec*行)
d=1
每小时(i=1秒)%do%{
df=合并(ret.zoo[,i],数据)
姓名(df)=30){
coef(lm(return~VAL+SIZE,data=as.data.frame(z),na.action=na.omit))
}
否则{
as.numeric(rep(NA,num.factors+1))35;##“+1”表示截距值
}     
}
beta=rollply(df,width=60,FUN=reg,by.column=FALSE,align=“right”)
测试温度[d:(d+rows-1),]=beta
gvkey.vec[d:(d+rows-1),]=gvkey
d=d+行
}
beta.df=data.frame(secId=gvkey.vec,date=rep(index(beta),sec),beta.temp)

colnames(beta.df)以下是将不同集群的结果组合到数据帧中的方法(从运行时的角度来看非常有效):


lstData实际上没有“显式”错误。但是当使用%dopar%时,矩阵“beta.temp”只有NA值。当使用%do%时,beta.temp在适当时具有回归系数值,在适当时具有NA值。我用%dopar%替换%do%肯定是做错了。我相信,当使用%dopar%时,我将结果分配到beta.temp(通过增加d)的方式是错误的。它与%do%配合使用效果很好。我只是不知道如何在并行计算的环境中做得不同。你可以尝试返回
beta
gvkey
,以及
rbind
它们在循环之外。即使gvkey也只有NA值,因为它也是用d递增的:我尝试了类似于你建议的东西。它工作完美,直到结合最终结果,这就是它给出错误的地方。请参考我上面更新的问题。谢谢。Foreach有一个。合并参数。检查那里
library(doParallel) ## parallel backend for the foreach function
registerDoParallel()

sec = ncol(ret.zoo)
num.factors = 2
rows = nrow(ret.zoo) - 60 + 1

result <- foreach(i=1:sec) %dopar% {
    library(zoo)
    library(stats)

    df = merge(ret.zoo[,i], data)
    names(df) <- c("return", names(data))
    gvkey = substr(colnames(ret.zoo)[i],2,9)

    reg = function(z) {
        z.df = as.data.frame(z)
        ret = z.df[,which(names(z.df) ==  "return")]
        ret.no.na = ret[!is.na(ret)]
        if(length(ret.no.na) >= 30) {
            coef(lm(return ~ VAL + SIZE, data = as.data.frame(z), na.action = na.omit))
        }
        else {
            as.numeric(rep(NA,num.factors + 1))   ## the "+1" is for the intercept value
        }   
    }

    rollapply(df, width = 60, FUN = reg, by.column = FALSE, align = "right")
}
beta.df = do.call('combine', result)
lstData <- Map(as.data.frame, result)
dfData <- rbindlist(lstData)
beta.df = as.data.frame(dfData)