我想建立一个包含两个预测变量的逻辑模型。一个来自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;
%好转;
答案 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次。
假设您有两个数据集indep1
和indep2
,每个数据集都包含一个列,每行有一个变量名称。如果你有一个宏:
%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.;
除了非常简单的情况外,控制宏语言之外的重复几乎总是比在其内部更容易;这是一种更好的编程风格,因为它使代码更具可移植性和可重用性。