公告

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

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


2007年9月16日 星期日

LAG - the Very Powerful and Easily Misused SAS Function

原文載點:http://www.nesug.info/Proceedings/nesug06/cc/cc32.pdf

這次簡單地介紹一個相當好用的 SAS 運算子--LAG。這個運算子經常使用在包含 time series data 的資料庫裡面,而 Yunchao (Susan) Tian 在 NESUG 2006 發表的這篇技術文件則將 LAG 做了小小的推廣。

LAG的語法很簡單,如下所示:

Y=LAGn(X); /*n = 1, 2, 3, 4, ...... */

n 可以填入任何數字來控制要 LAG 幾次,如果不寫 n 的話則預設值會設定成 1。

接下來有幾個不錯的例子來說明如何有效運用 LAG 運算子。

範例一:
在一般計算每一年數據的增加或減少的百分比時,經常會使用到 [(X-Y)/X]*100%。可是在 SAS 的運算概念裡面是使用「column」來運算,而不能直接用「row」來運算。如果每一年的資料是存在不同的變數時,就可以用上述的公式直接來算。但是如果時間序列的資料是存成直的(如下所示),就沒有辦法了。

Data EXAMPLE1;
input YEAR PRICE;
cards;
2001 200000
2002 220000
2003 250000
2004 280000
2005 310000
run;


有個笨方法是利用 PROC transpose 把資料轉成橫的,當計算完之後再轉回直的。不過 LAG 運算子可以省掉這個麻煩:

DATA EXAMPLE1_RIGHT;
SET EXAMPLE1;
LAG_PRICE = LAG(PRICE);
DIF_PRICE = PRICE - LAG_PRICE;
PER_INCREASE = (DIF_PRICE/LAG_PRICE)*100;
RUN;


這個程式的原理很簡單,就是把原始的 PRICE 資料往後 LAG 一年並存成新的變數 LAG_PRICE。每一筆資料會有當年的 PRICE 和前一年的 PRICE 的數據。如此一來就可以直接進行運算。

範例二:
此範例是上一個範例的進階。此回多了一個變數 COUNTY,也就是說有好幾個 COUNTY 的時間序列資料放在一起。如何讓 LAG 運算子在不同的 COUNTY 有適當的作用,則必須要額外用其他的涵式來控制。資料如下:

Data EXAMPLE2;
input COUNTY YEAR PRICE;
cards;
1001 2001 200000
1001 2002 220000
1001 2003 250000
1001 2004 280000
1001 2005 310000
1002 2001 220000
1002 2002 240000
1002 2003 270000
1002 2004 300000
1002 2005 340000
1003 2001 280000
1003 2002 300000
1003 2003 330000
1003 2004 370000
1003 2005 410000
run;


在把上面的資料 set 進新的資料後,一定要加上一行「BY COUNTY YEAR」來控制資料的讀取順序,這樣就可以讓接下來的 LAG 運算子在不同的 COUNTY 下做運算:

DATA EXAMPLE2_RIGHT;
SET EXAMPLE2;
BY COUNTY YEAR;
LAG_PRICE = LAG(PRICE);
DIF_PRICE = DIF(PRICE);
IF FIRST.COUNTY THEN DO;
LAG_PRICE = .;
DIF_PRICE = .;
END;
PER_INCREASE = (DIF_PRICE/LAG_PRICE)*100;
RUN;


兩點需要額外說明。一,此處引用另一個運算子 DIF,他可以自動做出和範例一程式中的「DIF(PRICE) = PRICE – LAG(PRICE)」一樣的運算。二、之後的 IF... THEN 條件式主要是強制讓每個 COUNTY 第一年的 LAG 值是 missing,連帶讓 DIF_PRICE 也跟著變成 missing,這樣就不會有因為溢位導致錯誤數據出現的情況。

範例三主要在講如何利用 LAG 運算子來做資料插補,但我看了一下內文,覺得並不實用,因為這種資料插補方法沒有理論基礎,還不如用 PROC MI 來做插補的動作。因此在這邊就不提了。有興趣的人可以自己去看內文。

CONTACT INFORMATION
Your comments and questions are valued and encouraged. Contact the author at:
Yunchao (Susan) Tian
Social & Scientific Systems, Inc.
8757 Georgia Avenue, 12th Floor
Silver Spring, MD 20910
Work Phone: (301) 628-3285
Fax: (301) 628-3201
Email: Stian@s-3.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; }