Hai trường hợp tôi không phản đối việc xem hồi quy từng bước là
- Phân tích dữ liệu thăm dò
- Mô hình dự đoán
Trong cả hai trường hợp sử dụng rất quan trọng này, bạn không quá quan tâm đến suy luận thống kê truyền thống, do đó, thực tế là giá trị p, v.v., không còn hợp lệ là điều ít quan tâm.
Ví dụ: nếu một bài nghiên cứu cho biết "Trong nghiên cứu thử nghiệm của chúng tôi, chúng tôi đã sử dụng hồi quy từng bước để tìm ra 3 biến thú vị trong số 1000. Trong một nghiên cứu tiếp theo với dữ liệu mới, chúng tôi đã chỉ ra 3 biến thú vị này có mối tương quan chặt chẽ với kết quả của sự quan tâm ", tôi sẽ không gặp vấn đề gì với việc sử dụng hồi quy từng bước. Tương tự như vậy, "Chúng tôi đã sử dụng hồi quy từng bước để xây dựng một mô hình dự đoán. Mô hình thay thế X được định dạng trước này trong bộ dữ liệu giữ của chúng tôi liên quan đến MSE" cũng hoàn toàn tốt với tôi.
Để rõ ràng, tôi không nói rằng hồi quy từng bước là cách tốt nhất để tiếp cận những vấn đề này. Nhưng nó rất dễ dàng và có thể cung cấp cho bạn giải pháp thỏa đáng.
BIÊN TẬP:
Trong các bình luận, có một câu hỏi là liệu AIC từng bước có thực sự hữu ích cho dự đoán hay không. Đây là một mô phỏng cho thấy nó hoạt động tốt hơn nhiều so với hồi quy tuyến tính với tất cả các hiệp phương sai, và gần như các lưới đàn hồi với hình phạt được chọn bằng xác nhận chéo.
Tôi sẽ không lấy mô phỏng này làm kết thúc cuộc thảo luận; không quá khó để đưa ra một kịch bản trong đó AIC khôn ngoan sẽ trở nên tồi tệ hơn. Nhưng đó thực sự không phải là một kịch bản không hợp lý, và chính xác là loại tình huống mà lưới đàn hồi được thiết kế cho (tương quan cao của các hiệp phương sai với rất ít hiệu ứng lớn)!
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!!
Lưu ý bên:
Tôi thực sự không phải là một fan hâm mộ của hồi quy từng bước vì nhiều lý do, vì vậy tôi cảm thấy hơi khó xử khi có lập trường này để bảo vệ nó. Nhưng tôi chỉ nghĩ rằng điều quan trọng là phải chính xác về chính xác những gì tôi không thích về nó.