Séance n°4 Programmation en SAS (1) : macro-langage
Exercice 13 : DNS ('Domain Name System') Sujet 2 ..... sur en Windows peut-il
dialoguer avec un serveur en Java avec un ORB Borland Visibroker en Unix.
part of the document
Séance n°4 Programmation en SAS (1) : macro-langage - O.D.S.
Le macro-langage, au même titre que le SQL ou lIML (cf. séance n°5), améliore les possibilités du langage de base. Il permet de passer des paramètres entre les étapes DATA et PROC, et de rendre plus rapide et plus simple lécriture des applications avec la répétition à volonté dune séquence dinstructions. LO.D.S. (Output Delivery System) est notamment un outil très utile pour envoyer, formater et conserver des sorties SAS dans un fichier externe (Word, par exemple).
1. Les macros
Les macro-commandes de SAS permettent denchaîner lexécution de plusieurs commandes SAS au moyen dune seule instruction (qui sera appelée macro) comportant, éventuellement, un ou plusieurs paramètres.
Les macro-variables
Les macro-variables sont les paramètres du macro-langage. La déclaration dune macro-variable consiste à associer par la commande %let une chaîne de caractères à un identificateur.
Rôlesert à stocker du texte ;Nom1 à 8 caractères ;Appelpar son nom précédé du symbole & (ex. &mvar) ;Création%LET < macro-variable = valeur > ;Visualiser le contenu%PUT &mvar ;
Exemple 1
%let valeur = 10; /*Associe la macro variable «valeur» au nombre 10*/
%put &valeur; /*Affiche la valeur courante de la macro variable «valeur»*/
Le symbole « & » signifie « le paramètre qui renvoie à ». Dans cet exemple, « &valeur » est donc « le paramètre qui renvoie à valeur ».
Exemple 2
Considérons la table « tension » de la séance n°3 :
DATA tension;
INPUT age tension;
CARDS;
35 114
45 124
55 143
65 158
75 166;
RUN;
%let tabin = tension;
%let varY = tension;
%let varX = age;
title "Scatter plot de &varY et &varX"; /* avec " au lieu de ' */
proc gplot data=&tabin;
plot &varY*&varX;
run;
quit;
Lorsque lon met des macro-variables dans une chaîne de caractères, il faut utiliser " au lieu de '.
Linstruction call symput permet de créer une macro-variable en lui affectant les valeurs dune variable dune table SAS. Cette instruction sutilise exclusivement dans une étape DATA.
Syntaxe
CALL SYMPUT('nom_macro-variable',valeur_macro_variable);
Exemple 3 :
data _NULL_;
set tension;
call symput('nobs',_N_);
run;
Rappel : _NULL_ est le mot clé à utiliser en remplacement d'un nom de dataset. Aucun dataset n'est alors physiquement créé.
Dans cet exemple, on affecte à la macro-variable nobs, les valeurs successives de la variable _N_ qui correspond au rang de lobservation lue (_N_ est une variable protégée de SAS qui contient le nombre de lignes de la table SAS sourante). Au terme de létape DATA, la macro-variable nobs contient le numéro de la dernière observation, cest-à-dire le nombre dobservations de la table tension. Le vérifier en affichant la macro variable à laide de linstruction %put &nobs;
Les macro-fonctions
Les macro-fonctions sont des fonctions spécifiques au macro-langage pour manipuler des macro-variables.
Exemple 4 : %LENGTH et %SCAN
%let semaine = lundi - mardi - mercredi - jeudi - vendredi - samedi - dimanche;
%let longueur = %length(&semaine);
%let jour2 = %scan(&semaine,2,'-');
Dans cet exemple, la macro-variable longueur contient la longueur de la chaîne de caractères semaine soit 63. La macro-variable jour2 correspond ensuite au 2ème mot de la chaîne (soit mardi). Le troisième argument indique que le séparateur est un tiret.
Exemple 5 : %EVAL
Par définition, une macro-variable sert à stocker du texte. Par exemple, la valeur dune macro-variable à laquelle on affecte « 1+2 » est « 1+2 » et non « 3 ». Toutefois, il est possible de forcer le compilateur macro à effectuer lopération avec %eval. La macro-fonction %eval(expression) évalue des calculs (additions, soustractions, multiplications et divisions seulement) sur des entiers à partir dexpressions contenant des macro-variables. Si la valeur évaluée contient des décimales, la valeur est tronquée à la partie entière.
%let i = 22;
%let j = &i/7; /* j contient 22/7 */
%let k = %eval(&i/7); /* k contient 3 */
%let pi = &k..%eval(100*&i/7-100*&k); /* pi contient 3.14 */
Les programmes macros
Parmi les programmes quon ne souhaite pas écrire plusieurs fois, nous distinguons ceux dont la structure ne change pas mais dont seuls quelques éléments varient. Dans ce cas, on pourra utiliser des macros pour définir larchitecture du programme et les paramètres qui permettront de modifier à notre guise les éléments qui doivent changer. Par ailleurs, on souhaiterait parfois que certaines procédures ne soient exécutées qui si certaines conditions sont remplies et autrement on en exécuterait dautres
En ce sens, le macro-langage est encore utile pour définir des variables ou exécuter de manière conditionnelle certaines procédures. Ce langage très riche est expliqué dans les manuels de SAS.
Une utilisation courante du macro-langage est la macro-expression qui sécrit comme suit
%MACRO < nom >;
< texte >
%MEND;
où nom est une chaîne de caractères qui ne dépasse pas huit lettres.
Exemple 6
%macro triangle;
< Programme traçant un polygone à trois côtés >
%mend;
Le caractère % est dans SAS le symbole des macros. Dans sa première ligne, une macro doit toujours comporter linstruction %macro suivi du nom et se termine toujours par une ligne comportant linstruction %mend éventuellement suivie du nom de la macro (« triangle » est donc facultatif ici).
Création dune macro-expression avec paramètres :
%MACRO < nom > (< paramètres >);
< contenu de la macro >
%MEND;
Appel de la macro :
%NOM(< paramètres >);
Remarque À lappel de la macro tous les paramètres sont annoncés entre parenthèses, séparés par des virgules, juste après le nom de la macro-expression. Lordre des paramètres doit être respecté.
Exemple 7
%macro printtab (table,varlist);
proc print data = &table;
var &varlist;
run;
%mend printtab;
Considérons la table « exemple » de la séance n°1 :
data exemple;
input nom$ naiss CSP$ auto$ sin98 sin99;
cards;
Pierre 65 lib golf 0 10
Paul 48 arti 306 0 0
Jacques 61 cadre 205 51 0
Carole 70 lib AX 27 0
Caroline 65 cadre golf 0 0
Nathalie 62 cadsup 306 0 5
;
run;
%printtab(exemple,nom auto);
Bibliothèque de macro-commandes
Lorsque certaines macro-commandes sont régulièrement utilisées, il est pratique de pouvoir les conserver les unes à la suite des autres dans un fichier muni de lextension « .sas ». En les ajoutant dans un fichier appelé « macros.sas », par exemple, il suffira ensuite dans nimporte quel programme SAS de faire lappel :
%INCLUDE 'C:\Mes documents\Cours de SAS\TPSAS\macro.sas'; /*exemple*/
Remarques Les macro-variables et macro-fonctions peuvent être utilisées globalement tout au long dun programme SAS ou encore localement à lintérieur dune macro.
%GLOBAL < nom_macro >; ou %LOCAL < nom_macro >;
À lintérieur dune macro, les instructions IF, THEN, ELSE, DO, TO, UNTIL, WHILE, END, etc. sont précédées du symbole « % ».
Enfin, notons que certaines macro-variables sont déjà définies dans SAS. Par exemple, les instructions suivantes
%put &sysdate; %put &sysday; %put &systime;
affichent respectivement la date, le jour et lheure dans la fenêtre Log.
2. Contrôle des sorties SAS avec lenvironnement O.D.S.
Par défaut, SAS présente les résultats dun programme sous forme de fichier texte. Le système O.D.S. (Output Delivery System) est un outil permettant de sélectionner des sorties SAS et de les récupérer en choisissant des présentations appropriées à certains logiciels tels que des éditeurs de texte (Word, par exemple) ou des éditeurs de graphiques (Adobe Illustrator, par exemple), etc.
Le système O.D.S. offre entre autres les présentations suivantes :
LISTINGprésentation par défaut avec des caractères de type mono-espace (Monaco, Courier) ;PRINTERfichiers de type postscript pour les imprimantes du même type ;HTMLfichiers en langage html pour les pages Internet ;RTFfichiers utilisables dans un éditeur de texte (Word, par exemple) ;PDFfichiers en format pdf.
Voici un exemple de programme SAS dans lequel la même sortie est produite en trois formats de fichiers :
data note;
input nom $ note @@;
cards;
Pierre 11 Paul 14
Carole 13 Jacques 7
;
run;
ods rtf file = 'note_examen.rtf';
proc print data = note; run;
ods rtf close;
ods pdf file = 'note_examen.pdf';
proc print data = note; run;
ods pdf close;
ods printer file = 'note_examen.ps';
proc print data = note; run;
ods printer close;
Commentaires Dans ce programme, on commande dabord la production dun fichier « .rtf » (Rich Text File) en écrivant ODS RTF; suivi du nom du fichier à créer entre apostrophes. Ce fichier contient la sortie de la procédure PRINT sous la forme dun tableau. On sort ensuite de lenvironnement O.D.S. avec linstruction ODS RTF CLOSE;.
Les sorties en formats « .pdf » (Portable Document Format) ou « .ps » (postscript) sobtiennent de la même manière. Les fichiers pdf peuvent être insérés dans un éditeur de texte mais pas les fichiers postscript. Pour visualiser le fichier postscript nommé « note_examen.ps », il suffit de taper dans une fenêtre Terminal sous Unix (Konsole) linstruction :
gv note_examen ( « gv » pour ghostview.
On peut alors imprimer le fichier postcript avec une commande du menu File.
On peut aussi convertir un fichier postscript en un fichier pdf en tapant par exemple :
ps2pdf note_examen.ps note_examen.pdf
Enfin, notons aussi quil est possible dinterrompre laffichage des sorties dans la fenêtre Output via linstruction :
ODS LISTING CLOSE;
Linstruction contraire :
ODS LISTING;
Permet ensuite de rétablir laffichage. Lintérêt de cette instruction est évident lorsquune même procédure est exécutée un grand nombre de fois dans une boucle, notamment pour ne pas encombrer inutilement la fenêtre Output.
Référence bibliographique :
[Haworth L. E. (2001) : Output Delivery System, the basics, SAS Institute Inc., Cary, NC]
Exercice n°1
Écrire une macro-commande imprime paramétrée par tabin, varlist et n qui affiche les n premières observations pour une liste de variables choisies dune table SAS donnée. Supprimer laffichage des rangs des observations et ajouter un titre qui renseigne le jour, la date et lheure de limpression.
Exercice n°2
Écrire une macro-commande gaussienne à quatre paramètres qui génère une table en sortie tabout qui contient n valeurs simulées suivant une loi normale de moyenne mu et décart-type sigma. On pourra sinspirer du code écrit pour lexercice 3 du TP2.
Exécuter cette macro en faisant varier n, mu, et sigma ; et observer la forme de la distribution associée en utilisant au choix la procédure UNIVARIATE ou SAS/Insight. Ajuster la fonction de densité théorique sur les histogrammes.
Remarque À chacune des valeurs entières du seed, choisie entre 1 et EMBED Equation.3 (= 2,147,483,647), correspond un tirage pseudo-aléatoire déterminé et reproductible. Si EMBED Equation.3 , SAS utilise lhorloge pour initialiser le tirage et celui-ci nest alors plus reproductible à lidentique.
Exercice n°3
Écrire une macro-commande correlation qui produit la matrice des coefficients de corrélation de Pearson pour certaines variables dune table SAS. Trois paramètres : tabin la table en entrée, tabout la table en sortie qui contient la matrice (utiliser loption : OUTP = < nom_tab >) et varlist pour les variables détude. Dire comment couper les sorties dans la fenêtre Output.
Écrire une macro-commande reglin qui traite de manière automatique le modèle de régression linéaire défini dans le TP3. Cette macro reçoit quatre paramètres : tabin la table en entrée, y_dep la variable dépendante Y, x_exp la (ou les) variable(s) descriptive(s) X et tabout la table en sortie qui contient les valeurs estimées de x1,
, xp, Int et (. Couper les sorties dans la fenêtre Output.
Exécuter ces deux macros sur la table class où height est la variable dépendante et weight la variable descriptive.
Exercice n°4 : un exemple de programme en SAS : le Balanced Bootstrap*
La méthode du Balanced Bootstrap consiste à réutiliser exactement le même nombre de fois chacune des observations lors du rééchantillonnage. Simple à programmer, cette méthode possède de bonnes propriétés statistiques. Les B échantillons « balanced bootstrap » peuvent être obtenus de la manière suivante :
Dupliquer B fois le n-échantillon initial x = (x1, x2,
, xi,
, xn) pour obtenir un nouvel nB- échantillon ;
Permutation aléatoire des nB lignes de cet échantillon ;
Découper le nB-échantillon obtenu en B parties égales.
On obtient finalement B échantillons bootstrap x* = ( EMBED Equation.3 ) construits à partir dun « rééchantillonnage équilibré » des observations (xi).
Proposer une macro bootstrap paramétrée par tabin, la table SAS à rééchantillonner et nboot, le nombre déchantillons souhaité afin de générer nboot échantillons « balanced bootstrap » boot_1,
, boot_nboot à partir de tabin. On pensera à lintérieur du programme à stocker le nombre dobservations de tabin dans une macro-variable nobs.
*[Davison A. C., Hinkley D. V., Schechtman E. (1986) : Efficient bootstrap simulation, Biometrika, 73, 3, p.555-566]