这个问题经常出现,特别是在金融背景下,人们想要计算滚动风险敞口,但似乎没有答案。 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 上是否有基于此或其他算法的算法?
答案原来是...
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...太棒了。 谢谢,杰森·福斯特。