Są dwa przypadki, w których nie sprzeciwiałbym się regresji stopniowej
- Analiza danych rozpoznawczych
- Modele predykcyjne
W obu tych bardzo ważnych przypadkach użycia nie obawiasz się tak bardzo tradycyjnego wnioskowania statystycznego, więc fakt, że wartości p itp. Nie są już ważne, nie stanowi problemu.
Na przykład, jeśli artykuł badawczy powiedział: „W naszym badaniu pilotażowym zastosowaliśmy regresję krokową, aby znaleźć 3 interesujące zmienne spośród 1000. W badaniu uzupełniającym z nowymi danymi pokazaliśmy, że te 3 interesujące zmienne były silnie skorelowane z wynik zainteresowania ”, nie miałbym problemu z zastosowaniem regresji stopniowej. Podobnie: „Zastosowaliśmy regresję krokową, aby zbudować model predykcyjny. Ten przeformowany model alternatywny X w naszym zbiorze danych dotyczących MSE” jest dla mnie również w porządku.
Dla jasności nie twierdzę, że regresja stopniowa jest najlepszym sposobem na rozwiązanie tych problemów. Ale jest to łatwe i może dać satysfakcjonujące rozwiązania.
EDYTOWAĆ:
W komentarzach pojawia się pytanie, czy krokowe AIC może być rzeczywiście przydatne do przewidywania. Oto symulacja, która pokazuje, że radzi sobie znacznie lepiej niż regresja liniowa ze wszystkimi zmiennymi towarzyszącymi, a także prawie równie elastycznymi sieciami z karą wybraną w drodze weryfikacji krzyżowej.
Nie wziąłbym tej symulacji za koniec dyskusji; nie jest trudno wymyślić scenariusz, w którym stopniowe AIC będzie gorsze. Ale tak naprawdę nie jest to nieracjonalny scenariusz, a dokładnie taki rodzaj sytuacji, w którym zaprojektowano siatki elastyczne (wysoka korelacja zmiennych towarzyszących z bardzo małą ilością dużych efektów)!
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!!
Dygresja:
Naprawdę nie jestem fanem regresji krokowej z wielu, wielu powodów, więc czuję się trochę niezręcznie, przyjmując to stanowisko w obronie tego. Uważam jednak, że ważne jest precyzyjne określenie dokładnie tego, co mi się nie podoba.