2013-10-16 121 views
0

我試圖在循環中運行PROC GLM,因爲我有很多模型(依賴變量和獨立變量的不同組合),並且它們非常耗時地逐個運行它們。但是在PROC GLM中,日誌錯誤表示only one MODEL statement allowed,所以對此有何解決方案?SAS PROC GLM in a loop

我的代碼看起來像下面

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); 

/*potential solutions*/ 

    %macro regression(data,y,x1,x2,x3); 
    proc glm data=&data; 
    class year; 
    model &y=&x1 &x2 &x3/solution; 
    run; 
    %mend regression; 


    %macro sql (mydataset,y,x1,x2,x3); 
    proc sql noprint; 

    select cats('%regression(&mydataset,',&y,',',&x1,',',&x2,',',&x3,')') 
    into :calllist separated by ' ' from &mydataset; 
    quit; 
    &calllist.; 

    %mend sql; 
    %sql 
    (mydataset=old 
    ,y=A1 
    ,X1=B 
    ,X2=C 
    ,X3=D); 

回答

1

你應該這樣做的兩個步驟。一個是包含PROC GLM的一個實例宏:

%macro regression(data,y,x1,x2,x3); 
proc glm data=&data; 
class year; 
model &y &x1 &x2 &x3/solution; 
run; 
%mend regression; 

然後調用從別的,宏,無論是與循環元素更好的宏觀,或從包含您的Y/X1/X2的數據集/ x3作爲列(每個模型語句一行),使用call executeproc sql select into方法。例如,與數據設定modeldata含有Y/X值模型:

proc sql noprint; 
select cats('%regression(mydataset,',y,',',x1,',',x2,',',x3,')') into :calllist separated by ' ' from modeldata; 
quit; 
&calllist.; 

或類似物。

+0

謝謝喬。有沒有一種方法可以在'%macro regression'中隱式定義'x'參數的數量?我的'xi'並不總是3(有時會達到10 ...)。 –

+0

你可以做幾件事情。你可以將'x'作爲一個字符串傳遞(它畢竟被用作一個字符串 - 所有的參數都被一個空格分開)。你可以通過10並傳遞任何空缺的空格。您可以傳遞參數的總數並遍歷該列表。 – Joe

+0

好的......有一個問題,mydataset和modeldata有什麼區別? –