【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つ。
- メモリ不足が原因かPROC GPLOTで曲線を描けなかった
- ロジスティック回帰のモデルを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曲線は、面倒だったので、エクセルで描きました。