IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

Règles execution des macro-variables


Sujet :

Macro

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2014
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Règles execution des macro-variables
    Bonjour,

    C'est ma première participation, mais cela fait longtemps que je suis de près ce forum très riche.

    Je rebondis sur ce sujet car je pensais être familier avec les MV et les && ou autres ".", mais là force est de constater que j'ai atteint mes limites.

    Mon soucis va plus loin que le post de départ. J'ai une solution de contournement sans passer par une mv, mais je VEUX savoir comment faire avec.

    C'est parti :

    • Contexte, J'aimerais pour chaque individu calculer son score en lui appliquant un modèle de régression logistique existant.

    • La table contenant les coefficients de cette régression logistique a la structure suivante :


    • La table de mes individus est la suivante :


    • Je veux appliquer le modèle en bouclant sur chaque individu, pour cela je veux créer les mv suivantes qui contiendront les valeurs des coefficients : yeux_bleux_0, yeux_bleux_1, sexe_H_0, sexe_H_1.

    • Je commence donc par passer par un call symput :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data _null_;
    	set coeff_log end=eof;
    	call symput(compress("VAR_"!!_N_),compress(VAR));
    	if eof then call symput("N",_N_);
    	call symput(compress(VAR!!"_0"),coeff_0);
    	call symput(compress(VAR!!"_1"),coeff_1);
    run;
     
    %put &yeux_bleus_0.;
    %put &yeux_bleus_1.;
    %put &sexe_H_0.;
    %put &sexe_H_1.;
    Voici la log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NOTE: There were 2 observations read from the data set WORK.COEFF_LOG.
     
    903  %put &yeux_bleus_0.;
    -0.654
    904  %put &yeux_bleus_1.;
    0.654
    905  %put &sexe_H_0.;
    0.123
    906  %put &sexe_H_1.;
    -0.123
    Tout est ok.

    • Par contre, pour la boucle, j'ai beaucoup de mal !
    Voici un de mes nombreux tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %macro toto;
    	%do i=1 %to &N.;
    		%put &&&var_&i.._0;
    		%put &&&var_&i.._1;
    	%end;
    %mend;
    %toto;
    Et voici la log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    MLOGIC(TOTO):  Beginning execution.
    MLOGIC(TOTO):  %DO loop beginning; index variable I; start value is 1; stop value is 2; 
    by value is 1.
    MLOGIC(TOTO):  %PUT &&&var_&i.._0
    yeux_bleus_0
    MLOGIC(TOTO):  %PUT &&&var_&i.._1
    yeux_bleus_1
    MLOGIC(TOTO):  %DO loop index variable I is now 2; loop will iterate again.
    MLOGIC(TOTO):  %PUT &&&var_&i.._0
    sexe_H_0
    MLOGIC(TOTO):  %PUT &&&var_&i.._1
    sexe_H_1
    MLOGIC(TOTO):  %DO loop index variable I is now 3; loop will not iterate again.
    MLOGIC(TOTO):  Ending execution.
    Pourquoi n'ai-je pas la valeur des mv et simplement leur nom ?! HELP

    Merci beaucoup pour vos réponses.

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonsoir.
    Parce qu'il te faudrait encore plus de & !
    Ici, avec les trois & du début, il y en a un qui sert tout de suite, et SAS cherche une macro-variable qui s'appellerait VAR_ tout court (car son nom s'arrête forcément au & suivant).
    Essayons de partir du résultat, tu veux &sexe_h_1 qui devient -0.123.
    Il faut donc, à l'étape d'avant, &var_2._1 avec deux & devant, pour qu'il en reste un au final : donc &&&var_2._1.
    Mais le "2" vient lui-même d'un &i., donc on vient à l'étape d'avant avec &&&&&&var_&i.._1 (on double tous les & de gauche de la version précédente, pour utiliser la règle && --> &).
    Ouf. Enfin je crois.

    Bon courage.
    Olivier

    PS : sinon, il y a la proc SCORE pour appliquer des modèles, voire la proc PLM si tu as une version de SAS récente (genre 9.3).
    Bon courage.
    Olivier

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2014
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Janvier 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Peut on ajouter une étoile à monsieur Decourt ?

    CODE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %macro toto;
    	%do i=1 %to &N.;
    		%put  &&&var_&i.._ = &&&&&&var_&i.._1;
    		%put  &&&var_&i.._0 = &&&&&&var_&i.._0;
    	%end;
    %mend;
    %toto;
    LOG :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    MLOGIC(TOTO):  Beginning execution.
    MLOGIC(TOTO):  %DO loop beginning; index variable I; start value is 1; stop value is 2; by value
          is 1.
    MLOGIC(TOTO):  %PUT &&&var_&i.._1 = &&&&&&var_&i.._1
    yeux_bleus_1 =        0.654
    MLOGIC(TOTO):  %PUT &&&var_&i.._0 = &&&&&&var_&i.._0
    yeux_bleus_0 =       -0.654
    MLOGIC(TOTO):  %DO loop index variable I is now 2; loop will iterate again.
    MLOGIC(TOTO):  %PUT &&&var_&i.._1 = &&&&&&var_&i.._1
    sexe_H_1 =       -0.123
    MLOGIC(TOTO):  %PUT &&&var_&i.._0 = &&&&&&var_&i.._0
    sexe_H_0 =        0.123
    MLOGIC(TOTO):  %DO loop index variable I is now 3; loop will not iterate again.
    MLOGIC(TOTO):  Ending execution.
    C'est beau ! Bravo (: Et Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Sources/Macros] Librairie "params.sas" : export des macro-variables
    Par forum dans le forum Contribuez
    Réponses: 0
    Dernier message: 22/01/2013, 16h43
  2. Réponses: 4
    Dernier message: 08/03/2010, 14h32
  3. Transposer un tableau via des macro variables
    Par juliep dans le forum Macro
    Réponses: 2
    Dernier message: 10/09/2009, 15h32
  4. Portée des macro-variables : un contre exemple?
    Par fafabzh6 dans le forum Macro
    Réponses: 2
    Dernier message: 23/04/2009, 17h23
  5. executer des macros depuis une macro
    Par lolo93 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/05/2008, 10h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo