【问题标题】:Perform Iterative Operations on OUTEST or OUTSTAT variables in SAS?对 SAS 中的 OUTEST 或 OUTSTAT 变量执行迭代操作?
【发布时间】:2014-09-15 18:48:48
【问题描述】:

在 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

【问题讨论】:

  • 您应该在此处提供一些代码,最好使用 SASHELP 数据集或您在问题中描述的内容,以便我们了解您使用的上下文。就此而言,这是什么 PROC?
  • 如果您使用的是 PROC REG,它确实有 selection=B(ackward),至少根据 9.2 documentation
  • 嗨乔。我将很快提供代码。它确实适用于 PROC REG,但 SELECTION=BACKWARD 仅适用于 PVALUE 等内容,不适用于 VIF。如果我错了,请纠正我。谢谢。
  • 嗨乔。那里更新了代码和注释。谢谢。

标签: sas regression


【解决方案1】:

首先 - 我会验证您不能使用 PROC MODEL 执行此操作。我不是一个回归的人,所以我不确定。可能值得在更关注统计数据的网站上发布; CV 不是很合适,因为他们通常不会尝试回答软件问题,但可能是 community.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 中调用它自己。增加的运行次数可能会有所帮助(既可以查看它在您的日志中运行了多少次,又可以确保您在删除字段变量时出错时不会陷入无限循环。 )

我会使用OPTION NONOTES NOSOURCE; 运行它,并且没有任何符号/mprint 内容,因此您可以在日志中获取 %put/put 语句。

【讨论】:

  • 谢谢一百万,乔。我正在处理这个问题,它让我的生活变得轻松了很多。我肯定会在未来咨询更多以统计数据为重点的社区。在那之前,你一直非常乐于助人!
猜你喜欢
  • 2020-02-03
  • 2013-12-13
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 2020-09-11
  • 2017-05-28
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多