least absolute shrinkage and selection operator (lasso) はモデルの係数を推定し、その推定はどの共変量をモデルに組み込むべきかを選択するのに使われます。
lassoは、多くの潜在的な共変量のうちのいくつかがアウトカムに影響を与える場合に最も有用です。そして、影響を与える共変量のみをモデルに含めることが重要です。
lassoコマンドは線形、ロジット、プロビットの回帰モデルにおいて逸脱度を用いて最適な予測を行います。
lassoとelastic net機能では、連続、二値およびカウントアウトアムのモデル選択と予測を行うことができます。
効果を推定して、係数を検定したい場合、このような最先端の推測法を用いれば、lassoモデルが制御変数を選択するので、興味のある変数の予測が可能です。
さらに、内生性のある共変量にも対処することができます。
lassoはモデル選択、予測、そして統計的推測に利用可能な技術です。
新しいlassoコマンドを利用する事により連続、頻度、二値のアウトカムを取り扱う線型、ポアソン、ロジット、プロビットの回帰モデルで最適な予測値の計算が可能となります。
lassoコマンドでは変数選択だけでなく、係数、標準誤差、信頼区間の推定、そして係数の診断までの一連の機能が用意されています。
例えば、次のようなコマンドを実行します。
. lasso linear y x1-x500
lassoは変数群の中から例えば最適なフィットを実現する
x2, x10, x11, x21
の変数セットを選択します。
そこで標準的なpredict
コマンドを実行することで y の予測値を計算します。
二値データや頻度データをアウトカムとする場合は
lasso logit, lasso probit, lasso poisson
といったコマンドを実行します。
変数選択でelastic netやsquare-root lasso法を利用する場合はelasticnet
やsqrtlasso
といったコマンドを利用します。
新たに提供されるコマンドは次の通りです。
dsregress, dslogit, dspoisson, poregress, pologit, popoisson, poivpoisson, xporegress, xpologit, xpopoisson, xpoivregress
ds
で始まるコマンドは二重選択型lassoコマンドです。
po
は部分選択型、xpo
はクロスフィットによる部分選択型のlassoコマンドを意味しています。
アウトカムの種類は連続、二値、頻度に対応しています。
アウトカムが連続変数である場合は、内生変数を含むモデルでも利用可能です。
lassoベースの統計的推測の手法には様々な提案があり、今回、できるだけ多くの手法を新たにサポートしました。
lasso
とelasticnet
は変数選択と予測に利用されるコマンドです。
統計的推測に利用するlassoの新しいコマンド群は元々、計量経済学者によって開発された手法ですが、今日では係数の診断と解釈を必要とする様々な分野の研究者にとってニーズの高い分析手法となっています。
lassoは、λを所与とした時に次式を最小化するβの推定値を求める推定手法です。
任意のλに対して何らかのβが求まります。その時、いくつかの係数β_jはゼロになるかもしれません。
また、λが大きくなるほど、ゼロとならない係数の数は減っていきます。
lassoの目的は、ゼロとならない係数βに対応するλで、好ましい特徴を持ったものを決定することです。
最終的に選択したλはλ^*と表記します。
λ^* について触れる場合、ゼロとならない係数βのセットを対象にしていることを覚えておいてください。
この例では、Stataのサンプルデータauto.dtaを使ってクロスバリデーション(CV)について説明します。
このサンプルデータは変数の数もサンプルサイズも小さいので、本来はlassoによる解析向きではありません。
lassoは一般的に数百、数千個以上の変数を持つデータに対して利用します。
サンプルデータは小さいデータですが、出力が小さく解説に便利なため、ここでは敢えて利用します。
下記のコマンドでサンプルデータを読み込みます。
. sysuse auto
lassoコマンドを実行する前に乱数キーを設定します。
CVは乱数を利用しますので、再現性を確保します。
. set seed 1234
mpg(マイル/ガロン)を被説明変数とするモデルを推定します。
lassoのモデルとして、linear
、logit
、probit
、poisson
が用意されています。
ここでは、線形モデルなので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のλ=4.691140からグリッド45のλ=0.078253まで繰り返し計算を実行します。
デフォルトではオプションselection(cv)
が100個のλを利用します。
λは一定間隔か、または対数スケールで作成されます。
ここではグリッド値47で終了し、λのグリッドポイントの最小値55では何の計算も実行しません。
出力結果の表からは、グリッド値1のλに対しては、非ゼロの係数がゼロ個であることが分かります。
この表にはCVの過程で計算したλを表示します。
グリッド値が100の時のλは、grid()
のサブオプションratio(#)
で設定します。
この比率は最後の最小λと最初の妻財λの比として求めます。
ratio(#)
のデフォルト値は1e-4です。
各λに対して係数を推定します。
すべてのλを表示する場合は、lassoknots
コマンドとalllambdas
オプションを利用します。
. lassoknots, alllambdas
λが小さくなるほど、非ゼロの係数が増えます。
非ゼロの係数が変化すると、モデルの変数が増えます。
ただし、場合によっては変数がモデルから除外される場合もあります。非ゼロの係数がより小さいλでゼロになることもあります。
この例題では追加された変数が削除されていません。
より多くの変数が存在するような場面では、変数の追加によって他の変数が削除されることもあります。
一般的にはλが単調に小さくなるにしたがって、非ゼロの係数の数は増える傾向にあります。
稀にモデルに含まれる変数の数が少なくなるとλは小さくなることがあります。
変数が追加または削除されるようなλはノットと呼ばれます。デフォルトでlassoknots
コマンドはノットだけを表示します。
ノットでないλがCV関数を最小化します。そのようなλはλ^*と表記します。
. lassoknots
各λに対して係数を推定したのち、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
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)
繰り返し計算のログの内容は、最初のlassoコマンド実行時とは異なっています。
今回は、最初にすべてのグリッド値が表示され、次にCVのフォルドが出力されています。
前回のコマンドでは、グリッド値とフォルドが交互に出力されました。
オプションalllambdas
を利用すると、すべてのλに対する係数ベクトルを推定し、次にCVを計算します。
このように、最小値で計算を終了しない方が、やや計算処理は速くなります。
乱数シードを利用した場合、選択されたλ^*とCV関数の値、そしてR^2は全く同じものになります。
λに対してCV関数をプロットします。
. cvplot
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種類の係数を得ます。
最小化する目的関数を次に示します。
Xで示す変数を標準化し、平均0、分散1とします。
standardized
オプションは、目的関数を最小化する標準化回帰係数を推定します。
lassoコマンドによる予測を実行する場合、係数の表現方法はあまり重要ではありませんが、標準化用の専用コマンドlassocoef
を利用します。
標準化した変数による係数はつぎのようになります。
. lassocoef, display(coef, standardized)
標準化した係数の推定値は元の変数の係数の推定値とほぼ同じ大きさです。
penalize
オプションは、標準化を実行していない状態で目的関数を最小化することで係数を推定します。
厳密に言うと、standardized
オプションは標準化した変数の罰則化係数です。
penalized
オプションは非標準化変数の罰則化係数です。
コマンドを実行して比べてみます。
. lassocoef, display(coef, penalized)
postselection
オプションは選択した変数を利用して線形回帰を実行し、その係数を利用します。
. lassocoef, display(coef, postselection)
regress
コマンドを使って結果を再現します。
. regress mpg 0bn.foreign 3bn.rep78 5bn.rep78 weight turn gear_ratio price length
p値に注目してみましょう。有意でない係数推定値が目立ちます。lassoという手法は推定にあたってp値は考慮しません。
予測力を向上させることに重点をおいている結果が、このようなp値の生み出す原因です。
ランダムノイズと考えられる観測値のことも考慮して優れたフィットを実現するのがCV関数です。
ランダムノイズに不要に反応してしまう状態は過剰選択(overselecting)と呼ばれています。
推定結果から分かるように、rep78には5つのカテゴリがありますが、lassoはそのうちrep78=3とrep78=5だけをモデルで採用しています。
自動選択された λ^* を変更する方法を紹介します。最初に、自動選択によるlassoの結果を次のコマンドでメモリー上に保存します。
. estimates store name
これを他のlassoコマンドの結果と比較します。ファイルとして保存する場合は次のようにします。
. estimates save filename
保存結果を呼び出す場合は次のようにします。
. estimates restore autolasso
lassoknots
コマンドにオプションを使って2種類のR^2を表示します。ここではout-of-sampleラベルも表示しました。
. lassoknots, display(cvmpe r2 osr2)
ID=15のλがCVにより選択されたものと同程度に良いことが分かりますので、それを使ってみましょう。
. lassoselect id = 15
新たに選択したλ^*を使ってcvplot
コマンドを実行します。
. cvplot
係数を表示し、先の結果と比べます。
. lassocoef autolasso ., display(coef, postselection)
先に実行した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.