функция задержки не работает в SAS - PullRequest
5 голосов
/ 28 февраля 2012

Вот часть моей программы. (Oldindex и oldreadmit находятся в retain commend)

Проблема в том, что она работает для oldindex = 1, затем readmit = 1, но не работает lag (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 ]

9 голосов
/ 28 февраля 2012

Функция 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;
4 голосов
/ 29 февраля 2012

Просто еще один совет по использованию функции задержки, начиная с версии 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

1 голос
/ 28 февраля 2012

Как говорит Ици выше, неожиданное поведение функции lag сбивает с толку. У удачливых пользователей сразу же возникнут проблемы, незадачливые пользователи могут надолго уйти, прежде чем поймут, что есть проблема (если они вообще возникнут). По этой причине я полностью избегаю функции задержки. Это слишком легко использовать неправильно, и я хочу защитить себя от ошибок, которых можно легко избежать. Таким образом я могу тратить больше времени на кодирование и меньше времени на отладку.

Я рекомендую просто использовать оператор retain. Все понимают, как это работает, и связь между переменными, оператором retain и оператором if хорошо понятна.

0 голосов
/ 17 мая 2012

Функция LAG может сбивать с толку, поскольку она не возвращает значение переменной из предыдущего наблюдения, а из очереди. Очередь заполняется в зависимости от того, когда она была вызвана в последний раз. Статья по теме -

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

...