我需要执行以下操作,但我不确定如何实现这一点。
我有一个包含需要执行回归的变量的表,该表看起来像
Colummn name | Y | X1 | X2 | X3 | ....| X10 |
Row 1 __________ | - | --- | --- | --- | ....| --- |
Row 2 __________ | - | --- | --- | --- | ....| --- |
我想运行10次回归并比较每个模型调整后的R Squared,回归代码为:
proc reg data = table outest = out_table;
model modelN /adjrsq;
run;quit;
在10个模型中,Y变量保持不变,X变量每次增加1:
模型1:Y = X1;
模型2:Y = X1 +X2
模型3:Y = X1+ X2 +X3
......
模型10:Y = X1+X2+X3+....+X10
我想写一个
DO i = 1 to 10
为了简单和方便而执行任务。最终输出可能是来自 PROC REG 代码的 10 个 out_table。但是,我不知道如何在循环中引用因变量。有人可以帮忙解决这个问题吗?谢谢!
如果您的 x 变量名为 x1、x2、x3 等,您可以使用
-
快捷键按顺序选择它们。
%macro model(n);
%do i = 1 %to &n;
model&i: model y=x1-x&i /adjrsq;
%end;
%mend;
proc reg data=have outest=out_table;
%model(10);
run;
如果变量没有按顺序排列,您将需要做一些额外的事情。在本例中,我们将从管道分隔列表中读取所有输入变量,并将它们一一添加。
/* Create a pipe-separated list of all input variables */
proc sql noprint;
select name
into :varlist separated by '|'
from dictionary.columns
where memname = 'HAVE'
AND libname = 'WORK'
AND name NE 'Y'
order by varnum
;
quit;
%macro model(n);
%do i = 1 %to &n;
model&i: model y=%scan(&varlist, 1, |)--%scan(&varlist, &i, |) /adjrsq;
%end;
%mend;
proc reg data=have outest=out_table;
%model(10);
run;