SAS筆記(3) LAG和DIFF函數


在實際的應用中,我們會想查看當前觀測的上一個觀測值,在上一篇博客中我們使用了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;

lag1

在這個例子中,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;

lag2

注意,為什么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;

lag3

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;

lag4


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM