[英]Parallel computing in R (Windows): changing code from foreach %do% to foreach %dopar%
我編寫了一段代碼,以針對多個證券運行多個時間序列的滾動回歸。 由於證券數量超過10,000,每個證券有200多個滾動窗口,因此順序設置(使用foreach%do%)的運行時間約為30分鍾。
我想使用“ doParrallel”后端實現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")
為了使用%dopar%啟用並行計算,我已調用並注冊了后端“ doParallel”。
非常感謝你!
更新
這是我的第一次嘗試:
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)
這可以完美地工作直到循環結束。 但是, beta.df = do.call('combine', result)
給出以下錯誤: Error in do.call("combine", result) : could not find function "combine"
錯誤: Error in do.call("combine", result) : could not find function "combine"
。
如何合並結果的輸出。 現在,它是一個列表,而不是數據框。
謝謝,
這是將來自不同群集的結果合並到數據幀中的方法(從運行時的角度來看非常有效):
lstData <- Map(as.data.frame, result)
dfData <- rbindlist(lstData)
beta.df = as.data.frame(dfData)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.