在SAS中,如何分配来自循环中使用的OUTEST或OUTSTAT函数的变量?
例如,假设我想运行某种迭代分析,直到我的平均值(平均值)达到某个阈值为止。我知道如何使用OUTEST或OUTSTAT提取平均值,但是如何在其上执行操作或代码块?
谢谢。
如果您对细节感兴趣,我将尝试执行VIFs的反向选择(以消除多重共线性)。不幸的是,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
发布于 2014-09-15 21:17:28
首先,我要验证一下,您不能使用PROC模型来完成这个任务。我不是回归者,所以我不确定。也许值得在一个更注重统计数据的网站上发布;简历并不是真正合适的,因为他们通常不会试图回答软件问题,但可能是communities.sas.com。如果在PROC模型和/或在一个更复杂的过程中不能直接实现这一点,我会感到惊讶。
其次,我处理这个问题的方法是编写一个递归宏。取出第一部分(非空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;上运行这个程序,没有任何symbogen/mprint的东西,所以您可以在日志中得到%put/put语句。
https://stackoverflow.com/questions/25854826
复制相似问题