我不知道这是否适合发布,但在我看来,我更有可能在那里得到答案。
目前正在为SAS实习工作,我正在尝试编写一个宏来自动化为我的数据集找到拟合ARIMA
模型的过程。我对这个软件很陌生,而且不是统计领域的专家。
然而,虽然我似乎明白如何导入我的文件并启动proc arima
,但我仍然遇到了一个小问题。我的代码的一部分,如果我在宏之外编写它(我猜它叫open code
?)就可以正常工作了:
data _null_;
set Lib.out; /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
x = 1000000;
put _STAT_; /* Prints correctly the names of the different lines in the log */
if _STAT_='AIC' then do; /* _STAT_ is a column and AIC the name of a line AFAIK */
if _VALUE_ < x then
x = _VALUE_;
put x;
put _STAT_; /* Here only prints AIC, which I guess is correct inside of the IF loop */
end;
run;
但是当在一个宏中运行时,例如:
%macro recherche(poste=, mto=);
--- code ---
data _null_;
set Lib.out; /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
%let aic0 = 1000000;
%put _STAT_; /* Doesn't recognize the _STAT_ statement and stops */
%if _STAT_='AIC' %then %do;
%if _VALUE_ < &aic0 %then %do;
&aic0 = _VALUE_;
data Lib.chosen;
set Lib.model; /* Contains the OUTMODEL statement of PROC ARIMA */
run;
%end;
end;
run;
--- code ---
我试图在互联网上搜索类似的案例,但无法找到我正在寻找的解释。此外,作为SAS的新手,官方文档仍然难以理解。提前谢谢。
答案 0 :(得分:0)
你在那里做的大部分内容都不需要%
。如果它是一个控制甚至发送给编译器的代码行的语句,你只需要它。
%macro recherche(mto=);
data _null_;
set Lib.out; /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
x = &mto.;
put _STAT_; /* Prints correctly the names of the different lines in the log */
if _STAT_='AIC' then do; /* _STAT_ is a column and AIC the name of a line AFAIK */
if _VALUE_ < x then
x = _VALUE_;
put x;
put _STAT_; /* Here only prints AIC, which I guess is correct inside of the IF loop */
end;
run;
%mend recherche;
假设MTO参数用于保存分配给x的值。你唯一一次使用%IF就是你做了类似
的事情%macro recherche(mto=,stat=);
data _null_;
set Lib.out; /* Lib.out contains the data of the OUTSTAT statement of the PROC ARIMA */
x = &mto.;
put _STAT_; /* Prints correctly the names of the different lines in the log */
%if &stat=AIC %then %do;
if _STAT_='AIC' then do; /* _STAT_ is a column and AIC the name of a line AFAIK */
if _VALUE_ < x then
x = _VALUE_;
put x;
put _STAT_; /* Here only prints AIC, which I guess is correct inside of the IF loop */
end;
%end;
%else %if &stat=XYZ %then %do;
*more code ...;
%end;
run;
%mend recherche;
那只会执行其中一段或另一段代码。宏语句无权访问proc或data步骤中的数据,并且它们不使用引号(除非引用是代码的实际重要部分)。
答案 1 :(得分:0)
在宏中使用管道语句do while循环时遇到了同样的问题。我会得到unclosed do循环错误,但语句可以独立工作。我曾尝试过每一次迭代来解决,但无济于事。最后,我的解决方案是将管道infile语句放入自己的程序中,然后使用%include将其带入宏。这非常有效!这个问题绝对是SAS内部的一个错误。