公告

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

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


2007年6月20日 星期三

SAS/GRAPH® Procedures for Creating Statistical Graphics

原文載點:http://www2.sas.com/proceedings/forum2007/193-2007.pdf

SAS V9.2版雖然還在「只聞樓梯響」的階段,但已經有許多 SAS 公司內部的人員陸陸續續地將一些技術性文件發表出來,讓使用者能夠對這個版本產生一點期待。我個人對 SAS 的期待主要在於 SAS 公司是否有針對他們最被人所詬病的繪圖能力有所改進。目前看來,由於 ODS 系統的導入,SAS 在製圖方面已經有長足的進步,但其彈性(flexibility)仍舊有待加強。不過對於一般的使用者來說,能夠看到 SAS 於幾行程式之間就可以生出跟以往所完全不能比擬的精緻做圖,已經是心滿意足了。但對稍有經驗的使用者來說,SAS 在這方面的改進永遠不夠。Dan Heath 在 SAS Global Forum 2007 發表了四個 SAS V9.2 版的製圖新語法,分別是 SGPLOT, SGPANL, SGSCATTER 和 SGRENDER。這些語法可以讓使用者在幾乎不依賴其他 PROC 程序的情況下,用最精簡的方式產生更精緻的圖形。對於想要發表論文的人是相當具有幫助。因此,雖然 SAS V9.2 還沒有正式流通,我們還是可以先瞭解一下新語法的威力。

上述所提及的新語法,通稱「SG家族」。SG家族語法的兩大特點是:
  • 可結合不同程序語法所產生出來的圖形。
  • 可製出目前語法程序所不能做出的圖形。
先來看一個範例:

proc sgpanel data=measure;
panelby b / columns=3;
vline a / response=y stat=mean limits=both;
run;


做出來的圖形:

以前要畫出這個圖形,得分別用 PROC GPLOT 做出三張圖,然後再用 PROC GREPLAY 把三張圖併在一起。上述的過程,估計需要花費 50~100 行左右的程式碼。使用 SGPANEL 僅需四行!

接下來就一一來介紹 SG 家族裡面的新語法~

SGPLOT PROCEDURE

SGPLOT 算是 GPLOT 的加強版。他可以做出下列圖形:

  • 基本圖形:scatter, series, step, band, needle
  • 模型和信賴區間:loess, regression, penalized B-spline, ellipse
  • 分配:box plot, normal curve, kernal density estimate
  • 分群:dot plot, bar chart, line chart

以下秀出幾個 SGPLOT 所能做出的圖形--

分配圖及常態曲線:

以往要做這種搭配常態曲線的分配圖,需要藉由 PROC UNIVARIATE 來執行。在 SAS V9.2 已經可以獨立製作了。
proc sgplot data=Fram_hrt;
histogram chol;
run;


利用 histogram statement,配上想要畫的變數,就可以產生該變數的分配直方圖。

如果想要在上面加一條常態曲線,使用 density [var] 的語法即可。
proc sgplot data=Fram_hrt;
histogram chol;
density chol; /* default: type=normal */
run;



箱型圖:

由 SGPLOT 做出來的箱型圖可以加上參考線(refline)和指定顏色。
proc sgplot data=sashelp.heart (where=(smoking_status ne ' '));
refline 80 / axis=x name="normal" lineattrs=(color=red) legendlabel="Normal diastolic pressure";
hbox diastolic / category=smoking_status;
keylegend "normal";
run;



散佈圖模、型配適線、信賴區間:

這個例子是 SGPLOT 在背後呼叫 PROC LOESS 來進行 LOESS 模型配適(loess statement)並繪製信賴區間的圖(clm option)。另外,原始資料的點散佈圖也一併繪入(scatter statement)。
proc sgplot data=sashelp.class;
scatter x=weight y=height;
loess x=weight y=height / clm nomarkers clmtransparency=0.3 name="loess";
keylegend "loess";
run;




SGPANEL PROCEDURE

基本上 SGPANEL 可以畫出來的圖形和 SGPLOT 完全一樣。但和 SGPLOT 不同的是,他可以一次繪製併合併多張圖形,有點像是將 GPLOT 和 GREPLAY 兩大程序合併。這其中的奧妙,其實只是使用了一個很類似 BY statement 的新語法:PANELBY statement。

先看看在不同的組合下(iron X infection)所畫出來的四張散佈圖、迴歸圖暨預測區間。
title "panelby iron infection;";
proc sgpanel data=cows;
panelby iron infection;
reg x=tpoint y=weight / cli markerattrs=(size=3px);
run;



也可以嘗試用另一種 layout(lattice)來繪圖。和上圖不同的是,上圖的兩個分群變數都是放在圖的上方,但 lattice layout 會把分群變數分別放在圖的上方和右方。

title "panelby iron infection /
layout=lattice;";
proc sgpanel data=cows;
panelby iron infection / layout=lattice;
reg x=tpoint y=weight / cli markerattrs=(size=3px);
run;



Dot plot 和 box plot 也可以用 SGPANEL 把圖形分群一張張地繪製出來再合併成一張。

proc sgpanel data=barley;
panelby site / novarname;
dot variety / response=yield group=year;
keylegend / title="Year";
run;



/* Create classification ranges */
/* using a format */
proc format;
value ageint
40-49 = "40-49"
50-59 = "50-59"
60-69 = "60-69";
run;
proc sgpanel data=Fram_hrt;
format age ageint.;
panelby age sex / layout=lattice;
hbox chol;
run;




上面的 box plot 扣掉 PROC FORMAT 和 format statement 的語法,其實只花了三行。

SGSCATTER PROCEDURE

SGSCATTER 程序可以專門針對 scatter plot 製作 panel plot。和 SGPLOT 與 SGPANEL 最大的不同是,SGSCATTER 只有三個 statement 就可以完成所有工作:
  • PLOT:繪製獨立的Y*X圖形,功能和其他繪圖語法中的 PLOT statement 一模一樣。
  • COMPARE:將數張圖形並列在一起以方便比較。
  • MATRIX:將數張圖形排成像矩陣型態那樣。

很明顯的是,SGPANEL 所製作出來的組合圖中,每張小圖必須要有相同的 X 軸和 Y 軸,但 SGSCATTER 所製作出來的組合圖中的每個小圖都可以有不同的座標軸。下列例子是最好的說明:
proc sgscatter data=sashelp.cars;
plot (mpg_city mpg_highway)*(weight horsepower) / group=type;
run;


簡單來說,(Y1 Y2)*(X1 X2)會產生四種組合,這就是下圖中四張小圖的座標軸。

不只是散佈圖,SGSCATTER 還可以外掛 PROC LOESS 來配適 LOESS 模型。方法是只要在 PLOT statement 後面的 option 上面寫上 loess 即可。
proc sgscatter data=sashelp.cars;
plot (mpg_city mpg_highway)*(weight horsepower) /group=type;
run;




若只想在一張圖裡面塞兩張圖來比較一下,可以使用 COMPARE statement。
proc sgscatter data=sashelp.cars;
compare x=(mpg_city mpg_highway) y=horsepower;
run;


語法相當簡單。兩個要比較的圖共用一個 Y 軸,但各自使用不同的 X 軸,然後就會出現下面的圖形。

想要做出類似圖形化的 correlation matrix,可使用 MATRIX statement。
proc sgscatter data=fitness;
matrix runpulse rstpulse maxpulse / ellipse=(alpha=0.5);
run;


將變數放入後,後面的 option 加上 ellipse 可以畫出預測橢圓形線,如下圖所示。

我們還可以在對角線上加上分配直方圖和常態曲線。方法是只要在 MATRIX statement 後面的 option 打上 diagonal=(histogram normal)。
proc sgscatter data=fitness;
matrix runpulse rstpulse maxpulse / diagonal=(histogram normal);
run;



SGRENDER PROCEDURE

SGRENDER 程序可以做出更具有彈性的圖形,但必須要搭配 Graph Template Language (GTL) 一起使用。有興趣的人可以看 Jeff Cartier 在 SUGI 31 所發表的一篇名為 A
Programmer's Introduction to the Graph Template Language 的技術文件。

除此之外,如同 PROC GPLOT,SG 家族的語法都可以使用 title, axis, legend 和 inset 等語法來做更細部的調整。但作者特別強調一點,那就是 SAS V9.2 還在開發的階段,所以這些語法的使用或許還有一點改變。我們就對他拭目以待吧!

CONTACT INFORMATION
Dan Heath
SAS Institute Inc.
500 SAS Campus Dr.
Cary, NC 27513
Dan.Heath@sas.com
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; }