Stata分析機能例題を利用してもっと知ろう
lasso

least absolute shrinkage and selection operator (lasso) はモデルの係数を推定し、その推定はどの共変量をモデルに組み込むべきかを選択するのに使われます。
lassoは、多くの潜在的な共変量のうちのいくつかがアウトカムに影響を与える場合に最も有用です。そして、影響を与える共変量のみをモデルに含めることが重要です。

この例題でできること

  • lassoによるフィッティングとモデル選択の方法
  • 選択(cv):クロスバリデーション
  • CV(クロスバリデーション)関数
  • 係数へのペナルティと選択
  • lassoselectコマンドを使って手作業でλを選択する
lasso 1
lasso 2

Stata評価版

最新バージョンのStataをお持ちでない場合は、無料の体験版でお試しいただけます。

doファイルのダウンロード

今回使用するコマンドをまとめたdoファイルです。zipファイルをダウンロード後に展開(解凍)してください。
doファイルは、Stataのメニューの「ファイル > 開く」で開いて使用します。

PDFファイルのダウンロード

このページの内容はPDFでも配布しております。

例1 逸脱度を用いた最適な予測

lassoコマンドは線形、ロジット、プロビットの回帰モデルにおいて逸脱度を用いて最適な予測を行います。

変数選択
モデルで利用すべき変数を機械学習の手法により選択します。
複数の計算手法
Lassoにはダブルセレクションlasso、パ-シャリングアウトlasso、クロスフィットパ-シャリングアウトlassoのバリエーションがあります。その他にElastic netコマンドを利用できます。

lassoとelastic net機能では、連続、二値およびカウントアウトアムのモデル選択と予測を行うことができます。
効果を推定して、係数を検定したい場合、このような最先端の推測法を用いれば、lassoモデルが制御変数を選択するので、興味のある変数の予測が可能です。
さらに、内生性のある共変量にも対処することができます。

フィット結果

lassoはモデル選択、予測、そして統計的推測に利用可能な技術です。
新しいlassoコマンドを利用する事により連続、頻度、二値のアウトカムを取り扱う線型、ポアソン、ロジット、プロビットの回帰モデルで最適な予測値の計算が可能となります。
lassoコマンドでは変数選択だけでなく、係数、標準誤差、信頼区間の推定、そして係数の診断までの一連の機能が用意されています。

icon具体的な使用例

例えば、次のようなコマンドを実行します。

. lasso linear y x1-x500

lassoは変数群の中から例えば最適なフィットを実現する

x2, x10, x11, x21

の変数セットを選択します。
そこで標準的なpredictコマンドを実行することで y の予測値を計算します。

二値データや頻度データをアウトカムとする場合は

lasso logit, lasso probit, lasso poisson

といったコマンドを実行します。
変数選択でelastic netやsquare-root lasso法を利用する場合はelasticnetsqrtlassoといったコマンドを利用します。
新たに提供されるコマンドは次の通りです。

dsregress, dslogit, dspoisson, poregress, pologit, popoisson, poivpoisson, xporegress, xpologit, xpopoisson, xpoivregress

dsで始まるコマンドは二重選択型lassoコマンドです。
poは部分選択型、xpoはクロスフィットによる部分選択型のlassoコマンドを意味しています。
アウトカムの種類は連続、二値、頻度に対応しています。
アウトカムが連続変数である場合は、内生変数を含むモデルでも利用可能です。
lassoベースの統計的推測の手法には様々な提案があり、今回、できるだけ多くの手法を新たにサポートしました。

lassoelasticnetは変数選択と予測に利用されるコマンドです。
統計的推測に利用するlassoの新しいコマンド群は元々、計量経済学者によって開発された手法ですが、今日では係数の診断と解釈を必要とする様々な分野の研究者にとってニーズの高い分析手法となっています。

例2 選択(cv):クロスバリデーション

lassoによるフィッティングとモデル選択の方法について

lassoは、λを所与とした時に次式を最小化するβの推定値を求める推定手法です。

クロスバリデーション 推定式

任意のλに対して何らかのβが求まります。その時、いくつかの係数β_jはゼロになるかもしれません。
また、λが大きくなるほど、ゼロとならない係数の数は減っていきます。

lassoの目的は、ゼロとならない係数βに対応するλで、好ましい特徴を持ったものを決定することです。
最終的に選択したλはλ^*と表記します。
λ^* について触れる場合、ゼロとならない係数βのセットを対象にしていることを覚えておいてください。

データの確認

この例では、Stataのサンプルデータauto.dtaを使ってクロスバリデーション(CV)について説明します。
このサンプルデータは変数の数もサンプルサイズも小さいので、本来はlassoによる解析向きではありません。
lassoは一般的に数百、数千個以上の変数を持つデータに対して利用します。

サンプルデータは小さいデータですが、出力が小さく解説に便利なため、ここでは敢えて利用します。
下記のコマンドでサンプルデータを読み込みます。

. sysuse auto

lassoコマンドを実行する前に乱数キーを設定します。
CVは乱数を利用しますので、再現性を確保します。

. set seed 1234

mpg(マイル/ガロン)を被説明変数とするモデルを推定します。
lassoのモデルとして、linearlogitprobitpoissonが用意されています。
ここでは、線形モデルなのでlinearを利用します。
CVのオプションはselection(cv)ですが、デフォルトで実行されますので、ここでは表記しません。

. lasso linear mpg i.foreign i.rep78 headroom weight turn gear_ratio price trunk length

lassoコマンドの実行後、推定結果をautolassoという名前で保存します。
一般的なlassoコマンドの利用場面では、計算時間がかかりますので、推定結果を保存する習慣をつけておくと効率的です。

. estimates store autolasso
クロスバリデーション 推定結果 1

この計算ではグリッド1のλ=4.691140からグリッド45のλ=0.078253まで繰り返し計算を実行します。
デフォルトではオプションselection(cv)が100個のλを利用します。

λは一定間隔か、または対数スケールで作成されます。
ここではグリッド値47で終了し、λのグリッドポイントの最小値55では何の計算も実行しません。
出力結果の表からは、グリッド値1のλに対しては、非ゼロの係数がゼロ個であることが分かります。
この表にはCVの過程で計算したλを表示します。

グリッド値が100の時のλは、grid()のサブオプションratio(#)で設定します。
この比率は最後の最小λと最初の妻財λの比として求めます。
ratio(#)のデフォルト値は1e-4です。

各λに対して係数を推定します。
すべてのλを表示する場合は、lassoknotsコマンドとalllambdasオプションを利用します。

. lassoknots, alllambdas
クロスバリデーション 推定結果 2 alllambdas

λが小さくなるほど、非ゼロの係数が増えます。
非ゼロの係数が変化すると、モデルの変数が増えます。
ただし、場合によっては変数がモデルから除外される場合もあります。非ゼロの係数がより小さいλでゼロになることもあります。

この例題では追加された変数が削除されていません。
より多くの変数が存在するような場面では、変数の追加によって他の変数が削除されることもあります。
一般的にはλが単調に小さくなるにしたがって、非ゼロの係数の数は増える傾向にあります。
稀にモデルに含まれる変数の数が少なくなるとλは小さくなることがあります。

変数が追加または削除されるようなλはノットと呼ばれます。デフォルトでlassoknotsコマンドはノットだけを表示します。
ノットでないλがCV関数を最小化します。そのようなλはλ^*と表記します。

. lassoknots
クロスバリデーション 推定結果 3

CV(クロスバリデーション)関数

各λに対して係数を推定したのち、CV関数を計算します。具体的には乱数を使ってデフォルトで10個のフォルド(塊)にデータを分割します。
あるフォルドを選択し、それを残りの9つのフォルドに回帰します。この時の新しい係数を使って選択したフォルドの予測値を求め、MSEを計算します。
同じことを残りの9つのフォルドに対しても実行します。
最後にこれらのMSEの平均をとって、CV関数の値とします。
MSEの値はCV mean prediction errorとして表に出力します。
デフォルトでselection(cv)はCV関数の最小値を検索し、計算を終了します。

λの値として単純にCVを利用したものよりもCVの平均値が大きくなるものが3つ存在します。
λ自体ではなく、そのCVの平均が最小となるものをλ^*と表現します。
CV関数をプロットする場合はcvplotコマンドを利用します。
CV関数の値についてより多くのものを調査する場合はselection(cv,alllabdas)と操作します。

. cvplot
クロスバリデーション関数 推定結果 1

CV関数の値をもっと表示するには、selection(cv, alllambdas)オプションを使って再度lassoを実行します。

. set seed 1234
. lasso linear mpg i.foreign i.rep78 headroom weight turn gear_ratio price trunk length displacement, selection(cv, alllambdas)
クロスバリデーション関数 推定結果 2

繰り返し計算のログの内容は、最初のlassoコマンド実行時とは異なっています。
今回は、最初にすべてのグリッド値が表示され、次にCVのフォルドが出力されています。
前回のコマンドでは、グリッド値とフォルドが交互に出力されました。
オプションalllambdasを利用すると、すべてのλに対する係数ベクトルを推定し、次にCVを計算します。
このように、最小値で計算を終了しない方が、やや計算処理は速くなります。
乱数シードを利用した場合、選択されたλ^*とCV関数の値、そしてR^2は全く同じものになります。
λに対してCV関数をプロットします。

. cvplot
クロスバリデーション関数 推定結果 3 フィット結果の並び替え

alllambdasオプションを利用しても、実際に図のプロットに利用するλは100個(グリッド)ではなく77個です。
このオプションを使っても、λの利用には他のルールが適用されます。
stop(#)オプションの停止許容範囲が設定されます。推定値の係数がλが変わってもほぼ変化しない場合、繰り返し計算を終了します。
実質的にCV関数が平坦になっており、より小さなλに関して計算を実行しても意味がないと考えれることがその理由です。
λの最小値を調べる場合は、stop(0)オプションを次のように利用します。

. lasso linear mpg i.foreign i.rep78 headroom weight turn gear_ratio price trunk length displacement, selection(cv, alllambdas) stop(0)

λが小さくなるほど、計算時間が長くかかります。そのため、λの計算をできる限り早く収束させるオプションが用意されています。
観測値と変数が多いほど、繰り返し計算の回数は膨大なものになります。
求めた最小値がグローバルな最小値であることを確認する場合はcvtolerance(#)を用いて、alllambdasよりも広い範囲を設定します。そうすると処理速度は短くなります。

係数へのペナルティと選択

ここではmpgの予測モデルの作成にlassoを利用する方法を説明します。
lassoコマンドの実行後に予測値を求める場合はpredictコマンドを利用します。
ただし、予測値の計算にあたっては、ペナルティのかかった係数を利用する方法と、その他に、自分で選択した係数を利用する方法の2つがあります。
実際にはlassoを実行すると、標準化(standardized)、罰則化(penalized)、選択(postselection)の3種類の係数を得ます。
最小化する目的関数を次に示します。

係数へのペナルティと選択 推定式 1

Xで示す変数を標準化し、平均0、分散1とします。

係数へのペナルティと選択 推定式 2

standardizedオプションは、目的関数を最小化する標準化回帰係数を推定します。
lassoコマンドによる予測を実行する場合、係数の表現方法はあまり重要ではありませんが、標準化用の専用コマンドlassocoefを利用します。
標準化した変数による係数はつぎのようになります。

. lassocoef, display(coef, standardized)
係数へのペナルティと選択 フィット結果の並び替え 1

標準化した係数の推定値は元の変数の係数の推定値とほぼ同じ大きさです。
penalizeオプションは、標準化を実行していない状態で目的関数を最小化することで係数を推定します。
厳密に言うと、standardizedオプションは標準化した変数の罰則化係数です。
penalizedオプションは非標準化変数の罰則化係数です。
コマンドを実行して比べてみます。

. lassocoef, display(coef, penalized)
係数へのペナルティと選択 フィット結果の並び替え 2

postselectionオプションは選択した変数を利用して線形回帰を実行し、その係数を利用します。

. lassocoef, display(coef, postselection)
係数へのペナルティと選択 フィット結果の並び替え 3

regressコマンドを使って結果を再現します。

. regress mpg 0bn.foreign 3bn.rep78 5bn.rep78 weight turn gear_ratio price length
係数へのペナルティと選択 フィット結果の並び替え 4

p値に注目してみましょう。有意でない係数推定値が目立ちます。lassoという手法は推定にあたってp値は考慮しません。
予測力を向上させることに重点をおいている結果が、このようなp値の生み出す原因です。
ランダムノイズと考えられる観測値のことも考慮して優れたフィットを実現するのがCV関数です。
ランダムノイズに不要に反応してしまう状態は過剰選択(overselecting)と呼ばれています。
推定結果から分かるように、rep78には5つのカテゴリがありますが、lassoはそのうちrep78=3とrep78=5だけをモデルで採用しています。

lassoselectコマンドを使って手作業でλを選択する

自動選択された λ^* を変更する方法を紹介します。最初に、自動選択によるlassoの結果を次のコマンドでメモリー上に保存します。

. estimates store name

これを他のlassoコマンドの結果と比較します。ファイルとして保存する場合は次のようにします。

. estimates save filename
          

保存結果を呼び出す場合は次のようにします。

. estimates restore autolasso

lassoknotsコマンドにオプションを使って2種類のR^2を表示します。ここではout-of-sampleラベルも表示しました。

. lassoknots, display(cvmpe r2 osr2)
lassoknots

ID=15のλがCVにより選択されたものと同程度に良いことが分かりますので、それを使ってみましょう。

. lassoselect id = 15
cvplot

新たに選択したλ^*を使ってcvplotコマンドを実行します。

. cvplot
lassoselectコマンドを使って手作業でλを選択する 結果 1

係数を表示し、先の結果と比べます。

. lassocoef autolasso ., display(coef, postselection)
lassoselectコマンドを使って手作業でλを選択する 結果 2

先に実行したlassoコマンドの結果をautolassoに保存していました。
ここでは、lassoselectコマンドを利用して新たに分析を実行し、異なる推定結果を得ました。
ピリオド.は直近の推定結果を意味します。
別の分析結果との比較などに利用する場合は、estimates storeコマンドで新たな名前を付けて保存しておきます。
名前を付けて保存した結果の内容を比較表示する時はlassocoefコマンドを利用します。

テクニカルサポート

ご不明な点がございましたら、お気軽にお問合せフォームよりテクニカルサポートまでご連絡ください。

その際、必ず「製品名」「バージョン」「シリアル番号」をご連絡ください。

Stata is a registered trademark of StataCorp LLC, College Station, TX, USA, and the Stata logo is used with the permission of StataCorp.

page_top_icon