変数選択のためにRのlars(またはglmnet)パッケージからLASSOを使用する


39

この質問が少し基本的なものに遭遇した場合は申し訳ありません。

Rの多重線形回帰モデルにLASSO変数選択を使用したいと考えています。15の予測変数があり、そのうちの1つがカテゴリカルです(問題が発生しますか?)。yを設定した後、次のコマンドを使用します。xy

model = lars(x, y)
coef(model)

私の問題は私が使用するときですcoef(model)。これにより、15行の行列が返され、毎回1つの追加の予測子が追加されます。ただし、どのモデルを選択するかについての提案はありません。私は何かを見逃しましたか?larsパッケージに「最高の」モデルを1つだけ返す方法はありますか?

glmnet代わりに使用することを提案する他の投稿がありますが、これはより複雑に思えます。同じyを使用した試みは次のとおりです。ここで何かを見逃していませんか?: xy

cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")

最後のコマンドは、変数のリストを返します。大部分は係数付きですが、一部は= 0です。これはLASSOが選択した「最良の」モデルの正しい選択ですか?次に、係数not=0を持つすべての変数で線形モデルを近似すると、係数推定値は非常に似ていますが、わずかに異なります。この違いの理由はありますか?LASSOによって選択されたこれらの変数で線形モデルを再調整し、それを最終モデルとして使用することは受け入れられますか?そうでない場合、有意性のp値を確認できません。見逃したことがありますか?

する

type.gaussian="covariance" 

それglmnetが複数の線形回帰を使用していることを確認しますか?

変数の自動正規化は係数にまったく影響しますか?LASSO手順に相互作用用語を含める方法はありますか?

この手順は、重要な推論/予測に何らかの変更が加えられた場合に実際に使用されるモデルよりも、LASSOの使用方法のデモンストレーションとして使用したいと考えています。

これを読んでくれてありがとう。LASSO / lars / glmnetに関する一般的なコメントも歓迎します。


4
副次的なコメントとして、結果を解釈する場合は、lassoによって選択された変数のセットが安定していることを実証してください。これは、モンテカルロシミュレーションを使用するか、独自のデータセットをブートストラップすることで実行できます。
フランクハレル

回答:


28

http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.htmlにあるglmnet優れたビネットのおかげで、使用方法は簡単に理解できます(CRANパッケージページも確認できます)。の最適なラムダについてglmnetは、経験則は

cvfit <- glmnet::cv.glmnet(x, y)
coef(cvfit, s = "lambda.1se")

代わりにlambda.min

同じlarsことをするためには、手でやらなければなりません。ここに私の解決策があります

cv <- lars::cv.lars(x, y, plot.it = FALSE, mode = "step")
idx <- which.max(cv$cv - cv$cv.error <= min(cv$cv))
coef(lars::lars(x, y))[idx,]

これはまったく同じではないことに注意してください。これは、任意のポイントではなく、投げ縄の結び目(変数が入力されるとき)で停止するためです。

注意してくださいglmnet、それを積極的によりそうよりも、維持されている今の好適なパッケージでありlars、そしてについての質問がなされていることglmnetlars(使用されるアルゴリズムが異なる)の前に答えました。

なげなわを使用して変数を選択し、OLSに適合させるという質問に関しては、現在進行中の議論です。Google for OLSはLassoを投稿しており、このトピックについて議論するいくつかの論文があります。統計学習の要素の著者でさえ、それが可能であることを認めています。

編集:ここでは何より正確に再現するためのコードであるglmnetでないが、lars

  cv <- lars::cv.lars(x, y, plot.it = FALSE)
  ideal_l1_ratio <- cv$index[which.max(cv$cv - cv$cv.error <= min(cv$cv))]
  obj <- lars::lars(x, y)
  scaled_coefs <- scale(obj$beta, FALSE, 1 / obj$normx)
  l1 <- apply(X = scaled_coefs, MARGIN = 1, FUN = function(x) sum(abs(x)))
  coef(obj)[which.max(l1 / tail(l1, 1) > ideal_l1_ratio),]

+1すばらしい回答!あなたまたは誰かが、lambda.minではなく、lambda.1seが経験則である理由について詳しく説明してもらえますか?
エロセニン

これを書いて4年後(そして、なげなわをしばらく使用しなかった)、私の記憶は消え去りました。ごめんなさい!
フアンセントロ

8

私は正しい解決策を解決したと思うので、少し前からこの質問に戻っています。

mtcarsデータセットを使用したレプリカを次に示します。

library(glmnet)
`%ni%`<-Negate(`%in%')
data(mtcars)

x<-model.matrix(mpg~.,data=mtcars)
x=x[,-1]

glmnet1<-cv.glmnet(x=x,y=mtcars$mpg,type.measure='mse',nfolds=5,alpha=.5)

c<-coef(glmnet1,s='lambda.min',exact=TRUE)
inds<-which(c!=0)
variables<-row.names(c)[inds]
variables<-variables[variables %ni% '(Intercept)']

「変数」は、最適なソリューションを解決する変数のリストを提供します。


1
私はコードを探していましたが、「テスト」がまだ定義されていないため、「final.list <-testing [-removed] #removing variables」というエラーが発生します。オブジェクトが見つかりません。 「テスト」を使用する代わりに、「cp.list」を使用して、コードが次のようになると仮定します。final.list <-cp.list [-removed] #removing variables final.list <-c(final.list、重複)#削除されてから後で追加された変数を追加するこれが正しいかどうかを教えてください敬具

3
`%ni%` <-Negate( `%ni%`); ##間違っているようです。while `%ni%` <-Negate( `%in%`); ##右に見える。stackexchangeフォーマッタが台無しにしたと思う...-
クリス

パラメータnfolds=5alpha=0.5パラメータの選択方法について詳しく説明してください。
コロン

7

おそらく、前方選択の段階的回帰との比較が役立つでしょう(著者の1人によるサイトへの次のリンクを参照してくださいhttp://www-stat.stanford.edu/~tibs/lasso/simple.html)。これは、統計学習の要素の3.4.4章で使用されているアプローチです(オンラインで無料で利用できます)。その本の3.6章は、最小二乗、最適なサブセット、および投げ縄(および他のいくつかの手順)の関係を理解するのに役立つと思いました。また、係数t(coef(model))とwrite.csvの転置を行うと、横にあるplot(model)のコピーとともにExcelで開くことができるので便利です。最小二乗推定値を含む最後の列で並べ替えることができます。次に、各変数が各区分ステップでどのように追加され、係数が結果としてどのように変化するかを明確に確認できます。もちろん、これはすべてではありませんが、願わくばそれが出発点になることを願っています。


3

larsglmnet生の行列を操作します。相互作用の項を含めるには、マトリックスを自分で作成する必要があります。つまり、交互作用ごとに1つの列を意味します(因子がある場合は、因子ごとのレベルごとです)。見てlm()、それはそれないかを確認する(警告を:ドラゴンがあります)。

すぐにそれを行うには、次のようなことを行います:相互作用用語を手動で作成するには、次のようにします(ただし、遅いので、できません)。

int = D["x1"]*D["x2"]
names(int) = c("x1*x2")
D = cbind(D, int)

次に、これをラールで使用するには(yキックを想定):

lars(as.matrix(D), as.matrix(y))

他の質問でもっとお役に立てればと思います。larsが私に悲しみを与えており、その中とウェブ上のドキュメントが非常に薄いため、これを見つけました。


2
「警告:ドラゴンがいる」これはでとても簡単model.matrix()です。
グレゴール14年

2

LARSは全体のソリューションパスを解決します。解の経路は区分的に線形です。解が変化する有限数の「ノッチ」ポイント(つまり、正則化パラメーターの値)があります。

したがって、得られるソリューションのマトリックスはすべての可能なソリューションです。返されるリストでは、正規化パラメーターの値も提供する必要があります。


ご回答ありがとうございます。正則化パラメーターの値を表示する方法はありますか?さらに、このパラメーターに基づいてソリューションを選択する方法はありますか?(パラメーターlambdaもですか?)
ジェームズ

区分的線形性は、線が水平であることを意味しないため、解はラムダで常に変化していることに注意してください。たとえば、予測のために、ノットだけなくノットにもラムダ値のグリッドがあります。ノット間のいくつかのポイントが最良の予測パフォーマンスをもたらす可能性は十分にあります。
リチャードハーディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.