SAS宏嵌套循环

时间:2013-10-02 22:37:15

标签: loops macros nested sas

我想建立一个包含两个预测变量的逻辑模型。一个来自set all_indeps1,另一个来自all_indeps2。我运行下面的宏,但是,它只使用all_indeps1中的 first 变量和all_indeps2中的所有变量运行模型。我应该如何修复宏,以便我可以从两个集合中获得两个变量的所有可能组合?

另外,我想只从逻辑模型输出每个预测变量的p值,任何想法?

非常感谢!

%macro trivariate(all_indeps1, all_indeps2);
%let k = 1;
%let l = 1;
%let indep1 = %scan(&all_indeps1, &k);
%let indep2 = %scan(&all_indeps2, &l);

    %do %while("&indep1" NE "");
        %do %while ("&indep2" NE "");
    title "independent variable is &Indep1 and &Indep2";
    proc logistic data = A descending;
        model Y = &indep1 &indep2;
    run;
        %let l = %eval(&l + 1);
        %let indep2 = %scan(&all_indeps2, &l);
        %end;
    %let k = %eval(&k + 1);
    %let indep1 = %scan(&all_indeps1, &k );

    %end;

%好转;

2 个答案:

答案 0 :(得分:1)

这实际上是2个问题。

1.没有什么能像我的宏那样跳出来。请尝试options mprint mlogic;查看幕后发生的更多信息。

我个人将其编码为

%macro trivariate(all_indeps1, all_indeps2);
%let n1 = %sysfunc(countw(&all_indeps1));
%let n2 = %sysfunc(countw(&all_indeps2));
%do i=1 to &n1;
   %let indep1 = %scan(&all_indeps1,&i);
   %do j=1 %to &n2;
      %let indep2 = %scan(&all_indeps2,&i);

      STUFF
   %end
%end;
%mend;

2.仅从PROC中选择1个输出。使用ods trace on;您的过程,然后ods trace off;这将打印放入输出目的地的表名。

然后您可以使用ods select <list of table names>;您的程序,然后使用ods select default;这将告诉输出传送系统(ODS)仅打印您要求的表格,然后重置为默认输出。 (在您的情况下,此表可能是ParameterEstimates)

答案 1 :(得分:1)

我根本不会将其编码为宏循环,而是设置它以使宏只是内部位,并调用宏n1 * n2次。

假设您有两个数据集indep1indep2,每个数据集都包含一个列,每行有一个变量名称。如果你有一个宏:

%macro trivariate(indep1,indep2);
   title "independent variable is &Indep1 and &Indep2";
    proc logistic data = A descending;
        model Y = &indep1 &indep2;
    run;
%mend trivariate;

proc sql;
 select cats('%trivariate(',indep1.var,',',indep2.var,')') into :trivarlist
  separated by ' ' 
  from indep1, indep2;
quit;

&trivarlist.;

除了非常简单的情况外,控制宏语言之外的重复几乎总是比在其内部更容易;这是一种更好的编程风格,因为它使代码更具可移植性和可重用性。