複数の証券に対して複数の時系列ローリング回帰を実行するコードを作成しました。証券の数は 10,000 を超え、証券ごとに 200 を超えるローリング ウィンドウがあるため、順次セットアップ (foreach %do% を使用) の実行時間は約 30 分です。
「doParallel」バックエンドを使用して、代わりに並列計算用に foreach %dopar% を実装したいと考えています。コード内の %do% を %dopar% に変更するだけではうまくいきません。私はこの並列計算方法に非常に慣れていないため、助けを求めています。
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"
。
結果の出力をどのように組み合わせることができますか。現在はデータフレームではなくリストです。
ありがとう、