滞后功能在SAS中不起作用

时间:2012-02-28 15:27:41

标签: sas

这是我的程序的一部分。(oldindex和oldreadmit保留赞扬)

问题是它适用于oldindex = 1然后readmit = 1但不起作用滞后(oldreadmit)= 1然后readmit = 1。你能告诉我这是什么问题吗?提前谢谢!

else if 0< gap <= 30 then do;
     index_d=0;
     if lag(oldreadmit)=1 or oldindex=1  then readmit=1;
         else oth=1;
     oldindex=index_d; 
     oldreadmit=readmit;
     end;

4 个答案:

答案 0 :(得分:9)

SAS lag功能引起了很多混乱,但一旦你理解了它是如何工作的,那就有意义了。假设您有3个观察值,并且您有一个if语句,导致在处理过程中跳过第二个观察。如果然后将滞后函数应用于第三个观察,它将返回第一个观察,而不是第二个,因为上次处理任何观察时都是第一次观察。

这意味着,在组合滞后和if语句时要小心。在您的代码中,您只有在if语句为真时才会执行的子句中存在延迟。这会给你带来奇怪的结果。你应该做的是定义一个变量,比如l_oldreadmit,以等于之前的滞后在if语句中使用它。

这将有效:

l_oldreadmit = lag(oldreadmit);

if (... whatever you have here ...);
else if 0< gap <= 30 then do;
 index_d=0;
 if l_oldreadmit=1 or oldindex=1  then readmit=1;
     else oth=1;
 oldindex=index_d; 
 oldreadmit=readmit;
 end;

答案 1 :(得分:4)

使用滞后函数的另一个提示是,从版本9开始,您可以使用IFN和IFC函数,这些函数不会违反标准IF语句遇到的问题。看看下面代码的结果,你会明白我的意思。

    data test;
    input col1;
    if col1>0 then col2=lag(col1);
    col3=ifn(col1>0,lag(col1),.);
    cards;
    1
    2
    0
    5
    0
    4
    ;
    run;

有关更详细的解释,这里有一篇关于这个主题的好文章。 http://www.howles.com/saspapers/CC33.pdf

答案 2 :(得分:1)

正如Itzy所说,lag功能的意外行为令人困惑。幸运的用户会立即遇到问题,不幸的用户可能会在意识到存在问题之前花很长时间(如果有的话)。出于这个原因,我完全避免了滞后功能。错误地使用它太容易了,我想保护自己免于犯错,这些错误很容易避免。这样我就可以花更多的时间编写代码,减少调试时间。

我建议只使用retain语句。每个人都理解它是如何工作的以及变量之间的关系,retain语句和if语句是很好理解的。

答案 3 :(得分:0)

LAG函数可能会引起混淆,因为它不会从先前的观察中返回变量的值,而是从队列中返回。队列根据上次调用的时间进行填充。一篇关于这个主题的文章 -

http://analyticsworld.in/aw/the-perils-of-the-lag-function/