Archives pour mai 2009

h1

Extrait de “La semaine de 4 heures”

mai 29, 2009

Voici en bleu un extrait du livre “La semaine de 4 heures” (Travaillez moins, gagnez plus et vivez bien) de Timothy Ferriss aux éditions Pearson (pages 48 et 49).

1. Printemps 2005, Princeton, New Jersey

…Mon séminaire à Princeton venait de s’achever dans l’excitation et l’enthousiasme.

Dans le même temps, je savais que, la porte aussitôt franchie, la plupart des étudiants s’empresseraient de faire le contraire de ce que j’avais prêché. La majorité d’entre eux travailleraient 80 heures par semaine comme des ronds de cuir grassement payés sauf si je leur démontrais que les principes étudiés en cours peuvent être appliqués pour de bon.

D’où le défi.

J’offrais un billet aller-retour n’importe où à quiconque réussirait un défi - qui restait à préciser … Je leur avais dit de me retrouver après les cours s’ils étaient intéressés et ils étaient là, une vingtaine d’étudiants sur une classe de 60.

Contacter trois personnes réputées intouchables – Bill Clinton, J.D. Salinger, Madonna, peu importait – et obtenir d’au moins l’une d’elles qu’elle réponde à trois questions.

Sur les 20 étudiants, dont les yeux papillonnaient à l’idée d’une balade gratuite autour du monde, combien ont réussi le défi ?

Exactement… aucun. Pas un.

Ils n’étaient pas en mal de bonnes raisons : “Ce n’est pas si facile d’obtenir que quelqu’un…” “J’ai une dissert’ supper importante à rendre, et…” “J’adorerais mais vraiment, je ne vois pas comment…”

Il n’y avait cependant qu’une vraie raison, répétée à l’infini sous des formes différentes : c’était un défi difficile, voir impossible, et les autres étudiants les battraient. Tous ayant surestimé la concurrence, pas un seul ne releva le défi.

Selon les règles que j’avais fixés, si quelqu’un m’avait envoyé ne serait-ce qu’une réponse illisible d’un paragraphe, j’aurais été obligé de lui donner le prix.

2. Et vous ?

Gagnez le livre d’Olivier Decourt “Reporting avec SAS : Mettre en forme et diffuser vos résultats avec SAS 9 et SAS 9 BI” offert par les éditions Dunod en répondant à la question : “Que vérifiez-vous pour valider vos programmes et comment ?” avant le 31 juillet 2009. Lire l’article sur le sujet.

Un mois après l’ouverture du concours, une participation a été enregistrée. Cela ne vous rappelle rien ?

h1

Plusieurs mots d’un paramètre de macro à mettre entre guillemets (%QSYSFUNC, %STR(), TRANWRD)

mai 28, 2009

Mettre entre guillemets les mots contenus dans une macro variable SAS et les séparer par des virgules est possible au moyen des fonction %STR(), %QSYSFUNC et TRANWRD. Dans quel cas est-ce utile ? Comment se décompose cette syntaxe ?

1. Dans quel cas a-t-on besoin d’ajouter des guillemets et virgules ?

Lors de l’écriture d’une macro, vous pouvez avoir besoin d’autoriser plus d’un mot dans un des paramètres.

options mprint;

%macro test (multival=);

%mend test;

%test (multival=Alfred William);

Note : l’option MPRINT de l’instruction OPTIONS permettra de voir la résolution de la macro dans la log.

Ensuite, le contenu de ce paramètre traité comme une macro variable peut être appelé dans une condition. Dans l’exemple qui suit “Alfred”,”William” sera remplacée par la macro variable mise à jour.

proc print data=sashelp.class (where=(name = (“Alfred”,”William”));

run;

Il faut pour cela mettre la macro variable à jour en ajoutant des guillemets et la virgule comme séparateur.

2. Comment ajouter guillemets et virgules ?

2.1 Un mot

Dans le cas d’un paramètre avec un mot, on peut ajouter %str(%”) devant et derrière. Le symbole % permet d’introduire les caractères spéciaux comme le guillemet.

%let multival=%str(%”)&multival.%str(%”);

La macro donne alors :

%macro test (multival=);

%let multival=%str(%”)&multival.%str(%”);

proc print data=sashelp.class (where=(name = &multival.));

run;

%mend test;

%test (multival=Alfred);

2.2 Plus d’un mot

Pour mettre entre guillemets plus d’un mot, l’espace entre les mots sera remplacé par “,” (guillemet, virgule, guillemet) au moyen de la fonction TRANWRD.

%qsysfunc(tranwrd(&multival.,%str( ),%str(%”,%”)))

Pour exécuter cette fonction, qui n’a pas d’équivalent dans les macros fonctions, il faut englober le tout dans %SYSFUNC/%QSYSFUNC. La présence de la virgule oblige dans notre cas à utiliser %QSYSFUNC.

%macro test (multival=);

%let multival=%str(%”)%qsysfunc(tranwrd(&multival.,%str( ),%str(%”,%”)))%str(%”);

proc print data=sashelp.class (where=(name in (&multival.));

run;

%mend test;

%test (multival=Alfred William);

2.3 Plus d’un mot mis en majuscule

Enfin, pour ne pas tenir compte de la case, le texte peut être mis en majuscule au moyen de la fonction %UPCASE.

where=(upcase(name) in (%upcase(&multival.))

Cela donne :

%macro test (multival=);

%let multival=%str(%”)%qsysfunc(tranwrd(&multival.,%str( ),%str(%”,%”)))%str(%”);

proc print data=sashelp.class (where=(upcase(name) in (%upcase(&multival.))));

run;

%mend test;

%test (multival=Alfred William);

Lectures complémentaires

h1

Les pièges d’Excel : Une colonne sans nom (GETNAME=YES)

mai 24, 2009

Lors de l’importation d’un fichier Excel sous SAS au moyen de la procédure PROC IMPORT, la première ligne indique à SAS quel nom donné aux variables au lieu d’utiliser les lettres de l’alphabet. L’option par défaut est GETNAME=YES. Dans un cas, des informations peuvent être perdues. C’est ce que je vous propose de voir ici.

1. Le cas où tout va bien

Le tableau à importer contient 4 colonnes. La première ligne servira à SAS pour attribuer le nom des variables. La seconde ligne contient les données. Le tableau SAS aura 4 variables avec une observation chacune.

La procédure PROC IMPORT

proc import datafile=‘C:/sasref/getname_example1.xls’
out=getname_ex
dbms=xls
replace;
getname=yes;
run;

2. Un nom de colonne manquant

Dans le cas suivant, une des cellules de la première ligne est vide. SAS cherche un nom (GETNAMES=YES) mais n’en trouve pas. SAS n’importe pas la colonne concernée.. Le data set contient alors 3 variables avec une observation chacune.

h1

Enlever les balises HTML d’un texte (do while et do until)

mai 18, 2009

Les balises HTML sont des mots entourés de < et > servant à la mise en forme de pages Internet. Dans l’exemple qui suit le but est d’enlever avec SAS des balises HTML contenues dans une variable appelée DESCRIP au moyen d’une boucle.  Cet exemple, basé sur un cas réel, permettra d’illustrer la syntaxe de DO UNTIL et de DO WHILE.

1. La fonction SUBSTR pour enlever un symbole <…>

Pour enlever une balise, je choisis ici de remplacer la chaîne commencant par < et se terminannat par > au moyen de la fonction SUBSTR. Pour ce faire,

  • paramètre 1 : donner le nom de la variable en premier
  • paramètre 2 : préciser la position du symbole < en second 
  • paramètre 3 : donner la longueur du texte en calculant le nombre de caractères entre ce symbole de début de balise et celui de fin (position de su symbole de fin > – position du symbole de début < + 1).

data no_tag (drop=tag:);
   descrip=‘<p>my text</p>’;
   tag_start = index(descrip,‘<’);
   tag_end   = index(descrip,‘>’);
   substr(descrip,tag_start,tag_end-tag_start+1)=‘ ‘;
run;

Ici le texte à mettre à jour est <p>my text</p>. Cette première étape data remplace la première balise et seulement la première. Pour des raisons de lisibilité, j’ai choisi de créer deux variables intermédiaires qui retourne la position de < (variable TAG_START) et de > (TAG_END) au moyen de la fonction INDEX.

En fin d’étape data, toutes les variables dont le nom commence par TAG sont supprimée grâce à l’option DROP.

2. Répéter l’opération au moyen d’une boucle DO UNTIL

A chaque exécution de la boucle la variable DESCRIP est mise à jour : une balise <…> est enlevée.

La boucle sera exécutée jusqu’à ce qu’aucun symbole < ne soit identifié. En d’autres termes, la boucle sera exécutée jusqu’à ce que la fonction INDEX retourne la valeur zéro.

data no_tag (drop=tag:);
   descrip=‘<p>my text</p>’;
   do until(index(descrip,‘<’)=0);
      tag_start = index(descrip,‘<’);
      tag_end   = index(descrip,‘>’);
      substr(descrip,tag_start,tag_end-tag_start+1)=’ ‘;
   end;
run;

3. Répéter l’opération au moyen d’une boucle DO WHILE

A chaque exécution de la boucle la variable DESCRIP est mise à jour : une balise <…> est enlevée.

La boucle sera exécutée tant qu’un symbole < sera identifié. En d’autres termes, la boucle sera exécutée tant que la fonction INDEX ne retournera pas la valeur zéro.

data no_tag (drop=tag:);
   descrip=‘<p>my text</p>’;
   do while(index(descrip,‘<’) ne 0);
      tag_start = index(descrip,‘<’);
      tag_end = index(descrip,‘>’);
      substr(descrip,tag_start,tag_end-tag_start+1)=‘ ‘;
   end;
run;

Avec DO UNTIL et DO WHILE, il faut faire attention aux boucles infinies. Si la condition pour sortir de la boucle n’est jamais obtenue. L’exécution continue sans fin.

Lectures complémentaires

Sur le blog www.sasreference.fr

Online Doc

h1

Mini-quiz SAS en ligne (J-11)

mai 14, 2009

Sébastien Ringuedé a rédigé des questions du type Certification SAS Base. Ces questions sont en français. Comme pour la certification, il a mis en place un système proposant de manière “aléatoire” 70  de ces questions. Vous qvez deux heures pour y répondre.

Le lundi 25 mai 2009, quiz SAS en ligne
(débutez ce test de 2h entre 20h30 et 21h30 heure de Paris)

Deux exemplaires de son livre sur SAS sont à gagner :

SAS Introduction au décisionnel : méthode et maîtrise du langage

Pour plus d’informations, reportez-vous au site : http://www.sas-sr.com/viewtopic.php?id=175

h1

Un premier exemple d’array : changer toutes les variables 1/2 en variable 0/1

mai 11, 2009

Imaginez que vous avez dans une table des variables oui/non où 1 représente non et 2 représente oui. Changement de standard oblige, vous devez symboliser les non par un 0 et les oui par un 1.

Si mavariable=1 alors mavariable=0.
Sinon mavariable=1.

Bien sûr, vous pouvez traiter séparément chaque variable. Ce chantier laborieux est remplaçable par une boucle où seul le nom de la variable change à chaque fois. Vous voulez donc effectuer une même opération sur un grand nombre de variables. La syntaxe de l’array est faite pour vous.

1. Un data set pour l’exemple

Voici la table (SAS data set) utilisée pour l’exemple. Elle s’appelle FINAL. Elle est composée d’une variable caractère et de trois variables numériques, toutes des variables binaires de type oui (2)/ non (1).

data final;
input subject $ pregny validny aeny;
datalines;
A 1 2 1
B 1 1 2
C 2 1 2
D 1 2 2
;
run;

Le but sera d’obtenir un data set avec des variables binaires de type oui (1)/ non (0).

subject pregny validny aeny;
A      0       1      0
B      0       0      1
C      1       0      1
D      0       1      1

2. C’est quoi un array ?

Un array est un nom qui désigne une liste de variables. Il est propre à l’étape data.

  • Définir un nouvel array : Dans un premier temps, l’array est à créer: Sous un nom de son choix, sont sauvegardés sauvegarde des noms de variables (les éléments de l’array) dont l’ordre est indexé pour pouvoir les désigner de manière individuelle par la suite.
  • Appler les variables contenues dans l’array : Dans un second temps, chaque élément de l’array (chaque variable) est appelé/désigné, non pas par son nom, mais par sa position dans l’array.

3. Définir un array

Pour définir un array, il existe l’instruction ARRAY. Elle est composée de trois parties principales et d’un quatrième optionnel.

  • le nom de l’array
  • le nombre de variables  listées (le nombre d’éléments dans l’array)
  • le nom des variables
  • la valeur des variables (optionel)

Dans l’exemple, j’ai un array nommé NY composé de trois éléments : les variables PREGNY (prenant no/yes), VALIDNY (valid no/yes) et AENY (adverse event no/yes).

data final;
set final;
*array ny {1998:2000} pregny validny aeny;
*array ny {1:3} pregny validny aeny;
array ny {*} pregny validny aeny;
run;

Je vous propose trois alternatives pour la notation. Ma préférence, pour des raisons de simplicité dans ce cas, va au cas numéro trois.

  • {1998:2000} Dans le premier cas, la variable PREGNY a pour référence la position 1998, VALIDNY a pour référence la position 1999 et la variable AENY est en position 2000.
  • {1:3} Dans le second cas, la numérotation commence à 1 avec la variable PREGNY et se termine à 3 avec la variable AENY.
  • {*} Dans le troisième et dernier cas, la numérotation est implicite. Comme précédemment. Elle ira de 1 à 3. SAS se charge de compter le nombre de variables pour savoir la dimension de l’array. Si SAS fait le travail pour nous, pourquoi se priver de ce luxe !

Note : La première syntaxe peut apporter dans certains cas un plus en terme de compréhension. C’est le cas quand le numéro a un lien avec le sens de la variable. Par exemple, les variables RESULT98, RESULT99 et RESULT00 peuvent avoir les positions 1998, 1999 et 2000 et donc avoir un caractère informatif.

4. Appeler un array

Pour appeler un élément d’un array (une variable), il faut donner le nom de l’array suivi de la position de la variable dans l’array. Ainsi :

  • ny{1} désigne la variable PREGNY
  • ny{2} fait référence à la variable VALIDNY
  • ny{3} concerne la variable AENY

data final;
set final;
array ny {*} pregny validny aeny;
*variable PREGNY;
if ny{1}=1 then ny{1}=0;
else ny{1}=1;
*variable VALIDNY;
if ny{2}=1 then ny{2}=0;
else ny{2}=1;

*variable AENY;
if ny{3}=1 then ny{3}=0;
else ny{3}=1;

run;

L’intérêt de cette notation vient dans l’usage d’une boucle où la position de la variable sera automatiquement changé.

data final;
set final;
array ny {*} pregny validny aeny;
do i=1 to dim(ny)
;*do i=1 to 3;
if ny{i}=1 then ny{i}=0;
else ny{i}=1;
end;
run;

Pour les plus paresseux comme moi, on demandera à SAS de calculer le nombre d’éléments contenus dans l’array (la dimension) au moyen de la fonction SAS propre à l’array DIM().

Je vous proposerai dans les semaines à venir un autre article sur les subtilités de l’array.

h1

Protégé : Newsletter Mai : Solution

mai 6, 2009

Cet article est protégé par mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :


h1

Protégé : Newsletter Mai : Exercice

mai 6, 2009

Cet article est protégé par mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :


h1

Les pièges d’Excel : cellules formatées

mai 6, 2009

Voici un des nombreux pièges avec des données Excel (version anglaise) à importer en SAS.

1. Repérer le problème

J’ai récupéré hier des données sous Excel version anglaise.

  • Normalement on aurait dû avoir un nombre avec trois décimales.
  • Mais, dans les faits, Excel interprétait le point comme un séparateur pour les milliers et non comme le séparateur entre la partie entière et la partie décimale.

excel_num

Du coup, à l’importation sous SAS, tous les nombres sont des entiers.

2. La raison du problème

Le formatage de la cellule utilisait le point comme séparateur des milliers.

excel_fmt

3. Une solution laborieuse et risquée

J’ai converti toutes les cellules en texte et ai manuellement rajouté le séparateur entre partie entière et partie décimale.