很多人要畫直方圖時,會直覺地想到使用 PROC GCHART。不過其實在 PROC UNIVARIATE 程序裡面已經包含了畫直方圖的指令,語法更簡單,功能更強大。Chauthi Nguyen 在 NESUG 2007 發表了一篇簡單的技術文件來說明如何使用這套語法。
本次範例所使用的資料如下所示:
在 PROC UNIVARIATE 中,有個叫做 histogram 的 statement,就是可以直接拿來畫直方圖,並且可利用一個叫做 normal 的 option 順道把常態曲線一併繪製上去。程式語法如下:
TITLE 'Summary of Weight Variable (in pounds)';
PROC UNIVARIATE DATA = sashelp.class NOPRINT;
HISTOGRAM weight / NORMAL;
RUN;
這道程式就是簡單地把變數 weight 的直方圖和常態曲線圖繪製在同一張圖表上。結果如下所示:
SAS/GRAPH 有個很大的缺點,就是畫出來的圖和 export 出來的圖品質差很多。作者也提供了一段小小的程式碼來加強輸出圖檔的品質。程式碼如下:
FILENAME outfig "C:\NESUG2007\histogram.html";
GOPTIONS RESET=all CTITLE=cx000080 FTEXT=swiss ROTATE CTEXT=black
HTEXT=0.85 HTITLE=2.5 DEVICE=html GSFNAME=outfig SFMODE=replace;
上述的程式碼會產生一個 html 檔,而把圖形(gif 檔)鑲入在這個網頁檔中。
接著,還有其他的語法可以把圖畫的更漂亮。如下所示:
PROC UNIVARIATE DATA = sashelp.class;
HISTOGRAM weight / NORMAL CFILL = ltgray;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD=’Standard Deviation’ (8.3) / POSITION = ne;
RUN;
其中,histogram statement 後面的 option CFILL 可以讓直方圖裡面填進顏色(如本例的ltgray)。INSET statement 則是可以將一些統計量插入到圖形裡面,至於後面的 position option 則是宣告插入圖表的位置(ne 表示 northeast)。結果如下:
TITLE 'Summary of Weight Variable (in pounds) - added a CLASS statement';
PROC UNIVARIATE DATA = sashelp.class NOPRINT;
CLASS sex;
HISTOGRAM weight / NORMAL (COLOR = red) CFILL = ltgray CTEXT = blue;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD = 'Standard Deviation' (8.3) / POSITION = ne;
LABEL sex = 'Gender';
RUN;
此處將 sex 安置在 class statement 後面,所以 PROC UNIVARIATE 程序會一次畫兩張圖出來。特別提醒一點的是,在做這個動作前,一定要先用 PROC SORT 將 sex 變數重新排序一遍。此範例沒有列出那段程式碼,因此在這邊特別強調。在 histogram statement 後面有多了幾個 option。其中,COLOR=red 是設定常態曲線的顏色是紅色,CTEXT=blue 是設定圖形上的一切文字的顏色都是藍色。結果如下:
PROC UNIVARIATE DATA = sashelp.class NOPRINT;
CLASS sex;
HISTOGRAM weight / NORMAL (COLOR = red NOPRINT FILL W=3)
CFILL = ltgray
CTEXT = blue;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD = 'Standard Deviation' (8.3)/ POSITION = ne;
LABEL sex = 'Gender';
RUN;
FILL option 是要把常態曲線下的面積填滿,W option 則是拿來增加常態曲線的寬度。結果如下:
TITLE 'Summary of Weight - More options for enhancing the histograms';
PROC UNIVARIATE DATA = sashelp.class NOPRINT;
CLASS sex;
HISTOGRAM weight / NORMAL (COLOR=green FILL W=5)
CFILL = ltgray
CTEXT = red
NOBARS
VAXISLABEL = "Percentage of patients"
CGRID = black
OUTHISTOGRAM = _outhist;
INSET N = 'Number of students' MEDIAN (8.2) MEAN (8.2) STD= 'Standard Deviation' (8.3)/ POSITION = ne;
LABEL sex = 'Gender';
RUN;
在 histogram statement 後面加上一個 NOBARS 的 option 就可以輕鬆的把直方圖給去除。除此之外,VAXISLABEL 是設定 Y 軸的標籤。CGRID 是設定在 Y 軸的 main trick 上面劃上橫線,且設定成黑色(=black)。OUTHISTOGRAM 則是把繪製這張圖有關的數據全部另存於 _outhist 這個新的資料集裡面。結果如下:
使用 PROC UNIVARIATE 來畫直方圖的好處是不用再額外設定諸如 PATTERNS, AXIS1, AXIS2 之類的部分,而可以簡單地在 histogram statement 後面的 option 來搞定。這個額外獨立出 PROC GPLOT、PROC GCHART 或 PROC G3D 程序的繪圖方式算是 SAS 的一大突破。希望將來類似 boxplot 也可以在 PROC UNIVARIATE 裡面來完成。
CONTACT INFORMATION
Chauthi Nguyen
GlaxoSmithKline Pharmaceutical, Inc.
2301 Renaissance Boulevard, King of Prussia, PA 19406
Work phone: (610) 787 - 3853
E-mail: Chauthi.Nguyen@gsk.com
新年快樂!!~~
回覆刪除