Le forum du Master ESA économétrie et statistique appliquée - Université d'Orléans

Vous n'êtes pas identifié.

Annonce

Vous êtes sur le forum du master ESA !

Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!

Venez visiter notre nouveau site : www.master-esa.fr

#1 17-10-2014 20:26:09

Chanoirland
Member
Date d'inscription: 03-09-2013
Messages: 49

Boucles et macro

Bonjour, est-ce que quelqu'un peut m'aider à comprendre pourquoi lorsque je lance cette boucle mes macros-variables ne sont pas crées, alors que si je lance le programme sans la boucle ça marche très bien  ?

Voici mon code qui ne marche pas:

%MACRO macro();
   
    %DO i=1 %TO 4 ;

        data _null_ ;
            set est_ols_&i. ;
           if Variable='Intercept' then call symputx("cste_ols"||"&i.",Estimate);
           if Variable='X' then call symputx("beta_ols"||"&i.", Estimate) ;
        run;
   
    %END;

%MEND ;

Alors que là SAS génère bien la bonne valeur (quand je fait %PUT &cste_OLS1 );

%MACRO macro(); /*je ne sais pas pourquoi avec la boucle do i=1 a 4 les macrovariables ne sont pas creees */
   
        data _null_ ;
            set est_ols_1 ;
           if Variable='Intercept' then call symputx("cste_ols"||"1",Estimate);
           if Variable='X' then call symputx("beta_ols"||"1", Estimate) ;
        run;
   
    %END;
%MEND ;

Merci d'avance!

Hors ligne

 

#2 17-10-2014 22:21:48

gozgoz
Member
Date d'inscription: 03-09-2013
Messages: 34

Re: Boucles et macro

Essaie avec ça, parce que dans ton code, tu lui demandes de concaténer la chaîne de caractères "cste_ols" avec la chaîne de caractère "&i.", si tu fais un %put &cste_ols_&i. je suis pratiquement sûr qu'il va t'afficher tes paramètres cste_4 et beta_4 .... quoique le "." à la fin de "&i.", il ne doit pas plaire à sas.

%MACRO macro();
   
    %DO i=1 %TO 4 ;

        data _null_ ;
            set est_ols_&i ;
           if Variable='Intercept' then call symputx("cste_ols"||&i,Estimate);
           if Variable='X' then call symputx("beta_ols"||&i, Estimate) ;
        run;
   
    %END;

%MEND ;

Et par curiosité, c'est la sortie de outest dans proc reg ta table est_ols_1?

Hors ligne

 

#3 17-10-2014 22:44:56

Chanoirland
Member
Date d'inscription: 03-09-2013
Messages: 49

Re: Boucles et macro

non non j'avais essayé ça ne change rien...

174  %PUT &cste_ols1 ;
WARNING: Apparent symbolic reference CSTE_OLS1 not resolved.
&cste_ols1


oui cest ma sortie de " ODS TABLE NAMES ParameterEstimates=est_OLS_&ordre;  " pour chaque proc reg et proc quantreg.



Du coup jai fait des vieux copier-collers :
    data _null_ ;
            set est_ols_2 ;
           if Variable='Intercept' then call symputx("cste_ols"||"2",Estimate);
           if Variable='X' then call symputx("beta_ols"||"2", Estimate) ;
        run;
        data _null_ ;
            set est_ols_3 ;
           if Variable='Intercept' then call symputx("cste_ols"||"3",Estimate);
           if Variable='X' then call symputx("beta_ols"||"3", Estimate) ;
        run;

et là ça marche...Mais bon j'aimerais bien comprendre quand mm..

Dernière modification par Chanoirland (17-10-2014 22:52:12)

Hors ligne

 

#4 18-10-2014 00:38:53

Carlos
Member
Date d'inscription: 02-09-2013
Messages: 19

Re: Boucles et macro

t'écris beaucoup !

data toto1;
input x1 x2;
cards;
1 2
;run;


data toto2;
input x1 x2;
cards;
3 4
;run;

%macro toto;
%do i=1 %to 2;
data _null_; set toto&i.;
call symputx ("cste_ols&i.",x1);
call symputx ("param_ols&i.",x2);
run;
/* les put c'est juste pour que tu vérifies */
%put &&cste_ols&i.;
%put &&param_ols&i.;
%end;
%mend;

%toto;

Hors ligne

 

#5 18-10-2014 07:15:29

Chanoirland
Member
Date d'inscription: 03-09-2013
Messages: 49

Re: Boucles et macro

Mais là t'as juste supprimé les conditions 'IF', et ça marche.
J'en ai besoin de ces conditions!

Hors ligne

 

#6 18-10-2014 09:44:22

esa_sr
Administrator
Date d'inscription: 21-02-2007
Messages: 5898
Site web

Re: Boucles et macro

Chanoirland a écrit:

Mais bon j'aimerais bien comprendre quand mm..

vous me connaissez, je ne peux que vous encourager dans cette voie !

Une fois le macro programme exécuté, si vous ne réussissez pas à accéder à votre macro variable, c'est simplement parce que vous les avez construites dans un macro programme et que par conséquent, elles sont locales !

page 508, section 10.6.3 de votre ouvrage favori : environnement local / environnement global.

petit exemple :

Code:

%macro toto;
  %do i=1 %to 4;
   data _null_;
      call symputx("cste"||"&i",&i*10);
   run;
   %put je suis en environnement local et je connais la valeur de la macro variable cste&i : &&cste&i ;
  %end;
%mend;

%toto ;

%put une fois le macro programme exécuté, je suis en environnement global... créons un joli message dans le journal : &cste1 &cste2 &cste3 &cste4 ;

Vous voulez utilisez vos macro variables une fois le macro programme exécuté ?

vous devez simplement ajouter, juste après votre %do i=1 %to 4 ;

%global cste&i;

et voilà !

Hors ligne

 

#7 18-10-2014 09:50:56

Carlos
Member
Date d'inscription: 02-09-2013
Messages: 19

Re: Boucles et macro

ceci est juste une alternative

%macro toto;

%do i=1 %to 4 ;

data _null_ ; set tmp1.est_ols_&i.(obs=1) ; call symputx("cste_ols&i.",Estimate);run;
data _null_; set tmp1.est_ols_&i.(firstobs=2); call symputx("beta_ols&i.",Estimate);run;
%put &&cste_ols&i.;
%put &&beta_ols&i.;
run;
   
%end;

%mend ;

%toto;

Hors ligne

 

#8 18-10-2014 09:59:44

Carlos
Member
Date d'inscription: 02-09-2013
Messages: 19

Re: Boucles et macro

Bien vu SR !

Dernière modification par Carlos (18-10-2014 10:17:03)

Hors ligne

 

#9 18-10-2014 10:24:26

gozgoz
Member
Date d'inscription: 03-09-2013
Messages: 34

Re: Boucles et macro

Ah enfin une réponse intélligente SR!!

Hors ligne

 

#10 18-10-2014 10:42:38

Chanoirland
Member
Date d'inscription: 03-09-2013
Messages: 49

Re: Boucles et macro

Tout s'explique!

Merci beaucoup à tous ceux qui ont essayé de m'aider, et à SR pour cette réponse constructive!

Hors ligne

 

#11 18-10-2014 10:43:38

esa_sr
Administrator
Date d'inscription: 21-02-2007
Messages: 5898
Site web

Re: Boucles et macro

c'est un vrai métier ;-)

Hors ligne

 

Pied de page des forums

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

[ Generated in 0.030 seconds, 9 queries executed ]