Archives pour avril 2008

h1

Créer une date SAS de 3 manières

avril 28, 2008

SAS utilise sa propre échelle de temps. Dans un premier temps, est rappelé comment SAS défini une date, une heure et une combinaison de l’heure et du jour. Puis, trois alternatives sont proposées pour convertir ou créer ces valeurs.

1. Rappel sur la notion de date SAS et datetime SAS

Date : Une date SAS est un nombre entier égal au nombre de jours écoulés depuis le 1er janvier 1960. Les dates avant 1960 ont donc négatives. Le 1er janvier 1960 est égal à zéro. Ainsi la différence entre deux dates SAS est un nombre de jours.

Time : Un time SAS est un nombre représentant le nombre de secondes écoulées depuis minuit. Il varie entre 0 et 86400 (60 secondes * 60 minutes *24 heures). La différence entre deux times SAS est un nombre de secondes.

Datetime : Un datetime SAS est un nombre représentant le nombre de secondes écoulées depuis le 1er janvier 1960. Ce nombre aura une valeur décimale si on utilise des dixièmes de secondes. Mais ceci est rare. La différence entre deux datetimes SAS est donc un nombre de secondes.

Avantages : Ces nombres sont pratiques pour faire des calculs sur le temps écoulé. De plus, les fonctions de temps SAS ont besoin de ces valeurs. Ainsi la fonction MONTH extrait le mois d’une date SAS (SAS Online Doc. : Liste des fonctions DATE).

Inconvénient et parade : pour lire ces dates/time/datetime, on préfère les voir en langage humain. Soit un format est appliqué sur la valeur numérique, soit une variable caractère est créée avec une fonction PUT et le nom du format. Ce sujet ne sera pas détaillé dans cet article.

SAS Online Doc : About SAS Date, Time and Datetime Values

2. Les fonctions MDY et DHMS

Créer une date avec la fonction MDY : La fonction MDY crée une date SAS. Elle a besoin de trois informations : le mois, le jour et l’année. Aux Etats-Unis, le mois apparaît en premier dans la date, suivi du jour et enfin du mois. Les trois paramètres de cette fonction sont donc des valeurs numériques. SAS étant un logiciel américain, l’ordre des paramètres de la fonction MDY est le même. Le nom de la fonction est lui-même parlant : M pour month, D pour day et Y pour year.

visit_dt = mdy(visit_m,visit_d,visit_y);

Créer un time avec la fonction HMS : la fonction HMS retourne un time SAS. Elle est composée de l’heure, des minutes et des secondes.

visit_hour = hms(vist_hr,visit_min,visit_sec);

Créer un datetime avec la fonction DHMS : Créer une datetime avec la fonction DHMS : la fonction DHMS créer une datetime SAS. Elle a 4 paramètres : la date SAS, l’heure, les minutes et les secondes.

visit_time = dhms(visit_dt, vist_hr,visit_min,visit_sec);

3. Lire un texte et le convertir en date/time/datetime

On peut lire une valeur texte et demander à SAS de l’interpréter comme une date. Il faut alors que ce texte suivre une des structures répertoriées par SAS. On parle d’informat. En voici la liste complète : SAS Online Doc., Informats by Category. La fonction INPUT est alors utilisée. Le premier paramètre est soit une valeur texte entre guillemets, soit une variable texte.

DATE informat : Une des notations les plus utilisées pour lire des dates est le jour suivi des trois premières lettres du mois en anglais et enfin de l’année exprimée avec 4 chiffres. La longueur totale étant de 9 caractères, l’informat s’appelle date9. DATE. a pour valeur par défaut 7. Cela impose une année à 2 chiffres.

jour = input(‘25NOV1952′,date9.);

nov_dt = input(‘25NOV52′,date7.); *attention à l’option globale YEARCUTOFF qui décidera s’il s’agit de 1952 ou 2052 par exemple (voir la note plus bas);

TIME informat : L’informat TIME. a pour longueur par défaut 8. Donc TIME. et TIME8. sont identiques.

heure = input(‘08:15:00′,time.);

DATETIME informat : L’informat DATETIME. a pour longueur par défaut 18. Ainsi DATETIME. et DATETIME18. sont identiques.

jour_heure = input(‘25NOV1952:08:15:10′,datetime.);

Note sur l’option YEARCUTOFF :

a. Identifier la valeur actuelle de YEARCUTOFF : pour savoir quelle est l’année de YEARCUTOFF, consultez la log après avoir soumis le code suivant :

proc options;
run;

b. Changer le yearcutoff : pour alterner cette valeur, utilisez l’instruction globale OPTIONS et le mot-clé YEARCUTOFF.

options yearcutoff=1950;

c. Interprétation : avec une YEARCUTOFF de 1920,

  • une année inférieure à 20 sera interprétée comme égale à une année 2000 :  20xx.
  • Une année supérieure ou égale à 1920 sera interprétée comme une année 1900 : 19xx

4. Ecrire manuellement quelques valeurs date/time/datetime

Une manière rapide de créer une date SAS si, et seulement si, on a très peu de valeurs à entrer est de faire suivre la valeur texte de d, t ou dt selon qu’il s’agisse d’une date, d’un time ou d’un datetime.

x = ‘ 25NOV1952′d;

x = ‘08:15:00′t;

x = ‘25NOV1952:08:15:10′dt;

SAS Online Doc. : SAS Constants in Expressions

h1

3 angles de vue sur les commentaires

avril 24, 2008

Il existe trois notations différentes pour écrire des commentaires dans un programme SAS. Chacune à ses avantages et ses limites. En en prenant connaissance ici, vous pourrez faire des choix stratégiques.

1. Désactiver une instruction : un commentaire entre une étoile et un point virgule est la plus rapide des notations. Celle-ci fait usage de la particularité de la syntaxe SAS. En effet, chaque instruction se termine par un point-virgule. En ajoutant une étoile (asterisk) en tête, l’instruction est désactivée.

Lors du développement d’un programme, on est amené à suspendre certaines instructions ou à en activer ponctuellement. C’est le cas la procédure PROC PRINT, qui permet d’avoir un aperçu du contenu d’un jeu de donné. 

*proc print data=cnt_pct;
*run;

Note : On n’utilisera pas cette syntaxe étoile/point-virgule :

  • pour suspendre un large bloc de texte
  • si les guillemets ne sont pas fermés dans le commentaire
  • entre deux instructions PUT ou deux instructions CALL EXECUTE.

2. Désactiver un bloc de texte plus globales : L’étoile/point-virgule  peut-être incluse dans d’autres  commentaires plus larges définis pas /* */. Ainsi on peut choisir d’annoter des titres de rubriques d’un programme avec *; . Ainsi on pourra englober ces titres dans une zone de désactivation plus grande.

/*
*Calcul des fréquences;
proc freq…;
run;

*Générer une table;
proc report…;
run;
*/

Note : On pourra choisir de fermer le bloc par /***/ au lieu de */. Ainsi, en enlevant seulement le /* en début de commentaire, l’intégralité du code est réactivée et fonctionne sans que la notation de fin soit impérativement supprimée.

3. Les commentaires et le langage macro :

Les différences entre les instructions à l’intérieur et la l’extérieur d’une définition de macro : les instructions macro doivent avoir l’étoile après le symbole pourcentage à l’intérieur d’une définition de macro. On continuera à mettre l’étoile avant si l’instruction est à l’extérieur de la définition de macro. La notation /**/ ne rencontre pas de difficulté particulière.

%macro commentaires;
%*IF….;
%mend;
*%commentaires;

Le cas particulier des conditions : seul le /**/  peut-être utilisé entre un %if et un %else.

%macro commentaire;
   %IF … %THEN %DO; … %END;
 /* l’autre notation n’est pas possible ici*/ 
  %ELSE …
%mend commentaire;

Une macro sans nom : la troisième méthode pour écrire un commentaire est de créer une macro sans nom.

%macro;
Mon texte est inactif ici.
%mend;

h1

Convertir une variable caractère en numérique et inversement

avril 21, 2008

Passer d’une variable numérique à une variable caractère ou inversement est fréquent sous SAS. Les fonctions INPUT et PUT permettent de changer ainsi le type de la variable. Dans un premier temps, je vous propose deux exemples pour illustrer les deux situations. Dans un second temps, on verra deux emplois supplémentaires de la fonction PUT : ajouter des zéros avant et après le nombre, et passer d’une valeur caractère à une autre valeur caractère.

Exemples d’application : dans la vie courante, il est fréquent de créer une variable texte à partir de plusieurs autres. Dans le lot, il y a souvent une variable numérique. Celle-ci doit être convertie en texte avant la concaténation. A l’inverse, on peut vouloir extraire le chiffre d’une chaîne de caractère et le sauvegarder dans une variable numérique.

Note : Dans un data step, on est obligé de créer de donner un nom différent à la variable d’origine et à la nouvelle variable. Il est alors courant de renommer au préalable la variable d’origine pour pouvoir utiliser son nom pour la nouvelle variable. Ensuite, la variable d’origine est supprimée. Dans une procédure SQL, le même nom peut être utilisé.

1. Du caractère au numérique et inversement

La fonction INPUT est composée de deux paramètres : la variable texte ou directement la chaîne de caractère d’un côté, l’informat de l’autre.

Du caractère au numérique : ici, on indique à SAS qu’il faut lire la variable d’origine comme une variable texte pouvant atteindre une longueur de 16 caractères. Pour cela on utilise l’informat $16. On peut aussi choisir un informat $CHAR. : ici $CHAR16. (SAS Online Doc. : INPUT Function, Informats by Category)

data char_to_num;
  x_char = ‘123456789.123456′;
  x_num = input(x_char,$16.);
*x_num = 123456789.123456;
run;

Note : Pensez à ajouter un format sur la variable numérique si vous ne la lisez pas intégralement dans votre output.

Du numérique au caractère : dans l’exemple ci-dessous, on indique à SAS que la valeur à créer sera numérique avec 16 chiffres/point dont 6 après la virgule. C’est l’information donné par le format numérique 16.6. Bien sûr, on peu avoir la longueur nombre à convertir peut-être plus petit sans risquer d’affecter la valeur. Une autre possibilité est d’utiliser le format BEST16. Si aucun nombre n’est précisé (BEST.) cela revient à BEST12. SAS cherche alors la meilleure réponse possible permettant d’entrer 8 chiffres/point. Les décimales pourront être tronquées s’il n’y a pas assez de place, voir les entiers. (SAS Online Doc. : PUT function, Formats by Category)

data num_to_char;
  y_num = 123456789.123456;
  y_char = put(y_num,16.6);
*y_char = ‘123456789.123456′;
run;

2. Les plus de la fonction PUT

Ajouter des zéros aux extrémités du nouveau texte : le format z. permet de remplacer les espaces vides par des zéros. Dans l’exemple ci-dessous, la nouvelle variable aura une longueur de 8 caractères. Les deux derniers seront les chiffres après la virgule. Comme il n’y en a qu’un seul dans la variable d’origine, un zéro sera ajouté à la fin. Il reste deux espaces en début à remplir avec des zéros.

data num_char_zero;
   z_num = 123.1;
   z_char = put(z_num,z8.2);
  *z_char = ‘00123.10′;
run;

Passer d’une valeur caractère à une autre : la valeur caractère d’origine peut aussi être du texte et non des chiffres. Dans cette situation, la nouvelle variable prend la valeur d’un format caractère souvent défini par le programmeur.

proc format;
  value $cntry
  FR = ‘France’
  LU = ‘Luxembourg’
  CH = ‘Suisse’;
run;

data char_to_char;
  a1_char=’LU’;
  a2_char=put(a1_char,$cntry.);
  *a2_char=’Luxembourg’;
run;

h1

6 conseils pour un CV SAS débutant

avril 17, 2008

Vous commencez vos études et vous voulez mettre toutes vos chances de votre côté pour votre entrée dans la vie activité ? Les études se terminent et vous voudriez devenir consultant SAS ? Comment construire votre expérience et créer un CV débutant béton. Car oui, l’expérience ne fait pas tout. Les recruteurs savent que vous ne connaissez pas le SAS base sur le bout des doigts. Ce qu’il recherche est un peu plus subtil. Voici 8 conseils pour construire un CV attractif.

1. Adaptez votre CV : il est très tentant de construire un CV passe partout et de l’envoyer au plus grand nombre. Pourtant dans les faits, il est plus efficace de cibler l’employeur et de renforcer les points qui l’interpelleront. Par exemple faire des CVs de programmeur SAS et de statisticien distincts. Il est courant de dire qu’on s’intéresse plus spontanément avec les personnes qui nous ressemblent, qui ont un point commun avec vous. A vous de donner la change à l’employeur de retrouver ce qui lui est familier.

2. Citez des actions illustrez votre intérêt pour le SAS : mentionnez dans votre CV toutes vos expériences relevant du SAS  que ce soit dans le cadre universitaire (stages, cours de SAS, projets conduits sous SAS, travail pour la junior entreprise de l’établissement sous SAS), de rencontres (séminaires universitaires, conférences utilisateurs), sur le net (forums de discussion) ou par le biais d’une certification SAS.

3. Détaillez votre expérience SAS par projet / stage : donnez des pistes au recruteur pour évaluer votre niveau de SAS. De plus cela de donner une part plus grande à SAS de la surface de votre CV. En effet, si vous pointez uniquement SAS dans les compétences informatiques et que vous le faite suivre d’autres langages de programmation ou logiciel statistique, cela donnera l’impression : ” connaît un peu de tout mais pas grand chose de chaque “.

  • Modules : listez les modules utilisés (SAS/Base®, SAS/Graph®, Macros, ODS®, SAS/STAT®, etc.),
  • Version SAS : précisez les versions de SAS utilisées (V 8.2, V.9.1.3)
  • Système d’exploitation : avez-vous travaillé sous Unix ou sous Windows ?
  • Réalisations : quel sont les résultats concrets de votre travail ? Précisez notamment ceux que vous pourriez refaire : statistiques descriptives sous formes de tableaux, génération de listings, validation de macros, rédaction d’un manuel utilisateur, migration de données, développement de routines, etc.

4. Partagez votre connaissance du secteur d’activité et du métier de consultant : pour collectez des informations sur la pharmaceutique, la finance, les études marketing, vos rencontres et vos lectures vous seront précieuses. Bien sûr, il y a les stages et les projets universitaires. En plus, vous pouvez rencontrez des professionnelles lors de journées avec les anciens étudiants de votre école, lors de conférences utilisateurs. Sur le net, les blogs professionnels commencent à se développer. On trouve aussi des groupes de discussions et des newsletters. La presse généraliste et spécialisées peut donner une vue moins spécialisée SAS pour mieux comprendre les enjeux, l’évolution du marché et des acteurs principaux.

5. Montrez votre capacité à communiquer en anglais et à progresser : parlez de vos études à l’étranger, vos voyages scolaires, échanges entre villes jumelées, vos rencontres avec des anglophones via une association ou un tandem, votre temps passé à écouter la radio anglaise ou à voir des films et séries américaines.

6. Citez des exemples reflétant votre personnalité et vos aspirations : vos stages sont autant de chances d’argumenter ce stage argumenta t-il en ma faveur lorsqu’il s’agira … d’évoluer dans un secteur d’activité, de mobilité, de vivre dans une grande ville, de perfectionner une langue, de s’adapter à un environnement international,  multidisciplinaire. De plus le choix du lieu d’étude par rapport à votre domicile familial pourra valoriser votre mobilité. Vos loisirs valoriseront votre capacité à travailler en équipe, à faire preuve d’initiative, à communiquer par téléphone, à encadrer une équipe, …

Quelque soient vos choix dans votre parcours, l’important est de restez cohérent.

h1

La concaténation : 4 fonctions SAS 9

avril 16, 2008

Mettre des morceaux de textes à la suite les uns des autres et enregistrer le tout dans une variable, c’est ce qu’on appelle la concaténation. D’un côté, il y a la double barre. De l’autre côté, il y a les fonctions “CAT” disponibles depuis SAS 9. Voici donc un rapide tour d’horizon de ces notations.

A titre d’exemple, si vous avez plusieurs variables pour identifier de manière unique une ligne d’observations, vous pouvez construire une variable unique à partir d’une concaténation et ainsi manier plus facilement certaines fonctionnalités de la procédure SQL.

Pour illustrer ce sujet, on utilisera une variable x et une variable z sans blanc aux extrémités et une variable y avec des blancs avant et après sont utilisés.

x = ‘Pays’;
y = ’  UK  ‘;
z = ‘2008′;

A chaque fois, plusieurs notations sont proposées. Toutes donnent le même résultat.

1. La traditionnelle double barre : qu’il s’agisse de la double barre || ou des deux points d’exclamations !!, la concaténation requiert des valeurs textes (SAS Online Doc. : Section sur “Concatenation Operator”). Il faudra donc convertir les valeurs numériques avec une instruction PUT par exemple.

a1 = x ||  y || z ;

a1 = ‘Pays’ || ‘  UK  ‘ || ‘2008′;

a1 = ‘Pays’ || y || z;

a1 = ‘Pays UK 2008′;

Cette notation sert aussi pour la concaténation de matrices (SAS IML) et la définition d’un CALL EXECUTE.

2. Les fonctions CATS, CATX, CATS et CATT : ces fonctions varient en fonction de la place que l’on souhaite accorder aux blancs des différents maillons de la chaîne et si on souhaite ajouter des séparateurs. Elles disposent au moins d’autant de paramètres que de maillons formant la chaîne à créer. Chaque morceau de texte est séparé par une virgule. Si en plus on souhaite ajouter un séparateur entre les différents composants, un paramètre supplémentaire est listé en tête.

Sans blanc aux extrémités : personnellement, j’utilise le plus souvent la fonction CATS qui enlève les blancs aux extrémités. Cela revient à faire d’utiliser la double barre sans agir sur les maillons de la chaînes à construire (SAS Online Doc).

a2 = cats(x,y,z) ;

a2 = cats(‘Pays’,'  UK  ‘,’2008′);

a2 = cats(‘Pays’,y,z);

a2 = ‘PaysUK2008′;

Ajouter un séparateur : la fonction CATX enlève les blancs de début et de fin et ajoute des séparateurs entre chaque “mot”. Le symbole utilisé comme séparateur est le premier paramètre de la fonction (SAS Online Doc.).

a3 = catx(‘-’,x,y,z) ;

a3 = catx(‘-’,'Pays’,'  UK  ‘,’2008′);

a3 = catx(‘-’,'Pays’,y,z);

a3 = ‘Pays-UK-2008′;

Garder tous les blancs : la fonction CAT n’enlève pas les blancs au début et fin de texte de chacun des éléments de la concaténation (SAS Online Doc.).

a4 = cat(x,y,z) ;

a4 = cat(‘Pays’,'  UK  ‘,’2008′);

a4 = cat(‘Pays’,y,z);

a4 = ‘Pays  UK  2008′;

Enlever les blancs de fin uniquement : la fonction CATT enlève les blancs en fin de chaîne (SAS online Doc.). Le dernier T de CATT fait référence à “Trailing Blanks” c’est-à-dire les blancs de fin de chaîne.

a5 = catt(x,y,z) ;

a5 = catt(‘Pays’,'  UK  ‘,’2008′);

a5 = catt(‘Pays’,y,z);

a5 = ‘Pays  UK2008′;

Pour ma part, j’ai du mal à me souvenir qui fait quoi. L’important, dans un premier temps, est de savoir que ces fonctions existent. On recherche après, en tant voulu, l’information sur les nuances. Si, vous avez trouvez un moyen mnémotechnique pour mémoriser les différences, n’hésitez pas à le faire savoir.

h1

Combien d’observations dans mon data set ?

avril 14, 2008

Savoir trouver le nombre d’observations dans un data set SAS : tel est le sujet d’aujourd’hui. Connaître le nombre d’observations dans un jeu de données présente plusieurs avantages. En voici deux :

  • Définir une condition pour qu’un code soit exécuté.
  • Définir une boucle pour exécuter un code autant de fois qu’il y a d’observations dans le data set d’origine.

Dans les deux cas, on choisi ici de sauvegarder ce nombre dans une macro variable. Quelles sont les méthodes à disposition pour trouver ce nombre ? Je vous en propose d’en détailler six. Celles-ci fonctionnent également lorsque le data set est vide d’observations.

Exemples illustrés avec le data set ORIG : pour illustrer les différentes méthodes, j’utilise un jeu de données nommé ORIG ne contenant pas d’observations.

data orig;
   x=1;

   *if x=1 then output;
   if x=1 then delete;
run;

L’instruction %PUT permet de voir la valeur de mes macro variables dans la LOG.

1. La fonction COUNT dans PROC SQL : la procédure SQL et sa fonction COUNT permettent de retrouver le nombre total d’observations dans le data set lu, si on n’utilise pas de GROUP BY. L’étoile signifie ”TOUTES LES OBSERVATIONS”, indépendamment de la variable. Si le nombre d’observations est stocké dans une variable, la valeur s’affiche pour chaque observation. Comme cette valeur est la même pour toutes les observations, on peut n’en afficher qu’une seule via DISTINCT. On peut sauvegarder cette information dans une macro variable via INTO:. Si le DISTINCT n’est pas utilisé, seule la première valeur sera sauvegardé dans la macro variable. DISTINCT est donc optionnel dans ce cas précis.

proc sql noprint;
   select distinct count(*) into: methode1
   from orig;
quit;

%put METHOD 1 = &methode1. ;


2. SQLOBS, une macro variable automatique à utiliser avec précaution : lorsqu’un data set est créé avec une procédure SQL, on peut, juste après, retrouver l’information avec la macro variable automatique &SQLOBS. Il faut bien faire attention de ne pas inclure d’autres data sets entre temps, lors d’une mise à jour par exemple. SQLOBS récupère le nombre d’observations du dernier jeu de données quelque soit son nom.

proc sql ;
   create table methode2 as
   select *
   from orig;
quit;

%put METHODE 2 = &sqlobs. ;

3. Les métadonnées des dictionnaires SAS : le dictionnaire TABLES liste tous les data sets de toutes les bibliothèques et des informations supplémentaires les caractérisant. Ainsi la variable NOBS contient le nombre d’observations dans le data set. Ici on choisi INTO: pour sauvegarder ce nombre dans une macro variable.

proc sql noprint;
   select nobs into: methode3
   from dictionary.tables
   where upcase(libname)=’WORK’ and
        upcase(memname)=’ORIG’;
quit;

%put METHODE 3 = &methode3. ;

4. ATTRN comme “SAS Component Language” ou SCL : le SCL nommé ATTRN permet d’accéder au nombre d’observations. Pour cela, le nom du data set en question et le mot clé NOBS sont données. Ce SCL est accessible via %SYSFUNC. Pour lire le data set et extraire cette information, il faut au préalable, l’ouvrir et ensuite le fermer pour éviter des bugs, via les SCL OPEN et CLOSE. On réfère donc au data set via la macro variable DSID ouvrant le data set.

%let dsid     = %sysfunc(open(work.orig,in));
%let methode4 = %sysfunc(attrn(&dsid,nobs));
%if &dsid. > 0 %let rc = %sysfunc(close(&dsid));

%put METHODE 4 = &methode4. ;

5. La variable automatique _N_ : dans un data step, une variable nommée _N_ est créée automatique. Elle contient le nombre total d’itérations effectuées par SAS. Ainsi, si aucune donnée n’est lue, _N_=1. Une fois la lecture d’une observation faite par exemple, SAS revient juste après l’instruction DATA et _N_ est incrémenté de 1. Le nombre d’observations dans le data set est donc _N_-1. Ce nombre est sauvegardé ici dans une macro variable appelée METHODE5 créée via une instruction CALL SYMPUTX.

data_null_;
  call symputx(‘methode5′,_N_-1);
  set orig;
run;

%put METHODE 5 = &methode5. ;

6.  L’option NOBS de l’instruction SET : en précisant un nom après l’option NOBS= de l’instruction SET, la valeur de NOBS est sauvegardée dans une variable. Ici, elle s’appelle METHODE6. L’instruction CALL SYMPUTX permet de sauvegarder cette valeur dans une macro variable. La manière dont SAS traite le code est très importante ici. Sans IF 0, SAS ne créerait pas METHODE6 via NOBS= quand il n’y a pas d’observation dans le data set. L’instruction STOP permet d’écourter le temps d’exécution, en ne lisant que l’entête du data set et non ses données.

data _null_;
  if 0 then set orig nobs=methode6;
  call symputx(‘methode6′,methode6);
  stop;
run;

%put METHODE 6 = &methode6. ;

h1

2 syntaxes pour calculer un âge

avril 9, 2008

Quel âge à mon patient au début de l’étude ? Et mon client, quel âge a t-il lors de la signature de son contrat x ? Ces questions simples a priori peuvent vite devenir un casse-tête avec SAS. Je vous propose deux approches qui vous permettront d’aborder succinctement plusieurs fonctions. Les fonctions les plus facile à comprendre MONTH, DAY, YEAR, INT/FLOOR sont traitées sous forme de notes. Les fonctions de base pour le calcul de l’âge YRDIF et INTCK sont introduites dans des sections distinctes. On ne parlera pas ici de la manière de créer une date SAS.

Note : les fonctions YEAR, MONTH et DAY permettent de retrouver respectivement l’année, le mois et le jour d’une date SAS. Elles n’ont donc que la date comme paramètre.

Note : la fonction INT (pour le mot anglais “integer”) retourne la partie entière d’un nombre. La fonction FLOOR retourne l’entier inférieur. En rappel, ”floor” signifie le sol en anglais. Dans le cas d’entier positif, les fonctions INT et FLOOR donnent la même valeur. Cela s’applique donc à l’âge.

Présentation du jeu de donné utilisé comme exemple : pour illustrer ce calcul, je vous propose en fin d’article un data set avec :

  • une variable pour la date de début (strt_dt),
  • une autre pour la date de fin (end_dt).

1. La fonction YRDIF : la fonction YRDIF contient trois paramètres : la date de début, la date de fin et le mode de définition des mois et années. Dans notre cas, on choisira des mois et années comme sur le calendrier et non des mois de 30 jours ou des années de 360 jours. Le troisième paramètre aura donc la valeur ‘ACT/ACT’ ou son alias ‘ACTUAL’.

yrdiff_val = yrdif(strt_dt,end_dt,‘ACTUAL’);

La valeur retournée est un nombre avec des virgules. Or il nous faut un nombre entier. Pour ne retirer que la partie entière, on ajoute la fonction INT.

int_yrdiff_val = int(yrdif(strt_dt,end_dt,‘ACTUAL’));

Maintenant, dans le cas particulier du jour anniversaire, on se rend compte que selon qu’il s’agit d’une année bissextile ou non, on a une valeur supérieure ou inférieure à un. On ajoute donc une condition pour ce cas particulier. Si les mois et jours sont identiques, on fait la soustraction entre l’année de fin et celle de début.

if month(strt_dt) = month(end_dt) and
   day(strt_dt) = day(end_dt)
   then age_m1 = year(end_dt)-year(strt_dt);
else age_m1 = int(yrdif(strt_dt,end_dt,‘ACTUAL’));

2. Une seule instruction : calculer la date en une seule instruction, c’est possible. Le calcul a été répertorié sur le forum SAS-L. Je vous propose de la détailler ici.

2.1 La fonction INTCK : la fonction INTCK avec pour premier paramètre ‘month’ a pour valeur minimale 0.  On rencontre ce cas lorsque les mois et année des deux dates coïncident. Pour le même mois un an après, SAS retournera une valeur de 12.

cnt_mois = intck(‘month’,strt_dt,end_dt);

2.2 Comparer les jours : si le jour de début est supérieur au jour de fin, le mois entier ne s’est pas écoulé. On enlève donc un mois au calcul précédent. Le résultat de la parenthèse (day(strt_dt) > day(end_dt) est soit 0, soit 1.

comp_jr = day(strt_dt) > day(end_dt);

2.3 S’exprimer en années : comme on veut le résultat en années et non en mois, le tout est divisé par 12.

2.4 Avoir un nombre entier : l’individu prenant un an de plus seulement quand l’âge est révolu, seule la partie entière nous intéresse. Une fonction INT ou FLOOR fera l’affaire.

age_m2 = int((intck(‘month’,strt_dt,end_dt)-(day(strt_dt)>day(end_dt)))/12);

3. Illustration avec des données : En plus des variables strt_dt (start date) et end_dt (end date), les observations sous regroupées en 4 catégories (variable flag).

  • Les dates anniversaires,
  • La veille et le lendemain de ces dates anniversaires.
  • Des dates de début et de fin identiques.

Des années bissextiles et des années de 365 jours sont incluses.

data strt_end;
  length flag $3;
  format strt_dt end_dt date9.;
  informat strt_dt end_dt date9.;
  input strt_dt end_dt flag $;
  datalines;
02APR1979 02APR1980 =1
02APR1980 02APR1981 =1
02APR1981 02APR1982 =1
02APR1979 01APR1980 <1
02APR1980 01APR1981 <1
02APR1981 01APR1982 <1
02APR1979 03APR1980 >1
02APR1980 03APR1981 >1
02APR1981 03APR1982 >1
02APR1979 02APR1979 =0
02APR1980 02APR1980 =0
02APR1981 02APR1981 =0
;
run;

Dans cette sortie, on trouve les dates de début et de fin. Puis, on distingue d’un côté les deux variables illustrant la méthode 1 et ensuite celles de la méthode 2.

                   __METHODE 1__ ____METHODE 2____
                   yrdiff_ age_ cnt_ comp par_ age
strt_dt    end_dt   val     m1  mois _jr annee  m2


02APR1979 02APR1980 1.00205  1  12   0  1.00000  1
02APR1980 02APR1981 0.99795  1  12   0  1.00000  1
02APR1981 02APR1982 1.00000  1  12   0  1.00000  1

02APR1979 01APR1980 0.99932  0  12   1  0.91667  0
02APR1980 01APR1981 0.99521  0  12   1  0.91667  0
02APR1981 01APR1982 0.99726  0  12   1  0.91667  0

02APR1979 03APR1980 1.00478  1  12   0  1.00000  1
02APR1980 03APR1981 1.00069  1  12   0  1.00000  1
02APR1981 03APR1982 1.00274  1  12   0  1.00000  1

02APR1979 02APR1979 0.00000  0   0   0  0.00000  0
02APR1980 02APR1980 0.00000  0   0   0  0.00000  0
02APR1981 02APR1981 0.00000  0   0   0  0.00000  0

h1

Changer la séquence d’affichage des variables

avril 7, 2008

Pour changer l’ordre des variables dans un jeu de données, il faut demander à SAS de relire l’intégralité des données dans l’ordre souhaité. Deux méthodes sont disponibles : un data step ou une procédure SQL. Dans le cas particulier où les variables sont à afficher par ordre alphabétique, on pourra extraire la liste des variables des dictionnaires SAS et la sauvegarder dans une macro variable.

Je vous propose donc de voir l’approche avec le data step, puis celle avec la PROC SQL et enfin d’ajouter un exemple particulier utilisant en plus les dictionnaires.

1. Définir la séquence des variables dans un data step : l’ordre de lecture des noms de variables déterminera l’ordre d’apparition dans le jeu de données.

1.1 Une instruction INPUT : Dans l’exemple ci-dessous, où seule l’instruction INPUT est utilisée, la variable YR02 apparaît en premier suivie de YR00, YR99 et YR01. 

data one;
  input yr02 1-9 date9. yr00 11-20 date9. yr99 yr01 $;
  datalines;
02APR2002 21FEB2001 3.52 C
;
run;

1.2 Les instructions RETAIN, FORMAT, INFORMAT, LABEL, ATTRIB : maintenant, on ajoute avant l’instruction INPUT des instructions RETAIN, FORMAT, INFORMAT, LABEL et ATTRIB. Ainsi, on voit que ces instructions affectent l’ordre d’apparition des variables : YR98, YR99,… YR02.

data one;
  retain yr98 ‘REF’;
  format yr99 best.;
  informat yr00 date9.;
  label yr01=‘Annee 2001′;
  attrib yr02 format=date9.
              informat=date9.
              label=‘Annee 2002′;
  input yr02 yr00 yr99 yr01 $;
  datalines;
02APR2002 21FEB2001 3.52 C
;
run;

1.3 L’instruction SET : de la même manière, l’instruction SET défini l’ordre d’apparition des variables pas encore mentionnées.

2. Lister les variables dans une procédure SQL.

2.1 Lister les variables manuellement : les variables du jeu de données SASHELP.CLASS apparaissent dans l’ordre suivant : NOM, SEX, AGE, HEIGHT et WEIGHT. Pour changer cet ordre, avec une procédure SQL, il faut les lister individuellement. Dans l’exemple qui suit, les variables apparaissent par ordre alphabétique.

proc sql;
  create table class as
  select age, height, name, sex, weight
  from sashelp.class;
quit;

2.2 Automatiser la démarche : Si vous avez plus de 300 variables à lister, cela devient vite très contraignant. Pour rendre la tâche plus simple, on sauvegarde la liste des variables par ordre alphabétique dans une macro variable. Le nom de toutes les variables est disponible dans le dictionnaire TABLES.

proc sql noprint;
  select name into : var_lst separated by ‘, ‘
     from dictionary.columns
     where upcase(libname)=‘SASHELP’ and
           upcase(memname)=‘CLASS’
     order by name;
  create table class as
     select &
var_lst.
     from sashelp.class;
quit;

h1

5 options courantes de PROC REPORT

avril 4, 2008

Après avoir vu les notions de bases de PROC report, je vous propose 5 points de syntaxe que j’utilise régulièrement pour un résultat un peu plus personnalisé.

  • Les points 1 et 2 sont des options de l’instruction PROC REPORT.
  • Le point 3 concerne l’instruction COLUMN.
  • Les points 4 à 5 servent dans les instructions DEFINE.

En fin d’article, vous avez un exemple de syntaxe pour mieux cerner le tout.

1. Changer le symbole coupant les mots pour l’utiliser comme du texte : par défaut, la barre inclinée (/) est le symbole pour les sauts à la ligne dans le titre des colonnes et les valeurs textes. Du coup, si on veut considérer celui-ci comme du texte à part entière, il faut définir un autre caractère pour couper le texte. Par exemple, on peut utiliser le symbole dièse # dans l’option SPLIT=’…’ de l’instruction PROC REPORT

2. Affichez les valeurs manquantes : lorsque des valeurs sont groupées, SAS ignore par défaut les valeurs manquantes (missing et special missing). Pour changer cela, il faut précisez l’option MISSING dans l’instruction PROC REPORT, avec GROUP, ORDER ou ACROSS. Un exemple de la documentation en ligne illustre ce sujet. How PROC REPORT Handle Missing Values. Les valeurs manquantes d’ANALYSIS et DISPLAY restent affichées.

3. Un titre pour plusieurs colonnes : il est possible d’ajouter un titre commun à plusieurs colonnes. Pour cela, il faut agir sur l’instruction COLUMN. Les variables concernées sont listées entre parenthèses. Le nom commun est donné entre guillemets en premier dans les parenthèses.

4. Définir la largeur des colonnes : pour définir la largeur de la colonne, il existe l’option WIDTH=. Cette largeur peut ne pas être suffisante pour afficher tout le texte. Mais, heureusement, il y a l’option FLOW. Celle-ci fait apparaître le texte sur plusieurs lignes, s’il n’y a pas assez de place sur une seule. Cela évite à celui-ci d’être coupé.

Même si, a priori, le texte est contenu dans la largeur défini, il est donc conseillé d’utiliser l’option FLOW pour éviter des coupures involontaires ou repérer plus facilement des textes plus longs que prévus.

5. Et les formats ? : Les formats s’utilisent indifféremment en option dans les instructions DEFINE avec un signe égal ou dans une instruction FORMAT.

Exemple :

proc report data=mesresultats nowd
split=‘#’
missing;
column pays patient_id
(‘Statistiques’ cnt pct);
define pays / display ‘Pays’
format=$cntry.;
define patient_id / display ‘ID’;
define cnt / display ‘N’;
define pct / display ‘%’;
*format pays $cntry.;
run;

NOTE 1 : Les options HEADLINE, HEADSKIP et les tirets bas pour entourer un titre commun à plusieurs colonnes n’ont pas été mentionnés ici car ils perdent leur intérêt avec un ODS RTF.

NOTE 2 : La modification de l’apparence peut-être amélioré en changer le “style” au niveau local c’est-à-dire dans la procédure REPORT ou au niveau global, en créant ou actualisant le Template de la procédure REPORT. Cela pourrait faire l’objet de plusieurs articles tant le sujet est vaste.

h1

6 conseils pour un CV bilingue anglais

avril 2, 2008

Aujourd’hui parler l’anglais, ce n’est pas un plus, c’est un pré-requis, comme savoir écrire et savoir allumer un ordinateur. Dans le monde SAS, l’anglais aussi un besoin pour lire et rédiger des supports en anglais, pour dialoguer avec des collègues de différents pays. Comme parvenir à progresser en anglais et à enrichir votre CV ?

1. Etudiez à l’étranger : une année d’échange à l’étranger est de plus en plus accessible et de plus en plus courant. Les universitaires ont fait de gros progrès en matière d’équivalence, d’administration et de financement.

2. Voyagez constructif : les voyages scolaires sont une première immersion dans un environnement différent. En outre, les échanges entre villes jumelées sont le moyen d’aborder des thèmes qui vous est propre (exemple : jouer lors d’un concert dans le pays d’accueil).

3. Participez à des activités avec des membres associatifs anglophones : les anglais s’installant en France sont de plus en plus nombreux. Des associations organisent des activités avec eux et ceux ayant un intérêt pour l’Angleterre et/ou la langue anglaise. C’est un bon moyen de parler anglais et d’échanger sur une culture. J’ai connu une association EuroMayenne qui propose au niveau de ce département ce type de rencontres.

4. Sirotez un verre en parlant anglais via un tandem : la moitié d’une discussion en anglais, l’autre en français, le tout en sirotant un verre, c’est possible avec les tandems. Fouinez sur le net pour rencontrer des anglophones voulant progresser en français. En Allemagne, par exemple, on utilise www.sprachtausch.net.

5. Façonner votre oreille en écoutant la radio : apprendre une langue ce n’est pas toujours un travail conscient et actif. Ecoutez en font sonore la radio anglais via Internet et votre oreille s’adaptera au fil du temps à la prononciation et mémorisera du vocabulaire. Vous vous surprendrez à utiliser des mots qu’a priori vous n’avez jamais rencontrés : www.bbc.co.uk/radio

6. Ecoutez les films et séries américaines en langue originale : se faire plaisir est essentiel pour apprendre une langue. Alors pourquoi ne pas regarder des films et séries américaines qui vous plaisent en langue originale. En complément, le sous-titrage en langue anglaise est un bon moyen pour aider le cerveau à faire coïncider un son à une écriture.