有人可以解释为什么以下两段代码会给出不同的结果吗?我想在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;
我一直在阅读有关滞后函数的内容,但无法在不接受输入数据集的datastep中找到对其使用的引用。
非常感谢您的帮助。
答案 0 :(得分:2)
LAG功能适用于输入数据,而不适用于输出数据。在您的第一个示例中,没有输入数据,只有输出,因此滞后值始终为空白。 在您的第二个示例中,您不需要代码的两个部分,您可以放置:
data lagtest2;
input a;
b= lag(a);
datalines;
1
2
3
;
run;
答案 1 :(得分:1)
基思大致正确的说法是他所展示的正确方法,但推理并不准确。 LAG
处理数据;输入和输出是无关紧要的(并没有真正有意义的区别)。事实上,很有可能只使用以编程方式提供的数据来完成这项工作。
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
一次,因此创建了一个队列,并且它被调用三次。