2013-10-02 122 views
1

我想构建一个包含两个预测器的逻辑模型。一个来自all_indeps1,另一个来自all_indeps2。我在宏下运行,但是,它只运行all_indeps1中的第一个变量和all_indeps2中的所有变量。我应该如何修复这个宏,以便可以从两组中获得两个变量的所有可能组合?SAS宏嵌套循环

另外,我想只输出逻辑模型中的每个预测变量的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; 

%修复;

回答

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

它几乎总是更容易控制比它里面的宏语言之外的重复,除了最简单的情况;这是一个更好的编程风格,因为它使得更便携和可重用的代码。

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.Choosing只有1从PROC输出

。使用 ods trace on;您的程序,然后 ods trace off;这将打印放置到输出目标的表名。

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