SAS:使用不带set语句的lag函数(模拟时间序列数据)。

时间:2014-07-02 10:04:50

标签: 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;
input a;
datalines;
1
2
3
;
run;

data lagtest2;
set lagtest2;
b= lag(a);
run;

我一直在阅读有关滞后函数的内容,但无法在不接受输入数据集的datastep中找到对其使用的引用。

非常感谢您的帮助。

2 个答案:

答案 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,则会弹出队列前面的值。 (对于laglag1,队列必须为2长;对于lag2,它必须为3长;等等 - 即,函数的数量加上刚刚弹出的值)

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