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 :

Tirage aléatoire avec pondération


Sujet :

Macro

  1. #1
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Tirage aléatoire avec pondération
    Bonjour à tous

    Voilà mon problème : j'ai récupéré sur le net une macro qui me permet de faire un tirage aléatoire parmi les observations d'une table. En l'occurence, il s'agit de choisir au hasard une personne dans une liste de 16 participants :


    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    /* Liste des participants au tirage au sort */
     
    DATA DM ;
    	INPUT NUMERO 1-2 NOM $ 4-18 PRENOM $ 20-28 ;
    	CARDS ;
    01 AUBAGNAC        Benoît
    02 AUCHOIX         Paul
    03 BEBEK           Virgnie
    04 BLANC           François
    05 DA CONCEICAO    Romain
    06 ELBAZ           Samantha
    07 ELEORE          Anaďs
    08 JACQUES-ORANGER Anne
    09 JANNEAU         Carine
    10 JOSIEN          Florence
    11 PETRE           Philippe
    12 ROUDAUT         Géraldine
    13 SAHEL           Sophie
    14 SISSOKO         Sambou
    15 TOUIAR          Sonia
    16 VO PHUOC LAM    Mélodie
    	;
    RUN ;
     
     
    	/* Macro-programme du tirage aléatoire */
     
    %macro Tirage(libref=,entree=,sortie=,nb=);
     
    data &libref..&sortie (drop=i j count);
      count=0;
      array obsnum(&nb) _temporary_;
      do i=1 to &nb;
          redo:
          select=ceil(ranuni(0)*n);
          set &libref..&entree point=select nobs=n;
             do j=1 to count;
               if obsnum(j)=select then goto redo;
             end;
          position=select;
          count=count+1;
          obsnum(count)=select;
          output;
       end;
       stop;
       set &libref..&entree;
    run;
     
    %mend Tirage ;
     
     
    	/* Lancement du tirage au sort d'un des seize participants */
     
    %Tirage(libref=work, entree=DM, sortie=GAGNANT, nb=1) ;

    Seulement, j'ai besoin de rajouter une notion de pondération, c'est-à-dire donner à certaines observations plus de chances d'être tirées au sort que d'autres. Pour cela je comptais rajouter une variable PONDERATION dans la table DM, mais dans la macro je ne parviens pas à rajouter ce qui permettrait de prendre en compte cette notion de poids. Quelqu'un aurait une idée svp ?

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Vous n'avez rien à rajouter à la macro. C'et au sein de l'étape data q'il faudrait faire la préparation nécessaire avant de faire le tirage.

    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
    /* Donner à certaines observations la pondération souhaitée */
    data DM1  ;
    set DM  ;	  
    pondera=1 ;
    if NUMERO=3  then pondera=2 ;
    if NUMERO=11 then pondera=3 ;
    if NUMERO=15 then pondera=4 ;	  
    run ;  
     
    /* Faire apparaitre l'observation dans la table autant de fois que l'on souhaite */
    data DM2 ;
    set DM1 ;
    do i=1 to pondera ;
    output ;
    end ;
    run ;
    Faire le tirage avec la table DM2. C'est une proposition !

    Cdt Ward

  3. #3
    Candidat au Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Septembre 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Septembre 2017
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par hossward Voir le message
    Bonjour,
    Vous n'avez rien à rajouter à la macro. C'et au sein de l'étape data q'il faudrait faire la préparation nécessaire avant de faire le tirage.

    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
    /* Donner à certaines observations la pondération souhaitée */
    data DM1  ;
    set DM  ;	  
    pondera=1 ;
    if NUMERO=3  then pondera=2 ;
    if NUMERO=11 then pondera=3 ;
    if NUMERO=15 then pondera=4 ;	  
    run ;  
     
    /* Faire apparaitre l'observation dans la table autant de fois que l'on souhaite */
    data DM2 ;
    set DM1 ;
    do i=1 to pondera ;
    output ;
    end ;
    run ;
    Faire le tirage avec la table DM2. C'est une proposition !

    Cdt Ward
    Merci ! J'y avais pensé mais j'avais plus envie de développer la macro plutôt que rajouter des observations, mais l'idée est très bonne et ton code est sympa, merci beaucoup

  4. #4
    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
    Sinon il y a tout simplement la proc SURVEYSELECT dans SAS/STAT, qui accepte les pondérations avec METHOD=PPS (je crois) et une instruction SIZE pour indiquer la variable de pondération.
    Bon courage.
    Olivier

Discussions similaires

  1. [XL-2010] Macro + tirage aléatoire avec condition
    Par emarnolydia dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/01/2015, 08h19
  2. [2005] tirage aléatoire avec NEWID()
    Par Kropernic dans le forum Développement
    Réponses: 5
    Dernier message: 04/06/2012, 09h47
  3. [XL-2003] Problème de tirage aléatoire avec mon programme
    Par MARGAR dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 15/11/2011, 15h19
  4. Tirage aléatoire avec remise
    Par ndiayette dans le forum SAS STAT
    Réponses: 3
    Dernier message: 16/05/2008, 22h14

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