■Lasso回帰(「ラッソ」もしくは「ラス―」と発音)は、大きな分類としては、罰則付き回帰(penalized regression)や正則化回帰(regularized regression)と呼ばれている回帰手法のひとつです。罰則付き回帰(正則化回帰)には、他にもリッジ回帰(ridge regression)や弾性ネット回帰(elastic net regression)があります。
通常のロジスティック回帰では、対数尤度が最大になるような回帰係数(パラメータ)を求めます。対数尤度が最大となるようなパラメータ値を求める推定方法を、最尤推定(maximum likelihood esitmation)と言います。学習データから計算された対数尤度が大きいほど、学習データに対する適合度は良いと言えます。よって、最尤推定は、学習データに最も適合した回帰係数(パラメータ)を求める推定方法だと言えます。
ロジスティック回帰の最尤推定は、データが大規模であれば、数理的に良い性質があります(一致性・有効性・漸近正規性)。
罰則付き回帰(正則化回帰)は、負の対数尤度に罰則項を足したものを目的関数にすることによって、オーバーフィッティング(over-fitting, 過剰適合、過適合)を回避し、予測精度を上げるための手法です。Lasso回帰の場合には、切片を除くパラメータ推定値の絶対値の和に定数(罰則パラメータ)を掛けたものが罰則項として使われます。この罰則パラメータをゼロにすると(つまり罰則を弱くすると)通常の最尤推定となり、罰則パラメータを無限大にすると(つまり罰則をきつくすると)切片を除くパラメータ推定値がすべてゼロになります。
投稿してもらったスクリーンショットのレポートにおいて、左に行くほど罰則パラメータが大きく、右に行くほど罰則パラメータが小さくなっています。
「負の対数尤度」(negative log-likelihood)は、対数尤度の符号を逆にしたものです。「尺度化した負の対数尤度」(scaled negative lo-g-likelihood)は、1観測(1行)あたりに負の対数尤度を平均したものです。対数尤度は大きいほどモデルがデータに適合していることを示しますが、符号を逆にした負の対数尤度は、値が小さいほどモデルがデータに適合していることを示します。
最尤推定や罰則付き回帰でパラメータ推定値を求める際には、学習データに対する負の対数尤度を用います。投稿してもらったレポートの右側のプロットでは、学習データにおける負の対数尤度だけではなく、検証データにおける負の対数尤度もプロットされています。モデルを複雑にすればするほど(罰則を緩くする、説明変数を増やすなどするほど)、学習データに対する負の対数尤度は小さくなります。しかし、検証データに対する負の対数尤度はそうはなりません。
一般的に、データがかなり豊富にあり、モデルもシンプルであり、かつ、真のモデルを指定した場合には、次図のように学習データと検証データの負の対数尤度は同じようになります。
しかし、データが少ない状況では、たとえ真のモデルをあてはめたとしても、次図のように、検証データの負の対数尤度は、学習データの負の対数尤度よりも大きくなり、しかも検証データのプロットはU字状になることが多いです。
検証データの負の対数尤度のほうが学習データのそれよりも大きくなるのは、モデルが学習データにオーバーフィット(過剰適合)していることを示唆しており、学習データへのあてはまりは良いが、検証データへのあてはまりは良くないことを示唆しています。また、検証データでU字状になるのは、モデルを複雑にするほど、検証データへのあてはまりが悪くなっていることを示しています。
■AUCに対する信頼区間によって、求められたAUC推定値がどれぐらい怪しいかをざっくり見積もることができるのではないかと思います。「一般化回帰」でロジスティック回帰モデルをあてはめた場合には、次の手順でAUCの信頼区間を求めることができます。
(1) 「ロジスティック回帰」アウトラインの赤い三角ボタンをクリックする。
(2) 呼び出されたメニューより、[列の保存]→[予測式の保存]を選択する。
この操作により、データテーブルに確率予測式の列が作成される。
(3) プルダウンメニューの[分析(A)]メニュー →[予測モデル]→[モデルの比較]を選択する。
(4) 呼び出された起動ウィンドウ左側の「列の選択」リストボックスにて確率予測値を含む2列(「確率(列名 = イベント名)」および「確率(列名 = 非イベント名)」を選択し、[Y, 予測子]ボタンをクリックする。
(5) [OK]ボタンをクリックする。
(6) 「モデルの比較」アウトラインの赤い三角ボタンをクリックし、[AUCの比較]を選択する。
■もし要求されていることが、「一つ取って置き法で求められた確率予測値をもとにAUCを求めなさい」ということでしたら、JMPでは特にそのような処理を行うGUIは用意されていません。JMP上で行うのであれば、JMPスクリプト言語(JMP Scripting Language; JSL)というスクリプト言語でプログラミングをする必要があります。
以下は、プログラム例です。あくまで例としてのサンプルです。
データテーブルに付与されている「行の属性」をクリアするので、予め分析対象とするデータテーブルだけを用意してください。その際、除外属性が付与された行などは予め除いておいてください。
以下の例では、行を1つずつ順に除いて、ロジスティック回帰モデルをあてはめ、その除かれた1行に対する確率予測値を求めています。その後、求められた確率予測値に基づいて、ROC曲線やAUCを求めています。
以下の例はあくまでサンプルです。
また、動作させるには、列名およびイベントを示すデータ値を適切なものに変更する必要があります。なお、欠測値がある行はデフォルトではすべて除去されて分析が行われます(リストワイズ除去で分析が行われます)。
Names Default To Here(1);
dt = Current Data Table();
eta = J(NRow(dt),1,.);
For(i = 1, i <= NRow(dt), i++,
dt << Clear Row States; // 行属性のクリア
Row State(i)= Excluded State(1); // 第i行に除外属性を付与
// ロジスティックモデルのあてはめ
plat = dt << Fit Model(
<<invisible, // レポートを非表示で実行
/* 以下は変更する必要あり */
/* ■応答変数名 */
Y( :KD 0_1 ),
/* ■説明変数名 */
Effects( :KldVolPerBW, :T77GLCM_ClusterShadeIBS17NFM ),
/* ■応答変数でイベントを示すデータ値 */
Target Level( "1" ),
Personality( "Nominal Logistic" ),
Run( Likelihood Ratio Tests( 1 ), Wald Tests( 0 ) )
);
formula = plat<<Get Probability Formulas;
Row()=i;
eta[i] = Eval(Arg(Arg(Arg(NameExpr(formula),1),3),1));
plat << Close Window;
);
dt << Clear Row States; // 行属性のクリア
prob1 = Logist(eta);
/* すでに列があるならば、それを削除 */
Try(
dt <<Delete Columns({:LOOCV 確率1})
);
dt << New Column("LOOCV 確率1", Values(prob1));
/* プロパティの付与 */
Column(dt,"LOOCV 確率1")<< Set Property(
"Response Probability",
/* 以下も変更する必要あり ■「:KD 0_1」は応答変数名,■ 「1」はイベントを示すデータ値 */
{:KD 0_1, 1, Creator( "一つ取って置き法" ), Model Name( "ロジスティック回帰" )}
);
dt << Model Comparison( Y( :LOOCV 確率1 ), ROC Curve( 1 ) );
■いずれにしも、説明変数が2変数のロジスティック回帰モデルでn = 50程度(イベントと非イベントがn=25程度)であると、たとえ真のモデルをあてはめたとしても推定誤差が大きく、また、その2変数モデルが良いモデルかどうかの判断すること(たとえば、他の説明変数を使ったほうがいいのではないか?、他の説明変数を追加したほうがいいのではないか?など)も難しいのではないかと思います。推定されたモデルが、将来、本番の予測モデルとして実用的かどうかを判断するのも、かなり難しいのではないかと思います。上記の方法やその他もろもろの方法で内的妥当性(internal validation)がたとえ確認できたとしても、控えめの慎重な判断にならざる得ないのではないかと思います。
■医療分野での予測モデル構築のガイドラインとしてはTRIPODがありますが、上記の回答を作成するにあたり、TRIPODガイドラインに注意を払いませんでした。予測モデル構築にあたり、チェックすべきことは他にもいろいろあると思います。
Yusuke Ono (Senior Tester at JMP Japan)