【SAS】ROC曲線のAUCを計算する方法

SASのLOGISTICプロシジャでAUC計算

SASでロジスティック回帰などを実行する際にROC曲線を描いてAUCを計算したいと思うことがあるだろう。
その場合、もちろんPROC LOGISTICのオプションでROC曲線とAUCを出すことができる。

プログラム例
/** LOGISTICプロシジャの実行 **/
PROC LOGISTIC DATA=data1 descending;
  MODEL y=x /outroc=roc;
RUN;

/** ROC曲線の作成 **/
PROC GPLOT DATA=roc;
  PLOT _sensit_*_1mspec_;
  SYMBOL1 i=join v=none;
RUN;
LOGISTICプロシジャの出力例
     Association of Predicted Probabilities and Observed Responses

   Percent Concordant     66.7     Somers' D     0.333
   Percent Discordant     33.3     Gamma         0.333
   Percent Tied            0.0     Tau-a         0.190
   Pairs                    12     c             0.667 ← この値

Technical Support
※上記の出力例で「← この値」で示した「c」の値が、AUCとなる。

LOGISTICのオプションが使えない場合

ただ、実際にやってみたらうまくいかなかった。(残念)
うまくいかなかったところは2つ。

  1. メモリ不足が原因かPROC GPLOTで曲線を描けなかった
  2. ロジスティック回帰のモデルをinmodelで使用する場合には、LOGISTICプロシジャの出力例が出なかった
LOGISTICでINMODELの使用例
/** LOGISTICプロシジャでINMODELを使う **/
PROC LOGISTIC INMODEL=inmodel;
  SCORE DATA=indata OUT=outdata OUTROC=roc;
RUN;

というわけで、AUCとか計算してくれる関数とかないかなと頑張って探してみた結果、ありました。
ウィルコクソンの順位和検定を利用してAUC計算しています。

AUCを計算するSASマクロ
%macro AUC( dsn, Target, score);
ods select none;
ods output WilcoxonScores=WilcoxonScore;
proc npar1way wilcoxon data=&dsn ;
     where &Target^=.;
     class &Target;
     var  &score; 
run;
ods select all;

data AUC;
    set WilcoxonScore end=eof;
    retain v1 v2 1;
    if _n_=1 then v1=abs(ExpectedSum - SumOfScores);
    v2=N*v2;
    if eof then do;
       d=v1/v2;
       Gini=d * 2;    AUC=d+0.5;    
       put AUC=  GINI=;
       keep AUC Gini;
     output;
   end;
run;
%mend;

SAS Programming for Data Mining: AUC calculation using Wilcoxon Rank Sum Test
ROC曲線は、面倒だったので、エクセルで描きました。