過去に多くの生物医学論文で段階的回帰が多用されていましたが、これは多くの問題のより良い教育により改善しているようです。ただし、多くの古いレビュアーはまだそれを求めています。ステップワイズ回帰に役割があり、使用する必要がある場合、どのような状況ですか?
過去に多くの生物医学論文で段階的回帰が多用されていましたが、これは多くの問題のより良い教育により改善しているようです。ただし、多くの古いレビュアーはまだそれを求めています。ステップワイズ回帰に役割があり、使用する必要がある場合、どのような状況ですか?
回答:
私は、段階的回帰が好ましいアプローチである状況を知りません。それに非常に大きなデータセット上の全段階的プロセスのブートストラップを有する(特にフルモデルから出発し、その降圧バージョン)大丈夫であってもよい。ここで、nは連続的な結果の観測値の数(または生存分析のイベントを含むレコードの数)pは考慮されたすべての相互作用を含む候補予測子の数です。モデル構築の方法(nはpよりもはるかに大きいことを意味します) 時々引用される20の係数よりも大幅に大きい)。
もちろん、ほとんどの人が段階的回帰のようなことをしようとする理由は、
すなわち、ステップワイズ回帰のような方法は、(良好な動作特性があった場合)良好な動作特性を持たない状況で特に魅力的です。
段階的な回帰を見ることに反対しない2つのケースは次のとおりです。
これらの非常に重要なユースケースの両方で、あなたは伝統的な統計的推論についてそれほど心配していないので、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!!
私は多くの理由で段階的回帰のファンではないので、このスタンスを守ろうとしてやや気まずい思いをします。しかし、私は単に私がそれについて好きではないものを正確に正確にすることが重要だと思う。