2008年11月22日

SAS Macro ( 巨集 ) 簡易教學

SAS的巨集雖然屬於P3等級的內容,不過對於實際分析資料的使用者來說,應該是相當實用的語法,且必要學習的。巨集沒有想像中的難,只是多了一些平常不會使用的符號,例如『%』或『&』等,這一篇教學將會舉一個簡單的例子,說明巨集的使用方式。


先來假設一個狀況,有4個資料檔{a1,a2,a3,a4},每個資料檔中均包含4個變項{y1,x1,x2,x3},而我想以PROC REG來分析4個資料檔中「y1和x1」、「y1和x2」及「y1和x3」的相關性。

第一步:先建立4個資料檔並包含3個變數。
先以do loop建立4個資料檔,而y1、x1、x2、x3的值將隨機由uniform分佈中抽取。程式如下:

data a1 a2 a3 a4 ;
do i=1 to 4;
do j=1 to 100;
y1=uniform(123);
x1=uniform(1234); x2=uniform(12345); x3=uniform(12345);
drop i j;
if i=1 then output a1;
else if i=2 then output a2;
else if i=3 then output a3;
else if i=4 then output a4;
end;
end;
run;


第二步:用傳統方式寫PROC REG程式。
當然可以傳統語法,逐筆將資料檔名稱和變項寫入程式中,以資料a1為範例:

proc reg data=a1;
model y1=x1;
run;
proc reg data=a1;
model y1=x2;
run;
proc reg data=a1;
model y1=x3;
run;

然後再將這一小段程式複製3次,將data分別改成a2、a3、a4即可。

第三步:改用巨集的語法。
其實可以很清楚的找到一個邏輯性;PROC REG的程式每次只需要修改下面藍色的部分就好,
proc reg data=a1;
model y1=x3;
run;

因此抓到這個邏輯以後,就可以寫出一段小小的巨集。

%macro My_reg (mydata, myvar);
proc reg data=&mydata;
model y1=&myvar;
run;
%mend My_reg;

這裡出現了奇怪的符號「%」和「&」。『%mcaro』為告訴SAS要開始寫一段巨集程式,有開始就會有結束,如同do loop會有do...end一樣,在巨集語法中結束即為『%mend』。

在『%macro』後面的My_reg為宣告這段巨集程式的名稱,為何要宣告,因為我們可能會同時使用上很多個巨集程式,如沒有宣告,SAS程式也搞不清楚現在要使用那個巨集程式。

接下來的『(mydata, myvar)』,就是在巨集有幾個「變數」會換(前面PROC REG藍色的2部分),並給這些變數一個名稱。

在被巨集程式的包裹住的語法,絕大部分都和之前寫的程式一樣,只有多了『&mydata』和『&myvar』這兩個,這個由『&』開頭的兩個部分稱為『巨集變項』,這為等一下要被取代的部分。

第四步:使用My_reg巨集。
已經寫好的巨集叫『My_reg』使用時,在巨集名稱前多加『%』,寫法如下:

%My_reg (a1,x1);
%My_reg (a1,x2);
%My_reg (a1,x3);

%My_reg (a2,x1);
%My_reg (a2,x2);
%My_reg (a2,x3);

%My_reg (a3,x1);
%My_reg (a3,x2);
%My_reg (a3,x3);

%My_reg (a4,x1);
%My_reg (a4,x2);
%My_reg (a4,x3);

在巨集名稱後面()要放入取代
巨集變項的「文字」,記得要以『,』區隔。執行後SAS便會將所寫入的文字逐步取代到『My_reg』巨集中,然後執行。

第五步:多一點的寫法。
這裡主要希望SAS能自己重複執行這個結果,不需要如第四步一樣手動改文字,此程式先不在這裡說明了,有興趣的請自行研究了。

%macro My_reg1 ;
%do i=1 %to 4;
%do j=1 %to 3;
proc reg data=a&i;
model y1=x&j;
run;
%end;
%end;
%mend My_reg1;
%My_reg1;


2008年11月4日

令人心碎的一週

一個好好的星期天,卻發生兩件令人心碎/心跳的比賽....

先說說兄弟象好了,其實看到恰恰的奮戰精神,和由挑戰賽到總冠軍第7站的表現,其實也滿足,雖然結果有點令人難過,但令人整個心碎的比賽卻出現在F1中。

我很少看到重播比賽確如此心跳加速,2008年度車手冠軍幾乎可以說在最後一個彎角最後10秒鐘才決定,在倒數幾圈的時候,總冠軍不斷在Massa和那位討人厭的H車手中轉換,真的是超刺激的。但最後卻是那個H車手拿到,真是太令人失望了,看到Massa在台上流淚的樣子,好無言喔。

看比賽如果有支持的隊伍,真的會很有感覺,不管是勝利或失敗,真是很棒的感覺!

黃軍紅軍明年加油,特別紅軍車手明年不要再讓那位拿冠軍了。