Deux cas dans lesquels je ne m'opposerais pas à une régression par étapes sont
- L'analyse exploratoire des données
- Modèles prédictifs
Dans ces deux cas d'utilisation très importants, vous n'êtes pas tellement préoccupé par l'inférence statistique traditionnelle, donc le fait que les valeurs p, etc., ne soient plus valables est peu préoccupant.
Par exemple, si un document de recherche disait "Dans notre étude pilote, nous avons utilisé une régression pas à pas pour trouver 3 variables intéressantes sur 1000. Dans une étude de suivi avec de nouvelles données, nous avons montré que ces 3 variables intéressantes étaient fortement corrélées avec la résultat d'intérêt ", je n'aurais aucun problème avec l'utilisation de la régression pas à pas. De même, "Nous avons utilisé une régression pas à pas pour construire un modèle prédictif. Ce modèle alternatif X préformé dans notre ensemble de données sur les MSE" me convient parfaitement.
Pour être clair, je ne dis pas que la régression par étapes est la meilleure façon d'aborder ces problèmes. Mais c'est facile et peut vous donner des solutions satisfaisantes.
ÉDITER:
Dans les commentaires, la question se pose de savoir si l'AIC par étapes peut réellement être utile pour la prédiction. Voici une simulation qui montre qu'il fait beaucoup mieux que la régression linéaire avec toutes les covariables, et presque aussi bien que les réseaux élastiques avec la pénalité choisie par validation croisée.
Je ne prendrais pas cette simulation comme la fin de la discussion; il n'est pas trop difficile de trouver un scénario dans lequel l'AIC par étapes se comportera moins bien. Mais ce n'est vraiment pas un scénario déraisonnable, et exactement le type de situation pour laquelle les filets élastiques sont conçus (forte corrélation des covariables avec très peu d'effets importants)!
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!!
Note latérale:
Je ne suis vraiment pas un fan de la régression pas à pas pour de nombreuses raisons, donc je me sens un peu maladroit d'avoir pris cette position pour la défendre. Mais je pense simplement qu'il est important d'être précis sur ce que je n'aime pas.