在2008年4月的時候,曾經寫過一篇繪製ROC曲線和比較兩條ROC曲線下面積的小文章,這篇是以MACRO來畫圖和比較,而在新版的SAS 9.2中已經可以於PROC LOGISTICS直接繪製高品質的ROC曲線(Receiver Operating Characteristic Curves, ROC Curves)。
在SAS 9.2中ODS GRAPHICS支援的程序增加許多,其中也包括PROC LOGISTICS。
先產生一筆虛擬的資料
data Age_data;
input disease age bw@@;
datalines;
0 50 65 0 39 61 0 21 70 0 61 67
0 30 55 0 35 63 0 25 52 0 41 66
0 43 52 0 36 54 0 37 46 0 25 61
0 41 53 0 62 55 0 28 70 0 33 68
1 52 45 1 49 61 1 47 42 1 62 31
1 55 67 1 70 61 1 75 55 1 77 52
1 81 68 1 64 53 1 62 41 1 39 57
1 61 51 1 61 55 1 57 49 1 79 67
;
run;
接下來就直接套用繪製的ROC曲線的語法
ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions(id=prob) ;
model disease (event='1')=age;
run;
ods graphics off;
ods graphics on:為宣告要繪製ods graphics的圖,而ods graphics off宣告結束,幾乎ods系列的語法都是類似的語法。
plots(only)=(roc):在proc logistic程序中,新增了幾個選項,plots為宣告要繪製統計圖,括號中的only為要求SAS只要畫出所需的圖就好,而在後面的【 (roc) 】和SAS說我們需要的圖為ROC曲線。
rocoptions(id=prob):表示在圖形上的點要放哪些資訊,目前有兩種可以選擇,【prob】為predicted probability ,而【obs】為observation number。
這幾個簡單的指令便可畫出高品質的ROC曲線。 而且還順便秀出AUC(Area Under Curve)的值。
ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob) ;
model disease (event='1')=age bw;
run;
ods graphics off;
此模型的ROC曲線為下圖:
不過也許大家比較想看到的是,單圖age或bw的圖,或是一張圖裡面同時有age和bw「個別」的ROC曲線,而不是模型的結果。
ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob) ;
model disease (event='1')=age bw;
roc '年齡' age;
roc '體重' bw;
run;
ods graphics off;
roc:個別宣告要繪製哪些變項的圖形,這裡我想個別看age及bw的ROC曲線。有單引號包住的文字,為宣告此圖形中變項的名稱,分別為「年齡」及「體重」。不過如果只使用這個語法的話,SAS同時還會多給一張model的圖,和age+bw+model的圖。
上面這張圖,雖然多了一個model的曲線,但這不一定是每次都想見到的,我的經驗,大多臨床工作者,都不太瞭解model這條曲線的意義,即使解釋了很久都還是不會用,因此單純的age和bw的比較也許就很足夠了。這個時候將程式修改成下面的寫法即可。
ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob) ;
model disease (event='1')=age bw/nofit;
roc '年齡' age;
roc '體重' bw;
run;
ods graphics off;
其實就只是多了一【nofit】,這會讓SAS不要做整個model估計,只分別對age和bw做兩個logisitc regression,此時Log視窗也會提醒,「NOTE: The NOFIT option is specified. No parameters are estimated and all other MODEL statement options (except FIRTH ,LINK= ,NOINT ,OFFSET= ,ROC ,and TECHNIQUE=) are ignored.」。結果如下圖:
最後就是比較age和bw的AUC有無統計上的差異了。
ods graphics on;
proc logistic data=age_data plots(only)=(roc) rocoptions( id=prob ) ;
model disease (event='1')=age bw/nofit;
roc '年齡' age;
roc '體重' bw;
roccontrast reference('體重')/ estimate e;
run;
ods graphics off;
roccontrast:比較ROC曲線。結果如下:
SAS 9.2此項新功能,我自己覺得使用上比MACRO直覺許多!
你好, 想請教你關於ROC curve的問題.
回覆刪除如果我想求算單條ROC曲線下面積是否顯著大於隨機猜測的機率(ROC曲線下面積=0.5), 請問程式該如何改寫呢? 非常感謝您的賜教
這真是個好問題,你可以用下面的語法完成。
回覆刪除proc logistic data=age_data ;
model disease (event='1')=bw;
roc;
roccontrast;
run;
如果這是FB我真是想要點個"讚"
回覆刪除簡直是寶典吶
您好,想請教您做出roc曲線後,如果想用sas做出cut-off 值,請問程式該怎麼改寫呢?非常感謝您的回覆
回覆刪除你可以參考這一篇的作法。
回覆刪除https://communities.sas.com/t5/SAS-Statistical-Procedures/ROC-in-SAS-obtaining-a-cut-off-value/m-p/161355#M8387
網路真的是好用! 但如果沒有貼文者, 我們都難把前輩的好經驗留傳下! 感謝!
回覆刪除網路真的是好用! 但如果沒有貼文者, 我們都難把前輩的好經驗留傳下! 感謝!
回覆刪除您好,想問問如果是要在cox regression去繪製roc曲線該如何下語法呢,謝謝您
回覆刪除就我的知識,應該是沒有這樣的語法,再麻煩您自行查閱其他文獻了
刪除