1

我想建立一个包含两个预测变量的逻辑模型。一个来自集合 all_indeps1,一个来自 all_indeps2。我在宏下面运行,但是,它只运行来自 all_indeps1 的第一个变量和来自 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;

%修补;

4

2 回答 2

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.;

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

于 2013-10-03T03:37:51.330 回答
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)

于 2013-10-03T02:22:40.183 回答