2008年12月7日

想念的影片

這個已經不知道在那個世界的貓,這是唯一能夠想起她身影的方式了,
一位很愛她的女生曾經說過「她是全世界最可愛的貓」。

當我想要一個人的時候,我都會去她休息的地方坐坐,曬曬太陽,
如果你們看到一個人,默默在那邊舔者傷口,請不要打擾他,
也許他身旁正有一隻全世界最可愛的貓。

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!回報的速度幾乎和高鐵車上公告的速度一樣。


2008年6月23日

好貴的F1賽車執照費

今天看到新聞才知道,F1的一張執照規費真的是天價阿,以目前薪水最高的車手Kimi Raikkonen來說,一張F1賽車執照規費可能高達35萬美金,約合台幣1050萬以上.......

『 Firefox 3 』 於2008-06-18全球同步推出

等待許久的Firefox3終於正視推出了,執行速度更快,更省資源。

Firefox 3 中文官方網頁

Firefox 3 火熱上映

2008年6月1日

超炫瀏覽器,手滑創紀錄

Firefox 3好像快出,又開始有活動了,作為Firefox 的愛好者,當然一定要推廣的啦,
這次的活動就是希望能創下同一天下載同一軟體的世界紀錄,詳細內容在活動網頁已經很清楚了,
有興趣的一定要去看看。

超炫瀏覽器,手滑創紀錄』活動網頁

就目前2008/6/1 PM8:30 台灣的預約人數為「7431」,一起加油吧!

火狐鬥陣拼紀錄,有你一份!

2008年4月20日

繪製ROC曲線和比較兩條ROC曲線下面積

SAS實用巨集簡介:繪製ROC曲線和比較兩條ROC曲線下面積

目的為介紹SAS官方網頁中關於ROC曲線的巨集(Macro)程式,程式分別為「繪製ROC曲線」和「以無母數方式比較兩條ROC曲線下面積」。本文中所提及之程式,僅為原作者的部分語法,詳細語法請見原文說明,兩篇原文出處連結如下:

Sample 25017: Nonparametric comparison of areas under correlated ROC curves (http://support.sas.com/kb/25/017.html)
 roc.sas程式:http://support.sas.com/kb/25/addl/fusion_25017_6_roc.sas.txt

Sample 25018: Plot ROC curve with labelled points for a binary-response model (http://support.sas.com/kb/25/018.html)
 rocplot.sas程式:http://support.sas.com/kb/25/addl/fusion25018_4_rocplot.sas.txt


請先將程式下載至本機硬碟中,建議將Sample 25017的程式取名為roc.sas,而Sample 25018的程式取名為rocplot.sas。必須要注意的是,如果是想比較兩條ROC曲線下面積,也就是roc.sas這個巨集程式,必須安裝SAS/IML。

繪製ROC曲線

在SAS說明檔中其實已經有介紹如何繪製出簡易的ROC曲線,但在我們諮詢的個案中比較常被問到的問題為,圖上的某個點其「原始數值為何」,利用rocplot.sas 便可輕鬆完成這個工作。
假設有一組資料,研究者想以年齡和某一個BW指標來判斷罹患某疾病的機會。
問題:繪製以年齡作為判斷此是否罹患此疾病的ROC曲線。

第一步:先將資料讀入SAS中
data Age_data;
input disease age bw@@;
datalines;
0 50 65 0 39 61 0 21 70 0 61 67
0 30 55 0 35 63 0 25 72 0 41 66
0 43 52 0 36 54 0 37 76 0 25 61
0 41 53 0 62 55 0 28 70 0 33 68
1 52 45 1 49 61 1 47 42 1 62 31
1 55 67 1 70 61 1 75 55 1 77 52
1 81 58 1 64 53 1 62 41 1 39 57
1 61 51 1 61 55 1 57 49 1 79 47
;
run;

第二步:將rocplot.sas程式預先讀入SAS中
%include "c:\temp\ROC\rocplot.sas";
/*
%include “程式所放的位置”;
*/
透過%include這個巨集指令,可將rocplot.sas呼叫至SAS程式中。

第三步:執行proc logistic程式,並將部分結果輸出,以配合rocplot.sas程式
proc logistic data=age_data;
model disease (event='1')=age / outroc=roc1 roceps=0;
output out=outp p=phat;
run;
這個程式中,我們將disease變項中的「1」視為事件(罹患疾病),並將繪製ROC曲線所需的資料輸出為「roc1」,和每個原值(年齡)的預測機率資料輸出為「outp」並將預測機率的變項命名為「phat」。基本上,使用時只需要改動依變項(disease)和自變項(age)這兩個部分即可。

第四步:使用%rocplot這個巨集程式。
%rocplot (outroc = roc1, out = outp, p = phat, id = age);
這個巨集中,outroc= 資料檔,配合proc logistic的outroc輸出。
out= 資料檔,也同樣配合proc logistic 的out輸出。
p= 預測機率值變項名稱,在輸出預測機率時的命名。
Id= 變項名稱,要依據那個變項繪製ROC曲線上所標記的原始數值,通常應與自變項相同。

第五步:圖形輸出結果



比較兩條ROC曲線下面積

問題:比較以年齡或BW指標對於判斷是否罹患疾病,此兩指標ROC曲線下面積。

第一步:先將roc.sas程式呼叫入SAS中
%include "c:\temp\ROC\roc.sas";


第二步:執行自變項為age的logistic 模型
proc logistic data=age_data;
model disease(event='1')=age / outroc=roc1_age roceps=0;
output out=outp_age p=phat_age;
run;
為了區別age和bw這兩個結果,這裡我們將age的output輸出的檔案命名為「outp_age」而預測機率命名為「phat_age」。

第三步:執行自變項為BW的logistic 模型
proc logistic data=age_data;
model disease(event='1')=bw / outroc=roc1_bw roceps=0;
output out=outp_bw p=phat_bw;
run;


第四步:執行%roc 巨集
%roc (data = outp_age outp_bw,
var = phat_age phat_bw,
response = disease);
在data=資料檔,這後面主要放前面步驟透過output所輸出的檔案,因此目前所放的為「outp_age」和「outp_bw」兩個檔案。
var=變項名稱,在output檔中,預測機率的變項名稱。
response= 依變項名稱,宣告依變項名稱為何。

第五步:結果
於「ROC Curve Areas and 95% Confidence Intervals」的表格中,age的AUC(area under curve, 曲線下面積)為0.912,而bw的AUC為0.6836。age和bw這兩個自變項AUC比較,可於「Contrast Test Results」中看到p-value為0.0378,因此這兩條ROC曲線下面積為顯著的不同。

2008年2月18日

Yahoo 的 e-mail?

我小玩了Yahoo的知識網一段時間,心裡想說有一些建議想給「知識網」,就遇到我的第一個問題,找了老半天為何沒有聯絡方式,好歹有建議表可以讓我送出吧?

沒想到...

我真的找不到,只好回到Yahoo首頁,很興奮的看到了「關於Yahoo!奇摩」裡面有一個「聯絡我們」,沒想到卻是Yahoo公司台北的電話和地址....整個傻眼!

回頭努力找,還是找不到,心理一橫,我也來找找Google的聯絡方式。好吧!我也是找到Google的地址,但很快的,我在Gmail中就看到意見表了。

回頭找找Yahoo mail,在一個很奇怪的角落「Yahoo!奇摩隱私權保護政策」最下面「看法與建議」終於看到了意見表!很快的打完我的幾意見,當然包括找不到和Yyahoo互動的意見,興高采烈的按下「送出」,咦~~沒反應耶,這時我心理的OS就是....『不會吧,Yahoo不支援Firefox 2...』,只好很無奈的打開IE 7,把剛剛寫好的建議貼過去,才順利寄出。

整個過程我大約花了2個小時以上,真的沒有辦法想像!

難怪最近Yahoo公司要裁員,個人的感想就是,一個沒有與網友互動空間的「網路公司」,還能在Web 2.0的世界下生存嗎,看看Google到處都是和公司直接討論的空間,例如說「Google網上論壇」。
好吧,也許我對Yahoo瞭解的實在太少,難怪不知道如何和他們互動吧。

呼~不管如何,還是把想法寄給Yahoo了。

2008年1月27日

把多張圖放在一頁,同時轉成PDF檔

如何把多張圖片放在一頁裡面,這算困擾我很久的問題,當然我知道Greplay可以用,大致上我也會用,但我總覺得預設的template不是很好用,終於在SUGI發現了Kevin P. Delaney寫的文章,不只簡單教了如何把多張圖片放在同一頁上,還教如何將圖片轉成PDF檔。

主要參考文章:
Multiple Graphs on One Page: The Easy Way (PDF) and the Hard Way (RTF)
ODS LAYOUT: Arranging ODS Output as You See Fit

先提如何將圖片放在一個PDF檔案中,其實語法相當的簡單。可以分為三步驟,1:打開一個PDF檔案。2:想要畫的SAS圖形。3:完成繪圖把該PDF檔關閉。

1:ODS PDF file="你想放的路徑(例如:c:\temp\graph.pdf)";
2:SAS/Grasph 語法;
3:ODS PDF close;

來做一個簡單的範例,先產生一堆在不同自由度下T分佈的機率吧。

data t (drop=i j);
   do j=1 to 30 by 2;

      do i=-3 to 3 by 0.1;
         df=j;
         x=i;
         y=probt(x,df);
         output;
      end;
   end;
run;


接者用Gplot把圖畫出來然後放一個PDF檔中。

options nodate nonumber;
goption reset=all device=pdfc;
ods pdf file="C:\temp\CHart\chart_test_1.pdf" STARTPAGE=never;

   proc gplot data=t;
      title2 "Chart1"; 
     where df le 15;
      plot y*x=df;
      symbol1 i=l;
   run;quit;
ods pdf close;


我這裡只把DF小於15的資料畫出來。其實這樣就簡單完成把圖形放置PDF檔中的語法了,比較特別需要說明的為device=pdfc,這指令是和SAS說在PDF檔中圖片的格式,作者覺得pdfc的格式在PDF檔案中會有比較好的效果,相對於GIF或其他的圖片格式。



過來就是重頭戲了,如何把多張圖片放在一頁,在文中作者教了至少4中方法,我這裡只說明ODS LAYOUT這個指令,Layout是在SAS V9或V9.1才有的指令,我覺得還滿簡單的,相對於要去修改Greplay的版模。

在畫圖之前先簡單說明LAYOUT我會的語法。

ods layout Start width=20cm height=28cm;
ods region x=0% y=5% width=45% height=45%;
/*SAS/Graphs 語法1*/

ods region x=51% y=5% width=45% height=45%;
/*SAS/
Graphs 語法2*/

ods region x=0% y=51% width=45% height=45%;
/*SAS/
Graphs 語法3*/

ods region x=51% y=51% width=45% height=45%;
/*SAS/
Graphs
語法4*/

ods layout end;


ODS LAYOUT:Start就是宣告我們要開始使用layout的指令,請想像我們手上拿一張白,width就是設定紙的寬度,我設定了20公分,height設定紙的高度,我設定28公分。

ODS REGION:宣告我下面的圖片要放在那個位置,
『x=51% y=5%』是說我將圖片要放在由左上角算起,整張紙X軸的第51%和Y軸上第5%的交叉點,當然這裡也可以用實際的長度單位來設定,例如x=11cm y=1cm。
『width=45% height=45%』設定我這一張圖片的大小,我是用相對長度,為整張紙45%寬度和紙長45%的長度,同樣也可以設為實際長度,如width=8cm height=10cm。
ods layout end:這也是必要語法,宣告上面的ODS LAYOUT設定結束。

依序設計這四張圖片想要放的位置就完成了,我隨意將剛剛製造的資料檔分成四張圖繪製,然後配合上面的語法就可完成我想要的工作了,完整的程式如下:


options nodate nonumber;
goption reset=all device=pdfc ;
ods pdf file="C:\temp\CHart\chart_test_2.pdf" STARTPAGE=never;

   ods layout Start width=20cm height=28cm;
   symbol1 i=l;

   ods region x=0% y=5% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart1';
      where df le 5;
      plot y*x=df/noframe;
   run;

   ods region x=51% y=5% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart2';
      where df ge 5 and df le 15;
      plot y*x=df/noframe;
   run;

   ods region x=0% y=51% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart3';
      where df ge 15 and df le 25;
      plot y*x=df/noframe;
   run;

   ods region x=51% y=51% width=45% height=45%;
   proc gplot data=t;
      title2 'Chart4';
      where df ge 25 and df le 30;
      plot y*x=df/noframe;
   run;quit;

   ods layout end;
ods pdf close;


結果如下圖:




利用PDF輸出和ODS LAYOUT的指令理論上就在一頁可繪製出多張高品值的圖形了,當然ODS LAYOUT應用不只用於圖形,想要結合表格和圖形,也是很OK的啦。

2008年1月10日

有質感的code+ & SAS如何匯入Excel檔案

很多BLOG在說明程式的時候都會用漂亮的框框把程式『框』起來,看來我偷偷學會了。

那就順便簡單說明一下的SAS如何匯入Excel檔案吧。

如果已經很熟libname的語法,那就不用特別去背proc import的語法了,所以那下面的語法對很多人來說就是不難了

libname myxls "c:\myexcel.xls";
data temp1;
set myxls."Sheet1$"n;
run;
libname myxls clear;

這裡比較需要注意的地方在於Sheet1$後面那個「$」和"Sheet1$"n後面的「n」,其他就很簡單了。
當然這個語法不是只有那麼陽春,功能也是滿強大的,有機會在介紹了喔。

code的那個框框,我是參考[筆記]在文章裡顯示優質的程式碼區

來一個研究所吧

當開始聽到這個工作的時候,覺得天阿~要搞一個獨立研究所,沒有系的支持,一個研究所!而且是全台灣第一個此領域的研究所,從來都沒想過的工作,光想到就頭痛。


還好,這個所主要的負責老師
很棒(也很可能是未來的所長,八卦~),花了很多時間寫了短短3頁申請理由,短短3頁但真的寫得很好!我就負責把其他的申請書部分完成,申請研究所完成到這裡,突然覺得好像也沒有很難......就只是文書工作,不過這也可能是學校很支持所以沒有遇到很大的阻力吧。

申請出去了,出去前還一直會擔心有錯字(我超愛有錯字的)....印了精美的10多本申請書送到學院和校發會。在等待的過程中,一度聽到今年不過了,也一度聽到OK沒問題,真是波折,但最大的波折莫過於,在2007年中的時候,教育部突然宣佈全國研究生凍結,當然生統所也就一起再見了,學校就告知我們97學年不能招生了喔...聽了真的很想罵人!

突然年底的時候,學校又說,生統所97學年度可以招生了,真的是OOXX,這變化太快了吧,好了又要開始用簡章的東西,還好也不複雜只是開個小會討論考試科目等等。

終於到2007年1月,學校的簡章出來了,而生統所的網頁在中心的同事加持下也順利推出,雖然東西很少,但只是生統所感覺有個家了。

現在開始期待,也有點擔心,期待有誰會來報名,擔心報人人數會不會太少,雖然第一屆只有4個名額,但總是希望一次就來個100人考吧!這種感覺真的很奇妙,看一個從沒有到似乎已經看到學生了的研究所,還會有種淡淡的成就感,就算我只是小小的螺絲釘。


(應觀眾要求,來寫寫心得)

2008年1月9日

Sciscape 科景

Sciscape 科景(http://www.sciscape.org/),很久以前就名列在我的最愛中了,我三步五時(差不多3-5個月XD),就會去看一下有沒有有趣的科學發現,例如說最近有趣的主題「應用科學:你也在耶誕節工作嗎?」、「醫學: 阿斯巴甜安全嗎? 、「生物:貓的基因定序也出爐了!!」、「一般科學:急著發表論文嗎?」、「生物:左撇子,天生的!」等。

我就把應用科學:你也在耶誕節工作嗎?轉貼上,內容如下:

[Dec 30, 2007]
應用科學:你也在耶誕節工作嗎?

編輯 JR 報導

研究指出有越來越多的科學家放棄耶誕假期,繼續工作。

英國牛津大學科學家Richard J. Ladle與同事,用Google Scholar來統計在1996~2006年間於耶誕節當天繳交的科學論文數量,結果發現數量有增加的趨勢,並且10年來成長了6倍。此結果發表在Nature期刊上。

他們猜測有四個可能的因素助長這個趨勢:第一,以論文數量作為研究能力的衡量標準;第二,越來越多的行政與教學要求加諸在研究者上,使得科學家不得不犧牲假期寫論文。第三,全年無休的線上繳交系統越來越普遍。第四,宗教迷信-替來年的論文數量討個好兆頭。

超時工作已不是個陌生的話題,如何取得工作與生活的平衡,正考驗著現代人類社會的智慧。

參考來源:

* nature: Come all ye scientists, busy and exhausted. O come ye, O com

對我平常懶得看PAPER的人來說,還算個不錯的消遣。無聊的人就上去挖寶吧!