Quelques éléments sur le logiciel SAS Introduction 1 Description
Transcription
Quelques éléments sur le logiciel SAS Introduction 1 Description
Master Ingénierie Mathématique M1 Université Paris-Sud 11 2008-2009 Calcul de risques et prédictions Quelques éléments sur le logiciel SAS Introduction SAS - Statistical Analysis System - est un logiciel polyvalent qui traite de nombreux domaines de la Statistique. De conception américaine, il est développé par la société SASInstitute basée à Cary, en Caroline du Nord. Il a acquis depuis la mise en route du projet au début des années 60 une situation dominante dans de nombreuses branches d’activités économiques. SAS est un logiciel multi-facettes capable de gérer de gros volumes de données (tableaux de plusieurs gigaoctets) à des fins d’analyse ou de reporting automatisé. Un avantage important sur d’autres logiciels de Statistique présents dans l’industrie est la possibilité de programmer sous SAS ses propres procédures. Il s’attache à suivre le grand principe de la compatibilité verticale, toute nouvelle version du logiciel doit accepter les applicatifs conçus avec les versions antérieures. Malheureusement, SAS compte aussi certaines faiblesses : coût élevé, langage de programmation peu avancé, graphiques moyens, ... 1 Description générale du logiciel SAS 1.1 Les fenêtres de SAS A l’ouverture de SAS, 5 fenêtres apparaissent simultanément : • Program editor : fenêtre servant à la rédaction du code qui sera exécuté. Cet éditeur ne constitue pas le point fort de SAS ! On peut aussi utiliser un autre éditeur plus pratique depuis lequel on copiera les programmes vers le Program editor. • Log : fenêtre de contrôle qui permet de s’assurer du bon fonctionnement du programme. Le programme y est écrit en noir avec ses commentaires en vert. On peut y lire les messages d’avertissement de SAS en vert pour un problème non fatal, et en rouge, précédé de «warning» lorsqu’une erreur fatale est détectée. • Output : fenêtre affichant les sorties du programme SAS sous forme de listing. • Results : fenêtre dressant l’historique des programmes successifs exécutés par SAS depuis le début de la session en cours. Cette fenêtre permet d’accéder directement aux résultats de la fenêtre Output. • Explorer : fenêtre permettant de naviguer parmi les données SAS. Cet explorateur de SAS permet d’accéder aux librairies SAS dont notamment la librairie «Work» associée à la session courante . Remarques : • Pensez à organiser à l’écran les cinq fenêtres à l’ouverture de SAS. • Les trois premières fenêtres sont les plus importantes. En particulier, prenez l’habitude de contrôler le bon déroulement du programme dans la fenêtre Log. 1 • Pensez à purger les fenêtres Output et Log car elles ne se vident pas automatiquement à l’execution d’un nouveau programme. 1.2 Articulation d’un programme SAS Un programme SAS est un enchaı̂nement d’instructions de deux types : • DATA : création, lecture et manipulation de tables SAS • PROC : traitement, analyse, édition des résultats Gestion des données Pour pouvoir appliquer des procédures à un ensemble de données, celles-ci doivent être préalablement enregistrées sous la forme d’un objet SAS, c’est à dire sous la forme d’une table. Nous reviendrons plus longuement dans la section suivante sur la gestion des données. Notons pour le moment qu’il existe trois principales façons de lire un fichier de données sous SAS : • Lecture directe des données, en les incluant dans le programme, au moyen de la commande DATALINES (ou CARDS). • Lecture des données préalablement enregistrées dans un fichier .txt (ou .dbf) au moyen de la commande INFILE. • Utilisation du gestionnaire d’importation. Dans tous les cas, n’oubliez pas de commencer par visionner les données avant de débuter une étape DATA en SAS. Les procédures SAS Un programme SAS est un enchaı̂nement de procédures, chacune réalisant un traitement sur les tables disponibles. Voici quelques exemples de procédures usuelles : – PRINT : pour afficher le contenu d’une table dans la fenêtre Output, – SORT : permet d’ordonner la table SAS selon les valeurs d’une variable quantitative, – MEANS, UNIVARIATE : descriptions de variables quantitatives (nombre d’observations, minimum, maximum, moyenne, écart-type...), – FREQ : description de variables qualitatives (effectifs, fréquences...), – CORR : étude des corrélations entre des variables quantitatives, – PLOT et GPLOT : graphiques pour des variables quantitatives, – CHART et GCHART : graphiques pour des variables qualitatives, – BOXPLOT : création de boı̂tes à moustaches. 1.3 Remarques générales • Toute instruction en SAS se termine par « ;» • Chaque instruction DATA ou PROC se termine par RUN PROC nomProcédure <option(s)>; instructions diverses; RUN; DATA tableSortie; instructions diverses; RUN; 2 • Options générales : Des commandes peuvent être rajoutées au début d’un programme SAS pour régler les options générales (elles continueront à s’appliquer jusqu’à la fin de la session SAS, ou jusqu’à ce qu’elles soient modifiées). On les indique avec la commande OPTIONS (le s est facultatif) : ? pagesize = nombre : impose le nombre de lignes dans une page de sortie output, ? linesize = nombre : impose le nombre de caractères par ligne, ? nodate : supprime l’impression de la date dans les sorties, ? nonumber : élimine la numérotation du listing, ? nocenter : aligne le texte à gauche. Exemple d’instruction : OPTIONS pagesize=40 linesize=64 nodate; •Titre : la commande TITLE permet de placer un titre en haut de chaque page des sor ties. TITLE ’ceci est un titre’; •Pied-de-page : la commande FOOTNOTE permet de placer un titre en bas de chaque page des sorties. FOOTNOTE ’ceci appara^ ıtra en bas de page’; • Commentaires : des commentaires peuvent être insérés n’importe où dans un programme SAS de la façon suivante : /* ceci est un commentaire */ Il est recommandé de ponctuer son programme de commentaires pour une meilleure lisibilité. • Édition de rapport : il est possible de récupérer les sorties SAS en éditant un rapport à l’aide de ODS. Il suffit d’entourer la suite des procédures SAS d’un programme de la façon suivante : ODS RTF FILE= "NomFicher.doc" encha^ ınement de phases DATA et de phases PROC générant des sorties (listing ou graphiques)... ODS RTF CLOSE; Toutes les sorties des différentes procédures insérées entre les deux lignes ODS seront alors copiées dans le fichier NomFichier.doc. Il est aussi possible d’éditer les sorties dans une page html en remplaçant RTF par HTML dans l’instruction ODS. Selon le format d’édition choisi, il peut être nécessaire de changer le format de sortie des graphiques. Le nouveau format est signalé comme une option générale à l’aide de l’instruction GOPTIONS DEVICE = JPEG ; ou tout autre format adapté (PS,GIF,...). Noter que le format JPEG est préférable pour des sorties RTF et HTML. Pensez à sauvegarder les programmes et les sorties (en .htlm ou en .doc) régulièrement pour 3 éviter de perdre le travail en cours en cas de bug ! • Impression (SAS sous Linux) : Pour imprimer vos sorties ou vos codes SAS, choisissez dans le menu déroulant Files, Print SetUp, Proprieties, et dans l’onglet «Destination», remplacez «Disk» par «Printer». Utilisez l’option LINESIZE dans OPTIONS pour limiter la longueur des lignes de sorties et éviter ainsi des problèmes à l’impression. • Accès à l’aide (SAS sous Linux à Orsay) L’utilisation des fichiers d’aide de SAS nécessite un paramétrage correct des proxies du navigateur par défaut. Lancer le navigateur (Mozilla ou Firefox), et accéder au réglage des proxies : Edit, Parameters, Advanced, Proxies. Dans la ligne de commande pas de proxies pour, rajouter l’instruction suivante ,@pa14 si pa14 est la machine utilisée, puis confirmer sur la case Ok. 2 Lecture de données L’étape DATA permet de créer des tables SAS, qui est le seul format de données avec lequel SAS peut travailler. Les tables sont créées dans la bibliothèque de travail WORK, à laquelle on accède en naviguant depuis l’explorateur. Il existe trois façons majeures de créer une table SAS à partir de données : • Écriture à l’intérieur du fichier avec des données délimitées • Importation de données depuis un fichier externe, à l’aide de l’instruction INFILE • Utilisation du gestionnaire d’importation La dernière méthode est la plus simple car automatisée mais elle nécessite que les données soient enregistrées dans un fichier lisible par le gestionnaire de SAS. Il est donc indispensable de bien maı̂triser les deux autres méthodes. Dans les deux premiers cas, une déclaration des variables est obligatoire au moyen de la commande INPUT. Une séquence DATA des données se présente en général de la façon suivante : DATA <nom de la table SAS>; .... INPUT Var1 Var2 Var3 ...; .... RUN; Le nom de la table est donné juste après l’instruction DATA. Les variables sont énumérées après l’instruction INPUT, il faut évidemment les déclarer dans le bon ordre. 2.1 Le vecteur de travail Le logiciel SAS est conçu pour travailler ligne par ligne, chaque ligne de la table correspondant à un individu dont nous avons une description à travers les différentes variables. Au cours d’une étape DATA, SAS lit, crée ou modifie les données en extrayant l’une après l’autre les lignes de la table (ou du fichier de données) pour les «placer» dans le vecteur de travail où sont effectuées les opérations sur les variables. On appelle ce principe la «boucle implicite». Ce type de fonctionnement permet une programmation très sobre, par exemple : 4 Var3 = Var2-Var1 pour créer une variable en fonction de variables existantes. En revanche, il est compliqué (voir impossible dans certains cas) de faire des opérations entre des données positionnées sur des lignes différentes. L’extraction d’une ligne correspond à une phase de lecture. En sortie du vecteur de travail, il s’agit cette fois d’une phase d’écriture des informations (i.e. des variables), dans la table créée. Avoir à l’esprit cette représentation schématique éclaire de nombreux aspects à première vue obscures de l’étape DATA de SAS. Par exemple, nous verrons que les formats de données interviennent pendant les deux phases de lecture et d’écriture. 2.2 2.2.1 Lectures de données par programmation SAS Données délimitées Dans ce premier exemple, les données sont écrites dans le programme après l’instruction DATALINES (ou CARDS). Program editor DATA table1; INPUT nom$ age sexe$; DATALINES; Chris 36 M Jane 21 F Tom 30 M Joe 49 M Jerry 28 M ; RUN; Dans l’instruction INPUT, les variables alphanumérique (textuelles) doivent être suivies de «$», c’est le cas ici des variables nom ou sexe. Les données sont, dans cet exemple, séparées par un blanc et ne sont pas alignées (21 est en position 6 sur la seconde ligne et 36 en position 7 sur la première ligne). Ce sont des données de type délimitées (délimitées ici par un blanc). La table table1 sera créée dans la librairie par défaut «WORK». Cette librairie temporaire n’existe que le temps de votre session SAS. Pour exécuter ces commandes (ou étape DATA) depuis la fenêtre du Program editor, on peut au choix : – taper dans la command line «submit» puis enter ; – ou à l’aide du menu déroulant dans «Run» cliquer sur «Submit» ; – ou cliquer directement dans la barre tools sur l’icône représentant le personnage en train de courir. Cette étape ne produit pas de résultat dans la fenêtre «Output». Par contre, la fenêtre «Log» peut être consultée car s’y inscrivent les messages du système indiquant le bon ou le mauvais déroulement du programme. A ce stade, la table table1 est créée dans la librairie «Work». On peut la visualiser à partir de la fenêtre de navigation SAS «Explorer SAS». Pour visualiser dans la fenêtre «Output» les résultats de l’étape DATA, on utilise la procédure PRINT : 5 Program editor PROC PRINT DATA = table1; RUN; Obs nom 1 2 3 4 5 Chris Jane Tom Joe Jerry Output age 36 21 30 49 28 sexe M F M M M On peut aussi utiliser d’autres séparateurs que le séparateur blanc pour agencer les données, il faut alors utiliser l’instruction INFILE. L’instruction INFILE sert généralement à importer des données depuis un fichier existant (voir plus loin). Combinée avec l’argument DATALINES, elle peut être utilisée pour traiter des données définies dans le corps du programme. On peut alors utiliser les différentes options proposées par INFILE : ? FIRSTOBS=num : indique le numéro num de la première ligne lue. ? OBS=num : indique le numéro num de la dernière ligne lue. ? DLM="." : indique le caractère séparateur, la tabulation est notée ’09’x. ? DSD : indique que la succession de deux séparateurs sera interprétée comme une donnée manquante. ? MISSOVER : permet de lire des enregistrements avec des données manquantes en fin d’enregistrement, sans devoir compléter par des caractères indiquant les données manquantes et sans que SAS prenne l’enregistrement suivant pour compléter les données. ? TRUNCOVER : indique à SAS de lire les données jusqu’à la fin de l’enregistrement ou jusqu’à la dernière colonne spécifiée par l’entrée colonne ou l’entrée formattée, lorsque certains enregistrements sont plus courts que d’autres. ? LRECL=nb : indique le nombre maximum nb de caractères par ligne de données (par défaut 256). Par défaut, le délimiteur utilisé avec INFILE est la «,» mais il est possible d’en changer. Par exemple, on peut utiliser le symbole «&» comme délimiteur : Program editor DATA table1; INFILE datalines DLM="&"; INPUT nom$ age sexe$; DATALINES; Chris&36&M Jane&21&F Tom&30&M Joe&49&M Jerry&28&M ; RUN; PROC PRINT DATA =table1; RUN; 6 Données manquantes : Il est important de pouvoir signaler à SAS l’existence de données manquantes. Dans le programme suivant, la donnée manquante a perturbé l’agencement des données dans la table : Program editor DATA table2; INFILE datalines DLM="&"; INPUT nom$ age sexe$; DATALINES; Bob&m Marie&25&f Yves&45&m ; RUN; Obs nom 1 2 Bob Yves Output age sexe . 45 Marie m PROC PRINT DATA=table2; RUN; L’option DSD de l’instruction INFILE permet de donner la priorité au séparateur : SAS interprète alors deux séparateurs successifs comme une donnée manquante, qu’il notera dans la table par un point «.». Program editor DATA table2; INFILE datalines DLM="&" DSD; INPUT nom$ age sexe$; DATALINES; Bob&&m Marie&25&f Yves&45&m ; RUN; Obs nom 1 2 3 Bob Marie Yves Output age . 25 45 sexe m f m PROC PRINT DATA=table2; RUN; Utilisation des informats : Les informats sont des formats de lecture (nous verrons plus loin les formats d’écriture). Bien qu’ils ne soient pas toujours obligatoires, les informats permettent de préciser à SAS sous quels formats les données doivent être lues dans l’éditeur ou dans le fichier externe. Les syntaxes principales sont : ? pour une variable numérique : Var :X. pour des variables entières et Var :X.Q pour des variables décimales. Dans ce dernier cas, X indique le nombre total de caractères à lire (point compris) et Q est le nombre total de décimales. ? pour une variable alphanumérique :Var :$X. où X indique le nombre de caractères (8 par défaut et donc au delà il faut le préciser). ? pour une date : Var :YYMMDD. ou Var :YYMMDD8. et d’autres formats sont encore possibles. 7 Les «:» sont là pour donner la priorité au délimiteur sur le format, ce qui signifie que le long d’une ligne, SAS passera d’une variable à la suivante sans nécessairement atteindre le nombre total de caractères déclarés. Par exemple, SAS ne lit par défaut que les 8 premiers caractères des données de type alpha-numérique. Output Program editor DATA table3; INPUT nom $ age sexe$; DATALINES; ChrisEvans 25 M JaneTrulli 21 F JoeStar 49 M ; RUN; PROC PRINT DATA=table3; RUN; Obs nom age sexe 1 2 3 ChrisEva JaneTrul JoeStar 25 21 49 M F M Obs nom age sexe 1 2 3 ChrisEvans JaneTrulli JoeStar 25 21 49 M F M La solution consiste à utiliser un informat : Program editor DATA table3; INPUT nom : $10. age sexe$; DATALINES; ChrisEvans 25 M JaneTrulli 21 F JoeStar 49 M ; RUN; PROC PRINT DATA=table3; RUN; Output Exercice : Créer un tableau SAS pour les 3 individus précédents où la première variable fait apparaı̂tre à la fois le nom et le prénom de l’individu, séparés par un blanc (Chris Evans), et en conservant les variables age et sexe. 2.2.2 Lecture de données délimitées en ligne Il est possible de noter les données dans l’éditeur en ligne à l’aide de l’option @@ dans l’instruction INPUT. 8 Program editor DATA table4; INFILE datalines DLM=","; INPUT nom:$12. age sexe$ @@; DATALINES; Chris Evans,25,M,Jane Trulli,21,F,Tom Jones,30,M Erik Truffaz,30,M,Miles Davis,7,M ; RUN; PROC PRINT DATA=table4; RUN; Output 2.2.3 Obs nom age sexe 1 2 3 4 5 Chris Evans Jane Trulli Tom Jones Erik Truffaz Miles Davis 25 21 30 30 7 M F M M M Données tabulées Dans les exemples qui suivent, les données figurent toujours dans le programme. On parle de données tabulées lorsqu’elles occupent toujours les mêmes positions dans le fichier. Puisque que nous avons vu la notion de format de lecture (ou informat dans la terminologie SAS), appliquons aux variables un format de lecture. Voici, quelques uns des formats de lecture usuels de SAS : Format w. w.d. COMMAw.d $w. DDMMYYw. Signification Entier décimal Décimal standard Décimal avec virgule Alphanumérique Jour Mois Année SAS permet de contrôler la colonne à partir de laquelle va se faire la lecture grâce à une instruction de la forme : INPUT [pointeur] nom de variable [$] format d’entrée ...; Le pointeur permet de pointer sur une colonne précise. Le format précise le type de variables, la longueur occupée sur le support et le type de représentation utilisée. Voici des exemples d’instructions liées au pointeur • @n : le pointeur se déplace à la colonne n de la ligne courante 9 • +n : le pointeur avance de n colonnes • #n : va à la ligne n Dans l’exemple suivant, les données sont tabulées selon le schéma suivant : Program editor DATA table6; INPUT @1 prenom $5. DATALINES; Chris Evans 29 M Jane Trulli 25 F Joe Star 55 M ; RUN; @7 nom $6. @15 age $2. @18 sexe $1. @21 naissance DDMMYY10.; 11/01/1976 17/03/1980 11/05/1950 PROC PRINT DATA = table6; RUN; On peut aussi utiliser le code équivalent dans l’instruction INPUT : INPUT @1 prenom $5. +1 nom $6. +2 age $2. +1 sexe $1. +2 naissance DDMMYY10.; Mais dans les deux cas, la table SAS n’a pas conservé le bon format pour la date de naissance : Obs prenom nom 1 2 3 Chris Jane Joe Evans Trulli Star Output age 29 25 55 sexe naissance M F M 5854 7381 -3522 Pour que ces formats soient conservés, on utilise l’instruction FORMAT (formats d’écriture) qui permet de définir les formats souhaités pour chacune des variables au moment de l’écriture de la table. Notons qu’il est donc possible d’appliquer des formats de lecture et d’écriture différents à une même variable (voir la variable nom dans l’exemple qui suit). 10 Program editor DATA table6; INPUT @1 prenom $5. @7 nom $6. @15 age $2. @18 sexe $1. @21 naissance DDMMYY10.; FORMAT prenom $5. nom $7. age $2. sexe $1. naissance DDMMYY10.; DATALINES; Chris Evans 29 M 11/01/1976 Jane Trulli 25 F 17/03/1980 Joe Star 55 M 11/05/1950 ; RUN; PROC PRINT DATA = table6; RUN; Cette fois on obtient les formats désirés : Obs prenom nom 1 2 3 Chris Jane Joe Evans Trulli Star Output age 29 25 55 sexe naissance M F M 11/01/1976 17/03/1980 11/05/1950 Ceci peut être vérifié avec la procédure CONTENTS qui décrit le contenu d’une table SAS : Program editor PROC CONTENTS DATA=table6; RUN; Log Liste alphabétique des variables et attributs # Variable Type Len 3 5 2 1 4 age naissance nom prenom sexe Alph Num Alph Alph Alph 2 8 6 5 1 Format $2. DDMMYY10. $7. $5. $1. Exercice : Comparez les formats de table6 avec ou sans l’instruction FORMAT. Voici un exemple voisin, pour lequel les données sont sur plusieurs lignes. Le caractère «#» permet d’organiser les variables d’une même observation sur plusieurs lignes : 11 Program editor DATA table6; INPUT #1 @1 prenom $5. @7 nom $6. @15 age $2. #2 @1 sexe $1. +6 naissance DDMMYY10.; FORMAT prenom $5. nom $6. age $2. sexe $1. naissance DDMMYY10.; DATALINES; Chris Evans 29 M 11/01/1976 Jane Trulli 25 F 17/03/1980 Joe Star 55 M 11/05/1950 ; RUN; PROC PRINT DATA = table6; RUN; 2.3 Obs prenom nom 1 2 3 Chris Jane Joe Evans Trulli Star Output age 29 25 55 sexe naissance M F M 11/01/1976 17/03/1980 11/05/1950 Lectures de données à partir d’un fichier externe Les données sont maintenant disponibles dans un fichier externe qui se nomme ici individus.txt. La première chose à faire est de bien identifier le type de fichier à lire (tabulaire ou délimité, et si c’est le cas, par quel délimiteur). Il faut aussi savoir quelles sont les données contenues et quels sont les formats associés. Notez bien que cet exemple n’est pas représentatif car le plus souvent les fichiers de données externes contiennent un grand nombre de données. Ce fichier est extrait d’un tableur du type excel ou works. Le fichier texte est d’un format particulier : Tab delimited file. Program editor DATA tableindiv; INFILE ’individus.txt’ DSD DLM=’09’x TRUNCOVER; INPUT prenom $ nom $ sexe $ anniversaire : DDMMYY10. age ville $10.; FORMAT sexe $1. anniversaire : DDMMYY10. age 2. ville $15.; RUN; PROC PRINT DATA = tableindiv; RUN; L’option DSD est là pour prévenir les données manquantes et l’option TRUNCOVER permet de lire des lignes non complètes sans passer automatiquement à la ligne suivante. Ici, «Londres» n’occupe pas 10 caractères, et sans TRUNCOVER, SAS serait tenté d’aller à la ligne suivante et 12 créerait ainsi une confusion dans la lecture. Le plus souvent, il est donc conseillé d’associer l’option TRUNCOVER à l’instruction INFILE. La sortie est bien celle désirée : Output sexe anniversaire Obs prenom nom 1 2 3 4 5 6 7 Chris Jane Tom Joe Jim Suzanne Janis Evans Trulli Jones Star Courrier Vega Poplin M F M M M F F 11/01/1976 11/12/1980 11/07/1971 11/05/1952 11/05/1948 11/09/1992 11/05/1937 age ville 25 21 30 49 53 9 64 Londres Manchester Milan Paris Monaco New York Boston Pour que de bons formats soient conservés au moment de l’écriture de la table, il est parfois nécessaire de préciser une nouvelle fois les formats (c’est par exemple le cas pour les dates et le nombre de décimales conservés dans les variables numériques, qui sont de 4 par défaut). Pour cela on peut indiquer directement les formats avec l’instruction FORMAT. On peut aussi utiliser l’instruction ATTRIB qui permet en plus d’affecter des labels aux variables. Voici un exemple de code utilisant cette instruction : Program editor DATA tableindiv1; INFILE ’individus.txt’ DSD DLM=’09’x TRUNCOVER; INPUT prenom $ nom $ sexe $ anniversaire : DDMMYY10. age ville $10.; ATTRIB prenom LABEL = "Prénom de l’individu" nom LABEL = "Nom de l’individu" sexe LABEL = "Sexe de l’individu" FORMAT = $1. anniversaire LABEL = "Date de naissance" FORMAT = DDMMYY10. age LABEL = "Age de l’individu" FORMAT = 2. ville LABEL = "Prénom de l’individu" FORMAT = $10. ; RUN; PROC CONTENTS DATA = tableindiv1; RUN; Output Liste alphabétique des variables et attributs # Variable Type 5 4 2 1 3 6 age anniversaire nom prenom sexe ville Num Num Alph Alph Alph Alph Len 8 8 8 8 8 10 Format Label 2. DDMMYY10. Age de l’individu Date de naissance Nom de l’individu Prénom de l’individu Sexe de l’individu Prénom de l’individu $1. $10. 13 De façon générale, retenir que pour modifier les formats obtenus dans la table SAS, il est préférable des modifier les formats dans la phase d’écriture de la table (avec ATTRIB), plutôt que dans la phase de lecture des données (avec les informats). 3 3.1 Manipulation de tables Fusion verticale de tables La fusion verticale consiste à empiler les données de plusieurs tables SAS. Elle est réalisée dans une étape DATA avec l’instruction SET qui permet de charger des tables. SAS lit alors l’une après l’autre les lignes de la première table avant de passer à la seconde table, ... Dans ce type de fusion, on a généralement des ensembles de données avec des variables communes. DATA tablecréée; SET TableLue1 TableLue2 ...tableLuen; RUN; Dans l’exemple présenté en Figure 1, on empile les tables table1 et table2 pour obtenir une troisième table combine. Les données sont empilées dans la table résultante combine mais s’il existe des doublons dans les données, ils ne sont pas pour autant éliminés. On appelle doublon la répétition d’un individu avec les mêmes caractéristiques, c’est à dire les mêmes variables (dans notre exemple l’individu Jane). Afin d’éliminer les doublons, il faut utiliser la procédure SORT avec l’option NODUPRECS. La procédure SORT permet de trier des données selon les variables déclarées dans l’instruction BY (en cas d’égalité sur la première variable, c’est la seconde qui sert de critère de tri, puis la troisième, ...). Attention à l’utilisation de l’option NODUPRECS : dans la recherche des doublons, seules les données déclarées dans l’instruction BY seront considérées. Program editor PROC SORT DATA=combine NODUPRECS; BY prenom age; RUN; PROC PRINT DATA=combine; RUN; Obs 1 2 3 4 5 6 7 8 9 10 11 Output prenom Chris Dan Emma Jane Jerry Jim Joe Joe Sam Sid Tom age 36 38 51 21 28 18 20 49 36 36 30 La répétition de l’individu «Jane» est éliminée alors que les deux individus distincts «Joe» sont conservés. 14 Program editor DATA table1; INPUT prenom $ age; DATALINES; Chris 36 Jane 21 Tom 30 Joe 49 ; RUN; DATA table2; INPUT prenom $ age; DATALINES; Jerry 28 Dan 38 Jim 18 Sid 36 Emma 51 Jane 21 Joe 20 Sam 36 ; RUN; DATA combine; SET table1 table2; RUN; PROC PRINT DATA=combine; RUN; Obs 1 2 3 4 5 6 7 8 9 10 11 12 Output prenom Chris Jane Tom Joe Jerry Dan Jim Sid Emma Jane Joe Sam age 36 21 30 49 28 38 18 36 51 21 20 36 Fig. 1 – Fusion verticale des tables table1 et table2. 3.2 Fusion horizontale de tables Pour réaliser la fusion horizontale de tables SAS, ces tables doivent posséder au moins une variable commune qui servira à recoller les données. Attention, avant d’effectuer une fusion horizontale de plusieurs tables, les données de chaque table doivent être triées selon la (les) variable(s) de recollement. La procédure SORT permet de trier des tables : PROC SORT DATA = tablelue; BY Var1 Var2... Varp; RUN; La fusion horizontale est réalisée dans une étape DATA avec l’instruction MERGE. Il faut indiquer à SAS, avec l’instruction BY, quelles sont les variables de recollement. 15 DATA tablecréee; MERGE Tablelue1 Tablelue2; BY Var1 Var2... Varp; RUN; Par exemple, la fusion des tables table1 et table2 en une troisième table combine selon la variable prenom est obtenue grâce à la programmation suivante : Program editor DATA table1; INPUT prenom $ age; DATALINES; Chris 36 Jane 21 Tom 30 Joe 49 ; RUN; Obs 1 2 3 4 Output prenom age Chris Jane Joe Tom 36 21 49 30 sexe M F M M DATA table2; INPUT prenom $ sexe $; DATALINES; Tom M Chris M Jane F Joe M ; RUN; PROC SORT DATA=table1; BY prenom; RUN; PROC SORT DATA=table2; BY prenom; RUN; DATA combine; MERGE table1 table2; BY prenom; RUN; PROC PRINT DATA=combine; RUN; Reprenons la même fusion mais cette fois-ci avec des données non communes dans les deux tables. La table table1 contient l’individu Tom qui ne figure pas dans table2. A contrario, la table table 2 contient l’individu Jerry ne figurant pas dans la table table1. 16 Program editor DATA table1; INPUT prenom $ age; DATALINES; Chris 36 Jane 21 Tom 30 Joe 49 ; RUN; Obs 1 2 3 4 5 Output prenom age Chris Jane Jerry Joe Tom 36 21 . 49 30 sexe M F F M DATA table2; INPUT prenom $ sexe $; DATALINES; Jerry F Chris M Jane F Joe M ; RUN; PROC SORT DATA=table1; BY prenom; RUN; PROC SORT DATA=table2; BY prenom; RUN; DATA combine; MERGE table1 table2; BY prenom; RUN; PROC PRINT DATA=combine; RUN; L’individu Jerry qui est présent dans table 2 et absent de table1 prend la valeur F pour la variable sexe et a une donnée manquante (représentée par le .) pour la variable age. A contrario, l’individu Tom présent dans table1 et absent de table2 prend la valeur 30 pour la variable age et a une donnée manquante (représentée par le blanc) pour la variable sexe. Pour organiser la fusion horizontale, on utilise une boucle avec l’option IN. Dans le programme qui suit on aura également l’occasion d’utiliser l’instruction OUTPUT (ordre d’écriture dans une table) qu’il faut obligatoirement utiliser ici dans la boucle pour que SAS écrive dans la table désirée. 17 Program editor DATA combine1 combine2 combine3; MERGE table1(in=a) table2(in=b); BY prenom; /*intersection de table1 et table2*/ IF a and b THEN OUTPUT combine1; /*dans table2 et pas dans table1*/ IF not a and b THEN OUTPUT combine2; /*dans table1 et pas dans table2*/ IF a and not b THEN OUTPUT combine3; RUN; PROC PRINT DATA=combine1; RUN; PROC PRINT DATA=combine2; RUN; PROC PRINT DATA=combine3; RUN; 3.3 Output (combine1) Obs prenom age sexe 1 2 3 Chris Jane Joe 36 21 49 M F M (combine2) Obs prenom age sexe 1 Jerry . F sexe (combine3) Obs prenom age 1 Tom 30 Création et sélection de variables utiles On peut rajouter de nouvelles variables à l’intérieur d’une étape DATA en les définissant directement, par exemple dans le code suivant : Program editor DATA Tablecréée; SET Tablelue; NouvelleVar = Var1 + Var2; RUN; Var1 et Var2 sont des variables de Tablelue et la table Tablecréée contient la variable NouvelleVar en plus de toutes les variables de Tablelue. Il est possible, au sein d’une étape DATA de supprimer certaines variables au moyen de l’option DROP = Var1. On peut aussi utiliser l’option KEEP=Var1 ... VarN qui permet de ne garder que certaines des variables de la table. Par exemple, Program editor DATA Tablecrée ; SET Tablelue (KEEP = Var2); RUN; On peut aussi supprimer certaines observations à l’aide de l’instruction WHERE, comme l’illustre l’exemple suivant. La table Homme est construit à partir de la table Indiv en ne conservant que les individus de sexe masculin. 18 Program editor DATA Indiv; INPUT prenom $ sexe $; DATALINES; Chris M Jane F Tom M Joe M ; RUN; DATA Homme; SET Indiv (WHERE = (sexe = ’M’)); RUN; PROC PRINT DATA = Indiv; RUN; PROC PRINT DATA = Homme; RUN; 19 Output (Indiv) Obs prenom 1 2 3 4 Chris Jane Tom Joe (Homme) Obs prenom 1 2 3 Chris Tom Joe sexe M F M M sexe M M M