我正在运行一个非常类似于以下代码的滚动回归:
library(PerformanceAnalytics)
library(quantmod)
data(managers)
FL <- as.formula(Next(HAM1)~HAM1+HAM2+HAM3+HAM4)
MyRegression <- function(df,FL) {
df <- as.data.frame(df)
model <- lm(FL,data=df[1:30,])
predict(model,newdata=df[31,])
}
system.time(Result <- rollapply(managers, 31, FUN="MyRegression",FL,
by.column = FALSE, align = "right", na.pad = TRUE))
我有一些额外的处理器,所以我试图找到一种方法来并行化滚动窗口 . 如果这是一个非滚动回归,我可以使用apply系列函数轻松地并行化它...
2 回答
显而易见的是使用
lm.fit()
而不是lm()
,因此您不会因处理公式等而产生所有开销 .Update: 所以,当我说明白我的意思是 blindingly obvious but deceptively difficult to implement !
经过一番摆弄后,我想出了这个
第一阶段是要意识到模型矩阵可以预先构建,所以我们这样做并将其转换回Zoo对象以与
rollapply()
一起使用:现在我们需要一个函数来使用
lm.fit()
来完成繁重的工作,而不必在每次迭代时创建设计矩阵:时间比较:
这比原版提供了相当合理的改进 . 现在检查生成的对象是否相同:
请享用!
新答案
我写了一个包,
rollRegres
,这样做得更快 . 它比Gavin Simpson's answer快〜58倍 . 这是一个例子老答案
您可以通过更新分解来缩短运行时间 . 这会在每次迭代时产生
成本而不是
,其中n是窗口宽度 . 下面是一个比较两者的代码 . 在C中执行此操作可能要快得多,但R不包含LINPACK
dchud
和dchdd
,因此您必须编写一个包来执行此操作 . 此外,我记得读到你可以更快地使用其他实现,而不是用于R更新的LINPACKdchud
和dchdd