在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。
答案 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语句。