2013-10-16 3 views
0

J'ai essayé d'exécuter PROC GLM dans une boucle, car j'ai de nombreux modèles (différentes combinaisons de variables dépendantes et indépendantes), et il faut beaucoup de temps pour les exécuter un par un. Mais erreur de notation indique only one MODEL statement allowed dans PROC GLM, donc des solutions pour cela?SAS PROC GLM dans une boucle

mon code ressemble comme ci-dessous

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

Répondre

1

Vous devriez le faire en deux étapes. L'une est une macro qui contient une instance de PROC GLM:

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

Et puis appeler cette macro d'autre chose, que ce soit une macro avec les éléments en boucle, ou mieux, d'un ensemble de données qui contient votre y/x1/x2/x3 en tant que colonnes (une ligne par instruction modèle) en utilisant les méthodes call execute ou proc sql select into. Par exemple, avec un ensemble de données modeldata contenant les valeurs y/x pour votre modèle:

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

ou similaire.

+0

Merci Joe. Existe-t-il un moyen de définir implicitement le nombre d'arguments 'x' dans'% macro regression'? Mon numéro de 'xi' n'est pas toujours 3 (parfois il va jusqu'à 10 ...). –

+0

Vous pourriez faire plusieurs choses. Vous pouvez simplement passer 'x' sous la forme d'une chaîne (il est après tout utilisé comme une chaîne - tous les arguments séparés par un espace). Vous pouvez passer 10 et passer des espaces pour ceux qui manquent. Vous pouvez transmettre le nombre total d'arguments et parcourir cette liste. – Joe

+0

okay ... une question, quelle est la différence de mydataset et modeldata? –