Мне нужно написать макропрограмму для создания списка для расчета скользящего среднего, где мне понадобятся некоторые строки, которые будут построены следующим образом:
var1_ma_past_1=mean(var1, lag1(var1), lag2(var1), lag3(var1), lag4(var1), lag5(var1));
var1_ma_past_2=mean(lag1(var1), lag2(var1), lag3(var1), lag4(var1), lag5(var1), lag6(var1));
var1_ma_past_3=mean(lag2(var1), lag3(var1), lag4(var1), lag5(var1), lag6(var1), lag7(var1));
[...]
var2_ma_past_1=mean(var2, lag1(var2), lag2(var2), lag3(var2), lag4(var2), lag5(var2));
моя примерная программа
%macro test ;
%do i = 1 %to 5;
%let ln&i = ;
%do j = 1 %to 5;
%let dml = %str(,);
%let pos = %str(lag&i(var&j));
%let ln&j = %sysfunc(catx(&dml, &&ln&j, &pos));
%end;
%end;
/* example output */
%put &ln1;
%mend test;
%test
Однако &j
начальные и конечные значения планируется заменить параметрами.
результат требуется для &ln1
lag1(var1),lag2(var1),lag3(var1),lag4(var1),lag5(var1)
но для &ln2
&ln3
и т. д. это не так (lag1(varn)
отсутствует)
lag2(var4),lag3(var4),lag4(var4),lag5(var4)
lag2(var3),lag3(var3),lag4(var3),lag5(var3)
Кроме того, я получил вывод журнала лавинной рассылки, говорящий ERROR: Required operator not found in expression:
из-за круглых скобок внутри cats()
, который находится внутри %sysfunc()
, пример макроса для репликации:
%macro test2;
%let x=meow;
%put %sysfunc(cats(x,lag()));
%mend;
%test2
Я пытался замаскировать скобки с помощью %str
, %superq
, %bquote
, но ничего не получилось.
я хотел бы научиться
- причина некорректного вывода для
&ln2
,&ln3
и т.д. - причина
ERROR: Required operator not found in expression:
и как исправить (или обходной путь, или вообще подавить ошибку если не критично)
Заранее спасибо.
proc product_status;run;
- person Reeza   schedule 09.03.2019PROC EXPAND
также будет включать пропущенные значения для расчета скользящего среднего значения, чего я не хочу. У меня также было ощущение, что каждыйPROC EXPAND
будет выводить набор данных, в этом случае эффективность резко ниже, хотя я лично не проверял это. - person Han Chengyu   schedule 10.03.2019