SAS:在不使用set语句的情况下使用lag函数(模拟时间序列数据)

SAS:在不使用set语句的情况下使用lag函数(模拟时间序列数据),sas,Sas,有人能解释一下为什么下面两段代码给出不同的结果吗?我想在SAS中模拟一些简单的时间序列过程,但我正在努力使用滞后函数 具体来说,在程序1中,变量b不包含任何数据,这是意外的。在程序2中,滞后功能按预期工作 /*Program 1*/ data lagtest; a = 1; b=lag(a); output; a = 2; b= lag(a); output; a = 3; b= lag(a); output; run; /*Program 2*/ data lagtest2; inpu

有人能解释一下为什么下面两段代码给出不同的结果吗?我想在SAS中模拟一些简单的时间序列过程,但我正在努力使用滞后函数

具体来说,在程序1中,变量b不包含任何数据,这是意外的。在程序2中,滞后功能按预期工作

/*Program 1*/
data lagtest;
a = 1;
b=lag(a);
output;

a = 2;
b= lag(a);
output;

a = 3;
b= lag(a);
output;
run;


/*Program 2*/
data lagtest2;
input a;
datalines;
1
2
3
;
run;

data lagtest2;
set lagtest2;
b= lag(a);
run;
我一直在阅读关于lag函数的文章,但在不接受输入数据集的datastep中找不到对其使用的引用


非常感谢您的帮助。

LAG函数作用于输入数据,而不是输出数据。在第一个示例中,没有输入数据,只有输出,因此滞后值始终为空。 在第二个示例中,您不需要这两段代码,只需将:

data lagtest2;
input a;
b= lag(a);
datalines;
1
2
3
;
run;

基思大致上是正确的,因为他所展示的是正确的方法,但推理并不准确<代码>滞后对数据起作用;输入和输出是不相关的(并不是真正意义上的区别)。事实上,仅通过编程提供的数据就可以实现这一点

data lagtest;
do a=1 to 3;
  b=lag(a);
  output;
end;
run;
类似地,第二个例子也可能不起作用,有一个有些荒谬的例子:

data lagtest2;
 p=1;
 set lagtest2 point=p;
 b= lag(a);
 output;
 p=2;
 set lagtest2 point=p;
 b=lag(a);
 output;
 p=3;
 set lagtest2 point=p;
 b=lag(a);
 output;
 stop;  
run;
第一个例子不起作用的原因不是数据来源;这是延迟呼叫的数量。最常见的错误之一是认为
lag
从以前的记录中检索值;那不是真的。
lag
的工作方式是每次调用
lag
都会创建一个队列。每次遇到lag语句时,参数中的任何值都会被推送到队列中,如果队列的长度至少为定义的长度+1,则会弹出队列前面的值。(对于
lag
lag1
而言,队列长度必须为2;对于
lag2
而言,队列长度必须为3;以此类推-即函数的编号加上刚刚弹出的值)


在第一个示例中,您调用了三次
lag
,因此创建了三个单独的队列,其中没有一个被第二次调用。在第二个示例中,您调用了
lag
一次,因此创建了一个队列,并调用了三次。

Aha-感谢您给出了如此清晰的答案。我已经看到“lag的工作方式是每次调用lag都会创建一个队列。”在我读到的内容中,但直到看到你的答案,我才理解它的意义。