首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SAS中对OUTEST或OUTSTAT变量执行迭代操作吗?

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

Stack Overflow用户
提问于 2014-09-15 18:48:48
回答 1查看 558关注 0票数 0

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

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

谢谢。

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

编辑:用示例代码更新:

代码语言:javascript
复制
%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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-15 21:17:28

首先,我要验证一下,您不能使用PROC模型来完成这个任务。我不是回归者,所以我不确定。也许值得在一个更注重统计数据的网站上发布;简历并不是真正合适的,因为他们通常不会试图回答软件问题,但可能是communities.sas.com。如果在PROC模型和/或在一个更复杂的过程中不能直接实现这一点,我会感到惊讶。

其次,我处理这个问题的方法是编写一个递归宏。取出第一部分(非空VIF字段),或者将其移动到只运行一次的外部宏,或者使其成为程序员自己完成的期望(除非这是不可行的,并且/或可以随迭代而改变--这不是我所了解的)。然后做这样的事情:

代码语言:javascript
复制
%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中调用自己。递增的运行#可能会有帮助(既可以查看它在日志中运行了多少次,也可以确保如果您在字段变量删除中出错,就不会陷入无限循环)。

我会在OPTION NONOTES NOSOURCE;上运行这个程序,没有任何symbogen/mprint的东西,所以您可以在日志中得到%put/put语句。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25854826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档