Я бы предположил, что вы написали datastep вроде так.
data want;
set have;
if missing(cal) then
cal = lag1(cal)*&coef1 + lag2(cal)*&coef2;
run;
LAG не захватывая предыдущее значение, а скорее создает очереди, которая является N долго и дает вам конечную часть. Если у вас есть это утверждение IF, то вы никогда не поместите полезные значения CAL в эту очередь - вы будете только бросать в нее пропуски. Смотрите его так:
data have;
do x=1 to 10;
output;
end;
run;
data want;
set have;
real_lagx = lag(x);
if mod(x,2)=0 then do;
not_lagx = lag(x);
put real_lagx= not_lagx=;
end;
run;
Реальный лагов являются немедленным последнее значение, в то время как NOT лаги последнее значение даже, потому что они внутри IF.
У вас есть два основных варианта. Используйте RETAIN для отслеживания последних двух наблюдений или используйте LAG, как я сделал выше, перед оператором IF, а затем используйте значения с задержкой внутри оператора IF. С любым методом нет ничего лучше или хуже; LAG работает так, как вы это хорошо понимаете. RETAIN часто считается «более безопасным», потому что его сложнее ввернуть; вам также легче посмотреть, что вы делаете.
data want;
set have;
retain cal1 cal2;
if missing(cal) then cal=cal1*&coef1+cal2*&coef2;
output;
cal2=cal1;
cal1=cal;
run;
или
data want;
set have;
cal1=lag1(cal);
cal2=lag2(cal);
if missing(cal) then cal=cal1*&coef1+cal2*&coef2;
run;
Последний метод будет работать только если cal
нечасто хватает - особенно, если он никогда не хватает больше, чем один раз из любых трех наблюдений.В первом примере будет заполнено первое cal
(строка 3), но оттуда оно всегда будет отсутствовать. Это может быть или не быть желательным; если это не так, используйте retain
.
Я провел аналогичную симуляцию, и это сработало для меня. Вы можете уточнить? Как и где вы определили 'coef1' и' coef2'? Какой результат вы получаете? Предоставление воспроизводимого примера также поможет решить вашу проблему. – Vincent
@ Vincent coef - две глобальные макропеременные. например. '% let coef1 = 0.38'. lag1() и lag2() возвращают отсутствующие значения. – Lovnlust
Код должен работать нормально. Являются ли ваши расчеты задержки в IF или другом условном блоке? Если да, это будет проблемой. Вы можете использовать условный лаг для Google, чтобы объяснить, почему это не работает. – Reeza