Posts Tagged ‘SAS’

h1

Les fonctions put et input – un sujet épineux

novembre 23, 2022

Découvrir le cours sur Udemy

Pour convertir une valeur du caractère au numérique et inversement, ou encore du caractère au caractère / du numérique au numérique, il est courant de passer par les fonctions put et input. Grâce à ces fonctions historiques et aux nouvelles fonctions putn, putc, inputn et inputc, il est possible de changer le type d’une variable, sélectionner des observations en fonction de valeurs formatées, de gagner en performance en évitant le tri imposé par un merge, d’afficher la date du jour dans un nom de fichier, dans un titre, et encore plus de chose.

Mais il y a des pièges. Comment s’assurer que les valeurs obtenues ne soient pas tronquées, ou encore pire, involontairement modifiées ? Comment repérer les valeurs présentent uniquement dans les formats mais pas dans les données ?

Dans ce cours, on part de la base afin de savoir choisir la bonne fonction et le bon format/informat en fonction de son besoin. À la fin de la première partie, vous saurez déjà comment convertir du caractère au numérique… En programmation, le diable se cache dans les détails. Dans la seconde partie, nous verrons tous ces cas particuliers qui font la richesse mais aussi la difficulté de ces fonctions. Les utilisateurs SAS débutants comme les programmeurs expérimentés y trouveront leur compte.

Le coupon de promotion pour le lancement de ce cours est valable jusqu’au 15 décembre 2022 : UPGRADE2022

et partager l’information à un ami ! Code promo : UPGRADE2022

h1

La fonction CATQ pour concaténer tout en ajoutant des guillemets avec SAS 9.3 et plus

février 23, 2019

La fonction catq est disponible depuis SAS 9.3. La particularité de cette fonction est de pouvoir ajouter des guillemets simples (single quotes) ou des guillemets doubles (double quotes) autour des différentes valeurs à concaténer.

Un des avantages de la fonction catq est de pouvoir travailler autant avec les valeurs numériques qu’avec les valeurs caractères. On fera néanmoins attention aux valeurs infinies comme 1/3.

Exemple 1

data catq;
    x=catq('1' ,'ABC ',2," EFG",' ');
    put x=;

    x=catq('2' ,'ABC ',2," EFG",' ');
    put x=;
run;

Dans ce premier exemple, on voit que le 1 permet d’ajouter des guillemets simples alors que le deux permet d’ajouter des guillemets doubles. Dans le cas présent, seules les valeurs caractères ont des guillemets.

x='ABC ' 2 ' EFG' ' '
 x="ABC " 2 " EFG" " "

Exemple 2

data catq;
   x=catq('1'     ,'ABC ',2," EFG",' '); 
   put x=;

   x=catq('1a'    ,'ABC ',2," EFG",' '); 
   put x=;
 
   x=catq('1c'    ,'ABC ',2," EFG",' '); 
   put x=;
   
   x=catq('1ac'    ,'ABC ',2," EFG",' '); 
   put x=;
run;

Dans ce second exemple, on voit que la lettre a pour que toutes les valeurs soient entre guillemets, y compris les valeurs numériques.

Si on souhaite ajouter la virgule (comma) entre les différentes valeurs à concaténer avec la lettre c, il faudra impérativement garder la lettre a.

 x='ABC ' 2 ' EFG' ' '
 x='ABC ' '2' ' EFG' ' '
 x=ABC ,2, EFG,
 x='ABC ','2',' EFG',' '

Exemple 3

Une autre manière d’ajouter la virgule comme séparateur entre les valeurs est d’utiliser la lettre d (delimiter) et de préciser le séparateur dans le second argument de la fonction ; cet argument est optionnel et ne servira qu’avec la lettre d.

data catq;
   x=catq('c','ABC ',2," EFG",' '); 
   put x=;

   x=catq('d',',','ABC ',2," EFG",' '); 
   put x= /;
  
   x=catq('1ac','ABC ',2," EFG",' '); 
   put x=;

   x=catq('1ad',',','ABC ',2," EFG",' '); 
   put x=;
run;

Nous obtenons le même résultat qu’on utilise c ou d avec l’argument optionnel. La lettre d offre juste plus de possibilités.

 x=ABC ,2, EFG,
 x=ABC ,2, EFG,
 x='ABC ','2',' EFG',' '
 x='ABC ','2',' EFG',' '

Exemple 4

Lorsqu’on n’a pas besoin des guillemets autour des différentes valeurs à concaténer, la fonction catq se rapproche de la fonction catx.

data catq;  
   x=catq('d',',','ABC ',2," EFG",' '); 
   put x=/;
   
   x=catq('ds',',','ABC ',2," EFG",' '); 
   put x=;
   
   x=catx(',','ABC ',2," EFG",' ');
   put x=/;
   
   x=catq('dt',',','ABC ',2," EFG",' '); 
   put x=;
run;

Pour enlever les leading et trailing blanks avec la fonction catq, on ajoutera la lettre s (strip).
Pour uniquement enlever les trailing blanks avec la fonction catq, on ajoutera la lettre t (trim).

 x=ABC ,2, EFG,
 x=ABC,2,EFG
 x=ABC,2,EFG
 x=ABC,2, EFG

Aller plus loin

La fonction dispose d’autres arguments pour travailler avec les literals (lettre n), pour afficher les valeurs en hexadecimal (lettre x), pour utiliser une tabulation horizontale comme séparateur (lettre h), etc.
Toutes les informations sont disponibles dans la documentation en ligne : http://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm

À lire aussi

h1

SAS : obtenez des couleurs sympas dans vos rapports en 5 minutes

août 20, 2018

h1

A partir de quelle lettre y a-t-il une différence : la fonction compare

mai 25, 2015

La fonction COMPARE retourne le nombre zéro si aucune différence n’existe entre deux chaînes de caractères. Sinon elle retourne la position la position du premier caractère différent.

Dans l’exemple ci-dessous, deux datasets sont créés. Une fois combinés, on s’intéresse à la différence entre la variable LABEL_ONE du premier dataset et la variable LABEL_TWO du second dataset. La première différence a lieu sur la deuxième lettre. La variable DIFF prend donc la valeur 2.

data one;
   length start $8 label_one $8;
   start='1';
   label_one='ABC';
run;

data two;
   length start $8 label_two $8;
   start='1';
   label_two='AbC';
run;

data diff;
   merge one two;
   by start;
run;

data diff;
   set diff;
   diff=compare(label_one,label_two);
run;

proc print data=diff;
run;

Vous pouvez ajouter un troisième paramètre dans la fonction si vous ne voulez pas tenir compte des différences de majuscule, de blancs de début de chaîne de caractère,…

Dans quel cas utiliser cette fonction ? Si vous réalisez un rapport listant la différence entre deux valeurs pour pouvoir ensuite les corriger, vous pouvez utiliser cette fonction pour préciser à partir de quel moment la couleur devra changer.

Pour en savoir plus : la documentation SAS 9.2

h1

Passer de CLASS CLAS à « CLASS » « CLAS » dans une macro variable

février 1, 2013

Mettre toutes les mots contenus dans une macro variable entre guillemets (quote en anglais) est un tâche plus fréquente qu’elle n’y paraît.
Une vois le code écrit, il est souvent plus rapide de faire du copier/coller et ensuite de modifier. Voici un exemple où DSN=CLASS CLAS sert à créer DSN_QUOTE= »CLASS » « CLAS ».

1. Exemple dans une macro

Dans l’exemple, la macro est PRINTDSN. Elle a pour tâche d’imprimer dans la log tous les datasets présents dans la bibliothèque SASHELP qui sont cités dans le paramètre de macro DSN, s’ils existent.

%macro printdsn (dsn=);

%let dsn      =%upcase(&dsn.);
%let dsn_quote=%sysfunc(tranwrd(%nrstr(%")&dsn.%nrstr(%"),%str( ),%str(" ")));

proc sql;
 create table ref as
 select memname
 from dictionary.tables
 where upcase(libname)='SASHELP' and
       upcase(memname) in (&dsn_quote.);
quit;

data _null_;
 set ref;
 call execute ('proc print data=sashelp.' || memname || ';');
 call execute ('run;');
run;
%mend printdsn;
%printdsn(dsn=class clas);

Pour ma part j’ai pris l’habitude de mettre le contenu des macros paramètres en majuscule, et ce dès le début du programme, sauf besoin spécifique contraire. Ceci explique la ligne %let dsn=upcase(&dsn.);

De plus j’ai pris l’habitude de rajouter le suffixe _quote au nom de la macro variable. Dans notre exemple il y a la macro variable DSN mise en majuscule. Cette variable est ensuite mise entre guillemets.

La macro fonction %sysfunc() permet d’utiliser la fonction tranwrd dans une expression macro. La fonction tranwrd est composée de trois paramètres :

  1. le texte d’origine entre guillemets
  2. le partie de texte à remplacer dans cette chaîne de caractères
  3. le texte de remplacement

2. Le même exemple sans macro

L’exemple est présenté dans une macro. Pour tester le code, un simple %let et %put feront l’affaire. Le résultat s’affiche alors dans la log.

%let dsn=CLASS CLAS;
%let dsn_quote=%sysfunc(tranwrd(%nrstr(%")&dsn.%nrstr(%"),%str( ),%str(" ");
%put &dsn_quote.;
h1

SAS 9.2. : WARNING avec PROC SQL et l’option UNDO_POLICY=NONE

janvier 6, 2013

Depuis SAS 9.2, un nouveau WARNING apparaît dans la log quand le nom de la table SAS d’entrée est le même que le nom de la table SAS de sortie. Pour éviter ce message, l’option undo_policy=none est à ajouter dans l’instruction proc sql;. SAS support prévient néanmoins que l’usage du même nom en entrée et en sortie présente un risque et que l’option enlève l’avertissement mais pas le risque.

1. Le message dans la log

WARNING: CREATE TABLE statement recursively references the target table

 

2. Exemple

Ce code générerait le warning avec SAS 9.2 si l’option undo_policy=none n’était pas utilisée.

proc copy in=sashelp out=work;
   select class;
run;

proc sql undo_policy=none;
   create table class as 
   select name, age
   from class;
quit;

 

En savoir plus

h1

Aller-Retour entre dataset et catalogue de formats avec CNTLIN en CNTLOUT

décembre 29, 2012

Dans un précédent article, je parlais des deux méthodes pour créer des formats avec une procédure proc format, la première étant de taper toutes les values dans une instruction value, la seconde étant de stocker ces valeurs dans un data set et de les convertir en format avec l’option cntlin. Aujourd’hui, je souhaite revenir sur l’option CNTLIN et son pendant CNTLOUT pour passer d’un dataset à un format et pour passer d’un format à un dataset.

1. Créer une table SAS (dataset) type

Pour débuter créons un data set (table SAS) appelée POP avec 4 colonnes START, LABEL, TYPE et FMTNAME. Cette table contient les données pour deux formats : un format numérique et un format alphanumérique. Ces deux formats sont appelés GRP.

data pop;
length start $40 label $200 type $1 fmtname $32;
retain fmtane 'GRP' type 'N';
start='10';
label='Per Protocol';
output;
start='11';
label='Modified Per Protocol';
output;
start='20';
label='Intent-to-Treat';
output;
start='21';
label='Modified Intent-to-Treat';
output;
type='C';
start='PP';
label='Per Protocol';
output;
start='mPP';
label='Modified Per Protocol';
output;
start='ITT';
label='Intent-to-Treat';
output;
start='mITT';
label='Modified Intent-to-Treat';
output;
run;

S’il est possible de convertir de convertir le nombre 100 stocker dans une variable alphanumérique en numérique, il est impossible de convertir le mot ABC en numérique. Dans cet exemple on comprend mieux pour quoi START est toujours alphanumérique qu’il s’agisse dun format numérique ou alphanumérique.

2. Passer d’un dataset à un format catalog

A présent la procédure proc format convertit le data set en format catalogue. Le data set est situé dans la bibliothèque (library) WORK. Il n’y a pas besoin de préciser la bibliothèque de la table POP. Par défaut le format catalog s’appellera FORMATS et sera stocké dans la bibliothèque WORK. L’option LIB n’est pas utilisé.

proc format cntlin=pop;
run;

Ainsi le code au dessus est équivalent à :

proc format cntlin=work.pop lib=work.formats;
run;

Le code proposé ci-dessus est uniquement là pour faciliter la compréhension. Sauf besoin particulier, la version simplifiée doit suffire.

3. Passer d’un format catalog à un dataset

Dans un second temps, je vous propose de convertir ce format dans un autre dataset.

proc format cntlout=pop2; 
run;

Ainsi le code au dessus est équivalent à :

proc format cntout=work.pop2 lib=work.formats; 
run;

A vous de jouez avec les proc print et librairies pour voir la résultat.

4. Rappel sur le nom du format

Notez ici que le nom du format est au maximum long de 32 caractères en  SAS 9.1.3 / SAS 9.2  et limité à 8 caractères pour la version SAS 8.2. Pour être plus précis, on a 32 caractères pour un format numérique et 31 caractères pour un format alphanumérique en SAS 9.1.3 et SAS 9.2, SAS gardant un caractère pour le symbole dollar $. SAS 8.2 fonctionnait sur le même principe : 8 caractères pour un format numérique et 7 caractères pour un format alphanumérique. Si le nom du format était trop long en SAS 8.2, SAS le coupe à la longueur maximum. Ainsi les nom  ALPHABETA et ALPHABETI sont interprétés pas SAS 8.2 en FMTNAME=ALPHABET pour un format numérique.

Aller plus loin

h1

Protégé : Newsletter Exercices – n°1 : Solution

juillet 14, 2012

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

h1

5 points pour rendre la maintenance d’un programme la plus inaperçu possible pour l’utilisateur

mars 4, 2012

La maintenance des programmes est toujours mieux acceptée si les utilisateurs sont informés au préalable et si la durée de l’intervention est limitée dans le temps. Voici cinq points qui rendront l’intervention plus douce.

  1. S’il est préférable de faire une maintenance de programme dans un environnement de développement, il est parfois plus rapide de faire certains changements directement en production après avoir fait une copie des fichiers d’origine, surtout les changements rapides. L’utilisateur est dans l’indisponibilité d’utiliser le programme durant cet intervalle de temps.
  2. Idéalement la maintenance sera planifiée. Les utilisateurs seront informés une semaine à l’avance par email de la date et durée d’indisponibilité. Ils pourront ainsi adapter leur travail en fonction.
  3. Le créneau horaire sera choisi de préférence en dehors des heures d’utilisation les plus fréquentes (le week-end, le matin, le soir).
  4. Un email informera du début de la maintenance.
  5. Un autre email confirmera la fin de la maintenance et donc la remise à disposition du service.
h1

SAS 9.2 Souligner ou barrer un texte dans une table en sortie ODS

juillet 14, 2011

Avec SAS 9.2 il est maintenant possible de souligner/barrer des valeurs d’une table dans une sortie ODS et plus seulement dans le titre.

L’exemple est basé sur une sortie .pdf. TEXTDECORATION=UNDERLINE souligne les valeurs. TEXTDECORATION=LINE-THROUGH barre les valeurs et TEXTDECORATION=OVERLINE (usage très rare a priori) ajoute une ligne au dessus du texte.

ods listing close;
ods pdf file=‘c:/sasref’;
proc print data=sashelp.class;
var name / display style(column)=[textdecoration=underline];
var sex / display style(column)=[textdecoration=line-through];
var age / display style(column)=[textdecoration=overline];
run;
ods pdf close;
ods listing;

Lecture complémentaire

SUGI, pour visualiser le résultat : http://www2.sas.com/proceedings/sugi31/227-31.pdf

h1

Deux exemples d’usage de la syntaxe de l’ODS : PROC PRINT et PROC REPORT

juin 26, 2011

Jusqu’à présent, j’ai présenté la syntaxe de l’ODS (Output Delivery System) de SAS avec la procédure PROC REPORT pour générer vos tableaux dans des fichiers .rtf (ODS RTF), .pdf (ODS PDF) ou en XML avec extension .xls (ODS TAGSETS.EXCELXP).

PROC PRINT se révèle dans les cas les plus simples aussi avantageux. Voici deux fichiers .pdf contenant la même table, une fois générée avec PROC REPORT et une fois avec PROC PRINT.

ods listing close;

*1. Exemple de l’ODS avec PROC REPORT;

ods pdf file=‘O:/sasref/exemple_report.pdf’;
proc report data=sashelp.class nowd;
columns sex age;
define sex / display style(column)=[cellwidth=2cm];
define age / display style(column)=[cellwidth=3cm];
run;
ods pdf close;

*2. Exemple de l’ODS avec PROC PRINT;

ods pdf file=‘O:/sasref/exemple_print.pdf’;
proc print data=sashelp.class nobs;
var sex / style(column)=[cellwidth=2cm];
var age / style(column)=[cellwidth=3cm];
run;
ods pdf close;

ods listing;

h1

Protégé : Exercice : Insérer de nouvelles observations dans une table (niveau A)

juin 2, 2011

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

h1

SAS 9.2 et PROC SORT : Quel est l’effet de l’option – sortseq=ascii (numeric_collation=on) ?

avril 10, 2011

Recherchez l’effet de l’option SAS 9.2 de la procédure PROC SORT : sortseq=ascii (numeric_collation=on),  une option qui manquait vraiment pour le tri de variables alphanumérique.

Pour cela, il vous suffit d’exécuter l’exemple suivant.

data one;
length x $10;
input x $;
datalines;
1
10
A
a
b
B
20
2
;
run;

proc sort data=one
out=nooption;
by x;
run;

proc sort data=one
out=withoption
sortseq=ascii (numeric_collation=on);
by x;
run;

title ‘No option’;
proc print data=nooption;
run;

title ‘With option’;
proc print data=withoption;
run;

Lecture Complémentaire

  • Trier les données par ordre croissant et décroissant
  • Tout sur l’instruction BY
  • SAS Online Doc 9.2: The PROC SORT Procedure
  • h1

    Plusieurs formats pour une variable numérique – passer à une variable caractère avec la fonction PUTN

    octobre 14, 2010

    Découvrez le cours de novembre 2022 : Les fonctions put et input – un sujet épineux

    Dans cet article que vous propose une illustration de la fonction PUTN. En effet une variable numérique peut contenir des groupes de valeurs. Chaque groupe de valeurs se réfère à un format donnée. Le nom de ces formats est disponible dans une autre variable. La question est alors comment puis-je créer une variable caractère équivalent simplement, sans boucle, sans if-then, etc. La solution : la fonction PUTN. Voici un exemple pour illustrer le propos.

    1. Le problème en exemple

    Dans cet exemple, deux formats numériques AGE et SEX exitent.

    proc format;
    value age 11-13=’11-13′
    14-16=’14-16′;
    value sex 1=‘Male’
    2=‘Female’;
    run;

    Dans un data set, ONE, trois variables existent :

    • CRITERIA : les critères sont AGE et SEX dans l’exemple.
    • CODLST : le nom des formats qui expliquent les valeurs numériques sont enregistrés dans la variable CODLST.
    • VALN: les valeurs numériques associées aux critères sont disponibles dans la variable VALN.

    data one;
    length criteria $8 codlst $8;
    input criteria $ codlst $ valn;
    age age 12
    sex sex 1
    ;
    run;

    L’objectif est de créer une variable VALC qui contienne l’équivalent alphanumérique de VALN (la valeur donnée dans le label du format).

    2. La solution proposée : PUTN

    data two;
    set one;
    length valc $20;
    VALC=putn(valn,codlst);
    run;

    3. Le résultat attendu

    criteria codlst valn valc

    age      age    12   11-13
    sex      sex    1    Male

    Ici les formats sont tous numériques. La fonction PUTN est utilisée.
    Pour des formats alphanumériques, il faudra se servir de la fonction PUTC.

    Allez plus loin

    Découvrez le cours de novembre 2022 : Les fonctions put et input – un sujet épineux

    h1

    Répéter la valeur d’une variable sur chaque page avec ODS RTF

    septembre 26, 2010

    Il y a un peu plus d’un mois, je vous parlais de l’option SPANROWS de PROC REPORT pour pouvoir répéter une valeur groupée sur chaque page du listing.

    Mais si vous devez créer un fichier .RTF et non un fichier .PDF ou si vous n’avez pas SAS 9.2, vous pouvez vous rabattre sur cette solution.

    Elle présente le seul inconvénient de séparer la table en table distincte à chaque nouvelle valeur du la variable groupée.

    Voici donc un exemple à tester par vous même.

    1. Le setting

    Par simple soucis de présentation, quelques instructions de paramétrage sont données.

    • Enlever le titre par défaut avec l’instruction TITLE.
    • Enlever la date et le numéro de page par défaut et alignez le résultat à gauche.
    • Créer un format caractère SEX où M réfère à Garçon et F à Fille.


    *——————————————–;
    * Setting;
    *——————————————–;

    title;
    options nodate nonumber nocenter;

    proc format;
    value $ sex ‘M’=‘Garçon’
    ‘F’=‘Fille’;
    run;

    2. Préparation des données

    Afin d’avoir assez de données le fichier CLASS est multiplié par 5. Les noms sauvegardés dans la variable NAME sont incrémentés d’un nombre.

    *——————————————–;
    * 2. Data Preparation;
    *——————————————–;

    data class;
    set sashelp.class;
    output;
    name=cats(name,’1′);
    output;
    name=cats(name,’2′);
    output;
    name=cats(name,’3′);
    output;
    name=cats(name,’4′);
    output;
    name=cats(name,’5′);
    output;
    run;

    3. Reporting;

    Vos données doivent être triées afin d’utiliser l’instruction BY dans PROC REPORT.

    L’option d’ODS RTF STARTPAGE=NEVER empêchera le passage à une nouvelle feuille à chaque nouvelle valeur de la variable SEX.

    Au moyen des options COMPUTE/ENDCOMP, il est possible de personnaliser le texte en début de chaque page. Un texte aligné à gauche est ajouté. Une ligne avant et une ligne après sont ajoutées pour faciliter la lisibilité du rapport. Ce texte est composé de « SEXE :  » suivi de la valeur formatée de la variable SEX.

    *——————————————–;
    * 3. Reporting;
    *——————————————–;

    proc sort data=class;
    by sex;
    run;

    *options nobyline;

    ods rtf file=’C:/…/test1.rtf’ startpage=never;
    proc report data=class;
    by sex;
    column sex name;
    define sex  / /*id*/ group noprint ;
    define name / display  ‘Nom’;

    compute before _page_ /style=[just=left] ;
    line ‘ ‘;
    line @1 ‘Sexe:’ @6 sex $sex. ;
    line ‘ ‘;
    endcomp;

    run;

    ods rtf close;

    h1

    Avec ODS, comment ajouter des caractères spéciaux ≤ et ≥

    septembre 19, 2010

    Comment inclure dans un rapport généré par ODS les symboles ≤ et ≥ ? En effet, ils ne font pas parti des caractères spéciaux ASCII classiques, il s’agit de caractères dépendants d’une police de caractères en particulier : la police « symbol ».

    SAS propose un article sur le sujet. Je vous propose de détailler l’exemple utilisé qui a été utilisé avec SAS 8.2 sous environnement DBCS.

    1. Setting

    Dans cette instruction ODS ESCAPECHAR, est précisé que l’accent circonflexe sera utilisé, non pas comme simple caractère, mais comme caractère introduisant une notation particulière pour le style.

    ods escapechar= »^ »;

    Un format appelé TEMP est créé. La valeur 11 aura un label composé du symbole « inférieur ou égal ».

    • Le symbole « inférieur ou égal » en lui même est introduit par le code hexadécimal A3.
    • Pour que ce que code corresponde à « inférieur ou égal », il faut utiliser la police de caractère, d’où le code font_face=symbol.
    • Avant A3, on change le style et en particulier la police de caractère. Notez ici l’accent circonflexe introduit précédemment pour entrer la police.
    • Après A3, on arrête d’utiliser cette police.

    proc format;
    value temp 11=‘The value is ^S={font_face=symbol}’ « A3″x ‘^S={} the value’;
    run;

    2. Reporting

    A présent SAS va écrire tout ce qui suite dans un fichier temp.rtf. Vous avez ici seulement besoin de préciser le chemin d’accès au fichier dans les guillemets.

    Le résultat s’affichera correctement dans votre fichier .RTF mais pas dans votre sortie listing classique. Autant fermer cette destination avec ODS LISTING CLOSE.

    ods listing close;

    ods rtf file=‘temp.rtf’;

    Les deux tableaux imprimé se basent sur la table CLASS dans la bibliothèque SASHELP.

    Dans le premier cas, le format créé précédemment est appliqué à la variable AGE. On aura dont le label de format défini précédemment quand AGE=11.

    title ‘This uses the special characters in the value’;
    proc print data=sashelp.class;
    format age temp.;
    run;

    Dans ce second exemple, le symbole « supérieur ou égal » est introduit avec le code hexadécimal B3 d’où « B3″x.

    Comme précédemment, il est entouré de ^S={font_face=symbol} avant et ^S={} après.

    Cette fois ci pas contre le symbole est ajouté dans le label d’une variable. Chacun des groupes de mot est donc mis entre guillemets.

    title ‘This uses the special characters in the label’;
    proc print data=sashelp.class label;
    label age=« Age » « ^S={font_face=symbol} » « B3″x « ^S={} » « 10 »;
    run;

    Enfin, on précise de former le fichier .rtf et donc de ne plus ajouter d’info dedans à partir de maintenant.

    ods rtf close;

    ods listing;

    Source : Usage Note 24054: In ODS, how can I add special characters such as GE or LE to my output?

    Lecture complémentaire

    h1

    Avez-vous pensé à lire votre log de manière automatique

    septembre 12, 2010

    Vous savez comment lire un fichier .txt avec SAS mais avez-vous déjà envisager lire votre programme ou encore votre log et d’en faire un data set pour pouvoir fouiner un peu dedans ? Voici donc un exemple très basique côté programmation mais qui peut se révéler très utilise si vous faites preuve d’un peu d’imagination.

    1. Commentaires sur l’exemple

    Dans l’exemple qui suite la log sauvegardée de manière permanente sur le disque dur est importée dans SAS. Une ligne est égale à une observation. Le délimiteur est le caractère hexadécimal 09. Le nombre maximum de caractères par observation est ici de 1000. A vous de trouver la valeur qui vous semble la mieux appropriée pour éviter que le texte soit coupé sans pour autant sur-consommer votre capacité de stockage.

    2. L’exemple

    data mylog;
    infile ‘c:/sasref/test.log’ dlm=’09’x;
    length x $1000;
    input x $;
    run;

    3. Aller plus loin

    Ensuite pour vous entraîner, sortez les lignes où il y a le mot NOTE, les lignes avec le mot REAL TIME ou encore les lignes contenant un mot-clé qui vous est propre à l’aide de fonctions caractères.

    Dans ce dernier cas, vous pouvez inclure dans votre programme les titres des grandes rubriques de votre programme et ensuite les extraire avec cette méthode. Pratique pour retrouver rapidement la structure d’ensemble de son programme, mettre à jour son en-tête, etc.

    Lectures complémentaires

    h1

    Des options pour se débarrasser de WARNING de SAS 9.2

    août 18, 2010

    Avec SAS 9.1.3 et SAS9.2 de nouveaux warning apparaissent. En voici deux que vous pouvez faire disparaître dans le cas où ils ne reflètent pas un problème dans votre programme.

    1. Avec PROC SQL, je crée une nouvelle table du même nom que la table source.
    2. Dans un data set je réduis la longueur d’une variable

    1. Utiliser le même nom de data set en entré et en sortie avec PROC SQL

    Pour illustrer le sujet, je vais d’abord créer un data set appelé ONE avec deux variables X et Y.

    data one;
    x=‘A’;
    y=‘B’;
    run;

    Ensuite je vais créer avec PROC SQL un nouveau data set du même nom ONE qui ne contiendra que la variable X.

    proc sql;
    create table one as
    select x
    from one;
    quit;

    Le message dans la log ressemble à ceci:
    WARNING: This CREATE TABLE statement recursively reference the target table. A consequence of this is a possible data integrity problem.

    Pour ne plus avoir ce message dans la log, ajouter l’option UNDO_POLICY=NONE

    proc sql undo_policy=none;
    create table one as
    select x
    from one;
    quit;

    Ce cas existe depuis SAS 9.1.3.

    2. Réduire la longueur d’une variable dans une étape data

    Une solution pour changer la longueur d’une variable est de définir sa longueur dans une instruction LENGTH avant de lire les données avec un SET par exemple.

    Depuis SAS 9.2, si la nouvelle longueur est plus petite que l’ancienne un WARNING apparaît dans la log. Ceci est une bonne chose car cela vous permet de repérer d’éventuelles coupures (truncations) de vos données.

    Dans certains cas cependant, vous savez pertinemment que le nombre de caractères dans données est au plus X et que dès lors elles ne seront pas coupées en réduisant la longueur.

    Vous pouvez vous épargner le warning en encadrant votre étape data des options globales VARLENCHK=nowarn et VALENCHK=warm.

    Je vous conseille d’appliquer cette option localement afin de pouvoir continuer à repérer d’autres coupures potentielles non prévues.

    data two;
    length x $32;
    x=‘A’;
    run;

    data two_a;
    length x $1;
    set two;
    run;

    WARNING : Multiple lengths were specified for the variable x by input data set(s). This may cause truncation of data.

    options varlenchk=nowarn;
    data two_b
    length x $1;
    set two;
    run;
    options varlenchk=warn;

    Notez cependant, qu’avec SAS 9.1.3 ou SAS 9.2, un warning apparaît dès lors que la variable est donnée dans une instruction BY. L’option VARLENCHK de SAS 9.2 ne vous enlèvera pas le warning. Je vous conseille donc de changer votre longueur au préalable si vous ne voulez pas ce WARNING.

    data two_b;
    length x $1;
    set two;
    by x;
    run;

    WARNING: Multiple lengths were specified for the BY variable x by input data sets and LENGTH, FORMAT, INFORMAT statements. This may cause unexpected results.

    Lectures complémentaires :

    h1

    Une option SAS 9.2 pour ODS PDF : répéter une valeur groupée sur plusieurs pages

    août 3, 2010

    Lorsque vous construisez un listing avec ODS PDF et PROC REPORT l’option GROUP de l’instruction DEFINE sert à n’afficher chaque valeur de la variable concernée qu’une seule fois.

    Hors, si cette valeur s’applique aux observations de plusieurs pages, elle ne sera pas répétée à moins d’ajouter l’option SPANROWS nouvelle avec SAS 9.2.

    Cette options ne fonctionne pas actuellement avec ODS RTF.

    Voici un exemple pour tester par vous même.

    1. Le setting

    Par simple soucis de présentation, quelques instructions de paramétrage sont données.

    • Enlever le titre par défaut avec l’instruction TITLE.
    • Enlever la date et le numéro de page par défaut et alignez le résultat à gauche.
    • Créer un format caractère SEX où M réfère à Garçon et F à Fille.


    *——————————————–;
    * Setting;
    *——————————————–;

    title;
    options nodate nonumber nocenter;

    proc format;
    value $ sex ‘M’=‘Garçon’
    ‘F’=‘Fille’;
    run;

    2. Préparation des données

    Afin d’avoir assez de données le fichier CLASS est multiplié par 5. Les noms sauvegardés dans la variable NAME sont incrémentés d’un nombre.

    *——————————————–;
    * 2. Data Preparation;
    *——————————————–;

    data class;
    set sashelp.class;
    output;
    name=cats(name,’1′);
    output;
    name=cats(name,’2′);
    output;
    name=cats(name,’3′);
    output;
    name=cats(name,’4′);
    output;
    name=cats(name,’5′);
    output;
    run;

    3. Reporting

    Enfin la section qui nous intéresse vraiment : générer un fichier .RTF et un fichier .PDF avec l’option SPANROWS et voir que que seul ODS RTF tient compte de cette option pour répéter l’observation en début de chaque nouvelle page.


    *——————————————–;
    * 3. Reporting;
    *——————————————–;

    ods listing close;
    ods rtf file=‘C:\sasref\test1.rtf’;
    ods pdf file=‘C:\sasref\test1.pdf’;


    proc report data=class spanrows nowd;
    column sex name;
    define sex / group ‘Sexe’;
    define name / display ‘Nom’ ;
    run;


    ods pdf close;
    ods rtf close;
    ods listing;

    h1

    Combien de nouveaux cas par an ? Une mesure d’incidence

    juillet 25, 2010

    L’incidence est une mesure statistique utilisée couramment dans les études cliniques, en cancérologie notamment. Vous trouverez sur Wikipédia une explication en termes simples de ce concept. Voici quelques extraits: définition et exemple de base.

    1. Le principe de base

    Wikipedia, définition : « En général, l’incidence (ou le taux d’incidence) est le nombre de nouveaux cas d’une pathologie observés pendant une période et pour une population déterminée. »

    Taux d’incidence=nombre de nouveaux cas/durée totale du suivi

    Wikipedia, exemple : « Par exemple, si 100 personnes à risque ont été étudiées pendant 2 ans, la durée totale de suivi est de 200 personnes-années.Dans ce même exemple, s’il a eu 5 nouveaux cas de la maladie à l’étude, le taux d’incidence sera de 5 cas par 200 personnes-années, ou plus simplement de 2,5 cas par 100 personnes-années (ou encore 0,025 cas par personne-année). »

    Taux d’incidence=5/200

    2. Le vrai taux d’incidence

    Wikipedia, définition : « En général, on s’intéresse à la première occurrence d’une maladie donnée chez une personne (au premier cancer et pas à ses récidives chez un même patient par exemple). »

    Wikipedia, l’exemple: « Dans l’exemple précédent, les cinq cas diagnostiqués pendant l’étude ne sont plus à risque à partir du moment où ils sont diagnostiqués. S’ils ont contracté la maladie après six mois d’observation, ils n’ont été à risque que pendant six mois. La durée totale de suivi pour cette étude est donc

    • de 190 personnes-années pour les personnes qui n’ont pas la maladie (95 personnes fois 2 ans) et
    • de 2,5 personnes-années pour les cas (6 mois fois 5 cas).

    Le vrai taux d’incidence est donc de 5 cas sur 192,5 personnes-années (ou 2,6 cas par 100 personnes-années). »

    Taux d’incidence=5/192.5

    L’éventail d’application de cette mesure s’étant au delà de la pharmaceutique. Nombre de personnes ayant retrouvé un emploi, nombre de clients ayant effectué un nouvel achat dans l’année après être passé au statuts de client perdu, etc.

    Complétez cet article

    N’hésitez pas à ajouter des précisions tant sur le calcul avec SAS, que sur la gestion des valeurs manquantes, identifier une différence significative entre deux taux d’incidence ou la représentation graphique de ce type de données.