Zwei Fälle, in denen ich eine schrittweise Regression nicht ablehnen würde, sind:
- Explorative Datenanalyse
- Vorhersagemodelle
In diesen beiden sehr wichtigen Anwendungsfällen sind Sie nicht so besorgt über die traditionelle statistische Inferenz, sodass die Tatsache, dass p-Werte usw. nicht mehr gültig sind, von geringer Bedeutung ist.
Zum Beispiel, wenn ein Forschungsbericht sagte: "In unserer Pilotstudie haben wir schrittweise Regression verwendet, um 3 interessante Variablen von 1000 zu finden. In einer Folgestudie mit neuen Daten haben wir gezeigt, dass diese 3 interessanten Variablen stark mit dem korrelieren Ergebnis des Interesses ", hätte ich kein Problem mit der Verwendung der schrittweisen Regression. In ähnlicher Weise ist "Wir haben schrittweise Regression verwendet, um ein Vorhersagemodell zu erstellen. Dieses vorgeformte alternative Modell X in unserem Hold-out-Datensatz in Bezug auf MSE" auch für mich völlig in Ordnung.
Um es klar auszudrücken, ich sage nicht, dass eine schrittweise Regression der beste Weg ist, um diese Probleme anzugehen. Aber es ist einfach und kann Ihnen zufriedenstellende Lösungen geben.
BEARBEITEN:
In den Kommentaren wird die Frage aufgeworfen, ob ein schrittweiser AIC tatsächlich für die Vorhersage nützlich sein kann. Hier ist eine Simulation, die zeigt, dass sie mit allen Kovariaten viel besser abschneidet als mit der linearen Regression, und mit fast ebenso elastischen Netzen, deren Strafe durch Kreuzvalidierung ausgewählt wurde.
Ich würde diese Simulation nicht als das Ende der Diskussion ansehen. Es ist nicht allzu schwer, ein Szenario zu entwickeln, in dem sich ein schrittweiser AIC schlechter entwickeln wird. Aber es ist wirklich kein unvernünftiges Szenario und genau die Art von Situation, für die elastische Netze ausgelegt sind (hohe Korrelation von Kovariaten mit sehr wenigen großen Effekten)!
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!!
Randnotiz:
Ich bin aus vielen, vielen Gründen wirklich kein Fan von schrittweiser Regression, daher fühle ich mich etwas unwohl, wenn ich diese Haltung einnehme, um sie zu verteidigen. Aber ich denke nur, dass es wichtig ist, genau zu sagen, was mir daran nicht gefällt.