公告

[公告]
2014/01/17
由於已經是faculty的關係,不太有足夠時間寫部落格。因此更新的速度會相當緩慢。再加上近幾年來SAS GLOBAL FORUM沒有出現讓我覺得驚艷的技術文件,所以能分享的文章相對也減少許多。若有人推薦值得分享的SAS技術文件,請利用『問題討論區』告知。

2013/07/19
臉書留言板的功能因為有不明原因故障,因此特此移除。而intensedebate的留言板因管理不易,也一併移除。目前已經開啟內建的 G+ 留言系統,所以請有需要留言的朋友,可直接至『問題討論區』裡面留言。


2008年1月1日 星期二

Histogram of Numeric Data Distribution from the UNIVARIATE Procedure

原文載點:http://www.nesug.info/Proceedings/nesug07/np/np12.pdf

很多人要畫直方圖時,會直覺地想到使用 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)。結果如下:

更炫的是,他可以一次把兩張直方圖並排在一起。以此例來講,如果要針對性別來分別畫一張 male 的直方圖和 female 的直方圖,則簡單地利用大家都會用的 CLASS statement 來完成:
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 這個新的資料集裡面。結果如下:


_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

1 則留言:

要問問題的人請在文章下方的intensedebate欄位留言,請勿使用blogger預設的意見表單。今後用blogger意見表單留言的人我就不回應了。

CODE { display: block; /* fixes a strange ie margin bug */ font-family: Courier New; font-size: 8pt; overflow:auto; background: #f0f0f0 url(http://klcintw.images.googlepages.com/Code_BG.gif) left top repeat-y; border: 1px solid #ccc; padding: 10px 10px 10px 21px; max-height:200px; height:200px; // for IE6 line-height: 1.2em; }