Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环中的SAS PROC GLM_Sas - Fatal编程技术网

循环中的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.;