Vous n'êtes pas identifié.
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
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
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
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
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 &¶m_ols&i.;
%end;
%mend;
%toto;
Hors ligne
Mais là t'as juste supprimé les conditions 'IF', et ça marche.
J'en ai besoin de ces conditions!
Hors ligne
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 :
%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
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
Bien vu SR !
Dernière modification par Carlos (18-10-2014 10:17:03)
Hors ligne
Ah enfin une réponse intélligente SR!!
Hors ligne
Tout s'explique!
Merci beaucoup à tous ceux qui ont essayé de m'aider, et à SR pour cette réponse constructive!
Hors ligne