Rで変数/機能の選択を行うために相互検証を使用する方法はありますか?


10

削減したい約70の変数を含むデータセットがあります。私が探しているのは、次の方法でCVを使用して最も有用な変数を見つけることです。

1)ランダムに言う20変数を選択します。

2)stepwise/ LASSO/ lars/ etcを使用して、最も重要な変数を選択します。

3)〜50xを繰り返し、どの変数が最も頻繁に選択されている(削除されていない)かを確認します。

これはa randomForestが何をするかという線に沿っていrfVarSelますが、パッケージは因子/分類に対してのみ機能するようであり、連続従属変数を予測する必要があります。

私はRを使用しているので、あらゆる提案が理想的にそこで実装されます。


すべての機能が重要ですか?サンプルはいくつありますか?私が問題を正しく理解している場合、ブースティングのいくつかのバリアントを試すことができます-サンプルのサブセットを繰り返し選択し、すべての変数をそれらに当てはめて、どれがより頻繁にポップアップするかを確認します。
オフェリア2012

1
私はあなたの手順がLASSOで改善する可能性は低いと思います。Rの実装(たとえば、glmnetとペナルティ付き)はデフォルトで交差検証を使用して「最適な」正則化パラメーターを見つけます。考慮できることの1つは、このパラメーターのLASSO検索を数回繰り返して、相互検証の潜在的な大きな変動(繰り返しCV)に対処することです。もちろん、アルゴリズムはあなたの主題固有の事前知識に勝るものはありません。
ミウラ2014年

回答:


9

あなたが説明したことはすでにcaretパッケージに実装されていると思います。rfeここで関数またはビネットを見てください:http : //cran.r-project.org/web/packages/caret/vignettes/caretSelection.pdf

とはいえ、機能の数を減らす必要があるのはなぜですか?70から20までは、実際には大幅な減少ではありません。いくつかの機能は本当に重要ではないと確信する前に、70以上の機能が必要だと思います。しかし、ここでも、主観的な事前知識がここにあると思います。


5

変数選択頻度が、初期モデルの変数の明らかな重要性からまだ得ていない情報を提供する理由はありません。これは基本的に、初期の統計的有意性の再現です。また、選択頻度のカットオフを決定するときに、新しいレベルの恣意性を追加します。変数選択のリサンプリングは、他の問題に加えて、共線性によってひどく損傷されます。


2

今日の初めから私の答えを修正しました。これで、コードを実行するためのサンプルデータがいくつか生成されました。他の人は、私が同意するキャレットパッケージの使用を検討することを正しく提案しています。ただし、場合によっては、独自のコードを作成する必要があります。以下では、Rのsample()関数を使用して、観測値を交差検証フォールドにランダムに割り当てる方法を示すことを試みました。また、forループを使用して、10のトレーニングセットで変数の事前選択(寛大なp値のカットオフが0.1の単変量線形回帰を使用)とモデル構築(段階的回帰を使用)を実行します。その後、独自のコードを記述して、結果のモデルを検証フォールドに適用できます。お役に立てれば!

################################################################################
## Load the MASS library, which contains the "stepAIC" function for performing
## stepwise regression, to be used later in this script
library(MASS)
################################################################################


################################################################################
## Generate example data, with 100 observations (rows), 70 variables (columns 1
## to 70), and a continuous dependent variable (column 71)
Data <- NULL
Data <- as.data.frame(Data)

for (i in 1:71) {
for (j in 1:100) {
Data[j,i]  <- rnorm(1) }}

names(Data)[71] <- "Dependent"
################################################################################


################################################################################
## Create ten folds for cross-validation. Each observation in your data will
## randomly be assigned to one of ten folds.
Data$Fold <- sample(c(rep(1:10,10)))

## Each fold will have the same number of observations assigned to it. You can
## double check this by typing the following:
table(Data$Fold)

## Note: If you were to have 105 observations instead of 100, you could instead
## write: Data$Fold <- sample(c(rep(1:10,10),rep(1:5,1)))
################################################################################


################################################################################
## I like to use a "for loop" for cross-validation. Here, prior to beginning my
## "for loop", I will define the variables I plan to use in it. You have to do
## this first or R will give you an error code.
fit <- NULL
stepw <- NULL
training <- NULL
testing <- NULL
Preselection <- NULL
Selected <- NULL
variables <- NULL
################################################################################


################################################################################
## Now we can begin the ten-fold cross validation. First, we open the "for loop"
for (CV in 1:10) {

## Now we define your training and testing folds. I like to store these data in
## a list, so at the end of the script, if I want to, I can go back and look at
## the observations in each individual fold
training[[CV]] <- Data[which(Data$Fold != CV),]
testing[[CV]]  <- Data[which(Data$Fold == CV),]

## We can preselect variables by analyzing each variable separately using
## univariate linear regression and then ranking them by p value. First we will
## define the container object to which we plan to output these data.
Preselection[[CV]] <- as.data.frame(Preselection[CV])

## Now we will run a separate linear regression for each of our 70 variables.
## We will store the variable name and the coefficient p value in our object
## called "Preselection".
for (i in 1:70) {
Preselection[[CV]][i,1]  <- i
Preselection[[CV]][i,2]  <- summary(lm(Dependent ~ training[[CV]][,i] , data = training[[CV]]))$coefficients[2,4]
}

## Now we will remove "i" and also we will name the columns of our new object.
rm(i)
names(Preselection[[CV]]) <- c("Variable", "pValue")

## Now we will make note of those variables whose p values were less than 0.1.
Selected[[CV]] <- Preselection[[CV]][which(Preselection[[CV]]$pValue <= 0.1),] ; row.names(Selected[[CV]]) <- NULL

## Fit a model using the pre-selected variables to the training fold
## First we must save the variable names as a character string
temp <- NULL
for (k in 1:(as.numeric(length(Selected[[CV]]$Variable)))) {
temp[k] <- paste("training[[CV]]$V",Selected[[CV]]$Variable[k]," + ",sep="")}
variables[[CV]] <- paste(temp, collapse = "")
variables[[CV]] <- substr(variables[[CV]],1,(nchar(variables[[CV]])-3))

## Now we can use this string as the independent variables list in our model
y <- training[[CV]][,"Dependent"]
form <- as.formula(paste("y ~", variables[[CV]]))

## We can build a model using all of the pre-selected variables
fit[[CV]] <- lm(form, training[[CV]])

## Then we can build new models using stepwise removal of these variables using
## the MASS package
stepw[[CV]] <- stepAIC(fit[[CV]], direction="both")

## End for loop
}

## Now you have your ten training and validation sets saved as training[[CV]]
## and testing[[CV]]. You also have results from your univariate pre-selection
## analyses saved as Preselection[[CV]]. Those variables that had p values less
## than 0.1 are saved in Selected[[CV]]. Models built using these variables are
## saved in fit[[CV]]. Reduced versions of these models (by stepwise selection)
## are saved in stepw[[CV]].

## Now you might consider using the predict.lm function from the stats package
## to apply your ten models to their corresponding validation folds. You then
## could look at the performance of the ten models and average their performance
## statistics together to get an overall idea of how well your data predict the
## outcome.
################################################################################

相互検証を実行する前に、その適切な使用法について読むことが重要です。これらの2つのリファレンスは、相互検証の優れた議論を提供します。

  1. Simon RM、Subramanian J、Li MC、MenezesS。交差検証を使用して、高次元データに基づく生存リスク分類子の予測精度を評価します。簡単なバイオインフォーム。2011 5月; 12(3):203-14。Epub 2011 2月15日。http ://bib.oxfordjournals.org/content/12/3/203.long
  2. リチャードサイモン、マイケルD.ラドマッハー、ケビンドビン、リサM.マクシェーン。診断および予後分類のためのDNAマイクロアレイデータの使用における落とし穴。JNCI J Natl Cancer Inst(2003)95(1):14-18。http://jnci.oxfordjournals.org/content/95/1/14.long

これらの論文は生物統計学者を対象としていますが、誰にとっても有用でしょう。

また、ステップワイズ回帰を使用することは危険であることを常に念頭に置いてください(クロス検証を使用すると、過剰適合を軽減するのに役立つはずです)。ステップワイズ回帰のよい議論はここで利用できます:http : //www.stata.com/support/faqs/stat/stepwise.html

他にご不明な点がありましたらお知らせください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.