Dos casos en los que no me opondría a ver una regresión escalonada son
- Análisis exploratorio de datos
- Modelos predictivos
En estos dos casos de uso muy importantes, no está tan preocupado por la inferencia estadística tradicional, por lo que el hecho de que los valores p, etc., ya no sean válidos es de poca importancia.
Por ejemplo, si un trabajo de investigación decía "En nuestro estudio piloto, usamos la regresión gradual para encontrar 3 variables interesantes de 1000. En un estudio de seguimiento con nuevos datos, mostramos que estas 3 variables interesantes estaban fuertemente correlacionadas con el resultado de interés ", no tendría ningún problema con el uso de la regresión gradual. Del mismo modo, "Utilizamos la regresión por pasos para construir un modelo predictivo. Este modelo alternativo X preformado en nuestro conjunto de datos de retención con respecto a MSE" también está totalmente bien para mí.
Para ser claros, no estoy diciendo que la regresión escalonada sea la mejor manera de abordar estos problemas. Pero es fácil y puede brindarle soluciones satisfactorias.
EDITAR:
En los comentarios, hay una cuestión de si el AIC por pasos puede ser realmente útil para la predicción. Aquí hay una simulación que muestra que funciona mucho mejor que la regresión lineal con todas las covariables, y casi tan bien como las redes elásticas con la penalización elegida por validación cruzada.
No tomaría esta simulación como el final de la discusión; No es demasiado difícil llegar a un escenario en el que la AIC escalonada se empeore peor. ¡Pero en realidad no es un escenario irrazonable, y es exactamente el tipo de situación para la que están diseñadas las redes elásticas (alta correlación de covariables con muy pocos efectos grandes)!
library(leaps)
library(glmnet)
nRows <- 1000
nCols <- 500
# Seed set For reproducibility.
# Try changing for investigation of reliability of results
set.seed(1)
# Creating heavily correlated covariates
x_firstHalf <- matrix(rnorm(nRows * nCols / 2), nrow = nRows)
x_secondHalf <- x_firstHalf + 0.5 *
matrix(rnorm(nRows * nCols / 2), nrow = nRows)
x_mat <- cbind(x_firstHalf, x_secondHalf) + rnorm(nRows)
# Creating beta's. Most will be of very small magnitude
p_large = 0.01
betas <- rnorm(nCols, sd = 0.01) +
rnorm(nCols, sd = 4) * rbinom(nCols, size = 1, prob = p_large)
y <- x_mat %*% betas + rnorm(nRows, sd = 4)
all_data <- data.frame(y, x_mat)
colnames(all_data) <- c('y', paste('x', 1:nCols, sep = '_'))
# Holding out 25% of data for validation
holdout_index <- 1:(nRows * .25)
train_data <- all_data[-holdout_index, ]
validate_data <- all_data[holdout_index, ]
mean_fit <- lm(y ~ 0, data = train_data)
full_fit <- lm(y ~ ., data = train_data)
step_fit <- step(mean_fit,
scope = list(lower = mean_fit, upper = full_fit),
direction = "forward", steps = 20, trace = 0)
glmnet_cvRes <- cv.glmnet(x = as.matrix(train_data[,-1]),
y = as.numeric(train_data$y) )
full_pred <- predict(full_fit, validate_data)
step_pred <- predict(step_fit, validate_data)
glmnet_pred <- predict(glmnet_cvRes, as.matrix(validate_data[,-1]), s='lambda.min')
sd(full_pred - validate_data$y) # [1] 6.426117
sd(step_pred - validate_data$y) # [1] 4.233672
sd(glmnet_pred - validate_data$y) # [1] 4.127171
# Note that stepwise AIC does considerably better than using all covariates
# in linear regression, and not that much worse than penalized methods
# with cross validation!!
Nota al margen:
Realmente no soy fanático de la regresión gradual por muchas, muchas razones, por lo que me siento un poco incómodo de haber tomado esta postura en defensa de ella. Pero simplemente creo que es importante ser preciso sobre exactamente lo que no me gusta.