我试图用Proc Mixed测试宏内部的不同协方差结构。
%macro cov(type);
proc mixed data=tmp order=data;
class sub trt visit;
model var = trt visit trt*visit / S cl;
repeated visit /subject=sub type=&type.;
FitStatistics=min_var_&type.;
run;
%mend;
我需要在模型中拟合的一些协方差结构会导致错误,并且我试图找到一种方法来执行此proc混合语句,如果它不会导致错误的值为& type 。
我一直在使用%sysfunc,但尚未能解决此问题。
%IF %SYSFUNC(EXIST(min_var_&type.)) %THEN %DO;
data help_&type.;
set min_var_&type.;
run;
%end;
这会正确生成这些数据集,但是对于那些无法拟合的宏变量,日志中仍然存在日志错误。
答案 0 :(得分:1)
您可以将日志重定向到如下文件:
filename logfile "\\SERVER\LOG\mylog.log";
proc printto log=logfile new;
run;
然后当你的PROC MIXED完成后,你可以在日志文件中过滤字符串" ERROR" :
....YOUR PROC MIXED...
/*come back to normal log*/
proc printto;
run;
/*check the log file*/
DATA CHECKLOG;
LENGTH ROWS $200;
LABEL ROWS = 'Messages from LOG';
INFILE "\\SERVER\LOG\mylog.log" TRUNCOVER;
INPUT ROWS &;
LINE = _N_;
IF SUBSTR(ROWS,1,5)='ERROR' /*OR SUBSTR(ROWS,1,7)='WARNING'*/ THEN
OUTPUT;
RUN;
数据集中将包含所有ERROR和(或警告,如果需要)。
然后你必须检查表是否为空。 如果是,您可以继续编写脚本。
你可以通过这种方法
来做到这一点proc sql;
select * from checklog;
run;
%put n=&sqlobs;
如果sqlobs大于0,则表示您有错误。 你可以通过像这样的宏函数来检查sqlobs:
%macro checklog;
proc sql;
select * from checklog;
run;
%if (&sqlobs>0) %then ...
%else ...
%mend checklog;