Два випадки, коли я не заперечую проти поступової регресії, - це
- Дослідницький аналіз даних
- Прогнозні моделі
В обох цих дуже важливих випадках використання ви не так переймаєтесь традиційним статистичним висновком, тому факт, що p-значення тощо, вже не є дійсними, мало хвилює.
Наприклад, якщо в дослідницькому документі сказано: "У нашому пілотному дослідженні ми використовували поетапну регресію для пошуку 3 цікавих змінних з 1000. У подальшому дослідженні з новими даними ми показали, що ці 3 цікаві змінні сильно корелюються з результат інтересу ", я б не мав жодних проблем із застосуванням поетапної регресії. Аналогічно, "Ми використовували поетапну регресію для побудови прогнозної моделі. Ця позаформована альтернативна модель X у нашому наборі даних про витримку щодо MSE" також повністю зі мною.
Щоб було зрозуміло, я не кажу, що поетапна регресія - це найкращий спосіб вирішити ці проблеми. Але це легко і може дати вам задовільні рішення.
Редагувати:
У коментарях виникає питання, чи ступінчаста АПК може бути корисною для прогнозування. Ось моделювання, яке показує, що це робить набагато краще, ніж лінійна регресія з усіма коваріатами, і майже так само, як і еластичні сітки з покаранням, обраним за допомогою перехресної перевірки.
Я б не сприймав це моделювання як закінчення дискусії; не надто складно придумати сценарій, коли покрокова АПК буде гіршою. Але це насправді не необґрунтований сценарій, а саме тип ситуації, для якої створені еластичні сітки (висока кореляція коваріатів з дуже невеликими великими ефектами)!
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!!
Бічна примітка:
Я дійсно не є прихильником ступінчастої регресії з багатьох, багатьох причин, тому я відчуваю себе дещо незручно, зайнявши цю позицію на захист. Але я просто думаю, що важливо бути точним щодо того, що саме мені не подобається.