【问题标题】:Execute proc step only if it doesn't cause log error (inside macro) SAS仅在不导致日志错误(宏内部)SAS 时才执行 proc 步骤
【发布时间】:2017-10-24 05:34:03
【问题描述】:

我正在尝试使用 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;

这会正确生成这些数据集,但对于那些无法拟合的宏变量,日志中仍然存在日志错误。

【问题讨论】:

  • 为什么某些协方差结构会导致错误?这是您在运行PROC MIXED 之前可以预测的吗?您不能告诉PROC MIXED 仅在不会导致错误的情况下运行,但您可以控制错误发生后发生的情况。但我认为最好不要出现错误,所以也许首先解决这个问题,无论是你自己还是在问题中解决它,最好用一些示例数据来显示你所指的错误类型。
  • 我正在为多个数据集运行此宏,其中一些数据集适合特定的协方差结构,而另一些数据集则不适合。在拟合 proc 混合之前,我不知道哪种协方差结构适合该数据。
  • 如果您的目标是避免日志中出现错误消息,并且您无法预测 PROC MIXED 何时会抛出错误,您可以使用 PROC PRINTTO 重定向日志,然后运行 ​​MIXED,重定向回主日志,然后测试备用日志是否有错误,并决定是否再次运行该模型。
  • @Laura 那么如果协方差结构不合适,PROC MIXED 会发生什么? proc错误吗?如果是这样,究竟是什么导致了错误?
  • 'QUANEW优化无法完成。 ' 所以我猜这种协方差结构根本不适合那个特定的数据,而其他它可能适合,这就是为什么无论如何它都必须适合。

标签: sas sas-macro


【解决方案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;

您将在数据集中包含所有错误和(或警告,如果需要)。

然后你必须检查表是否为空。 如果是,你可以继续你的脚本。

你可以通过这个方法做到这一点

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多