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

SAS Base Discussion :

automatisation d'attribution de points selon variable et sa modalité, à partir d'une autre table


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    dataminer
    Inscrit en
    Juin 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dataminer

    Informations forums :
    Inscription : Juin 2015
    Messages : 39
    Points : 33
    Points
    33
    Par défaut automatisation d'attribution de points selon variable et sa modalité, à partir d'une autre table
    Bonjour à tous,

    je suis actuellement sur un score et plus particulièrement la construction d'une grille de score. Je ne parviens pas à automatiser l'attribution de points selon la modalité des variables.

    Exemple :
    J'ai 1 fichier contenant pour toutes les variables et leurs modalités le nombre de point attribué.

    Nom_variable modalité Score
    Var1 A x1
    Var1 B x2
    Var1 C x3
    Var2 D y1
    Var2 E y2
    Var2 F y3
    Var2 G y4
    … … …
    Var N Z z1


    J'ai mon autre fichier qui contient ma table avec les variables explicatives et dans laquelle je voudrais comptabiliser les points pour chaque individu. Il me faudrait donc obtenir une table du style (les colonnes en rouge sont celles que j'aimerais ajouter) :
    Var1 Var2 … Var N Score_Var1 Score_Var2 … Score Var N
    A D … Z x1 y1 … z1
    B E … Z x2 y2 … z1
    C D … Z x3 y1 … z1
    A G … Z x1 y4 … z1
    … … … … … … … …


    Avec laquelle je pourrais comptabiliser le nombre total de points par individu.

    Mais comment relier ces 2 tables ? je ne peux pas les joindre par un simple left join... Je ne vois pas comment partir. Si quelqu'un avait une piste sur laquelle je pourrais me lancer je vous remercie !

    Merci de votre aide.

  2. #2
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Bonjour
    J'ai pas eu le temps pour réfléchir à fond donc ma solution peut ne pas être très efficace. On peut l'améliorer pour que ça soit plus rapide. Cependant ça marche très bien et c'est tout vraiment automatique dans le sens où tu ne dis même pas combien de variables tu as, tu le liste pas le nom des variables. Sas cherche les variables et il donne directement les scores. Je me suis basé sur ton exemple pour créer premièrement une table de grille de score

    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
    /*Je crée d'abord un grille des score*/
    data Grille;
    input Nom_variable$ Modalite Score;
    cards;
    Richesse 1 0
    Richesse 2 0.3
    Richesse 3 0.6
    Richesse 4 1
    Sexe 1 0
    Sexe 2 1
    Etude 1 0
    Etude 2 0.4
    Etude 3 0.483
    Etude 4 0.55
    Etude 5 1
    ; run;
    J'ai donc 3 variables. Le niveau de richesse qui a 4 modalité, le sexe et le niveau d'étude qui a 5 modalités. On peut avoir d'autres variables jusqu'à 1000 si tu veux.
    J'ai besoin également d'une base de données pour tester mon code. J'invente donc un truc de 1000 individu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data base(drop=i);
    do i=1 to 1000;
    Id=i; /*Identifiant de l'individu*/
    Richesse=1 + RAND('BINOMIAL',0.5,3); /*pour que les valeurs soient 1 2 3 ou 4 de façon aléatoire*/
    Sexe=1 + RAND('BINOMIAL',0.3,1); /*le sexe qui est 1 ou 2 avec une proportion de 30% de 2*/
    Etude=1 + RAND('BINOMIAL',Richesse/6,4); /*C'est juste une manière pour moi de générer la variable Niveau d’étude pour que ça soit liée avec la variable richesse. Plus le niveau d'étude augmente plus l'indice de richesse augmente également. Tout ceci n'a pas d'importance, je m'amuse juste de façon à ce que je sois dans une situation un peu réaliste*/
    output;
    end;
    run;
    Attention toutes les variables listées dans Nom_variable de la table Grille doivent être dans la table Base avec les mêmes écritures sinon le code n'a aucune chance de fonctionner

    Je construis donc une macro qui donne les scores
    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
    %macro score(Data=,Score=,Out=);
    proc freq data=&Score noprint order=data;
    table Nom_variable/out=_Variable;
    data _null_;
    set _variable;
    call symputx("Nvar",_n_);
    call symputx(compress("Var"||_n_),Nom_variable);
    run;
    data &Out;
    set &Data;
    run;
    %do i=1 %to &Nvar;
    proc sql UNDO_POLICY=NONE;
    create table resultat as select A.*,B.Score as Score_&&Var&i from resultat as A inner join &Score as B on A.&&Var&i = B.Modalite where B.Nom_variable="&&Var&i";
    %end;
    drop table _variable; quit;
    %mend;
    J'applique simplement la macro qui doit marcher sur n'importe quelle base sur mes jeux de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %score(Data=Base,Score=Grille,Out=Resultat);
    On a donc les résultats dans la table spécifiée dans Out.
    Je suis entrain de penser à une méthode sans macro mais vraiment automatique comme celle présentée ici. Je n'arrive pas à l'automatiser. L'avantage de ce que j'ai posté ici c'est que même pour 10.000 variables, tu ne donnes pas la liste des variables. Il connais ces variables grâce à la table grille.

    Salut
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    dataminer
    Inscrit en
    Juin 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dataminer

    Informations forums :
    Inscription : Juin 2015
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Bonjour et merci d'avoir répondu !!

    Votre programme marche très bien ! je ne vois pas comment vous pourriez l'automatiser plus que cela !

    Par contre j'avoue que je ne comprend pas très bien la partie du programme avec les doubles &&... ça force SAS à relire le programme une 2e fois?

    Merci beaucoup en tout cas !

    Cordialement,

    Fulgurr

  4. #4
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Bonjour
    Ce sont les multiples ampersand. Voici un exemple pour comprendre ce qu'ils font
    je suppose que je veux créer 4 variables macros en leur affectant successivement 10 20 30 40. Je peux faire par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    %let X1=10; %let X2=20; %let X3=30; %let X4=40;
    Je décide ensuite de les afficher dans le journal
    Je pourrais décider de les créer dans une boucle pour aller plus rapidement et je pourrais même créer plus de 4, je crée 10 par exemple en leur assignant les nombres 10, 20, 30, ..., 100.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    %macro create;%do i = 1 %to 10;
    	%global X&i;
    	%let X&i=%sysevalf(&i*10);
    %end;
    %mend;
     
     
    %create;
    Je vrais créer une boucle pour les afficher ici. Déjà pour afficher X1, on avait mis &X1. C'est ça qui renvoie la valeur dans une variable macro. Lorsque j'aurai ma boucle avec les i qui parcourent 1 jusqu'à 10, je vais devoir afficher Xi. Mais si je mets &Xi, Sas va me dire qu'il ne connait pas ma variable macro Xi car c'est ce qu'on aurait mis si on avait une variable macro qui s'appelle Xi. Ici ce n'est pas le cas, on a X1 ... X10. Si je mets &X&i, Sas ne va pas comprendre la partie &X car il n'y a pas de variable qui s'appelle X. la bonne formulation est &&X&i.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %macro Print;%do i=1 %to 10;
    	%put &&X&i;
    %end;
    %mend;
     
     
    %Print;
    Comment est ce que SAS lit &&X&i. Il lit chaque symbole &. S'il voit && il dit une fois pour supprimer un & et il revient. Je m'explique. La première fois, il voit &&X&i et il supprime un & au niveau de X. Mais au niveau de i comme il y a un seul &, il sera obligé de considérer la valeur de i. Ainsi la variable macro devient &X1 par exemple lorsque i=1. Donc il fait une relecture une deuxième fois et il affiche la valeur de X1.
    Il y a des cas ou on utilise même triple ampersands ou même plus.
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  5. #5
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Pour comprendre plus tu peux aller ici
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    dataminer
    Inscrit en
    Juin 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : dataminer

    Informations forums :
    Inscription : Juin 2015
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Ok d'accord, en principe c'est plutôt simple ! Après en pratique, pour utiliser ça, faut bien réfléchir au préalable...

    Merci à toi

  7. #7
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par fulgurr Voir le message
    Ok d'accord, en principe c'est plutôt simple ! Après en pratique, pour utiliser ça, faut bien réfléchir au préalable...

    Merci à toi
    Oui surtout l'utilisation fait réfléchir vraiment.
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/08/2016, 23h19
  2. Réponses: 6
    Dernier message: 16/01/2014, 11h21
  3. Réponses: 5
    Dernier message: 29/05/2007, 10h52
  4. [MySQL] récupérer valeur d'une variable dans une autre table
    Par Tee shot dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/03/2007, 22h07
  5. Réponses: 2
    Dernier message: 29/06/2006, 13h58

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