R 中有更快的滚动窗口回归包吗?

问题描述 投票:0回答:1

这个问题经常出现,特别是在金融背景下,人们想要计算滚动风险敞口,但似乎没有答案。 R 包有很多,但它们似乎都只是语法糖,而不是为线性回归的特殊情况而设计的。 例如,

################################################################
## neither runner nor roll.reg speeds up sequential regressions.
################################################################

N <- 100

set.seed(0)
x <- cumsum(rnorm(N))
y <- 3 * x + rnorm(N)

y[N/2] <- NA

df <- data.frame(y, x)

################################################################

## naive
slope <- rep(NA, 40)
norunner <- function() {
    for (j in 2:nrow(df)) slope[j] <- coefficients(lm(y ~ x, data = df[1:j,]))[2]
    slope
}

library(runner)
withrunner <- function() {
    slope <- as.numeric( runner( df, function(x) { coefficients(lm(y ~ x, data = x))[2] } ) )
    slope
}

library(fDMA)
withroller <- function() {
    with(df, roll.reg( y=y, as.data.frame(x=x), window=nrow(df))$coeff.[,2] )
}

################################################################
R <- 100  ## repeat for timing purposes

print( system.time( lapply( 1:R, function(i) norunner() ) ) )

print( system.time( lapply(1:R, function(i) withrunner() ) ) )

print(system.time( lapply( 1:R, function(i) withroller() ) ) )

在我的硬件上大约需要 2.2、2.2 和 4.3 秒。曾经有一个包rollRegres,但它已从 CRAN 中删除。 安息吧。 (我还没有尝试过 GitHub 版本...它真的更快吗?是什么让它被删除?还有人在运行它吗?)

线性回归应该是可滚动的,如以下所示:通过绅士更新算法AS 274。 (通过用 -1 加权来删除观测值。)CRAN 上是否有基于此或其他算法的算法?

r lm
1个回答
0
投票

答案原来是...

library(roll)
.

library(roll)

withplainroll <- function() {
    with(df, coefficients(roll_lm(x, y, width = nrow(df), min_obs =1))[,2])
}

print( system.time( lapply( 1:R, function(i) withplainroll() ) ) )

现在的速度是 0.05...太棒了。 谢谢,杰森·福斯特。

© www.soinside.com 2019 - 2024. All rights reserved.