在實際的應用中,我們會想查看當前觀測的上一個觀測值,在上一篇博客中我們使用了RETAIN語句來記錄上一條觀測,其實SAS還提供了一個很好用的函數LAG。當我們使用函數時,一定要明確該函數的返回值是什么。之前我一直認為LAG就是滯后一階,返回當前觀測的上一個值,實際上這種理解是錯誤的。
LAG返回的是上一次LAGE函數運行時的實參,即LAG(argument)=上一次LAG函數執行時的argument.
1. LAG函數
1.1 用LAG計算差值
DATA COMPARE; INPUT X; LAST_X = LAG(X); DIFF_X = X - LAST_X; DATALINES; 4 2 9 6 ; PROC PRINT DATA=COMPARE NOOBS; TITLE "Demonstration the LAG Function"; RUN;
在這個例子中,LAG的確返回的是當前數據的上一個值,但是這只是表象,記住:LAG返回的是上一次LAGE函數運行時的實參,即LAG(argument)=上一次LAG函數執行時的argument。具體地,第一個X的值是4,但是在此之前LAG函數並沒有執行過,那么它的實參當然是空,所以LAG(4)=.;接着X=2,上一次運行LAG時,LAG的實參是4,所以LAG(2)=4;接着X=9,上一次LAG運行時的實參是2,所以LAG(9)=2,依次類推。也許你覺得這兩種理解對結果沒有影響,那么我們來看看下一個例子:
DATA LAG2; INPUT X; IF X > 2 THEN LAG_X = LAG(X); DATALINES; 1 3 . 5 2 7 ; PROC PRINT DATA=LAG2; TITLE "Listing of LAG1 Data Set"; RUN;
注意,為什么LAG(3)是空呢,3的上一個值不是1嗎,LAG(3)滯后一階不是1嗎?所以,記住:LAG返回的是上一次LAGE函數運行時的實參,即LAG(argument)=上一次LAG函數執行時的argument。在這個例子中,因為只用當X>2時才會調用LAG,所以第一次調用LAG時,X=3;當X=5時,第二次調用LAG,此時LAG(5)=3。
1.2 LAG2 LAG3等等
根據LAG可以推測出LAG2 LAG3的用法了:
DATA LAG_N; INPUT X; LAG_X = LAG(X); LAG2_X = LAG2(X); LAG3_X = LAG3(X); DATALINES; 1 2 3 4 5 ; PROC PRINT DATA=LAG_N; TITLE "Demonstrating the LAGn Family of Functions"; RUN;
2. DIFF函數
在沒有判斷語句的前提下,相當於一階差分 DIF(X)=X-LAG(X)
DATA COMPARE; INPUT X; DIFF_X = DIF(X); DATALINES; 4 2 9 6 ; PROC PRINT DATA=COMPARE NOOBS; TITLE "Demonstration the DIF Function"; RUN;