过去,逐步回归在许多生物医学论文中已被过度使用,但是随着对其许多问题的更好的教育,这种逐步改善的趋势似乎正在改善。但是,许多较老的审阅者仍然要求它。在什么情况下逐步回归会起作用,应该使用逐步回归(如果有)吗?
过去,逐步回归在许多生物医学论文中已被过度使用,但是随着对其许多问题的更好的教育,这种逐步改善的趋势似乎正在改善。但是,许多较老的审阅者仍然要求它。在什么情况下逐步回归会起作用,应该使用逐步回归(如果有)吗?
Answers:
我不了解逐步回归将是首选方法的情况。可以将整个逐步过程引导到超大型数据集上(特别是从完整模型开始的逐步降低版本),这可能是好的。在这里,是连续结果中的观察次数(或生存分析中具有事件的记录数)是包括所有考虑的相互作用的候选预测变量的数目,即,即使很小的影响变得非常明显,也没关系如何建立模型(这意味着会比很多,比有时引用的20大很多)。Ñ p Ñ p
当然,大多数人都喜欢做逐步回归之类的原因是,
也就是说,像逐步回归这样的方法(如果它具有良好的运行特性)在那些情况下(如果它没有良好的运行特性)将特别有吸引力。
我不反对看到逐步回归的两种情况是
在这两个非常重要的用例中,您不必太担心传统的统计推断,因此,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!!
由于许多原因,我实际上并不喜欢逐步回归,因此采取这种立场为自己辩护时,我感到有些尴尬。但是我只是认为准确地知道我不喜欢的东西很重要。