Annonce

Bienvenue sur le site support de mes ouvrages d'introduction à SAS

La 4ème édition de mon ouvrage est disponible depuis le 11 avril 2019 !

Où trouver cet ouvrage ?


#1 14-11-2018 08:17:13

SAS-SR
Administrateur
Lieu: Université d'Orléans
Date d'inscription: 01-09-2008
Site web

[archive] au hasard (Balthazar)

Sujet un peu plus hardcore cette semaine....

un étudiant m'a contacté pour m'indiquer qu'il avait un problème avec son programme.

Comprenons bien son objectif avant de regarder son programme : il souhaite construire une nouvelle table à partir d'une autre. Jusque là, tout va bien.

mais... (il y a forcément un mais...), il souhaite que chaque observation soit construite en prenant au hasard pour chacune des variables, une des valeurs rencontrée dans la table.
il souhaite donc, pour une observation donnée que la valeur de la première variable soit tirée au hasard, que la valeur de la seconde variable soit elle aussi tirée au hasard, etc. etc. tout en respectant la distribution empirique de ses variables.

Si on applique son idée sur la table SASHELP.CLASS, je peux avoir une observation avec pour valeur de NAME Alfred, puis le sexe de Jane, puis l'age de Joyce, le poids de Robert et la taille de Ronald.

Il a rédigé ce programme (qui fonctionne parfaitement) :

Code:

data boot_class;
   do i=1 to 20;
      selectx1 = ceil(ranuni(-123456)*n);
      set sashelp.class(keep=name) point=selectX1 nobs=n;
      selectx1 = ceil(ranuni(-123456)*n);
      set sashelp.class(keep=sex) point=selectX1 nobs=n;
      selectx1 = ceil(ranuni(-123456)*n);
      set sashelp.class(keep=age) point=selectX1 nobs=n;
      output;
   end;
   stop;
run;

ce programme permet de créer une table de 20 observations.

Avant chaque instruction SET, on tire un chiffre au hasard compris entre 1 et N, le nombre d'observations de la table.

et là, vous allez me dire : "mais d'où vient ce nombre d'observations ?"
et je vous réponds : "de l'option NOBS= de l'instruction SET"
vous me répondrez "mais l'instruction SET apparaît APRES le premier usage de N"
et là, je vous dirai "pas d’inquiétude : au moyen de l'option NOBS= vous créez un marqueur qui aura pour valeur le nombre d'observations de la table et qui sera créée au cours de la phase de compilation du programme. Lorsque le programme est compilé, SAS va accéder aux métadonnées de la table citée après l'instruction SET et donnera sa valeur à N.

Au moment de l'exécution, et donc au moment du calcul de la modalité de SELECTX1, N sera connu et pourra donc être utilisé.

petite remarque : l'option NOBS= est précisée dans chaque instruction SET. C'est inutile, il suffit que cette option apparaisse une seule fois, dans n'importe quelle instruction SET et le programme fonctionnera quand même.

reprenons : je dispose d'un nombre au hasard compris entre 1 et N, disons 12. Au moyen de l'option POINT= de l'instruction SET, j'accède directement à la 12ème observation et je conserve la valeur de NAME pour cette 12ème observations.

je tire ensuite une deuxième fois un nombre au hasard entre 1 et N, disons 4, et au moyen de POINT=, j'accède directement à la 4ème observation pour ne conserver que la valeur de SEX.

On recommence ensuite...

bref... on arrive à construire cette table :

Code:

Obs.     i    Name       Sex    Age

  1      1    Joyce       F      11
  2      2    Jeffrey     M      13
  3      3    Philip      F      15
  4      4    Ronald      F      12
  5      5    Louise      F      12
  6      6    Robert      F      12
  7      7    Joyce       F      12
  8      8    Alice       F      15
  9      9    Ronald      F      15
 10     10    John        M      15
 11     11    Thomas      F      15
 12     12    Carol       M      15
 13     13    Robert      F      15
 14     14    Barbara     M      15
 15     15    Louise      F      14
 16     16    William     M      15
 17     17    Alfred      F      14
 18     18    Thomas      M      14
 19     19    John        M      12
 20     20    Mary        F      14

Si ça marche, quelle est le problème ?

le problème, c'est que mon étudiant ne travaille pas avec une table contenant quelques variables. Sa table contient plus de 30 variables et il n'a pas vraiment envie d'écrire un programme avec plus de trente instructions de tirage d'un nombre au hasard et plus de 30 instructions SET en modifiant à chaque fois la variable à conserver.

il souhaite quelque chose d'un peu plus "automatique"....

Alors il m'a proposé ça :

Code:

Data boot_class;
   length  x_var $ 50;
   Do i=1 to 20;
      Do x_var='name','sex','age','height','weight' ;
        select_obs = ceil(ranuni(-123456)*n);
        set sashelp.class(keep=x_var) point=select_obs nobs=n;
      end;
      output;
   end;
   stop;
run;

et là, ça ne fonctionne pas du tout...

vous avez en effet dans votre journal le message suivant :

Code:

ERROR: La variable x_var de la liste DROP, KEEP ou RENAME n'a jamais été référencée.

ben oui....

sashelp.class(keep=x_var)

mon étudiant demande à conserver de la table SASHELP.CLASS la variable x_var qui n'existe pas dans cette table...
il aurait bien voulu que SAS, automatiquement, remplace X_VAR par sa valeur mais ça, ça n'est pas possible....

alors ? comment faire pour mon étudiant ne soit pas obligé d'écrire plus de 30 blocs de SELECTX1= / SET ?

amusez vous bien et à la semaine prochaine

Ce sujet est maintenant archivé - seuls les utilisateurs inscrits de www.sas-sr.com peuvent consulter l'intégralité du sujet et les réponses aux questions posées.
pour vous identifier, suivez ce lien
pour vous inscrire, suivez ce lien

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB
Traduction par FluxBB.fr
Flux RSS