在实际的应用中,我们会想查看当前观测的上一个观测值,在上一篇博客中我们使用了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

版权声明:本文为zhangzhangwhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangzhangwhu/p/7229498.html