在SAS中对OUTEST或OUTSTAT变量执行迭代操作?

时间:2014-09-15 18:48:49

标签: sas regression

在SAS中,如何分配来自OUTEST或OUTSTAT函数的变量以用于循环

例如,假设我想进行某种迭代分析,直到我的平均值(平均值)达到某个阈值。我知道如何使用OUTEST或OUTSTAT提取均值,但是我如何在其上执行操作或代码块?

谢谢。

如果您对细节感兴趣,我正在尝试向后选择VIF(以消除多重共线性)。不幸的是,SAS似乎没有“SELECTION = BACKWARD”功能......

编辑:更新了示例代码:

%MACRO MULTICOLLINEARITY(TABLE_SUFFIX,YVAR,FIELDS,MAX_VIF);

/* PRELIMINARY PROC REG ON ALL FIELDS*/
PROC REG DATA=TABLE_&TABLE_SUFFIX. NOPRINT;
MODEL &YVAR = &FIELDS / VIF COLLIN NOINT;
ODS OUTPUT PARAMETERESTIMATES=PAREST1;
RUN;

/* RETAIN NON-NULL VIF FIELDS ONLY */
DATA NO_NULL_VIF;
SET PAREST1 (WHERE=(VarianceInflation <> .));
RUN;

/* CREATE VARIABLE LIST OF NON-NULL VIF FIELDS */
PROC SQL;
SELECT VARIABLE
INTO :NO_NULL_VIF_FIELDS SEPARATED BY ' '
FROM NO_NULL_VIF;
QUIT;

/* RE-RUN REGRESSION WITH NON-NULL VIF FIELDS ONLY */
PROC REG DATA=TABLE_&TABLE_SUFFIX. NOPRINT;
MODEL &YVAR = &NO_NULL_VIF_FIELDS / VIF COLLIN NOINT;
ODS OUTPUT PARAMETERESTIMATES=PAREST2;
RUN;

/* START ITERATION OF DROPPING THE HIGHEST VIF UNTIL THE CRITERIA IS MET */

???

%MEND;

%MULTICOLLINEARITY(, RESPONSE, &INPUT_FIELDS,???)

根据标准,我的意思是VIF_MAX&lt; N其中N是宏中指定的某个阈值。例如,如果我们只想保留VIF小于5的字段,那么它应该删除最高的字段,重新运行PROC REG,删除最高,重新运行等等,直到最高值小于5。

1 个答案:

答案 0 :(得分:2)

首先 - 我确认您无法使用PROC MODEL执行此操作。我不是一个回归的人,所以我不确定。可能值得在更加注重统计的网站上发帖;简历并不合适,因为他们通常不会尝试回答软件问题,但可能是communities.sas.com。如果在PROC MODEL和/或其中一个更复杂的过程中无法直接实现这一点,我会感到惊讶。

其次,我接近这个的方法是编写一个递归宏。取出第一部分(非空VIF字段),然后将其移动到只运行一次的外部宏,或者让程序员自己做一个期望(除非这不可行,并且/或者可以随着迭代而改变 - 而不是我熟悉的东西)。然后做这样的事情:

%MACRO MULTICOLLINEARITY(TABLE_SUFFIX,YVAR,FIELDS,MAX_VIF);
    ods _all_ close;
    %put Running with &fields;  *note which fields currently running;
                                *also may want to include a run # counter as parameter;
    PROC REG DATA=TABLE_&TABLE_SUFFIX.;
      MODEL &YVAR = &FIELDS / VIF COLLIN NOINT;
      ODS OUTPUT PARAMETERESTIMATES=PAREST2;
    RUN;
    quit;
    *Data step to analyse PAREST2 and see if any of the fields can be dropped;

    proc sort data=parest2;
      by descending varianceinflation;
    run;

    data _null_;
      set parest2(obs=1);
      if varianceinflation > &max_vif then do;
        fields_run = tranwrd("&fields",trim(variable),' ');
        if not missing(fields_run) then do;
            call_string = cats('%multicollinearity(',"&table_suffix.,&yvar.,",fields_run,",&max_vif.)");
            call execute(call_string);
        end;
      end;
      else do;
        put "Stopped with Max VIF:" variable "=" varianceinflation;
    run;

    ods preferences;
%MEND MULTICOLLINEARITY;

然后使用完整字段列表调用一次,如果仍有参数,则会在CALL EXECUTE中调用自身。递增的#次运行可能会有所帮助(两者都可以查看它在日志中运行了多少次,并且能够确保如果您使用fields变量出错,则不会以无限循环结束删除。)

我会使用OPTION NONOTES NOSOURCE;和没有symbogen / mprint的东西来运行它,所以你可以在你的日志中获得%put / put语句。