gpt4 book ai didi

r - 在 R 中并行化滚动窗口回归

转载 作者:行者123 更新时间:2023-12-04 02:10:49 24 4
gpt4 key购买 nike

我正在运行与以下代码非常相似的滚动回归:

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 系列函数轻松地将它并行化......

最佳答案

显而易见的是使用 lm.fit()而不是 lm()所以你不会在处理公式等过程中产生所有的开销。

更新:所以当我说明显的时候,我想说的是 显而易见但看似难以实现 !

经过一番摆弄,我想出了这个

library(PerformanceAnalytics)
library(quantmod)
data(managers)

第一阶段是实现模型矩阵可以预先构建,因此我们这样做并将其转换回 Zoo 对象以供 rollapply() 使用。 :
mmat2 <- model.frame(Next(HAM1) ~ HAM1 + HAM2 + HAM3 + HAM4, data = managers, 
na.action = na.pass)
mmat2 <- cbind.data.frame(mmat2[,1], Intercept = 1, mmat2[,-1])
mmatZ <- as.zoo(mmat2)

现在我们需要一个函数来使用 lm.fit()无需在每次迭代时创 build 计矩阵即可完成繁重的工作:
MyRegression2 <- function(Z) {
## store value we want to predict for
pred <- Z[31, -1, drop = FALSE]
## get rid of any rows with NA in training data
Z <- Z[1:30, ][!rowSums(is.na(Z[1:30,])) > 0, ]
## Next() would lag and leave NA in row 30 for response
## but we precomputed model matrix, so drop last row still in Z
Z <- Z[-nrow(Z),]
## fit the model
fit <- lm.fit(Z[, -1, drop = FALSE], Z[,1])
## get things we need to predict, in case pivoting turned on in lm.fit
p <- fit$rank
p1 <- seq_len(p)
piv <- fit$qr$pivot[p1]
## model coefficients
beta <- fit$coefficients
## this gives the predicted value for row 31 of data passed in
drop(pred[, piv, drop = FALSE] %*% beta[piv])
}

时序对比:
> system.time(Result <- rollapply(managers, 31, FUN="MyRegression",FL,
+ by.column = FALSE, align = "right",
+ na.pad = TRUE))
user system elapsed
0.925 0.002 1.020
>
> system.time(Result2 <- rollapply(mmatZ, 31, FUN = MyRegression2,
+ by.column = FALSE, align = "right",
+ na.pad = TRUE))
user system elapsed
0.048 0.000 0.05

与原始版本相比,这提供了相当合理的改进。现在检查结果对象是否相同:
> all.equal(Result, Result2)
[1] TRUE

享受!

关于r - 在 R 中并行化滚动窗口回归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5652058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com