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在台上流淚的樣子,好無言喔。

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

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

2008年10月5日

SAS Certified Base Programmer Credential for SAS 9

自從幾年前知道SAS有所謂全球認證考試的時候,就很想要試試,終於在前一段時間順利取得了,把一些個人的心得和大家分享。



參考書目方面,SAS Programming ISAS Programming IISAS Certification Review:Base Programming for SAS9(簡稱CRB),這三本SAS公司正式課程的講義是很棒的參考書目。當然能去上這3堂課可能會是更好的選擇,這3個課程我都上了,在老師的講解下,對以前比較模糊的概念重新釐清,對於考試老師應該也會有重點提示!如果時間真的不夠,那強烈推薦CRB課程一定要去

模擬試題,在CRB課程後面會有50題的試題,而網路上也可以找到所謂的「50題」和「123題」,其中的123題可能是某家補習班出的,而似乎有點過難,時間不夠可以考慮跳過。

「CRB」和「50題」如果的答題正確率有超過75或80%,正式考試的通過率應該不會太低了。不過我考試時當天可能運氣比較差,覺得正式的題目似乎比模擬題目難了一些。

準備考試,還是需要讀書的,因為會考一些平常比較少用的指令,例如PROC REPORT,可能需要用腦袋記下了。如果有幾個同伴一起準備,應該也會很有幫助,大家先以題目為主題討論,互相分享大加的讀書心得,如再加上已經自己有1年以上的SAS使用經驗,應該對考試更有相當大的幫助,因為有不少題目,用實務經驗判斷就好。

考試形式為
70單選題,正確率達65%便可取得證書,英文出題,考完當場就知道成績。

有興趣朋友可以參考下面兩個連結的內容,當然還有課程的費用(不要被嚇到!)

SAS台灣官網:
http://www.sas.com/offices/asiapacific/taiwan/index.html

SAS Global Certification Program:
http://support.sas.com/certify/

2008年7月18日

台中也是會淹水的!

我自己住的門口,平常大雨也不會怎樣,但沒想到今天這個颱風,卻讓門口的道路變成小河...
原本還打算出門吃早餐的,只好回頭吃泡麵了,真是有夠猛的!
下面的影片和照片雖然很短,但也可以稍微感受到『河水』的感覺吧。



2008年7月6日

GPS手機真好玩

最近買了一台有GPS的手機。
剛好今天做高鐵回台中,路途上無聊開了GPS...


將PaPaGO! VR-ONE紀錄的檔案轉到Google Map的圖如下(藍色的線),看起來還滿不錯的,
好像自己用筆畫在高鐵的鐵軌上!

整個40分鐘的過程中PaPaGO!回報的速度幾乎和高鐵車上公告的速度一樣。