У меня проблема с поиском наиболее эффективного способа расчета скользящей линейной регрессии для объекта xts с несколькими столбцами. Я искал и читал несколько предыдущих вопросов здесь, в stackoverflow.
Этот вопрос и ответ близки, но, на мой взгляд, недостаточны, поскольку я хочу рассчитать множественные регрессии с неизменной зависимой переменной во всех регрессиях. Я попытался воспроизвести пример со случайными данными :
require(xts)
require(RcppArmadillo) # Load libraries
data <- matrix(sample(1:10000, 1500), 1500, 5, byrow = TRUE) # Random data
data[1000:1500, 2] <- NA # insert NAs to make it more similar to true data
data <- xts(data, order.by = as.Date(1:1500, origin = "2000-01-01"))
NR <- nrow(data) # number of observations
NC <- ncol(data) # number of factors
obs <- 30 # required number of observations for rolling regression analysis
info.names <- c("res", "coef")
info <- array(NA, dim = c(NR, length(info.names), NC))
colnames(info) <- info.names
. Массив создается для хранения множественных переменных (остатков, коэффициентов и т. д. )по времени и по факторам.
loop.begin.time <- Sys.time()
for (j in 2:NC) {
cat(paste("Processing residuals for factor:", j), "\n")
for (i in obs:NR) {
regression.temp <- fastLm(data[i:(i-(obs-1)), j] ~ data[i:(i-(obs-1)), 1])
residuals.temp <- regression.temp$residuals
info[i, "res", j] <- round(residuals.temp[1] / sd(residuals.temp), 4)
info[i, "coef", j] <- regression.temp$coefficients[2]
}
}
loop.end.time <- Sys.time()
print(loop.end.time - loop.begin.time) # prints the loop runtime
Как показывает цикл, идея состоит в том, чтобы запускать скользящую регрессию из 30 наблюдений с data[, 1]
в качестве зависимой переменной (фактор )каждый раз против одного из других факторов. Мне нужно сохранить 30 остатков во временном объекте, чтобы стандартизировать их, поскольку fastLm
не вычисляет стандартизированные остатки.
Цикл выполняется чрезвычайно медленно и становится громоздким, если количество столбцов (факторов )в объекте xts увеличивается примерно до 100 -1000 столбцов заняли бы целую вечность. Я надеюсь, что у кого-то есть более эффективный код для создания скользящих регрессий по большому набору данных.