过去,逐步回归在许多生物医学论文中被过度使用,但随着对其许多问题的更好教育,这种情况似乎正在改善。然而,许多年长的评论者仍然要求它。在什么情况下逐步回归起作用并且应该使用(如果有的话)?
在任何情况下都应该使用逐步回归?
我不知道逐步回归将是首选方法的情况。的极大数据集上引导整个逐步过程可能没问题(特别是在从完整模型开始的降压版本中)。这里是连续结果中的观察数(或生存分析中包含事件的记录数)是候选预测变量的数量,包括所有考虑的交互作用 - 即,当任何甚至很小的影响变得非常清晰并且无关紧要时你是如何构建模型的(这意味着将比大得多,比有时引用的因子 20 大得多)。
当然,大多数人想做逐步回归之类的事情的原因是,
- 因为它不是计算密集型的(如果您没有进行适当的引导,那么您的结果将非常不可靠),
- 因为它提供了明确的“在模型中”与“不在模型中”的陈述(这在标准逐步回归中非常不可靠;适当的引导通常会清楚地表明这些陈述通常不会那么清楚)和
- 因为通常小于、接近或略大于。
即像逐步回归这样的方法(如果它具有良好的操作特性)在那些不具有良好操作特性的情况下特别有吸引力。
我不反对逐步回归的两种情况是
- 探索性数据分析
- 预测模型
在这两个非常重要的用例中,您并不那么关心传统的统计推断,因此 p 值等不再有效这一事实并不重要。
例如,如果一篇研究论文说“在我们的试点研究中,我们使用逐步回归从 1000 个变量中找出 3 个有趣的变量。在使用新数据的后续研究中,我们发现这 3 个有趣的变量与感兴趣的结果”,我对使用逐步回归没有任何问题。类似地,“我们使用逐步回归来构建预测模型。在我们的 MSE 数据集中,这个表现出色的替代模型 X”对我来说也完全没问题。
需要明确的是,我并不是说逐步回归是解决这些问题的最佳方法。但这很容易,可能会给您满意的解决方案。
编辑:
在评论中,有一个问题是逐步 AIC 是否真的可以用于预测。这是一个模拟,表明它比所有协变量的线性回归要好得多,并且几乎与通过交叉验证选择的惩罚的弹性网络一样好。
我不会把这个模拟作为讨论的结束;想出逐步式 AIC 表现更差的场景并不难。但这确实不是一个不合理的场景,并且正是弹性网络设计的那种情况(协变量的高相关性,几乎没有大的影响)!
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!!
边注:
由于很多很多原因,我真的不喜欢逐步回归,所以我采取这种立场来捍卫它感到有些尴尬。但我只是认为准确地说出我不喜欢的地方很重要。