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 :

Boucle tirage aléatoire sans remise


Sujet :

Macro

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut Boucle tirage aléatoire sans remise
    Bonjour ,

    j'ai un petit soucis au niveau d'un macro programme que j'ai et j'ai besoin de votre aide ...

    Dans une base de données j'ai créé une variable réunissant deux variables de type numérique, donc mes conso A et conso B sont réunies en "conso".
    Grâce à cette macro (voir ci dessous) je tire aléatoirement sans remise nb individus de ma variable conso :

    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
    %macro tasr(libref=,entree=,sortie=,nb=,nbsim=);
    %do i=1 %to &nbsim;
    data t&libref. (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;
    %tasr(libref=work,entree=reech,sortie=donnees2,nb=36,nbsim=10);
    Je précise que j'ai trouvé cette macro sur le net. Bon alors il me sélectionne bien 36 données SR. Simplement maintenant j'aimerai qu'ils me les stockent dans une nouvelle variable et que les 36 autres valeurs non sélectionnées soient stockées dans une autre variable.. J'espere être clair

    Pouvez vous m'aider s'il vous plait ? Je tiens également a préciser que je suis débutante en SAS

    En vous remerciant ,

  2. #2
    Membre actif
    Homme Profil pro
    Analyste - Information médicale
    Inscrit en
    Mars 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste - Information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2012
    Messages : 72
    Points : 255
    Points
    255
    Par défaut Précisons
    Bonjour,
    ta macro n'est pas complète visiblement.

    En partant depuis le début, tu voudrais à partir d'une variable de n observations, faire x tirages aléatoire sans remise pour obtenir :
    1 - une table avec tes x observations
    2 - une table avec tes n-x observations

    C'est bien ça ?

  3. #3
    Membre actif
    Homme Profil pro
    Analyste - Information médicale
    Inscrit en
    Mars 2012
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste - Information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2012
    Messages : 72
    Points : 255
    Points
    255
    Par défaut
    Si c'est ça je te propose la macro suivante, c'est franchement pas top mais c'est un début :

    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
    %macro tasr(lib,table,nbtasr);
     
    * Nb observations de ta table;
    data _null_; set &lib..&table.; call symput('nb',compress(_n_)); run;
     
    * Teste que le nombre d observations est strictement supérieur au nombre de tirages;
    %if &nbtasr.>=&nb. %then %put La table contient &nb. observations, vous devez faire un nombre de tirages strictement inférieur.;
    %else %do;
     
    * Crée les tables "reste" et "tasr" dans la work;
    data reste; set &lib..&table.; run; data tasr; set _null_; run;
     
    * tire une observation aléatoire par étape jusqu a nbtasr;
    %do i=&nb.-1 %to &nb.-&nbtasr. %by -1;
    data _null_; call symput('v',int(ranuni(0)*&i.)+1); run;
    data reste tasr_prov; set reste;if _n_=&v. then output tasr_prov; else output reste; run;
    data tasr; set tasr tasr_prov; run;
    %end;
     
    %end;
    %mend;
    %tasr(sashelp,class,18);

  4. #4
    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 : 51
    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
    Points : 6 064
    Points
    6 064
    Par défaut
    Ca ne serait pas plus simple d'utiliser la proc SURVEYSELECT ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Merci pour vos réponses !!!
    la PROC SURVEYSELECT j'y ai pensé mais est ce réellement un tirage aléatoire sans remise ? je n'en étais pas certaine ...

  6. #6
    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 : 51
    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
    Points : 6 064
    Points
    6 064
    Par défaut
    c'est LA proc pour faire des tirages avec (with replacement) ou sans remise (without replacement)

    http://support.sas.com/documentation...ct_sect007.htm

    C'est une procédure a privilégier car elle gère correctement le tirage aléatoire. Lorsque l'on fait un tirage avec une étape DATA, je me souviens de cas contestables.
    Je pourrais retrouver de très très vieilles discussions sur ce sujet mais je ne jouerai pas au vieux con ce soir.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  7. #7
    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
    J'ajoute que dans SURVEYSELECT METHOD=URS (tirage avec remise) on doit utiliser de préférence l'option OUTHITS pour avoir 2 observations si le même individu est tiré 2 fois ; et que l'option OUTALL permet d'avoir une variable indiquant la sélection ou non d'un individu, ce qui permet ensuite de scinder facilement le résultat en une table de sélectionnés et une table de non-sélectionnés.
    Bon courage.
    Olivier

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Ok merci pour vos réponses, je vais me rabattre sur la PROC SURVEYSELECT mais le problème reste le même : un tirage aléatoire sans remise va être fait mais comment stocker les valeurs restantes dans une autre variables ?

  9. #9
    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
    Citation Envoyé par Jennn Voir le message
    un tirage aléatoire sans remise va être fait mais comment stocker les valeurs restantes dans une autre variables ?
    Citation Envoyé par olivier.decourt Voir le message
    l'option OUTALL permet d'avoir une variable indiquant la sélection ou non d'un individu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROC SURVEYSELECT DATA=sashelp.class OUT=work.echantillon 
                    METHOD=URS SEED=1 SAMPSIZE=15
                    OUTALL OUTHITS NOPRINT ;
    RUN ;
    Tu constateras que la table en sortie contient les individus sélectionnés ET ceux qui ne le sont pas. La variable SELECTED permet de faire le tri entre les deux.
    Bon courage.
    Olivier

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Je reviens sur cette procédure que j'ai un peu laissé tomber quelques temps...
    La méthode URS est bien sauf que c'est avec remise, moi il me faut du sans remise absolument. sinon tout fonctionne très bien je vous remercie !

  11. #11
    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 : 51
    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
    Points : 6 064
    Points
    6 064
    Par défaut
    tu es allé voir le lien que j'ai mis vers la doc ?

    Si URS est un tirage with replacement, tu n'as pas trouvé la méthode without replacement ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  12. #12
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Oui oui j'ai été voir bien sur mais il n'y a pas réellement d'équivalent ?

  13. #13
    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 : 51
    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
    Points : 6 064
    Points
    6 064
    Par défaut
    d'équivalent à quoi ?
    il y a le tirage avec ou sans remise simple.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  14. #14
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Oui la méthode SRS , seulement si j'utilise cette méthode je ne peux plus mettre les options telles que OUTHITS pour récupérer mes valeurs non sélectionnées...

  15. #15
    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 : 51
    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
    Points : 6 064
    Points
    6 064
    Par défaut
    SRS te permet de savoir qui est sélectionné une fois grâce à OUTALL et non pas OUTHITS.
    OUTHITS te dit combien de fois la ligne est prise puisque le URS est avec remise.
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  16. #16
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    Oui sauf que mes variables non utilisées je les sélectionne de cette façon pour les placer dans une nouvelle variable :

    if NumberHits = 0 then consoa = consos;
    else if NumberHits NE 0 then consob = consos;

    et ça c'est bien avec l'option OUTHITS que j'obtiens cette variable NumberHits...

  17. #17
    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 : 51
    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
    Points : 6 064
    Points
    6 064
    Par défaut
    certes mais ton numberhits est le nombre de fois où l'observation est sélectionnée. Je ne vois donc pas le rapport avec un tirage aléatoire et ton IF. Qu'as tu en ligne ? des individus ou des variables ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  18. #18
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    En ligne j'ai des individus. Ceux qui ont été tirés au sort je les place dans consob, et ceux qui n'ont jamais été tirés au sort forment consoa.

    et ça je le fais à chaque tirage aléatoire...

Discussions similaires

  1. Tirage aléatoire sans remise
    Par Ghadgoud dans le forum Débuter
    Réponses: 4
    Dernier message: 02/06/2015, 12h47
  2. [Sources/Macros] Tirage aléatoire sans remise : macro tasr
    Par fafabzh6 dans le forum Contribuez
    Réponses: 2
    Dernier message: 10/04/2014, 20h43
  3. Tirage aléatoire sans doublon
    Par Cupidon dans le forum SAS STAT
    Réponses: 2
    Dernier message: 13/02/2013, 11h21
  4. Perl script aléatoire d'un hash: tirage sans remise
    Par Sethenssen dans le forum Langage
    Réponses: 11
    Dernier message: 04/08/2011, 10h18
  5. 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