Tengo un problema para encontrar la forma más eficiente de calcular una regresión lineal continua sobre un objeto xts con múltiples columnas. He buscado y leído varias preguntas anteriores aquí en stackoverflow.Regresión continua sobre múltiples columnas
Este question and answer se acerca, pero no lo suficiente, en mi opinión, ya que quiero calcular regresiones múltiples con la variable dependiente sin cambios en todas las regresiones. He intentado reproducir un ejemplo con datos aleatorios:
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
La matriz se creó con el fin de almacenar múltiples variables (residuos, coeficientes etc.) con el tiempo y por factor.
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
Como el bucle de muestra la idea es ejecutar una regresión de rodadura 30 observaciones con data[, 1]
como la variable dependiente (factor) cada vez en contra de uno de los otros factores. Tengo que almacenar los 30 residuales en un objeto temporal para estandarizarlos ya que fastLm
no calcula los residuos estandarizados.
El ciclo es extremadamente lento y se vuelve engorroso si el número de columnas (factores) en el objeto xts aumenta a alrededor de 100 - 1.000 columnas tardarían una eternidad. Espero que uno tenga un código más eficiente para crear regresiones continuas sobre un gran conjunto de datos.
Puede hacer que sea 2 veces más rápido al no ejecutar la regresión dos veces ... que he editado en su pregunta. –
Sí, por supuesto! Es tarde aquí en Europa. Gracias Joshua. El cambio ha aumentado el rendimiento en 2-2.5x. Sin embargo, ¿considera que este código tiene un rendimiento adecuado para un conjunto de datos de 2500 observaciones diarias y alrededor de 1.000 factores? ¿O conoce alguna ganancia en el rendimiento al usar rollapply en comparación con el enfoque anterior? Supongo que si el conjunto de datos se vuelve muy grande, tiene que aplicar filtro recursivo de mínimos cuadrados o algo relacionado, ¿tiene alguna idea al respecto? –