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 :

Macro variables dans boucles


Sujet :

Macro

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Par défaut Macro variables dans boucles
    Bonjour,

    Je relance mon problème. Je souhaiterai qu'une partie de mon programme SAS s'écrive "automatiquement" selon les paramètres de la macro.
    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    eta1=beta11*item1+beta21*item2+beta31*item3+beta41*item4+beta51*item5;
    eta2=beta12*item1+beta22*item2+beta32*item3+beta42*item4+beta52*item5;
    eta3=beta13*item1+beta23*item2+beta33*item3+beta43*item4+beta53*item5;
    eta4=beta14*item1+beta24*item2+beta34*item3+beta44*item4+beta54*item5;
    Ici, le nombre d'items est de 5 et le nombre de modalités (5-1). Il faut que ces lignes s'écrivent automatiquement, leur nombre peut varier selon le nombre de modalités et leur longueur peut être différente selon le nombre d'items.

    J'ai donc commencé à écrire la macro suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    %macro modele1a(var_temps=, temps=, nbitem=, nbmodalite=);
     
    %do j=1 %to %eval(&nbmodalite.-1);
    	%do i=1 %to &nbitem ;
    	%let eta&j&i= beta&i&j*item&i ;
    	%end;
    %end;
     
    %do j=1 %to %eval(&nbmodalite.-1);
    	%do i=1 %to &nbitem ;
    	&&eta&j = %sysfunc(catx('+',&transition,&&&eta&j&i));
    	%let transition=&&eta&j;
    	%end;
    %end;
    %mend;
     
    %modele1a (var_temps=temp,temps=0-6,nbitem=5,nbmodalite=5);
    Mais cela ne fonctionne pas.
    Faut- il que je continue sur cette idée ou y'a t-il de meilleurs moyens de réaliser ce que je souhaite faire ?
    Peut être travailler avec des chaînes de caractères ?

    Merci de m'aider!

  2. #2
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Par défaut
    oui c'est une idée intéressante et qui est souvent utilisée.

    qu'est ce qui ne fonctionne pas ?

  3. #3
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    bonsoir,

    c'est peut-être &&eta&j qui pose problème ?

    Pour ma part j'écrirais ça légèrement différement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    %macro _m;
    data test;
    %do i=1 %to 9;
    item&i=&i;
    %do j=1 %to 7;
    beta&i&j=&i*&j;
    %end;
    %end;
    run;
    %mend ;
    %_m;
     
    %macro _n(nbitem=9,nbmodalite=8);
    data test;set test;
    %do j=1 %to %eval(&nbmodalite-1);
    %do i=1 %to %eval(&nbitem);
    %if &i=1 %then %do;eta&j=beta&i&j*item&i%end;
    %else %do;+beta&i&j*item&i%end;
    %end;
    ;
    %end;
    run;
    %mend;
     
    %_n;
    par contre si tes items ou tes modalités dépassent 9... il te faudra je pense jongler avec formats z. pour qu'il n'y ai aucune ambiguité.

    bon courage.

  4. #4
    Membre averti
    Femme Profil pro
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Par défaut
    Citation Envoyé par jerome_pdv2 Voir le message
    bonsoir,

    c'est peut-être &&eta&j qui pose problème ?

    Pour ma part j'écrirais ça légèrement différement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    %macro _m;
    data test;
    %do i=1 %to 9;
    item&i=&i;
    %do j=1 %to 7;
    beta&i&j=&i*&j;
    %end;
    %end;
    run;
    %mend ;
    %_m;
     
    %macro _n(nbitem=9,nbmodalite=8);
    data test;set test;
    %do j=1 %to %eval(&nbmodalite-1);
    %do i=1 %to %eval(&nbitem);
    %if &i=1 %then %do;eta&j=beta&i&j*item&i%end;
    %else %do;+beta&i&j*item&i%end;
    %end;
    ;
    %end;
    run;
    %mend;
     
    %_n;
    par contre si tes items ou tes modalités dépassent 9... il te faudra je pense jongler avec formats z. pour qu'il n'y ai aucune ambiguité.

    bon courage.
    Merci,
    mais je ne veux pas que SAS effectue de calcul.
    Je souhaite que les ligne "eta1= beta11*item1 ...." restent littérales. ( C'est pour les utiliser ensuite dans une proc NLmixed et qu'il estime certains paramètres).

    Peut être faut-il que j'utilise des chaînes de caractère pour que cela fonctionne ?

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Mars 2013
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2013
    Messages : 23
    Par défaut
    Citation Envoyé par datametric Voir le message
    oui c'est une idée intéressante et qui est souvent utilisée.

    qu'est ce qui ne fonctionne pas ?
    je pense que c'est le &&eta&j car il ne s'évalue pas comme j'utilise des éléments (&transition notamment) qui ont une valeur seulement quand je suis passée une fois dans la boucle.

  6. #6
    Membre Expert
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Par défaut
    Bonjour,

    le code en question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %do j=1 %TO %eval(&nbmodalite-1);
    %do i=1 %TO %eval(&nbitem);
    %IF &i=1 %then %do;eta&j=beta&i&j*item&i%end;
    %else %do;+beta&i&j*item&i%end;
    %end;
    ;
    %end;
    ne calcule rien, il génère seulement du texte...

    Pour l'effet qu'il produit tout dépend de son environnement d'execution (DATA ou PROC) comme je te l'ai dit en privé.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 29/05/2008, 17h26
  2. Réponses: 0
    Dernier message: 28/05/2008, 16h15
  3. Problème avec variable dans boucle DO WHILE
    Par bandit_debutant dans le forum Langage
    Réponses: 13
    Dernier message: 25/02/2008, 17h34
  4. affecter variable dans boucle FOR batch
    Par efferalgan dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 25/10/2007, 15h25
  5. [SHELL] Variable dans boucle for
    Par magicwill dans le forum Linux
    Réponses: 6
    Dernier message: 11/08/2007, 12h31

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