循环中的SAS PROC GLM
我尝试在一个循环中运行循环中的SAS PROC GLM,sas,Sas,我尝试在一个循环中运行PROC GLM,因为我有许多模型(因变量和自变量的不同组合),并且逐个运行它们非常耗时。但是log error表示在PROC GLM中只允许一个模型语句,所以有什么解决方案吗 我的代码如下所示 data old; input year A1 A2 A3 A4 B C D; datalines; 2000 22 22 30 37 4 13 14 2000 37 29 31 38 6 16 12 2000 42 29 34
PROC GLM
,因为我有许多模型(因变量和自变量的不同组合),并且逐个运行它们非常耗时。但是log error表示在PROC GLM中只允许一个模型语句,所以有什么解决方案吗
我的代码如下所示
data old;
input year A1 A2 A3 A4 B C D;
datalines;
2000 22 22 30 37 4 13 14
2000 37 29 31 38 6 16 12
2000 42 29 34 37 3 15 15
2000 28 28 27 35 10 13 15
2000 33 22 37 40 9 12 15
2000 22 29 26 40 3 11 15
2000 37 20 32 40 6 12 13
2001 44 22 33 35 7 20 12
2001 33 20 26 40 6 13 15
2001 32 30 37 35 1 12 13
2001 44 25 31 39 4 20 14
2001 25 30 37 38 4 20 10
2001 43 21 35 38 6 11 10
2001 25 23 34 37 5 17 11
2001 45 30 35 37 1 13 14
2001 48 24 36 39 2 13 15
2001 25 24 35 40 9 16 11
2002 38 26 33 35 2 14 10
2002 29 24 35 36 1 16 13
2002 34 28 32 35 9 16 11
2002 45 26 29 35 9 19 10
2002 26 22 38 35 1 14 12
2002 20 26 26 39 8 17 10
2002 33 20 35 37 9 18 12
;
run;
%macro regression (in, YLIST,XLIST);
%local NYLIST;
%let NYLIST=%sysfunc(countw(&YLIST));
ods tagsets.ExcelXP path='D:\REG' file='Regression.xls';
Proc GLM data=∈ class year;
%do i=1 %to &NYLIST;
Model %scan(&YLIST,&i)=%scan(&XLIST,1) %scan(&XLIST,2)/ solution;
Model %scan(&YLIST,&i)=%scan(&XLIST,1) %scan(&XLIST,2)/ solution;
Model %scan(&YLIST,&i)=%scan(&XLIST,1) %scan(&XLIST,2)/ solution;
%end;
%do i=2 %to &NYLIST;
Model %scan(&YLIST,&i)=%scan(&XLIST,1) %scan(&XLIST,2) %scan(&XLIST,3)/ solution;
Model %scan(&YLIST,&i)=%scan(&XLIST,1) %scan(&XLIST,2) %scan(&XLIST,3)/ solution;
Model %scan(&YLIST,&i)=%scan(&XLIST,1) %scan(&XLIST,2) %scan(&XLIST,3)/ solution;
%end;
run;
ods tagsets.excelxp close;
%mend regression;
options mprint;
%regression
(in=old
,YLIST= A1 A2 A3 A4
,XLIST= B C D);
您应该分两步完成此操作。一个是包含一个PROC GLM实例的宏:
%macro regression(data,y,x1,x2,x3);
proc glm data=&data;
class year;
model &y &x1 &x2 &x3/solution;
run;
%mend regression;
然后使用call execute
或proc sql select into
方法从其他对象调用该宏,或者从包含y/x1/x2/x3作为列(每个模型语句一行)的数据集调用该宏,该数据集包含循环元素,或者更好。例如,使用包含模型y/x值的数据集modeldata
:
proc sql noprint;
select cats('%regression(mydataset,',y,',',x1,',',x2,',',x3,')') into :calllist separated by ' ' from modeldata;
quit;
&calllist.;
或者类似的。谢谢乔。是否有方法隐式定义
%宏回归中x
参数的数量?我的xi
数量并不总是3(有时会增加到10…),你可以做几件事。您可以将x
作为字符串传递(毕竟它是作为字符串使用的-所有参数都用空格分隔)。您可以传递10个空格,并为任何缺少的空格传递空格。您可以传递参数总数并遍历该列表。好的……一个问题,mydataset和modeldata的区别是什么?mydataset
是一个占位符,因为我懒得向上滚动。假设数据集名称是old
。然后我应该使用选择cats(“%regression(old',y',”,x1',“,x2',”,x3',))到:calllist中,由“”和old分隔代码>?很抱歉
proc sql noprint;
select cats('%regression(mydataset,',y,',',x1,',',x2,',',x3,')') into :calllist separated by ' ' from modeldata;
quit;
&calllist.;