Archives pour décembre 2008

h1

7 règles pour collecter des données personnelles, CNIL France

décembre 16, 2008

En tant qu’utilisateur de SAS, nous sommes souvent amenés à traiter des données sur les personnes. En France, la Commission Nationale de l’Information et des Libertés (CNIL) est l’organisme à contacter pour faire enregistrer les caractéristiques d’une base de données sur les personnes.

Si ce sujet fait partie de votre actualité, vous pouvez consulter la page sur les obligations. Je vous propose de présenter ces 7 points sous l’angle de la newsletter du blog.

1. La collecte des données

Avoir l’accord des personnes : Les lecteurs qui reçoivent la newsletter mensuelle de www.sasreference.fr donnent leur accord en envoyant un email pour s’inscrire à veronique.bourcier@sasreference.fr. en précisant “Inscription Newsletter” dans l’objet.

2. La finalité des données

Objectif précis et cohérent : la seule information que je collecte est l’adresse email car c’est la seule information dont j’ai besoin pour communiqué l’information. Ces emails ne servent pas à d’autres communiqués de presse et je ne revend pas les données.

3. La durée de péremption

Ces données seront supprimées le jour où la newsletter n’existera plus ou lors de votre déinscription.

4. Sécurité des données

Depuis février 2009, les données sont sauvegardées dans un fichier Excel de mon disque dur. Zookoda.com (service actuellement gelé) dispose des données pour les personnes enregistrées avant cette date.

5. Confidentialité des données

Seul 1and1 (mon hébergeur) et moi avons les données (+ zookoda.com pour les données d’avant le 2 février. Il n’y a pas de nom et prénom associés aux emails.

6. L’information des personnes

Vous êtes informé de :

  • Mon identité : veronique.bourcier@sasreference.fr,
  • La finalité du traitement : newsletter
  • Le caractère obligatoire des données à fournir : donner une adresse email valide (logique pour une newsletter).
  • L’existence de vos droits : dans la newsletter, vous êtes informé comment vous désabonner (m’envoyer un email en précisant “Désabonnement Newsletter” dans l’objet).
  • La transmission envisagée des données : la page Newsletter précise que les données ne sont pas transmises à des tiers.

7. La déclaration au CNIL

Les activités liées au blog ne procurant encore aucun revenu, la dispense concernant les blogs du CNIL s’applique.

Pour connaître votre cas, vous avez accès à la page “Faut-il déclarer ?“.

Si vous devez faire une déclaration, reportez vous à la page “Déclarer un fichier“.

A vous la parole

N’hésitez pas à intervenir pour nous faire partager votre expérience  sur le sujet ou sur votre connaissance sur les règles dans les autres pays francophones.

h1

5 points à retenir sur l’opérateur logique LIKE

décembre 14, 2008

Comment dire à SAS de sélectionner toutes les observations pour lesquelles une variable donnée contient le mot CASTS ? L’opérateur logique LIKE, utilisable uniquement une condition exprimée par WHERE est fait pour ce travail. Voici donc 5 points à retenir sur LIKE que vous pourrez vous même vérifier à l’aide du data set founi en bas d’article dans la rubrique “Annexe” et des exemples de la section 2.

1. Les 5 points à retenir sur LIKE

1. Trouver un texte ayant une structure donnée : Le but de LIKE est de trouver, pour une variable donnée, toutes les observations ayant une structure particulière.

2. Traiter des chaînes de caractères : LIKE s’applique à une chaîne de caractères et non à des valeurs numériques.

3. Autoriser un caractère libre : Le tiret bas (underscore : _) désigne qu’il faut absolutement un caractère à l’endroit où il est utilisé : ni plus ni moins.

4. Autoriser une chaîne de caractère libre : Le pourcentage (percent : %) accepte toute chaîne de caractère, quelque soit sa longueur, à l’endroit où le symbole apparaît. L’absence de caractère est aussi valide.

5. Appliquer LIKE dans un WHERE : LIKE s’utilise uniquement avec WHERE dans une étape data ou dans la procédure SQL. Il ne fonctionnera pas avec IF.

2. Quelques exemples

Un exemple avec les pourcentages : Dans ce premier exemple, on sélectionne toutes les lignes d’observations où la variable TEST_LAB contient le mot CASTS en majuscule. Il est possible de prendre une observation contenant du texte ou des blancs avant le mot CASTS et/ou après le mot CASTS.

data casts;
   set lab (where=(test_lab like '%CASTS%'));
run;

Pour prendre toutes les observations indépendamment de la case ajouter la fonction UPCASE autour du nom de la variable UPCASE(TEST_LAB) like…

Un exemple avec le tiret bas : imaginons que vous vouliez repérer toutes les tests en rapport avec “Leukocyte esterase” mais vous envisagerez une mauvaise saisie au niveau du k, c et y. Vous demandez alors toutes les observations ressemblant au mot “Leukocyte esterase” en acceptant n’importe quelle autre valeur pour k, c et y.

data check_leuk;
   set lab (where=(test_lab like 'LEU_O__TE ESTERAS'));
run;

Un exemple combinant pourcentage et tiret bas : dans ce troisième et dernier exemple, on cherche à trouver toutes les observations contenant le mot CAST tout en assumant que la lettre A peut être erronnée dans les données du data set LAB. N’importe quel caractère à l’emplacement du A est autorisé.

data check_casts;
   set lab (where=(test_lab like '%C_ST%'));
run;

La même chose avec PROC SQL

proc sql;
   create table check_casts as
       select *
       from lab
       where test_lab like '%C_ST%';
quit;

Annexe : CASTS réfère à des tests de laboratoires sur les urines (urinal test).

data lab;
   length test_label $100;
   input test_label $;
   datalines;
FATTY CASTS
GRANULAR CASTS
HYALINE CASTS
RED BLOOD CELL COSTS
LEUKOCYTE ESTERASE
RENAL TUBULAR EPITHELIAL CASTS
WAXY CASTS
WHISTE BLOOD CELL CASTS
KETONE
;
run;
h1

Résoudre une énigme, solution au problème de Freundenthal en 7 points

décembre 9, 2008

La semaine dernière, je vous ai parlé du problème de Freundenthal (lire l’article). J’espère que vous avez apprécié la complexité du problème et particulièrement la première citation de Syvie. Voici une solution possible du problème avec SAS.

Rappel : Les données du problème

On choisit deux entiers X et Y, avec 1 < X < Y et X + Y <= 100.  
On indique à Patricia le produit P de X et Y.
On indique à Sylvie la somme S de X et Y.  

Le dialogue est alors le suivant :  

Patricia : ”Je ne sais pas quels sont les nombres X et Y.”
Sylvie : ”Je savais que vous ne connaissiez pas X et Y.” 
Patricia : ”Eh bien alors, maintenant, je connais X et Y.
Sylvie : ”Eh bien, moi aussi je les connais maintenant.”  

1. Générer un data set contenant toutes les combinaisons de base possible

On choisit deux entiers X et Y, avec 1 < X < Y et X + Y <= 100.
On indique à Patricia le produit P de X et Y.
On indique à Sylvie la somme S de X et Y.

data step1;
   do x=2 to 49;
      do y=3 to 98;
         p=x*y;
         s=x+y;
         if x+y =<100 and x<y then output;
      end;
   end;
run;

Le minimum pour x est 2 et pour y est 3 : Sachant que le plus petit nombre doit être strictement supérieur à 1 et que y doit être strictement supérieur à x, la valeur de x est au minimum 2 et celle de y est au minimum 3.

Le maximum pour x est 49 : Sachant que la somme de x et y ne peut pas dépasser 100 et que x doit être toujours strictement inférieur à y, la valeur de x est au maximum 49.

Le maximum pour x est 98 : Sachant que la somme de x et y ne peut pas dépasser 100 et que la plus petite valeur de x est 2, la valeur maximale de y=98.

Au final, on se retrouve avec 2352 combinaisons possibles.

2. Comprendre la première phrase de Patricia

Patricia nous dit : “Je ne sais pas quels sont les nombres x et y”.

En d’autres termes le produit connu par Patricia est calculable de plusieurs manières.

Si un produit est calculable de plusieurs manières, Patricia ne peut pas savoir quelles sont les valeurs de x et y.

Exemple où Patricia pourrait utiliser sa phrase : Si Patricia avait p=20, il y aurait deux solutions possibles x=2, y=10 et x=4, y=5.

Exemple où Patricia ne pourrait pas utiliser sa phrase : Si Patricia avait le nombre p=27, elle saurait les valeurs de x et y, à savoir x=3 et y=9.

3. Interpréter en SAS la première phrase de Patricia

Ici sont extraites toutes les combinaisons de x et y pour lesquelles un produit apparaît plusieurs fois. On se retrouve avec 574 combinaisons.

proc sql;
   create table patricia_1 as
      select *
      from step1
      group by p
      having count(*) gt 1;
quit;

4. Comprendre la première phrase de Sylvie

Sylvie nous dit : ”Je savais que vous ne connaissiez pas X et Y.”.

Pour expliquer cette phrase de Sylvie, je vous propose de passer par un exemple. Supposons que la somme de x et y connue par Sylvie est égale à 12 (s=12).

Cette somme est calculable à partir de plusieurs combinaisons : 2+10, 3+9, 4+8 et 5+7. Pour chacune de ces combinaisons, on obtient les produits suivants : 20, 27, 32 et 35.

  • Pour obtenir le produit 20, Patricia a 2 possibilités : 4*5 et 2*10.
  • Pour obtenir 27, il y a également 1 possiblité : 3*9.
  • Pour obtenir 32, il y a 2 produits possibles : 2*16 et 4*8
  • Enfin pour obtenir 35, il y a 1 possiblité : 5*7

Il faudrait que les 4 produits puissent s’obtenir avec plusieurs combinaisons pour faire partie des réponses possibles.

Parmi toutes les x et y qui donnent le nombre s, tous forment un produit calculable d’une autre manière.

5. Interpréter sous SAS de la citation de Sylvie

L’interprétation de la citation se fait en quatre étapes :

  • Pour chaque somme, trouver tous les produits possibles.
  • Ajouter à chaque produit toutes les autres combinaisons donnant le même produit.
  • Savoir pour chaque combinaison de somme, le nombre de produits associés
  • Ne prendre que les sommes où tous les produits sont calculables d’au moins deux manières.

Etape 1 : La première étape est notre data set STEP1 généré précédemment.

Etape 2 : Une combinaison MANY-TO-MANY

Chaque somme peut apparaître plusieurs fois dans le data set STEP1 car il peut y avoir plusieurs manières de l’obtenir. Dans la précédente section, on a vu qu’il y avait 4 combinaisons de x et y pour obtenir la somme 12.

Chaque produit peut apparaître plusieurs fois dans le data set STEP1 car il peut y avoir plusieurs manières de l’obtenir. Dans la précédente section, on a vu qu’il y avait 2 combinaisons de x et y pour obtenir la le produit 20 et une seule pour obtenir le produit 27.

Il s’agit donc de faire un merge many-to-many du data set STEP1 par lui même. On passe alors à 7006 lignes d’observations.

Prenont la ligne où s=12, x=2, y=10 pour exemple. Le produit qu’elle renvoie est calculable de 2 manière différente. C’est à dire qu’il y a une autre somme qui donne le même produit. Il s’agit de s=9 quand x=4 et y=5. Il faut donc doubler l’information pour chacune de ces sommes.

    STEP1               STEP1
 s  s_x  s_y   p     p  p_x  p_y
12    2   10  20    20    2   10
9     4    5  20    20    4    5

Au final on voudrait :

        STEP2
 s  s_x  s_y   p  p_x  p_y
12    2   10  20    2   10
12    2   10  20    4    5
9     4    5  20    2   10
9     4    5  20    4    5

En SAS, cela donne :

proc sql;
   create table step2 as
      select a.*, px, py
      from step0 a,
           (select x as px, y as py, p from step1) b
      where a.p=b.p;
quit;

Imprimez le résultat pour p=20 et vous verrez qu’on obtient la réponse attendue.

Etape 3 : A présent, il s’agit de savoir pour chaque combinaison de somme et produit, le nombre d’occurences.

proc sql;
   create table step3a as
      select *, count(*) as cnt
      from step3
      group by s, p;
quit;

Lorsque s=12, on obtient :

x     y     p     s    px    py    cnt
2    10    20    12     2    10     2
2    10    20    12     4     5     2
3     9    27    12     3     9     1
4     8    32    12     2    16     2
4     8    32    12     4     8     2
5     7    35    12     5     7     1

Au lieu de sélectionner toutes les observations, on peut se contenter de S, X, Y, P et la variable CNT. On a alors nos 2352 lignes d’origine.

proc sql;
   create table step3b as
      select distinct s, x, y, p, count(*) as cnt
      from step3
      group by s, p;
quit;

Pour s=12, on a :

 s    x     y     p    cnt

12    2    10    20     2
12    3     9    27     1
12    4     8    32     2
12    5     7    35     1

Etape 4 : La dernière étape concernant la première citation de Sylvie consiste à identifier les sommes où tous les produits associées sont calculables d’au moins deux manière.

Dans l’étape data qui suit, j’ai choisi de passer par un compteur. Ce compteur est représenté par la variable FLAG. Il est réinitialisé pour chaque nouvelle somme (variable S). Si SAS rencontre une fois la valeur CNT=1, le compteur est incrémenté. Pour la dernière observation de la somme

data step4 (keep=s);
   set step3b;
   by s;
   if first.s then flag=0;
   if cnt=1 then flag+1;
   if last.s and flag=0 then output;
run;

Le data step STEP4 contient 10 observations.

 s      

11
17
23
27
29
35
37
41
47
53

Il est donc ensuite de se concentrer sur la troisième phrase du dialogue.

6. Patricia : “Eh bien alors, maintenant je connais X et Y”

Sachant p, et sachant que s ne peut être qu’une des 10 valeurs trouvées dans l’étape 4 (STEP4), Patricia est capable de trouver quelle combinaison est la bonne. On en conclut que parmi les possibilités extraites dans le data set PATRICIA_1, il ne faut garder que celles où S n’apparaît qu’une fois pour un P donné.

proc sql;
   create table patricia_2 as
      select *
      from patricia_1
      where s in (select s from step4)
      group by p
      having count(*)=1;
quit;

 On se retrouve avec 86 observations.

7. Sylvie : “Eh bien moi aussi je les connais maintenant”

Si parmi les resultats restant, Sylvie est capable de trouver la réponse c’est parce qu’il ne reste plus qu’une valeur possible de P pour la somme dont elle a la connaissance.

A partir du data set PATRICIA_2, on extrait les observations où la valeur de S n’apparaît qu’une fois.

proc sql;
   select x, y, s, p
      from patricia_2
      group by s
      having count(*)=1;
quit;

Seul un cas est extrait. Dès lors, la réponse à l’énigme de Freundenthal est x=4 et y=13.

 x   y   s   p

 4  13  17  52
h1

Créer un fichier .sas automatiquement

décembre 4, 2008

Il est très courant en SAS de créer un programme à partir d’une instruction FILENAME et d’une étape data. Souvent les informations contenues dans un fichier de référence servent à faire varier quelques lignes de code.

1. Le data set pour l’exemple

Dans cet exemple, il est demandé de renommer toutes les variables commençant pas z_ de manière automatique car le nom et le nombre de ces variables peut varier.

data lab;
   input patient z_test1 $ test1_val z_test2 $ test2_val;
   datalines;
1 TEMP 38 HR 80
;
run;

Si deux variables seulement seraient à renommer et si elles s’appelaient toujours Z_TEST1 et Z_TEST2, le code serait tout simplement.

data lab;
   set lab (rename=(z_test1=test1 z_test=test2));
run;

Ou

data lab;
   set lab;
   rename z_test1=test1
          z_test2=test2;
run;

Ou

data lab;
   set lab;
   rename z_test1=test1;
   rename z_test2=test2;
run;

C’est cette dernière forme qui nous intéressera de reproduire de manière automatique.

2. Créer le fichier de référence

La liste de toutes les variables commençant pas Z_ du data set temporaire LAB, est sauvegardée dans le data set REF et plus particulièrement dans la variable OLD_NAME. On choisit en plus d’ajouter une seconde variable NEW_NAME contenant les noms sans les Z_.

Dans notre exemple, vu qu’il y a 2 variables à renommer, le data set REF contient deux observations dans la variable NAME.

proc sql;
   create table ref as
      select name as old_name,
             subst(old_name,3) as new_name
      from dictionary.columns
      where upcase(libname)='WORK' and
            upcase(memname)='LAB' and
            upcase(name) like 'Z_%';
quit;

3. Créer un fichier .sas avec une instruction filename et une étape data

Dans un second temps, l’emplacement et le nom du programme SAS à créer sont à donner. C’est le rôle de l’instruction FILENAME. Pour y faire ensuite référence, il suffit d’utiliser le surnom donné dans l’instruction. Ici, il s’agit du surnom SASREF.

filename sasref 'C:/sasref/rename_z.sas';

Les instructions FILENAME et LIBNAME ont des similarités. Dans une instruction LIBNAME, le nom de la bibliothèque s’appelle le LIBREF. Ici on parle de FILEREF. Tous les deux (LIBREF et FILEREF) doivent avoir une longueur de 8 au maximum et ne doit pas commencer par un chiffre.

4. Une étape data

Dans un troisème temps, une étape data est donnée pour écrire le programme.

  1. Ne pas créer de data set, DATA  _NULL_ : Comme, il n’y a pas besoin de créer de data set, le nom du data set est remplacé par le mot _NULL_.
  2. Désigner le nom du fichier .sas à créer, FILE: Puis, on précise où les informations contenues dans lesinstructions PUT seront copiées.
  3. Lire les données du fichier de référence, SET : Après, il faut désigner notre data set REF contenant les observations dans l’instruction SET.
  4. Utiliser la variable automatique _N_=1 pour désigner la première boucle autour de l’étape data et donc ici la première observation : Lors de la lecture de la première observation du data set REF les instructions DATA LAB et SET LAB seront écrites dans le programme.
  5. Ajouter autant d’instruction RENAME que d’observations dans le ficihier REF : Pour chacune des observations de REF, une instruction RENAME sera écrite. Le contenu variera en fonctions des valeurs contenues dans les variables OLD_NAME et NEW_NAME.
  6. Utiliser l’option END= pour désigner la dernière observation du data set REF : Enfin à la lecture de la dernière observation, une instruction RUN est ajoutée. Pour désigner la dernière observation, on fait appel à l’option END= de l’instruction SET qui nous permet d’introduire une nouvelle variable nommée EOF. Celle variable prend la valeur 0 pour toutes les observations du data set REF sauf la dernière qui prend la valeur 1.
data _null_;
   file sasref;
   set ref end=eof;
   if _N_=1 then
      do;
         put 'data lab;';
         put '    set lab;';
      end;
   put '   rename '  old_name '=' new_name ' ;';
   if eof then put 'run;';
run;

5. Exécuter le programme

Pour terminer il est possible d’appeler le programme avec une instruction %INCLUDE et d’enlever le lien qui existe entre SASREF et le fichier (desassign the filename reference)

Appeler le programme :

%include sasref;

Couper le lien entre le FILEREF et le programme RENAME_Z.SAS :

filename sasref clear;

Pour vous entraîner, vous pouvez faire varier le code et essayer de retrouver les autres syntaxes pour renommer les variables citées en première partie.

h1

Résoudre une énigne avec SAS : le problème de Freundenthal

décembre 2, 2008

SAS peut-il vous aider à résoudre une énigme ?  Sur le blog www.apprendre-en-ligne.net/blog, une énigme appelée le problème de Freundenthal a attiré l’attention d’un des lecteurs du blog. Vu le nombre de cas possibles, il s’est amusé à résoudre le problème avec SAS.   

Mais vous ? Serez vous curieux de connaître la réponse avant la semaine prochaine ?  

L’énigme   

On choisit deux entiers X et Y, avec 1 < X < Y et X + Y <= 100.  
On indique à Patricia le produit P de X et Y.
On indique à Sylvie la somme S de X et Y.  

Le dialogue est alors le suivant :  

Patricia : ”Je ne sais pas quels sont les nombres X et Y.”
Sylvie : ”Je savais que vous ne connaissiez pas X et Y.” 
Patricia : ”Eh bien alors, maintenant, je connais X et Y.
Sylvie : ”Eh bien, moi aussi je les connais maintenant.”  

À vous de trouver X et Y.