Einführung in das Programmieren mit Base SAS unter Windows Heinrich Stürzl Tutorium KSFE 2011 Vorwort Vorwort 1 Literaturhinweise 2 Grundlagen 4 1. 6 2. 3. 4. Benutzeroberfläche (Display Manager) 1.1 Results Fenster 7 1.2 SAS Explorer 8 1.3 Listenfenster (Output) 9 1.4 Protokollfenster (Log) 9 1.5 Enhanced Editor 10 1.6 Drucken von Listenoutput 14 1.7 Standard Short Cuts 15 1.8 Übung 1: Ein erstes SAS Programm 18 Programme 19 2.1 Hinweise zum Aufbau von SAS Programmen 20 2.2 SAS Namenskonvention 21 2.3 Übung 2: Ein zweites SAS Programm 21 2.4 SAS Anweisungen 23 2.5 Programmbeispiel: Filmschauspieler 25 2.6 Übung 3: Filmschauspieler 27 SAS Tabellen (Data sets) 28 3.1 Temporäre und permanente SAS Tabellen 29 3.2 SAS Tabellen Namen 30 SAS Daten Bibliothek (Data Library) 4.1 Explorer Fenster Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 31 32 1 Vorwort 4.2 Libname Fenster 34 4.3 Libraries Fenster 35 4.4 Übung 4: Verwaltung von Daten Bibliotheken und SAS Tabellen 36 5. Output Delivery System (ODS) 37 6. System Optionen 40 7. SAS Online Hilfe 41 7.1 SAS Help and Documentation Version 9 41 7.2 SAS OnlineDoc 9.1 for the Web 42 Datenschritt (DATA STEP) 43 8. 43 9. Grundlagen des Datenschritts 8.1 Kompilierungsphase 44 8.2 Ausführungsphase 45 8.3 OUTPUT und DELETE 46 Variablen 47 9.1 Variablenlänge (LENGTH) 48 9.2 Einleseformate und Ausgabeformate (INFORMAT, FORMAT) 50 9.3 Variablenetikettierung (LABEL) 53 9.4 Selektion von Variablen (KEEP, DROP) 54 9.5 Umbenennen von Variablen (RENAME) 55 9.6 Übung 5: Variablen, Formate, Label 56 10. Funktionen 10.1 Übung 6: Funktionen, Fehler und Fehlermeldungen 11. Bedingte Anweisungen (IF/THEN, SELECT) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 57 60 61 2 Vorwort 12. Selektion von Beobachtungen (IF, WHERE, DELETE) 62 13. Einlesen von Daten aus externen Dateien 65 13.1 Einlesen von Daten im ASCII Format (INFILE, INPUT) 65 13.2 Übung 7: Daten aus ASCII Datei einlesen 67 13.3 Einlesen von Daten aus Microsoft Excel Tabellen via DDE 68 14. Verknüpfung von SAS Tabellen (SET, MERGE) 69 14.1 SET 70 14.2 MERGE 73 15. Tabellenoptionen (data set options) 15.1 Übung 8: Tabellen verknüpfen, neue Tabellen erstellen, Tabellenoptionen 74 76 Prozedurschritt (PROC STEP) 77 16. Grundlagen des Prozedurschritts 77 17. PROC CONTENTS zur Dokumentation 79 18. PROC FORMAT für eigene Formate 81 18.1 Permanente Formate 82 19. PROC SORT zum Sortieren 83 20. PROC PRINT zur Listenausgabe 84 21. PROC FREQ für Häufigkeitstabellen 88 22. PROC MEANS für Deskriptive Statistik 92 23. PROC UNIVARIATE zur Analyse einzelner Merkmale 95 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 3 Vorwort 24. Grafikprozeduren 103 25. Übung 9: Prozeduren 105 Links 106 Lösungsvorschläge 107 Übung 2.1 (Gültige SAS Namen) 108 Übung 2.2 – 2.6 (Ein erstes SAS Programm) 108 Übung 2.7 (Umrechnungstabelle DM in Euro) 108 Übung 6.3 (Syntaxfehler und logische Fehler) 109 Übung 6.5 und 6.6 (Datentypkonvertierung) 109 Übung 7 (ASCII-Datei einlesen) 110 Übung 8 (Tabellen verknüpfen, Neue Tabellen erstellen, Tabellenoptionen) 111 Übung 3, 5, 6, 9 (Schauspielerdaten) 112 Interaktive Einführung 117 Anwendungsbeispiel 1: Körperlänge zufälliger Probanden 117 Anwendungsbeispiel 2: Alter, Körperlänge und Gewicht fiktiver Schüler (SASHELP.CLASS) 120 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 4 Vorwort Vorwort SAS® ist eine Software zur statistischen Datenanalyse, die das US-amerikanische Unternehmen SAS Institute mit Sitz in Cary, North Carolina seit 1976 entwickelt und vertreibt. Der Name SAS war ursprünglich die Abkürzung für Statistical Analysis System und ist heute ein Markenname. SAS Institute ist das größte private nicht börsennotierte Softwareunternehmen (Wikipedia, 2010). Die SAS Software war ursprünglich für den Einsatz auf Großrechnern gedacht und läuft heute unter fast allen gängigen Hardwareplattformen. Sie besteht aus verschiedenen Modulen wie Base SAS (Basis Modul mit der SAS Language inkl. Standard Prozeduren und Makrosprache), SAS/STAT (Statistik Prozeduren), SAS/GRAPH (Grafik Prozeduren), SAS/ACCESS (Schnittstellen zu Microsoft Office, Datenbanken etc.) u. a., die jeweils die Funktionalität eines bestimmten Anwendungsbereiches enthalten und einzeln lizenziert werden müssen. Die Module wiederum setzen sich aus einer oder mehreren Prozeduren (direkt anwendbare Auswerteroutinen) zusammen. Das vorliegende Skript behandelt ausschließlich die Base SAS Funktionalität und ist eine Einführung in die Skriptsprache SAS Language, eine Programmiersprache für die Verarbeitung von Daten unter besonderer Berücksichtigung statistischer Aspekte, sowie statistische Basis Prozeduren. Es ist als schriftliche Ergänzung zu dem dreitägigen Kurs "SAS für Anfänger" gedacht, der eine allgemeine Einführung in das Programmieren mit Base SAS unter Windows darstellt. Ziel des Kurses ist es, einfache SAS Programme zu erstellen und damit Rohdaten einzulesen, aufzubereiten und einfache (deskriptive) Auswertungen durchzuführen. Damit vermittelt der Kurs Grundkenntnisse, welche die Voraussetzung für alle weiteren SAS Kurse bilden. Das Skript basiert auf der SAS Version 9.1 unter Windows. Neuerungen gegenüber früheren Versionen sind teilweise gekennzeichnet. Das Skript dient der Orientierung während der Einarbeitungsphase und soll einen schnellen Zugang zur selbständigen und sicheren Handhabung von SAS unter Windows ermöglichen. Der Aufbau ist nicht unbedingt systematisch, sondern orientiert sich vielmehr am Kursablauf. Auf keinen Fall kann das Skript ein Ersatz für die Online Hilfe bzw. Handbücher sein, vielmehr soll es den Beginn der Arbeit damit erleichtern. Der 1. Abschnitt behandelt die Grundlagen des SAS Systems unter Windows: Benutzeroberfläche, SAS Programme, SAS Tabellen (data sets), SAS Bibliotheken, SAS Online Hilfe, sowie die einfache Nutzung des Output Delivery Systems (ODS). Der 2. Abschnitt ist dem Datenschritt (DATA STEP) gewidmet und behandelt die Grundlagen der Programmierung der Base SAS Software: Anweisungen (statements), Optionen (data set options, system options), Variablen, Ein- und Ausgabeformate (informats, formats), Funktionen (functions), Datenselektion, Datenzugriff und Verknüpfung. Der 3. Abschnitt Prozedurschritt (PROC STEP) wird die Datenauswertung anhand einiger Basis Prozeduren gezeigt wie PROC CONTENTS, FORMAT, SORT, PRINT, FREQ, MEANS, UNIVARIATE. Die verwendeten Datenbeispiele beziehen sich überwiegend auf personenbezogene Daten von Schauspielern. Das Skript enthält Übungsaufgaben mit Lösungsvorschlägen. Nicht eingegangen wird auf die SAS Makrosprache, statistische Tests und Statistikprozeduren aus SAS/STAT. Hochauflösende Grafiken werden nur angedeutet. Windows Grundkenntnisse werden vorausgesetzt. Erfahrungen mit mindestens einer anderen Programmiersprache sind empfehlenswert. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 1 Literaturhinweise Literaturhinweise SAS Handbücher (englischsprachig) gibt es online bei SAS Institute unter http://support.sas.com/documentation und in gedruckter Form (kostenpflichtig). Einstiegsliteratur nach Wichtigkeit absteigend geordnet: 1. SAS Language Reference: Concepts, Vol 1-2, SAS Institute Inc. Allgemeine Beschreibung der Base SAS Software. Vermittelt ein detailliertes Verständnis der Grundlagen Online verfügbar, siehe SAS Online Hilfe, S. 41 2. SAS Language Reference: Dictionary, Vol 1-4, SAS Institute Inc. Referenz Handbuch der gesamten Base SAS Language, soweit sie unabhängig vom Betriebssystem ist. Online verfügbar, siehe SAS Online Hilfe, S. 41 3. SAS Companion for Windows, Vol 1-2, SAS Institute Inc. Referenz Handbuch für SAS unter Windows mit ausführlichen Hinweisen zur Benutzeroberfläche und der windowsspezifischen Funktionalitäten der SAS Language Online verfügbar, siehe SAS Online Hilfe, S. 41 4. SAS Procedures Guide, Vol 1-4, SAS Institute Inc. Referenz Handbuch zu den Prozeduren der Base SAS Software Online verfügbar, siehe SAS Online Hilfe, S. 41 5. SAS 9.1 Output Delivery System: User's Guide, Volumes 1-2; SAS Institute Inc. Referenz Handbuch zum Output Delivery System (ODS) Online verfügbar, siehe SAS Online Hilfe, S. 41 6. Lora Delwiche and Susan Slaughter, The Little SAS Book: A Primer, Third Edition, SAS Institute Inc., € 48 Allgemeine Einführung in SAS Version 9 (inkl. SAS/STAT) für alle Betriebssysteme in englischer Sprache: "Getting started with SAS is easy with The Little SAS Book. This friendly, easy-to-read guide gently introduces you to the most commonly used features of SAS software plus a whole lot more! The book has been revised to include concepts of the Output Delivery System; the STYLE= option in the PRINT, REPORT, and TABULATE procedures; ODS HTML, RTF, PRINTER, and OUTPUT destinations; PROC REPORT; more on PROC TABULATE; exporting data; and the colon modifier for informats. You'll find clear and concise explanations of basic SAS concepts (such as DATA and PROC steps), inputting data, modifying and combining data sets, summarizing and presenting data, basic statistical procedures, and debugging SAS programs. Each topic is presented in a self-contained, two-page layout complete with examples and graphics. This format enables new users to get up and running quickly, while the examples allow you to type in the program and see it work!" 7. Carina Ortseifen, Der SAS-Kurs: Eine leicht verständliche Einführung, Int.Thomson Publishing, 1997, (seit 2000 vergriffen, jedoch als Download kostenlos erhältlich unter http://www.urz.uni- heidelberg.de/statistik/sas-ah/05.01/SAS-Kurs.html. Gut verständliche Einführung in die Datenverarbeitung mit der SAS Version 6.12 unter Windows in deutscher Sprache mit zahlreichen Übungen und Lösungen zu praxisnahen Beispielen. Das Buch vermittelt ein solides Grundwissen der SAS Software in den Bereichen Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 2 Literaturhinweise Datenübernahme/Dateneingabe, Datenanalyse und Präsentation. Neben den deskriptiven statistischen Auswerteverfahren wird gezeigt wie gängige statistische Tests mit SAS durchgeführt werden können. Das Buch enthält auch eine Kurzeinführung in SAS/GRAPH, die Makrosprache, die Matrixsprache in SAS/IML und die Anwendungsentwicklung mit SAS/AF. Das ansprechend gestaltete und didaktisch gut aufgebaute Buch eignet sich durch seinen tutoriellen Charakter hervorragend zum Selbststudium und führt den Leser durch zahlreiche Hinweise auf die Online-Hilfe und Handbücher zur selbständigen Arbeit mit der SAS Software. 8. A. Graf, C. Ortseifen, Statistische und grafische Datenanalyse mit SAS, Spektrum Akad. Verl., 1995, € 29 Ziel ist es, für einen gegebenen Datenbestand und eine bestimmte Fragestellung die richtige Auswahl und Anwendung von SAS Prozeduren und der ihnen zugrundeliegenden statistischen Verfahren zu finden. Dies wird anhand zahlreicher Beispiele demonstriert, wobei die von den Prozeduren gelieferten Ergebnisse detailliert interpretiert werden. 9. SAS Language and Procedures: Usage, Version 6, First Edition, SAS Institute Inc. Tutorielle Einführung in Base SAS anhand von konkreten Aufgabenstellungen von einfachem bis mittlerem Schwierigkeitsgrad. Themenauswahl: Introduction to the SAS System, Basic Programming, Combining SAS Data Sets, Understanding your SAS Session, Producing Reports, Producing Plots and Charts, Designing Your Own Output, Storing and Managing Data in SAS Files Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 3 Grundlagen Grundlagen Steuerung des SAS Systems SAS war (und ist) kommandozeilen-orientiert, das heißt die Steuerung erfolgt über Kommandos, die in der Kommandozeile eingegeben werden oder bequemer über Funktionstasten und Short Cuts (Tastenkombinationen). Als Windows Anwendung kann SAS auch mit der Maus über Menüs und Symbolleisten gesteuert werden, wobei auch hier Kommandos hinterlegt sind. Im Skript wird versucht, zu jeder Aktion die verschiedenen Möglichkeiten der Steuerung aufzuzeigen. • Menüpunkte sind durch Fettdruck hervorgehoben, wobei Haupt- und Untermenüpunkte durch Î getrennt werden. Beispiel: Öffnen eines neuen Fensters im Enhanced Editor: Enhanced Editor: File Î New • Short Cut (Tastenkombination). Im Beispiel: Strg+N • Icons der Symbolleiste werden grafisch dargestellt. Im Beispiel: • Kommandos werden in eckigen Klammern fett gedruckt, wobei die unbedingt notwendigen Teile durch Großbuchstaben gekennzeichnet sind. Ein anderer funktionaler Unterschied zwischen Groß/Kleinschreibung besteht nicht. Senkrechte Striche "|" kennzeichnen Alternativen. Im Beispiel: , [WEDit|WHOstedit] für Window Edit bzw. Window Host Edit. Hinweise: • Alle Pull-Down Menüs und Pop-Up Menüs (Rechtsklick), sowie die angezeigte Symbolleiste (tool bar) sind kontext-spezifisch, also davon abhängig, welches Fenster gerade aktiv ist. • Alle angegebenen Funktionstasten und Short Cuts entsprechen der Standardeinstellung des SAS Systems. Für eine vollständige Übersicht siehe Kapitel „Standard Short Cuts“, Seite 15 bzw. SAS Help and Documentation Î Using SAS Software in Your Operating Environment Î Using SAS in Windows Î Running SAS under Windows Î Interacting with SAS under Windows Î Working within Your SAS Session Î Defining Keys. SAS Language Die Skriptsprache SAS Language besteht aus Anweisungen (statements). Diese werden im Editor eingegeben und müssen immer durch ein Semikolon ";" abgeschlossen werden. Beispiel: Data Anweisung DATA tabelle1 <tabelle2...> ; Die hier verwendete Typografie orientiert sich an den üblichen Standards. SAS Programmcode, d.h. Anweisungen erscheinen in der Schriftart Courier fett gedruckt, wobei reservierte Schlüsselworte zur leichteren Unterscheidung groß und selbst definierte Bezeichnungen kursiv und klein dargestellt sind. Optionale Angaben stehen in spitzen Klammern. Ein funktionaler Unterschied zwischen Groß-/Kleinschreibung besteht nicht (Ausnahme: Definition von Variablen). Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 4 Grundlagen Übersicht Bedeutung Kommando (global command) Anweisung (statement) Steuerbefehl alternativ zu Menüpunkt Sprachelement der SAS Language Short Cut, Icon der Symbolleiste (tool bar) Eingabe in Kommandozeile Editor Fenster (immer mit ";" beenden) Ausführen durch Enter-Taste Run Î Submit, Beispiele [WEDit] [ZOOM] DATA tabelle1; RUN; ,, F8, [SUBmit] Dateitypen Generell sind bei SAS zwei grundsätzlich verschiedene Arten von Dateien zu unterscheiden: SAS Programmdateien (SAS program files) und SAS Datendateien (SAS data files) Im Gegensatz zu anderen Windows Anwendungen wird mit File Î Open, keine Datendatei geöffnet, sondern eine Programmdatei. Dies ist eine ASCII-Datei, die aus SAS Anweisungen besteht und deren Inhalt im Editor Fenster angezeigt wird. Üblicherweise tragen SAS Programmdateien die Endung ".sas". Siehe Kapitel 2: SAS Programme Bei SAS Datendateien gibt es wiederum verschiedene Typen. In allen Fällen handelt es sich um Binärdateien in einem SAS spezifischen Format. Der wichtigste Typ ist die so genannte SAS Tabelle (data set). Die Dateiendung wird von SAS automatisch vergeben und richtet sich nach der SAS Version und dem Betriebssystem. Siehe Kapitel 4: SAS Tabellen (data sets) Dateitypen SAS Programmdatei "Programm" SAS Datendatei "Tabelle" (data set) (program file) Bedeutung ASCII-Datei mit SAS Anweisungen Binärdatei in einem SAS spezifischen Format, (statements) die Daten enthält Erstellen mit File Î New, DATA Anweisung Öffnen mit File Î Open, SAS Explorer Dateiendung *.sas (Standard) *.sas7bdat (ab Version 7 unter Windows) *.sd2 (Version 6.12 unter Windows) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 5 Grundlagen Benutzeroberfläche (Display Manager) 1. Benutzeroberfläche (Display Manager) SAS Applikationsfenster (SAS Workspace) Menüzeile (menu bar) Kommandozeile (command bar) Docking Bereich (kann fehlen) Statuszeile Arbeitsverzeichnis Symbolleiste (tool bar) Cursor Positionsanzeige SAS Fensterleiste (window bar) Unterhalb der Menüleiste (menu bar) befindet sich die Symbolleiste (tool bar) mit dem Kommandofenster (command bar, F11), in das Kommandos (global commands) zur Steuerung des Systems eingegeben werden können. Darüber hinaus gibt es noch Pop-Up Menüs (nicht abgebildet). ACHTUNG: Alle Pull-Down Menüs und Pop-Up Menüs (Rechtsklick), sowie die angezeigte Symbolleiste (tool bar) sind kontext-spezifisch, also davon abhängig, welches Fenster gerade aktiv ist. Die unterste Zeile enthält links die Statuszeile, in der wichtige Systemmeldungen angezeigt werden. In der Mitte steht das aktuelle Arbeitsverzeichnis (current working folder), welches das Standardverzeichnis zum Öffnen und Speichern von Programmdateien ist und ganz rechts die aktuelle Mauszeigerposition (nur im Enh. Editor). Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 6 Grundlagen Benutzeroberfläche (Display Manager) Die Fenster Results und Explorer sind standardmäßig fest verankert (docked). Alle übrigen aktuell vorhandenen Fenster erscheinen in dem freien Raum rechts davon und sind beweglich. Über die SAS Fensterleiste (window bar) ist jedes Fenster direkt aktivierbar. Sichtbare Fenster lassen sich durch Hineinklicken aktiveren. Mit Strg+Tab kann man zyklisch durch alle Fenster wechseln. Beim Start von SAS erscheinen normalerweise die fünf Hauptfenster: Results, Explorer, Output, Log, Enhanced Editor. 1.1 Results Fenster Mit dem Results Fenster werden die erzeugten Ergebnisse (Outputs) verwaltet2. Es ist das Inhaltsverzeichnis aller erzeugten Ergebnisse. Das Results Fenster liegt normalerweise verankert (docked) hinter dem Explorer Fenster und ist beim Start von SAS leer. Sobald Output erzeugt wird, kommt es automatisch in den Vordergrund und zeigt die generierten Outputs in chronologischer Reihenfolge der Erstellung in Form von Einträgen in einer Baumstruktur an. Jede Prozedur erzeugt darin einen Eintrag (folder), der verschiedene Untereinträge (subfolders) enthält. Die einzelnen Untereinträge sind Links auf das entsprechende Dokument und können gezielt angezeigt, gedruckt, gespeichert oder gelöscht werden. Dazu mit der rechten Maustaste den gewünschten Untereintrag anklicken. Durch Doppelklicken eines Eintrags werden alle Untereinträge angezeigt. Durch Doppelkicken von Untereinträgen werden diese, wenn es sich um Listenoutput handelt im Output Fenster geöffnet, indem die entsprechende Stelle im Output Fenster angezeigt wird bzw. wenn es sich um einen HTML Output handelt, wird dieser in einem Browser angezeigt. Siehe auch Kapitel "Output Delivery System (ODS)". Wenn der Inhalt des Output Fensters gelöscht wird, werden die entsprechenden Listeneinträge im Results Fenster gelöscht und umgekehrt. Zum Drucken den gewünschten Eintrag oder Untereintrag markieren und anschließend aus dem Rechtsklick Menü den Punkt Print auswählen oder File Î Print, Strg+P oder File Î Print Preview wählen oder direkt das Druckersymbol anklicken. Siehe auch das Kapitel "Drucken von Listenoutput" auf Seite 14 2 Alternativ kann dafür auch das ältere Output Manager Fenster verwendet werden (Aufruf mit [MANager]). Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 7 Grundlagen Benutzeroberfläche (Display Manager) Bei der Erscheinungsform des Results Fensters kann wahlweise zwischen verankert und frei beweglich gewählt werden. Dazu das Fenster aktivieren und anschließend im Menü wählen: Window Î Docked 1.2 SAS Explorer Das SAS Explorer Fenster dient der Verwaltung von SAS Bibliotheken und den darin enthaltenen SAS Dateien (SAS files) und ist ähnlich dem Windows Explorer aufgebaut. Das Fenster erscheint normalerweise fest verankert (docked) mit dem Results Fenster und ist einteilig. Durch Doppelklick auf ein Symbol wird der Inhalt des Elements angezeigt. Alternativ kann man über View Î Explorer oder den Button ein weiteres Explorer Fenster zu öffnen. Dieses ist freibeweglich und zweiteilig mit Baumstruktur links (tree). Im linken Teil des Fensters erscheinen die definierten Bibliotheken. Durch Anklicken einer Bibliothek erscheinen rechts alle darin enthaltenen SAS Dateien d.h. Tabellen (data sets), Kataloge (catalogs), etc. Freibewegliches Explorerfenster mit Baumstruktur in Detail Ansicht Es stehen vier verschiedene Ansichten zur Verfügung. Menü View: Large Icons, Small Icons, List und Details. Die Anzeige der Baumstruktur lässt sich wahlweise an und ausschalten über View Î Show Tree oder das entsprechende Icon. Siehe auch das Kapitel SAS Daten Bibliothek (Data Library) auf Seite 31 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 8 Grundlagen 1.3 Benutzeroberfläche (Display Manager) Listenfenster (Output) Das Listenfenster oder Output Fenster enthält die inhaltlichen Ergebnisse der ausgeführten SAS Programme in Form von Listen, Tabellen und zeichenbasierten Grafiken, den so genannten Listenoutput. Der Aufruf erfolgt durch Anklicken der entsprechenden Fensterlasche oder über Window Î Output, F7 oder [LST|OUTPut]. Das Listenfenster arbeitet kumulativ, d.h. es enthält in chronologischer Reihenfolge alle erzeugten Listenoutputs. Es ist ratsam, dieses Fenster von Zeit zu Zeit zu löschen durch Edit Î Clear all, File Î New, Strg+N, , [CLEAR]. Der Inhalt des Fensters kann als Datei gespeichert werden über File Î Save, Strg+S oder den Button. Zur Übersicht und Verwaltung aller Outputs dient das Results Fenster. Es ist das Inhaltsverzeichnis des Listenfensters. Damit kann man die einzelnen Einträge gezielt anzeigen, löschen, drucken, speichern. Siehe Kapitel "Results Fenster" auf Seite 7 Zum Drucken siehe auch das Kapitel "Drucken von Listenoutput" auf Seite 14 1.4 Protokollfenster (Log) Im Protokollfenster oder Log Fenster wird jede Ausführung von Quellcode fortlaufend protokolliert. Er enthält neben dem Programmcode wichtige Hinweise (note, info3) und ggfs. Warnungen (warning) oder Fehlermeldungen (error). Nach jeder Ausführung von Quellcode sollte zuerst der Log kontrolliert werden! Dies gilt auch dann, wenn Output erzeugt wurde und dieser automatisch angezeigt wird. Worauf soll man im Log achten? • • • Gibt es Errors oder Warnings? Stimmt die Anzahl der Beobachtungen (observations) und Variablen (variables) mit der Erwartung überein? Gibt es unerwartete Notes? z.B. NOTE: Variable xxx was not initialized NOTE: Missing values were generated as a result of performing an operation on missing values. Each place is given by: (Number of times) at (Line):(Column). 1 at 701:5 NOTE: Character values have been converted to numeric values at the places given by: (Line):(Column) 703:25 Der Aufruf erfolgt durch Anklicken der entsprechenden Fensterlasche oder über Window Î Log, F6 oder [LOG]. Es ist ratsam, dieses Fenster von Zeit zu Zeit zu löschen durch Edit Î Clear all, File Î New, Strg+N, , [CLEAR]. Der Inhalt des Fensters kann als Datei gespeichert werden über File Î Save, Strg+S oder den 3 Button. Infos werden standardmäßig nicht angezeigt. Sie enthalten zusätzlich zu Notes, Warnings und Errors ergänzende Hinweise, die sehr nützlich sind. Dazu muss die Systemoption MSGLEVEL=I gesetzt werden. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 9 Grundlagen 1.5 Benutzeroberfläche (Display Manager) Enhanced Editor Das Enhanced Editor Fenster dient zum Erstellen, Verwalten und Ausführen von SAS Programmen. Jede Programmdatei wird in einem separaten Editor Fenster geöffnet. Für den inhaltlichen Aufbau von SAS Programmen siehe Kapitel "SAS Programme". Verwaltung von SAS Programmen Ein neues Enhanced Editor Fenster erhält man über View Î Enhanced Editor oder über die Kommandos [WEDit|WHOstedit]. Über File Î New, Strg+N, oder den Button der Symbolleiste ist dies nur dann möglich, wenn ein Enhanced Editor Fenster aktiv ist. Ebenfalls nur dann kann eine bestehende Programmdatei über File Î Open, Strg+O oder in einem weiteren Enhanced Editor Fenster geöffnet werden. In diesem Fall trägt das Fenster den Namen der SAS Programmdatei. Ein neues Fenster bekommt den Namen "Untitledn" (n ist ein fortlaufender Zähler) bis sein Inhalt über File Î Save, Strg+S oder unter einem konkreten Namen gespeichert wird (standardmäßig mit der Endung ".sas"). Falls kein Enhanced Editor Fenster aktiv ist, wird über den Button oder das Kommando [DMSTOOLS] das zuletzt benutzte Enhanced Editor Fenster aktiviert, oder gegebenenfalls ein erstes geöffnet. Alternativ kann das gewünschte Fenster durch Anklicken der entsprechenden Fensterlasche aktiviert werden. Jede Änderung am Inhalt eines Enhanced Editor Fensters wird automatisch erkannt und durch einen Stern "*" im Fensternamen angezeigt. Erst durch Speichern oder Rückgängigmachen der Änderung über Strg+Z, , [UNDO] verschwindet der Hinweis. Die Verwaltung dieser Änderungshinweise erfolgt separat für jedes benutzte Enhanced Editor Fenster. Beim Beenden von SAS wird dies automatisch berücksichtigt und gegebenenfalls nachgefragt, ob gespeichert werden soll. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 10 Grundlagen Benutzeroberfläche (Display Manager) Ausführen von SAS Programmen Das Ausführen von SAS Programmcode, wird auch als "Abschicken" oder "Submittieren" (Submit) bezeichnet. Dies geschieht über Run Î Submit, , F8, [SUBmit] entweder für den gesamten Inhalt des Editorfensters oder falls darin Code markiert ist, ausschließlich für die Markierung. SAS protokolliert die Ausführung des Programmcodes im Log Fenster mit Hinweisen (notes) und gegebenenfalls auch mit Warnungen (warnings) und Fehlermeldungen (errors). Falls durch den ausgeführten Code Output erzeugt wird, wird dieser im Results Fenster als neuer Eintrag angezeigt. Der Programmspeicher. Jeder ausgeführte Programmcode wird im Programmspeicher von SAS für die Dauer der SAS Sitzung gespeichert und kann jederzeit zurückgeholt (recall) werden. Normalerweise ist dies jedoch nicht notwendig, da der Quellcode im Enhanced Editor Fenster auch nach dem Ausführen erhalten bleibt. Im alten Programm Editor (PGM), der vor Version 7 und auch immer noch alternativ verfügbar ist, wird der Inhalt des Editor Fensters beim Submit gelöscht und muss per Recall (Run Î Recall Last Submit, F4, [RECall]) aktiv aus dem Programmspeicher zurückgeholt werden. Die Eigenschaften des Programmspeichers können auch bei Verwendung des Enhanced Editors benutzt werden, um bei der Entwicklung von Programmen an Versionen heranzukommen, die im Verlauf einer SAS Session bereits einmal ausgeführt worden sind. Der Programmspeicher arbeitet nach dem Prinzip "Last In – First Out" und lässt sich als Stapel veranschaulichen. Das zuletzt ausgeführte Programm wird "ganz oben" auf den Stapel gelegt und kommt beim Recall als erstes zurück. Damit liegt das vorletzte Programm oben auf und kann als nächstes zurückgeholt werden. Dies lässt sich fortsetzen, bis zum ersten Programm. Der Stapel ist dann abgearbeitet. Durch ein erneutes Ausführen von Programmcode wird der komplette Stapel wieder aufgebaut, wodurch wiederum alle früheren Programme zum Zurückholen bereitstehen. Achtung: Durch jedes Recall wird der entsprechende Quellcode am Anfang des Editor Fenster eingefügt! Der zuerst ausgeführte Code erscheint damit vor dem danach ausgeführten, so dass die ursprüngliche Chronologie direkt wiederherstellbar ist. Das Enhanced Editor Fenster besitzt eigene Short Cuts. Diese haben Vorrang vor der Tastenbelegung der übrigen Hauptfenster (Display Manager Keys = DMKEYS). Standardmäßig sind die Short Cuts so definiert, dass sie den üblichen Windows Standards entsprechen. Zum Beispiel: Strg+O für Öffnen, Strg+S für Speichern, Strg+P für Drucken, Strg+F bzw. Strg+H für Suchen bzw. Suchen/Ersetzen, Strg+A für Alles Markieren, Strg+Z für Rückgängigmachen der jeweils letzten Änderung (Undo) Strg+Y für Rückgängigmachen des jeweils letzten Undo (Redo) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 11 Grundlagen Benutzeroberfläche (Display Manager) Darüber hinaus gibt es weitere nützliche Short Cuts wie: Strg+7 Markierte Zeilen auskommentieren mit /* ... */ (Umkehrung Strg+Shift+7)4 Strg+9 Suche nach Klammer-Paaren (nicht bei Text in Anführungsstrichen oder Kommentar) Alt+9 Suche nach DO...END Paaren (ab V8.2) Alt+Ç|È Sprung zur ersten|letzten sichtbaren Zeile des Fensters Strg+G Direkter Sprung zu einer bestimmten Zeile Alt+Zahlenblock- Aktuellen Step reduzieren (Umkehrung Alt+Zahlenblock+) Strg+Alt+Zahlenblock- Alle Steps reduzieren (Umkehrung Strg+Alt+Zahlenblock+) Für eine vollständige Übersicht siehe Kapitel "Standard Short Cuts" oder in der Online Hilfe, Index: Keyboard Shortcuts, Enhanced Editor. Änderungen sind möglich über Tools Î Options Î Enhanced Editor Keys. Eigenschaften des Enhanced Editor: Die Eigenschaften des Enhanced Editors sind einstellbar über Tools Î Options Î Enhanced Editor... Nachfolgend werden die wichtigsten Standardeigenschaften beschrieben. • Syntaxsensitive Farbgestaltung z.B. Schlüsselworte, Kommentare, Zahlen, Text in Anführungsstrichen, Makros, etc. • Segmentierung des Quelltextes durch horizontale Linien, DATA Steps, PROC Steps und Makros können jeweils auf eine Zeile reduziert werden (code folding) Markierung und Submit reduzierter ist Zeilen möglich! (umfasst alle enthaltenen Zeilen) • Einrückungen werden mit "Enter" automatisch in die nächste Zeile übernommen Markierte Zeilen können mit Tab bzw. Shift+Tab ein- bzw. ausgerückt werden. • Windowsübliche Eigenschaften Korrekte Wortmarkierung durch Doppelklick (auch bei Umlauten) Markierung bleibt beim Kopieren bestehen Einfügen überschreibt Markierung Bestehende Markierung erweiterbar durch Shift Block Markierung mit Alt-Taste Nächstes Wort löschen mit Strg+Entf (bis zum Ende des aktuellen Wortes) Letztes Wort löschen mit Strg+Rück (Backspace) • Lesezeichen (Line Marker) Strg+F2 setzt oder entfernt ein Lesezeichen auf die aktuelle Zeile. Mit F2 kann man zwischen den Lesezeichen springen. Lesezeichen bleiben beim Submit erhalten. 4 Diese Short Cuts müssen ggfs. vor dem ersten Gebrauch einmalig neu definiert werden über Tools Î Options Î Enhanced Editor Keys Î Category: Selection Operations, Commands: Un-/Comment the selection with line comments Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 12 Grundlagen • Benutzeroberfläche (Display Manager) Textbaustein (abbreviation) Häufig verwendete Texte wie bestimmte Titel oder Fußnoten, Optionen, Prozeduren etc. können als Textbaustein (abbreviation) gespeichert werden. Tools Î Add Abreviation... oder Strg+Shift+A Bei Verwendung der Abkürzung wird der Text als Tool Tipp angezeigt und kann mit Tab eingefügt werden. Nachträgliches Ändern oder Löschen über Tools Î Keyboard Macros Î Macros... oder Strg+Shift+M • Tastatur Makros Über Tools Î Keyboard Macros Î Record New Macro können Abfolgen von Editorbefehlen für wiederholte Anwendungen gespeichert werden. z.B. Suchen und Ersetzen von bestimmtem Texten. Tastatur Makros und Abkürzungen können über Tools Î Keyboard Macros Î Macros... oder Strg+Shift+M erzeugt und verwaltet werden, wobei viele spezielle Befehle zur Verfügung stehen. z.B. Aktuellen Zeitstempel einfügen • Zeilenkommandos des alten Program Editors (PGM) zum einfachen Duplizieren oder Löschen von Zeilen wurden ab SAS Version 8.2 in begrenztem Umfang wieder eingeführt und können in der Kommandozeile nach einem Doppelpunkt eingegeben werden oder als Tastaturmakro gespeichert werden. Beispiel: :r Aktuelle Zeile wiederholen (repeat) :d Aktuelle Zeile löschen (delete) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 13 Grundlagen 1.6 Benutzeroberfläche (Display Manager) Drucken von Listenoutput Bei der Erstellung von Listenoutput richtet sich SAS automatisch nach der aktuell verfügbaren Seitengröße, welche vom aktuell eingestellten Drucker, der Papiergröße (A4 etc.), der Seitenorientierung (hoch, quer), der Schriftart und Schriftgröße und den Seitenrändern abhängt. Daraus berechnet SAS die verfügbare Anzahl von Zeichen pro Zeile (linesize) und Zeilen pro Seite (pagesize) und speichert beide Werte in den Systemoptionen linesize und pagesize. SAS erstellt den Listenoutput für ein bestimmtes Seitenlayout entsprechend der Einstellung der Systemoptionen linesize und pagesize, welches nachträglich nicht mehr geändert werden kann. Im Bedarfsfall muss der Output für ein anderes Seitenlayout neu erstellt werden. Beim Drucken von Listenoutput ist es entscheidend, dass das Seitenlayout des Outputs mit dem des Druckers übereinstimmt. Falls beide Einstellungen nicht zusammenpassen, z.B. weil im Programm eine andere Line Size und/oder Page Size verwendet wurde oder die Druckereinstellung nachträglich geändert wurde, kann dies zu unbefriedigenden Ausdrucken führen (Fehlende Teile oder schlechte Blattaufteilung). Um korrekte Ausdrucke von Listenoutput zu erzielen geht man am besten so vor: 1. Den gewünschten Drucker und das gewünschte Seitenlayout (Papiergröße, Seitenorientierung, Seitenränder, Schriftart und -größe) vor dem Erstellen des Outputs, d.h. vor dem Start des Programms über File Î Print Setup... auswählen. Dadurch berechnet SAS automatisch die verfügbare Anzahl von Zeichen pro Zeile (linesize) und Zeilen pro Seite (pagesize) und stellt die System Optionen entsprechend ein. Alle nachfolgend aufgerufenen Prozeduren orientieren sich daran und erstellen den Listenoutput passend dazu. 2. Im Programm diese Angaben für Line Size und Page Size nicht ändern. Das Programm starten und den Listenoutput erstellen lassen. 3. Über File Î Print Preview oder den Button das Aussehen des Ausdrucks vor dem Drucken überprüfen und erst anschließend Drucken. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 14 Grundlagen 1.7 Benutzeroberfläche (Display Manager) Standard Short Cuts Standard Display Manager Keys (DMKEYS) Gültig in allen Hauptfenstern außer dem Enhanced Editor. Änderung sind möglich über Tools Î Options Î Keys oder [KEYS]. SAS System Default Key Settings Key Default Setting Key Default Setting F1 help ALT+F1 F2 reshow ALT+F2 F3 end ALT+F3 F4 recall ALT+F11 F5 pgm ALT+F12 F6 log CTRL+B libname F7 output CTRL+D dir F8 zoom off; submit CTRL+E clear F9 keys CTRL+G F11 command bar CTRL+H help CTRL+I options F12 SHIFT+F1 subtop CTRL+J SHIFT+F2 CTRL+K cut SHIFT+F3 CTRL+L log SHIFT+F6 CTRL+M mark SHIFT+F7 left CTRL+Q filename SHIFT+F8 right CTRL+R rfind CTRL+T title CTRL+U unmark SHIFT+F11 CTRL+W access SHIFT+F12 CTRL+Y CTRL+F1 RMB CTRL+F2 SHIFT+RMB CTRL+F3 CTRL+RMB CTRL+F11 MMB CTRL+F12 SHIFT+MMB SHIFT+F9 SHIFT+F10 wpopup wpopup CTRL+MMB Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 15 Grundlagen Benutzeroberfläche (Display Manager) Standard Short Cuts für den Enhanced Editor haben Vorrang vor der sonstigen Tastenbelegung (Display Manager Keys = DMKEYS), welche in den übrigen Hauptfenstern gilt. Default Keyboard Short Cuts for the Enhanced Editor Category Command Keyboard Short Cut Help Help for a procedure cursur on proc name, F1 Abbreviation Add a new abbreviation Ctrl + Shift + A Bring up word tip Alt + F1 + No Selection Hide the current word tip Esc Make a text abbreviation Shift + E Collapse all folding blocks Alt + Ctrl + Number pad- Collapse current line Alt + Number pad - Expand all folding blocks Alt + Ctrl + Number pad+ Expand current line Alt + Number pad+ Toggle expand current line Alt + Number pad* Code Folding Command/Macro Support Add or change macros Edit Line Markers Miscellaneous Navigation Ctrl + Shift + M Execute the last recorded macro Ctrl + F1 Start/Complete macro Alt + Shift + R Delete current character Delete Delete previous character Backspace Delete to next word start Ctrl + Delete Delete to previous word start Ctrl + Backspace Insert a carriage return Enter Redo Ctrl + Y Undo Ctrl + Z Go to the next marked line F2 Go to the previous marked line Shift + F2 Toggle marker on the current line Ctrl + F2 Copy selection Ctrl + C Cut selection Ctrl + X Past from clipboard Ctrl + V Go to line (interactive) Ctrl + G Move cursor down Down Move cursor down a page Page Down Move cursor left Left Move cursor right Right Move cursor to beginning of document Ctrl + Home Move cursor to beginning of line Home Move cursor to end of document Ctrl + End Move cursor to end of line End Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 16 Grundlagen Benutzeroberfläche (Display Manager) Move cursor to matching brace/parentheses Ctrl + [ or Ctrl + ] Move cursor to matching DO/END Alt + [ or Ctrl + ] Move cursor to next case change Alt + Right Move cursor to next word start Ctrl + Right Move cursor to previous case change Alt + Left Move cursor to previous word start Ctrl + Left Move cursor up Up Move cursor up a page Page Up Move cursor to the first visible line Alt + Up Move cursor to the last visible line Alt + Down Scroll screen down Ctrl + Up Scroll screen up Ctrl + Down Option Setting Toggle insert/overwrite mode Insert Selection Extend selection character left Shift + Left Extend selection character right Shift + Right Extend selection down Shift + Down Extend selection down a page Shift + Page Down Extend selection to beginning of document Ctrl + Shift + Home Extend selection to beginning of line Shift + Home Extend selection to end of document Ctrl + Shift + End Extend selection to end of line Shift + End Extend selection to next case change Alt + Shift + Right Extend selection to previous case change Alt + Shift + Left Extend selection up Shift + Up Extend selection up a page Shift + Page Up Extend selection to previous word start Ctrl + Shift + Left Extend selection to the next word start Ctrl + Shift + Right Select all Ctrl + A Clean up whitespace Ctrl + Shift + W Comment the selection with line comments5 Ctrl + 7 Convert the selected text to lowercase Ctrl + Shift + L Convert the selected text to uppercase Ctrl + Shift + U Tab selection Tab + Selection UnComment the selection with line comments Ctrl + Shift + 7 UnTab selection Shift + Tab + Selection neu ab SAS 8.2 Selection Operations 5 Dieser Short Cut und sein Pendant muss ggfs. neu definiert werden über Tools Î Options Î Enhanced Editor Keys Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 17 Grundlagen 1.8 Benutzeroberfläche (Display Manager) Übung 1: Ein erstes SAS Programm 1. Starten Sie SAS über das entsprechende Symbol am Desktop 2. Geben Sie im Enhanced Editor den folgenden Programmcode ein und lassen Sie diesen ausführen: TITLE1 "Mein erstes SAS Programm"; DATA neu; x=100; y=2*x; z=MEAN(OF x y); text1="Hallo Welt! "; text2=text1||text1; RUN; PROC PRINT DATA=neu; RUN; 3. Kontrollieren Sie das Log Fenster und rufen Sie über das Results Fenster den Listenoutput auf. 4. Speichern Sie das Programm, wenn es fehlerfrei war und kontrollieren Sie mit dem Windows Explorer, dass die Programmdatei tatsächlich angelegt worden ist. Danach beenden Sie SAS. 5. Starten Sie SAS erneut und öffnen Sie ihr Programm wieder. Sie können jetzt das Programm abändern, indem Sie zum Beispiel den Text der Variable TEXT1 ändern oder auch weitere Variablen hinzufügen. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 18 Grundlagen Programme 2. Programme Ein SAS Programm ist eine Folge von logischen Schritten (steps), die nacheinander in der gegebenen Reihenfolge ausgeführt werden. Jeder Schritt selbst ist eine Aneinanderreihung von Anweisungen (statements). Jede Anweisung muss immer mit einem Semikolon beendet werden. In einem SAS Programm können drei Arten von Schritten unterschieden werden. Globale Anweisungen Nicht-SAS Daten Datenschritt DATA Step SAS Tabelle Data set Prozedurschritt PROC Step Output 1. Globale Anweisungen dienen der Festlegung grundlegender Einstellung wie Systemoptionen, Titel etc. 2. Im Datenschritt (DATA STEP) werden eine oder mehrere SAS Tabellen (data sets) erzeugt. Er beginnt mit der Anweisung DATA und dem Namen der zu erzeugenden SAS Tabelle. Im Datenschritt können Daten aus verschiedenen Quellen eingelesen und in nahezu beliebiger Weise verarbeitet werden. Dazu steht eine Vielfalt von Anweisungen und Funktionen zur Verfügung. 3. Im Prozedurschritt (PROC STEP) wird eine SAS Tabelle mit Hilfe einer vordefinierten Auswerteprozedur verarbeitet. Das SAS-System stellt eine Vielzahl von Prozeduren zur Verfügung. Jeder Prozedurschritt beginnt mit der Anweisung PROC, dem Namen der gewünschten Prozedur und nach der Option DATA= mit dem Namen der zu verarbeitenden SAS Tabelle (data set). Hinweis: Die Reihenfolge der Schritte ist entscheidend für die korrekte Abarbeitung, da jeder Schritt von den Ergebnissen der vorangegangenen Schritte abhängig ist. Grundsätzlich gilt: Es kann nur das verwendet werden, was vorher erstellt oder definiert worden ist. Ein Programm kann mehrere Daten- und Prozedurschritte enthalten. Sie dürfen jedoch nicht geschachtelt werden, d. h. In einem Datenschritt darf kein weiterer Datenschritt oder ein Prozedurschritt aufgerufen werden. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 19 Grundlagen 2.1 Programme Hinweise zum Aufbau von SAS Programmen Guter Programmierstil zeichnet sich dadurch aus, dass Programme nicht nur effizient, sondern auch übersichtlich und verständlich geschrieben sind. Beachten Sie dazu folgende Techniken6: • Beginnen Sie jedes Programm mit einem Dokumentationskopf, welcher wenigstens den Programmnamen, das Erstellungsdatum, den Autor und eine Kurzbeschreibung enthält. Am besten erstellt man sich eine leere Kopfvorlage und speichert sie als Textbaustein (abreviation). • Stellen Sie globale Anweisungen, die für das gesamte Programm von Bedeutung sind an den Anfang. • Verwenden Sie Einrückungen, um das Programm übersichtlicher und leichter lesbar zu machen. Einrückungen nach DATA und PROC Anweisungen machen die Schrittgrenzen deutlich erkennbar. Einrückungen innerhalb von DO-Blöcken kennzeichnen verschiedene Ebenen. • Beenden Sie jeden Daten- oder Prozedurschritt mit einer RUN-Anweisung. • Trennen Sie Sinnabschnitte durch Leerzeilen, um das Programm übersichtlicher zu machen. Unübersichtlich DATA baby; SET klinik1; WHERE alter<1; PROC PRINT DATA=baby; VAR name alter gewicht; BY sex; RUN; Besser DATA baby; SET klinik1; WHERE alter<1; RUN; PROC PRINT DATA=baby; VAR name alter gewicht; BY sex; RUN; • Gestalten Sie komplexe Ausdrücke übersichtlich. Verwenden Sie gegebenenfalls. mehrere Zeilen. z. B. IF wert1<=untergrenze OR wert1>=obergrenze THEN flag=1; ELSE flag=2; • Sparen Sie nicht an Kommentaren. Kommentare machen Programme leichter nachvollziehbar und erhöhen die Verständlichkeit. Kommentare haben entweder die Form * ...; oder /* ... */ Für normale Kommentare wird die erste Variante empfohlen, um die zweite Möglichkeit zum "Herauskommentieren" größerer Programmteile zur Verfügung zu haben, die auch Semikolons enthalten dürfen. • Verwenden Sie nach Möglichkeit "sprechende Namen" für SAS Tabellen, Variablen, Formate und andere selbst definierte Bezeichnungen, soweit dies im Rahmen der SAS Namenskonvention möglich ist. 6 SAS Programming Tips: Chapter 10, Code clearly Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 20 Grundlagen 2.2 Programme SAS Namenskonvention Die SAS Namenskonvention gilt für alle selbst definierten Bezeichnungen von Variablen, Tabellen (data sets), Bibliotheksreferenzen (libref), Dateireferenzen (fileref, File Short Cut), Formate, u.s.w. 1. SAS Bezeichnungen können bis zu 32 Zeichen lang sein (V6 maximal 8 Zeichen) AUSNAHME: maximal 8 Zeichen für Referenzen (Links) zu Bibliotheken (librefs) und Dateien (filerefs), 2. bestehend aus den Buchstaben (a-z), 3. den Ziffern (0-9) oder 4. dem Unterstrich (_) (underscore) und 5. dürfen nicht mit einer Ziffer beginnen. Ein funktionaler Unterschied zwischen Groß-/Kleinschreibung besteht nicht. (Ausnahme: Definition von Variablen) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 21 Grundlagen 2.3 Programme Übung 2: Ein zweites SAS Programm 1. Welche Bezeichnungen sind gültige SAS Namen? frauen männer ERGEBNIS erg1 erg_1 BlutWert1 blutw.1 a 1a a1 test-1 leukos op1_rr5 hämophil 1.wert alle a_b_c_d a/b lösung_1 messwert rr001 rr100 _Z_ ___ _test 2. Fügen Sie in Ihrem Programm in der ersten Zeile den Namen des Programms als Kommentar ein. Ebenso Ihren Namen und das heutige Datum. 3. Ihr Name und der Programmname sollen auf jeder Seite des Outputs erscheinen. Fügen Sie dazu eine weitere Titelzeile in Ihr Programm ein. 4. Fügen Sie am Ende der Zeile z=MEAN( ... den Text "Mittelwert aus den Variablen x und y" als Kommentar ein. 5. Fügen Sie vor der RUN Anweisung eine neue Zeile mit der Anweisung OUTPUT ein. Kopieren Sie nun alle sechs Zeilen zwischen den Anweisungen DATA und RUN und fügen Sie diese nach einer Leerzeile noch mal ein, wobei Sie hier der Variablen x den Wert 200 zuweisen. 6. Führen Sie das geänderte Programm aus und interpretieren Sie das Ergebnis. 7. Erstellen Sie ein neues SAS Programm, welches eine Umrechnungstabelle von DM in Euro erstellt. Speichern Sie dazu Ihr erstes Programm unter einem neuen Namen z.B. "DMinEuro.sas" (File Î Save As...) Ändern Sie die Kommentar- und Titelzeilen entsprechend ab. Ersetzen Sie den Datenschritt durch den Folgenden: DATA eurotab; DO DM=1 TO 20; Euro=DM/1.95583; OUTPUT; END; RUN; Lassen Sie die damit erstellte SAS Tabelle "eurotab" mit PROC PRINT anzeigen. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 22 Grundlagen 2.4 Programme SAS Anweisungen Die Elemente der SAS Language heißen Anweisungen (SAS Statements). • • Alle Anweisungen werden durch ein Semikolon beendet. Anweisungen sind frei formatierbar. Sie können groß oder klein geschrieben werden. (In diesem Skript werden die reservierten Schlüsselwörter jedoch groß geschrieben, um sie leichter von frei definierten Namen unterscheiden zu können) • • • Anweisungen können in jeder Spalte beginnen und enden. Eine Anweisung kann sich über mehrere Zeilen erstrecken. Mehrere Anweisungen können in einer Zeile stehen. Es gibt drei Arten von Anweisungen: 1. Globale Anweisungen (global statements) 2. Datenschritt Anweisungen (DATA Step statements) 3. Anweisungen der Prozeduren (PROC Step statements) 1. Globale Anweisungen (global statements) Mit Globalen Anweisungen (global statements) wie z.B. OPTIONS, LIBNAME, FILENAME, TITLE, FOOTNOTE werden grundlegende Einstellungen festgelegt, die für den korrekten Ablauf eines SAS Programms - genauer - für alle nachfolgenden Daten- und Prozedurschritte notwendig sind. Globale Anweisungen bleiben solange wirksam bis sie neu gesetzt werden, höchstens jedoch bis zum Ende der SAS Sitzung. Globale Anweisungen sollten am Anfang eines Programms stehen oder bei Änderungen direkt vor dem Daten- oder Prozedurschritt, bei dem die Änderung wirksam werden soll. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Language Dictionary Î Dictionary of Language Elements Î Statements Mit der TITLE Anweisung beispielsweise können bis zu 10 Kopfzeilen definiert werden, die oben auf jeder Seite des nachfolgend erzeugten Outputs erscheinen. Titel bleiben solange erhalten bis sie geändert oder gelöscht werden, höchstens jedoch bis zum Ende der SAS Sitzung. Syntax: TITLEn <'text'|"text">; n = 1...10 (ohne Angabe wird n=1 gesetzt) text = jeweiliger Text, der Umlaute und Sonderzeichen enthalten kann. Ohne Angabe von text wird die jeweilige Überschrift gelöscht. Standardmäßig ist Titel1 definiert als "The SAS System" ACHTUNG: Die Definition eines Titels löscht automatisch alle nachfolgenden Titel. z.B. wenn TITLE3 definiert wird, so werden dadurch TITLE4 bis TITLE10 gelöscht. Die Anweisung TITLE; löscht alle Titel. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 23 Grundlagen Programme Entsprechend können mit der FOOTNOTE Anweisung bis zu 10 Fußzeilen definiert werden, die unten auf jeder Seite des nachfolgend erzeugten Outputs erscheinen. Fußzeilen haben dieselben Eigenschaften wie Titelzeilen. Syntax: FOOTNOTEn <'text'|"text">; 2. Datenschritt Anweisungen (DATA Step statements) Datenschritt Anweisungen können im Datenschritt (DATA Step) verwendet werden. Es gibt zwei Gruppen: 1. Deklarationsanweisungen (declarative statements) wie z.B. WHERE, LENGTH, ARRAY, BY, KEEP, DROP, RENAME, FORMAT, LABEL liefern Informationen, die allgemein für einen Datenschritt gelten. Sie können an beliebiger Stelle im Datenschritt stehen, da sie bereits bei der Kompilierung wirksam werden. Es ist sinnvoll sie immer an derselben Stelle zu verwenden z.B. am Anfang oder Ende des Datenschritts. 2. Ausführbare Anweisungen (executable statements) wie z.B. INFILE, INPUT, IF, DO, DELETE, OUTPUT, SET bewirken erst während der Ausführung des Datenschritts eine Aktion mit den Daten. Die Reihenfolge der ausführbaren Anweisungen im Datenschritt ist entscheidend, da jede Anweisung von den Ergebnissen der vorgegangenen ausführbaren Anweisungen abhängig ist. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Language Dictionary Î Dictionary of Language Elements Î Statements 3. Anweisungen der Prozeduren (PROC Step statements) Jede Prozedur besitzt ihre spezifischen Anweisungen. z. B. TABLES Anweisung bei PROC FREQ. Alle zulässigen Anweisungen einer Prozedur erhält man am einfachsten, indem man im Enhanced Editor den Kursor auf den Prozedurnamen stellt und F1 drückt oder über das Kommando [help Prozedurname] z.B. [help univariate]. Siehe auch Kapitel "Version 8 Online Hilfe". Für eine vollständige Übersicht der Prozeduren der Base SAS Software siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures bzw. im Handbuch SAS Procedures Guide. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 24 Grundlagen 2.5 Programme Programmbeispiel: Filmschauspieler * Programmdateiname: Film1.sas Übungsbeispiel im SAS-Kurs für Anfänger, Stürzl/01.01.01 Globale Anweisungen (Kommentare, OPTIONS, LIBNAME, TITLE, FOOTNOTE) Datenschritt (DATA STEP): Einlesen von Rohdaten (INFILE, INPUT), Erzeugen von Variablen durch Zuweisung, Funktion TODAY() Prozedurschritte (PROC PRINT, CONTENTS, MEANS, FREQ); OPTIONS DATE NUMBER; LIBNAME kurs "C:\SASkurs"; * Verzeichnis zum Speichern von permanenten SAS Tabellen (data sets); TITLE1; TITLE2 "Filmschauspieler"; FOOTNOTE1 "Einführung in SAS/WINDOWS (Stürzl/film1.sas)"; DATA kurs.kino; INFILE DATALINES; * Rohdaten in Variablen einlesen; INPUT Vorname $ Nachname $ GebDatum:DDMMYY8. Gewicht:NUMX5.1; Sex:$1. Laenge * zusätzliche Variablen erzeugen; Name=vorname||nachname; Alter=TODAY()-gebdatum; Index=gewicht/((laenge-1)*100); * BROCA-Index (Verhältniszahl von Gewicht zu Körperlänge); BMI=gewicht/(laenge**2); * Body Mass Index (Normbereich: 19-24 kg/m²); * Körperlänge und -gewicht der Schauspieler sind DATALINES; Benno Fürmann 17.01.71 1 1.85 Dustin Hoffmann 08.08.37 1 1.64 Franka Potente 22.07.74 2 1.74 Gérard Depardieu 27.12.48 1 1.85 Götz George 23.07.38 1 1.88 Marianne Sägebrecht 27.08.45 2 1.72 Marlene Dietrich 27.12.01 2 1.75 Pierce Brosnan 16.05.53 1 1.84 Robert Redford 18.08.37 1 1.82 Senta Berger 13.05.41 2 1.73 Til Schweiger 19.12.63 1 1.85 Veronica Ferres 10.06.65 2 1.78 RUN; PROC RUN; PROC RUN; PROC RUN; PROC RUN; frei erfunden; 79,0 64,0 62,0 95,0 90,5 96,5 64,5 76,0 79,0 69,0 74,0 69,0 PRINT DATA=kurs.kino; CONTENTS DATA=kurs.kino; MEANS DATA=kurs.kino; FREQ DATA=kurs.kino; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 25 Grundlagen Programme Mit diesem Programm werden die Namen und Geburtstage, sowie die fiktiven Angaben zu Körperlänge und Körpergewicht verschiedener Filmschauspieler eingelesen und weiterverarbeitet. Das Programm ist zwar syntaktisch ohne Fehler, es enthält jedoch eine Reihe von inhaltlichen Fehlern und Unzulänglichkeiten, die zu unbrauchbaren oder unschönen Ergebnissen führen. Diese Fehler sollen im weiteren Verlauf des Kurses korrigiert und das Programm schrittweise verbessert und erweitert werden. Nach dem Ausführen des Programms erscheint im Log Fenster der Quelltext mit Zeilennummern versehen und folgenden Hinweisen: NOTE: Libref KURS was successfully assigned as follows: Engine: V9 Physical Name: C:\SASKURS NOTE: The data set KURS.KINO has 12 observations and 10 variables. NOTE: DATA statement used (Total process time): real time 0.17 seconds cpu time 0.01 seconds NOTE: There were 12 observations read from the data set KURS.KINO. NOTE: PROCEDURE PRINT used (Total process time): real time 0.17 seconds cpu time 0.00 seconds NOTE: PROCEDURE CONTENTS used (Total process time): real time 0.40 seconds cpu time 0.03 seconds NOTE: There were 12 observations read from the data set KURS.KINO. NOTE: PROCEDURE MEANS used (Total process time): real time 0.25 seconds cpu time 0.01 seconds NOTE: There were 12 observations read from the data set KURS.KINO. NOTE: PROCEDURE FREQ used (Total process time): real time 0.10 seconds cpu time 0.00 seconds Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 26 Grundlagen 2.6 Programme Übung 3: Filmschauspieler 1. Lassen Sie sich die Hilfe zu PROC PRINT anzeigen. 2. Über die folgenden Anweisungen werden drei Titelzeilen definiert. TITLE1 "Erste Zeile"; TITLE2 "Zweite Zeile"; TITLE3 "Dritte Zeile"; Wie lauten die ersten drei Titelzeilen nach folgender Anweisung? TITLE2; 3. Öffnen Sie das Programm "Film1.sas" und lassen Sie es ausführen. Kontrollieren Sie das Log Fenster und vergleichen Sie die Angaben mit denen der Kursunterlagen. 4. Betrachten Sie den erzeugten Output. Was fällt auf? Was könnte verbessert werden? 5. Speichern Sie das Programm unter dem Namen "Film2.sas" und nehmen Sie darin folgende Änderungen vor: - Tragen Sie den geänderten Programmnamen auch im Programmcode ein und benutzen Sie dafür die Suchen/Ersetzen Funktion des Editors Edit Î Replace..., Strg+H (film1 ⇒ film2) - Tragen Sie Ihren Namen als Programmautor ein (Zeile 13), - Da die Länge der Variable "Nachname" nicht ausreicht, muss sie mit einem längeren Format eingelesen werden. Setzen Sie in der INPUT Anweisung statt "Nachname $" "Nachname:$12." - Rechnen Sie das Alter von der Einheit Tage in Jahre um, indem Sie durch 365,25 teilen7 - Beschränken Sie die Prozedur FREQ auf die Variable "Sex": Fügen Sie dazu nach der Prozedur Anweisung die folgende neue Zeile ein TABLES sex; 6. Speichern Sie Ihre Änderungen Starten Sie das Programm erneut und kontrollieren Sie Ihre Änderungen im Ausgabefenster. 7 Hinweis zur Altersberechnung: Die Formel Alter = (TODAY()-gebdatum)/365.25; berechnet das Alter in mittleren Jahren als Gleitkommazahl, die auch wenn sie ganzzahlig gemacht wird (z. B. durch Rundung oder Abschneiden der Nachkommastellen) nicht exakt mit der gebräuchlichen Alterszählweise übereinstimmt, wonach das Alter genau am Geburtstag um ein Jahr erhöht wird. Die folgende Formel löst das Problem und benutzt die Funktion INTCK (interval check) zur Zählung der Monate und die Eigenschaft, dass das Ergebnis eines Vergleichs in SAS eine Zahl ist (1 = wahr, 0 = falsch). Alter=FLOOR((INTCK('MONTH', gebdatum, TODAY()) - (DAY(TODAY()) < DAY(gebdatum)) )/12); Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 27 Grundlagen SAS Tabellen (Data sets) 3. SAS Tabellen (Data sets) Das SAS System verwaltet und speichert Daten in einem speziellen Format als SAS Tabelle (SAS data set), hier kurz Tabelle oder Data set genannt. Darüber hinaus gibt es noch andere Arten von SAS Datendateien (SAS Files), wie Kataloge, Views, Indexdateien, u.a., auf die hier nicht näher eingegangen werden soll. Alle Daten, die mit SAS verarbeitet werden, werden in einer oder mehreren Tabellen (data sets) gespeichert. Eine SAS Tabelle (data set) kann als rechteckige Matrix aus n Zeilen und m Spalten veranschaulicht werden. Jede Zeile bildet darin eine so genannte Beobachtung (observation, row) bestehend aus den Ausprägungen (data values) von m verschiedenen Variablen (variables, columns). Neben diesem so genannten Datenteil werden beschreibende Informationen (descriptor information) der Tabelle wie Name, Größe, Erstellungsdatum, Variablendefinition, Anzahl der Beobachtungen, etc. mit der Tabelle gespeichert. Die beschreibenden Informationen können z.B. mit PROC CONTENTS angezeigt werden. Der Datenteil kann z.B. mit PROC PRINT angezeigt werden. obs 1 2 var_1 var_2 ... var_m ... ... ... n SAS Tabelle (data set) aus n Beobachtungen (observations) und m Variablen Die mit "obs" bezeichnete Spalte kann ebenfalls als Variable (_N_) aufgefasst werden. Sie wird automatisch geführt und gibt die Nummer der jeweiligen Beobachtung an (steht nur zur Laufzeit zur Verfügung). Beispiel: Bei 250 Patienten werden im Rahmen einer Studie neben einer Patientennummer, Geburtsdatum und Geschlecht, sowie vier verschiedene medizinische Merkmale erfasst. Die entsprechende Tabelle würde dann aus n=250 Beobachtungen und m=3+4 Variablen bestehen und insgesamt 250*7=1750 Ausprägungen (data values) umfassen. Alle Angaben zu einem Patienten, d.h. die Ausprägungen aller Variablen eines Patienten stellen dabei eine Beobachtung (observation) dar. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 28 Grundlagen 3.1 SAS Tabellen (Data sets) Temporäre und permanente SAS Tabellen Eine temporäre SAS Tabelle existiert nur während der laufenden SAS Session und wird beim Beenden von SAS automatisch gelöscht. Diese Form eignet sich für Daten, die nur vorübergehend gebraucht werden oder schnell wieder erstellt werden können. Permanente SAS Tabellen stehen auch nach einem Neustart von SAS weiterhin zur Verfügung. Diese Form eignet sich für Daten, die dauerhaft verfügbar sein sollen. Die Information, welche der beiden Formen gewählt wird, bekommt SAS über den Namen der Tabelle. Dabei gilt: Wenn der Name einteilig ist, d.h. nur aus einem Wort ohne Hochkomma besteht oder der Name mit "work." beginnt, dann ist die Tabelle temporär und wird damit in der WORK Bibliothek bis zum Ende der Session gespeichert. In allen anderen Fällen bleibt die Tabelle permanent erhalten. Beispiel 1: Temporäre SAS Tabelle (data set) erstellen und anzeigen DATA temperatur; GradFahrenheit=70; GradCelsius =(GradFahrenheit - 32)*5/9; RUN; PROC PRINT DATA=temperatur; RUN; Log Ö NOTE: The data set WORK.TEMPERATUR has 1 observations and 2 variables. Entsprechend könnte man statt dem einteiligen Namen "temperatur" auch direkt den zweiteiligen Namen "work.temperatur" verwenden. Permanente SAS Tabelle (data set) erstellen und anzeigen Beispiel 2a: SAS Bibliothek im ersten Teil des Namens DATA kurs.temperatur; GradFahrenheit=70; GradCelsius =(GradFahrenheit - 32)*5/9; RUN; PROC PRINT DATA=kurs.temperatur; RUN; Log Ö NOTE: The data set KURS.TEMPERATUR has 1 observations and 2 variables. Beispiel 2b: Windows Dateiname mit Pfad DATA "C:\Eigene Dateien\temperatur"; GradFahrenheit=70; GradCelsius =(GradFahrenheit - 32)*5/9; RUN; PROC PRINT DATA="C:\Eigene Dateien\temperatur"; RUN; Log Ö NOTE: The data set C:\Eigene Dateien\temperatur has 1 observations and 2 variables. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 29 Grundlagen SAS Tabellen (Data sets) Beispiel 2c: Windows Dateiname ohne Pfad DATA "temperatur"; ... Log Ö NOTE: The data set temperatur has 1 observations and 2 variables. SAS speichert die Datei im aktuellen Dateiverzeichnis, welches in der Statuszeile unten rechts angezeigt wird. 3.2 SAS Tabellen Namen Auch wenn das nicht in allen Fällen offensichtlich ist, Tabellen Namen sind für SAS immer zweiteilig, in der Form libref.table-name libref (SAS data library reference) verweist auf die Daten Bibliothek und damit auf den Ort, d.h. das Dateiverzeichnis oder Ordner wo die Tabelle gespeichert wird. Im Fall von temporären Tabellen wird die Bibliothek WORK verwendet. Das zugehörige Dateiverzeichnis "#TDnnnnn" wird beim Start von SAS automatisch erstellt und am Ende wieder entfernt. Im Fall von direkten Pfadangaben (Beispiel 2b und 2c) wird libref automatisch erstellt. Libref muss ein gültiger SAS Name sein, darf jedoch höchstens acht Zeichen lang sein (siehe SAS Namenskonvention, Seite 21) table-name ist der Name der Tabelle innerhalb der Bibliothek. Zusammen mit der Dateiendung ".sas7bdat" welche von SAS automatisch vergeben wird, bildet table-name den Windows Dateinamen.8 table-name muss ein gültiger SAS Name sein (siehe SAS Namenskonvention, Seite 21). Beispiel 2a: SAS Tabellen Name kurs.temperatur Vollständiger Windows Dateiname C:\SASkurs\temperatur.sas7bdat Übersicht zu den vorangegangen Bespielen: SAS Tabellen Name Bibliothek (libref) table-name Windows Dateiname Typ temperatur WORK temperatur temperatur.sas7bdat temporär work.temperatur WORK temperatur temperatur.sas7bdat temporär kurs.temperatur kurs temperatur temperatur.sas7bdat permanent "C:\Eigene Dateien\temperatur" Automatisch erstellt temperatur temperatur.sas7bdat permanent "temperatur" Automatisch erstellt temperatur temperatur.sas7bdat permanent 8 In SAS Version 7 und 8 war auch die Kurzform ".sd7" möglich. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 30 Grundlagen SAS Daten Bibliothek (Data Library) 4. SAS Daten Bibliothek (Data Library) Das SAS System verwaltet seine Datendateien (Tabellen, Kataloge,...) in so genannten Daten Bibliotheken (data libraries). Unter Windows sind damit bestimmte Dateiverzeichnisse/Ordner gemeint, die im SAS System als Bibliothek bekannt gemacht sind. Drei Bibliotheken werden beim Start automatisch definiert und stehen immer zur Verfügung. WORK verweist auf ein Systemverzeichnis, in dem SAS Tabellen nur temporär gespeichert und beim Beenden der SAS Sitzung gelöscht werden. ACHTUNG: Fehlt in einem Tabellennamen der Bibliothekname, so wird automatisch die Bibliothek "WORK" verwendet und die Tabelle damit nur temporär gespeichert! SASUSER verweist auf ein Systemverzeichnis, in dem sich Konfigurationsdateien (u.a. Profile-Katalog) befinden. SASHELP verweist auf Dateiverzeichnisse, in denen sich Beispieldateien, Grafiktreiber u. v. m. befinden. Ein Dateiverzeichnis wird zur Daten Bibliothek (Data Library), indem ihm innerhalb des SAS System ein Bibliothekname (libref = library reference) zugeordnet wird. Dies ist eine logische Verknüpfung (Link), die höchstens bis zum Ende der SAS Session gültig ist. Diese Verknüpfung kann interaktiv oder per Programmcode erstellt werden. Interaktiv mit , im Explorer Fenster, im Libname Fenster [LIBname], oder [LIBAssign] Per Programm mit Hilfe der LIBNAME Anweisung. LIBNAME libref <engine> "Windows-Pfad"; libref (SAS data library reference) ist der frei wählbare Name der Bibliothek und muss ein gültiger SAS Name mit höchstens acht Zeichen sein (siehe SAS Namenskonvention, Seite 21). engine (optional) bezeichnet das verwendete (binäre) Datenformat. Ohne Angabe wird automatisch die jeweils aktuelle Engine verwendet z.B. V9. Die verwendete Engine hängt vom Betriebssystem (host) und der SAS Version ab und bestimmt zugleich die Dateiendung. Windows-Pfad bezeichnet den vollständigen Pfad des referenzierten Dateiverzeichnisses in einer für Windows gültigen Schreibweise. Beispiel: LIBNAME kurs "C:\SASkurs"; Log Ö NOTE: Libref KURS was successfully assigned as follows: Engine: V9 Physical Name: C:\SASKURS Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 31 Grundlagen SAS Daten Bibliothek (Data Library) Die folgende Tabelle gibt eine Übersicht über die Dateiendungen der SAS Versionen unter Windows. 4.1 Type V608, V610, V611, V612 V7, V8 V9 SAS Tabelle (data set) Table *.sd2 *.sas7bdat, *.sd7 *.sas7bdat SAS Katalog Catalog *.sc2 *.sas7bcat, *.sc7 *.sas7bcat Explorer Fenster Mit Hilfe des SAS Explorers lassen sich Inhalte von Bibliotheken anzeigen und verwalten. Lassen Sie dazu die Baumstruktur in Detail Ansicht anzeigen und klicken Sie auf die gewünschte Bibliothek. Alle darin enthaltenen SAS Datendateien werden angezeigt. Alle anderen Dateien, die sich in dem zugrunde liegendem Verzeichnis befinden werden nicht angezeigt. Durch Anklicken einer Tabelle mit der rechten Maustaste öffnet sich das Kontextmenü. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 32 Grundlagen • SAS Daten Bibliothek (Data Library) Open (Rechtsklick Menü) Durch Doppelklick oder Open auf eine SAS Tabelle wird ihr Inhalt in tabellarischer Form (table view) angezeigt. Alternativ kann eine Beobachtung pro Seite (form view) angezeigt werden über View Î Form View, Standardmäßig werden die Labels der Variablen angezeigt, über View Î Column Names die Variablen Namen. Außerdem lassen sich die Daten nach einzelnen Variablen sortieren, nach einer bestimmten Bedingung selektieren oder sogar manuell editieren. • View Columns (Rechtsklick Menü) Über ′View Columns′ werden die Variableneigenschaften der Tabelle (Columns Lasche) angezeigt [VARS <tabelle>]. • Properties (Rechtsklick Menü) Über ′Properties′ werden die beschreibenden Informationen (General Lasche) der Tabelle angezeigt. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 33 Grundlagen SAS Daten Bibliothek (Data Library) Eine neue Bibliothek interaktiv erstellen: Über , im Explorer Fenster über , File Î New, Strg+N, oder [LIBAssign] Das Kontrollkästchen "Enable at startup" erlaubt die automatische Neudefinition der Bibliothek beim nächsten Start von SAS. 4.2 Libname Fenster Zur Verwaltung von Bibliotheken und Datendateien kann auch das Libname Fenster verwendet werden. Es kann über das Kommando [LIBname] aufgerufen werden und hat gegenüber dem Explorer Fenster den kleinen Vorteil, dass eine Detailansicht nicht eingestellt werden muss und die Pfade der referenzierten Verzeichnisse direkt erkennbar sind. Durch Doppelklick auf eine Bibliothek wird ihr Inhalt angezeigt. Der weitere Drill Down ist genauso wie beim Explorer Fenster. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 34 Grundlagen 4.3 SAS Daten Bibliothek (Data Library) Libraries Fenster Alternativ zum Explorer und Libname Fenster kann das Libraries Fenster verwendet werden, welches auch schon in der Version 6.12 zur Verfügung stand. Aufruf über das Kommando [DLGLIB]. Das Libraries Fenster zeigt in alphabetischer Reihenfolge alle momentan definierten Bibliotheken ("Libraries") und die damit verknüpften Dateiverzeichnisse ("Folders Assigned"), sowie die darin enthaltenen SAS Datendateien ("Library Contents") d. h. SAS Tabellen (data sets) (Typ "DATA"), Kataloge (Typ "CATALOG") etc. Über die Schaltfläche "Modify Library" können Bibliotheken umbenannt, gelöscht oder mit anderen Dateiverzeichnissen verknüpft werden. (Dies hat jedoch keinen Einfluss auf die physikalischen Verzeichnisse und die darin enthaltenen Dateien. Diese bleiben unverändert erhalten) Neue Bibliotheken lassen sich über "New Library" definieren. Durch Doppelklick auf eine SAS Datendatei (Tabelle oder Katalog) wird ihr Inhalt angezeigt. Eine Übersicht aller Möglichkeiten gibt das Popup Menü, das man durch Anklicken einer Datei mit der rechten Maustaste erhält: Open table view Tabellarische Ansicht einer SAS Tabelle (data set) pro Beobachtung eine Zeile Open form view Ansicht einer SAS Tabelle (data set) pro Beobachtung eine Seite VAR window Struktur der SAS Tabelle mit Information zu den Variablen (Var Fenster) Rename... Erlaubt die Umbenennung von Dateien Delete... Erlaubt das Löschen von Dateien Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 35 Grundlagen 4.4 SAS Daten Bibliothek (Data Library) Übung 4: Verwaltung von Daten Bibliotheken und SAS Tabellen 1. Rufen Sie ein freibewegliches Explorer Fenster auf und stellen Sie die Detailansicht mit Baumstruktur ein. 2. Klicken Sie auf die Bibliotheken "KURS" und "WORK" und kontrollieren Sie die darin enthaltenen Dateien. Prüfen Sie mit Hilfe des Windows Explorers, ob die SAS Tabelle "kino.sas7bdat" tatsächlich angelegt wurde. 3. Ändern Sie Ihr Programm "Film2.sas" so, dass die Tabelle "Kino" nur temporär gespeichert wird Markieren Sie die Zeilen des Datenschritts und lassen Sie diesen ausführen. Beachten Sie im Protokollfenster die Meldung "The data set WORK.KINO has..." und kontrollieren Sie die neue SAS Tabelle in der Bibliothek "WORK". Achtung: Diese Programmänderung nicht speichern! 4. Lassen Sie sich den Inhalt der Tabelle "work.kino" im Viewtable Fenster anzeigen. Testen Sie darin die Buttons der Symbolleiste. 5. Lassen Sie sich die allgemeinen Eigenschaften der Tabelle anzeigen. 6. Löschen Sie die Tabelle "Kino" aus der Bibliothek "WORK. 7. Definieren Sie eine neue Bibliothek "sample" für das Verzeichnis !SASROOT\CORE\SAMPLE ("!SASROOT" ist eine Windows Umgebungsvariable, die den Pfadnamen des SAS Systems enthält). Suchen Sie sich Ihr neues Jahresgehalt aus der SAS Tabelle "Salary" aus. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 36 Grundlagen Output Delivery System (ODS) 5. Output Delivery System (ODS) Das Output Delivery System, kurz ODS (ab Version 8) bietet für die Ausgaben der Prozeduren neben der einfachen zeilen- und spaltenorientierten Ausgabe im Listenfenster (LISTING), zahlreiche weitere Ausgabeformate wie z. B. HTML (Hypertext Markup Language), RTF (Rich Text File Æ MS Word), PDF (Portable Document Format), welche wesentlich mehr Gestaltungsmöglichkeiten hinsichtlich Schriftart, Größe, Farbe und Gesamtlayout bieten. Es können auch mehrere Ausgabekanäle (destinations) gleichzeitig ausgewählt werden, so dass dieselben Inhalte mit einem Programmlauf in verschiedenen Formen abgelegt werden. Standardmäßig wird ausschließlich der Listenoutput (LISTING) verwendet. Mit SAS Version 9.1 stehen folgende Ausgabemedien (destinations) produktiv zur Verfügung: AusgabeObjekt LISTING Listenoutput (im Listenfenster) OUTPUT SAS Tabelle (SAS data set) HTML HTML-Datei RTF RTF-Datei PDF PDF-Datei Jede Prozedur legt seine Ergebnisse in Form von Ausgabeobjekten (output objects) ab, welche ausschließlich die entsprechenden Informationen ohne Formatierungen beinhalten. Ein bestimmtes Layout wird dadurch erreicht, dass ein Ausgabeobjekt mit einem bestimmten Template (style) verknüpft wird. Beispiel: Prozeduroutput in RTF-Datei schreiben zur Weiterverwendung in der Textverarbeitung. ODS RTF FILE=“C:\saskurs\klasse.rtf“; PROC PRINT DATA=sashelp.class; RUN; PROC MEANS DATA=sashelp.class; RUN; ODS RTF CLOSE; Analog kann eine PDF-Datei erstellt werden, indem ODS PDF verwendet wird. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 37 Grundlagen Output Delivery System (ODS) Die beiden Ausgabemedien LISTING und HTML können per Menü über ToolsÎ OptionsÎ Preferences... aktiviert werden. Falls beide angewählt werden, wird jeder Output in beiden Formen erstellt. Jedes Ausgabeobjekt wird im Results Fenster als separater Eintrag angezeigt und kann von dort gezielt ausgewählt, gespeichert, gelöscht oder gedruckt werden. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 38 Grundlagen Output Delivery System (ODS) HTML Output wird als Datei der Form sashtmn.htm im angegebenen Verzeichnis erstellt, wobei jede Prozedur eine neue Datei erzeugt und dabei der Zähler n jeweils um eins erhöht wird. Falls das WORK Verzeichnis verwendet wird, werden alle HTM-Dateien beim Beenden von SAS automatisch gelöscht. Die HTM-Dateien sind einfache Body Files (ohne Frames). Das Layout der HTM-Dateien kann durch die Auswahl von Styles beeinflusst werden. Falls der interne Browser gewählt ist, wird der Output in SAS im Results Viewer Fenster angezeigt. Mehr Möglichkeiten der Einflussnahme auf die Erstellung der HTML-Dateien wie zum Beispiel benutzerdefinierte Dateinamen, Erstellung von einer HTML-Datei für den Output mehrerer Prozeduren, Erstellung von Frames mit Inhaltsverzeichnissen für HTML Reports ist möglich über die Anweisung ODS HTML. Auf die genauere Darstellung der ODS Anweisung kann hier nicht eingegangen werden. Für eine vollständige Übersicht siehe: SAS Help and Documentation Î SAS Products Î Base SAS Î Output Delivery System (ODS) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 39 Grundlagen System Optionen 6. System Optionen Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Language Dictionary Î Dictionary of Language Elements Î SAS System Options Eine Übersicht über alle Optionen und ihre aktuellen Einstellungen erhält man 1. Im Log Fenster durch die OPTIONS Prozedur PROC OPTIONS; RUN; 2. Im Options Fenster. Aufruf über Tools Î Options Î System... oder [OPTIons] System Optionen ändern: 1. Interaktiv im Options Fenster durch Anklicken mit der rechten Maustaste. 2. Per Programm mit Hilfe der OPTIONS Anweisung. Beispiel OPTIONS NODATE NUMBER PAGENO=1 msglevel=i; Einige häufig verwendete System Optionen: DTRESET |NODTRESET Kontrolliert, ob der Zeitstempel der DATE Option laufend aktualisiert wird (DTRESET) oder den Startzeitpunkt der SAS Session (Default) enthält (ab V9.1) DATE |NODATE Kontrolliert, ob ein Zeitstempel (siehe DTRESET Option) auf jeder Seite des Listenoutputs oben angezeigt werden soll (fixes englisches Format, gilt nicht bei Grafiken) NUMBER |NONUMBER Kontrolliert, ob eine Seitennummer im Listenoutput angezeigt werden soll PAGENO=n Setzt den Zähler für die Seitenummer auf n LINESIZE=n Legt die maximale Anzahl der Zeichen pro Zeile für den Listenoutput fest. 64 ≤ n ≤ 256 Siehe auch "Drucken von Listenoutput" auf Seite 14. PAGESIZE=n Legt die maximale Anzahl der Zeilen pro Seite für den Listenoutput fest. 15 ≤ n ≤ 32767 Siehe auch "Drucken von Listenoutput" auf Seite 14. YEARCUTOFF=yyyy MSGLEVEL=i | n Legt das erste Jahr einer Zeitspanne von 100 Jahren fest für die Interpretation zweistelliger Jahreszahlen. Siehe "Hinweis zum Jahr 2000 Problem" im Kapitel "Variablen". msglevel=n zeigt Notes, Warnings und Errors im Log (Standard), msglevel=i zeigt zusätzlich auch sehr nützliche Infos. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 40 Grundlagen SAS Online Hilfe 7. SAS Online Hilfe 7.1 SAS Help and Documentation Version 9 • Help → SAS Help and Documentation oder • Cursor auf SAS Keyword stellen + F1 drücken Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 41 Grundlagen 7.2 SAS Online Hilfe SAS OnlineDoc 9.1 for the Web Übersicht: http://support.sas.com/v9doc OnlineDoc 9.1 PDF (buchweise): http://support.sas.com/documentation/onlinedoc/91pdf OnlineDoc 9.1.3 im HTML Format: http://support.sas.com/onlinedoc/913 Ist im Vergleich zu SAS Help and Documentation etwas anders strukturiert. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 42 Datenschritt (DATA STEP) Grundlagen des Datenschritts Datenschritt (DATA STEP) 8. Grundlagen des Datenschritts Mit Hilfe des Datenschritts (DATA STEP) lässt sich eine oder mehrere SAS Tabellen (SAS data sets) erzeugen. Der Datenschritt beginnt mit dem Schlüsselwort DATA und den Namen der zu erstellenden SAS Tabellen. Jeder Datenschritt sollte mit der RUN Anweisung beendet werden. Syntax: DATA tabelle1 <tabelle2...>; Tabelle1, Tabelle2, .. steht für den vollständigen (zweiteiligen) Namen einer SAS Tabelle der Form libref.table-name. Dabei bezeichnet libref die Bibliothek, in der die Tabelle gespeichert wird und mit table-name wird der Name der Tabelle festgelegt. Falls nur table-name verwendet wird, so wird automatisch die Bibliothek "WORK" verwendet, d.h. die SAS Tabelle wird nur temporär bis zum Beenden des SAS Systems gespeichert (siehe Grundlagen, SAS Tabellen). Im Datenschritt können Daten aus verschiedenen Quellen eingelesen und in nahezu beliebiger Weise verarbeitet werden. Dazu steht eine Vielfalt von Anweisungen und Funktionen zur Verfügung. Die Daten, die im Datenschritt verarbeitet werden, können sowohl aus externen (nicht-SAS) Dateien, als auch aus anderen SAS Tabellen stammen, oder aber im Programmtext eingebettet sein (DATALINES|CARDS) oder direkt generiert werden. Nicht-SAS SAS Tabelle Daten INFILE, SET, INPUT MERGE Data set Datenschritt DATA Step Externe Dateien (ASCII-, Microsoft Excel, u.a.) und im Quelltext integrierte Daten werden mit Hilfe der INPUT Anweisung, andere SAS Tabellen mit den Anweisungen SET, MERGE oder UPDATE eingelesen. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 43 Datenschritt (DATA STEP) Grundlagen des Datenschritts Vor der Ausführung eines Datenschritts werden die Anweisungen des Programms während der Kompilierung auf ihre syntaktische Richtigkeit hin überprüft und alle benötigten Variablen temporär angelegt. Erst wenn der Datenschritt fehlerfrei kompiliert werden konnte, kommt er zur Ausführung, wobei die Anweisungen nacheinander auf jede Beobachtung angewendet werden (Implizite DO-Schleife). Kompilierungsphase 1. Syntaxprüfung 2. PDV erstellen Ausführungsphase Implizite DO-Schleife über alle Beobachtungen 8.1 Kompilierungsphase Während der Kompilierung wird der Datenschritt zunächst auf korrekte Syntax überprüft und falls keine Fehler gefunden wurden automatisch kompiliert, d.h. in Maschinensprache übersetzt. Außerdem werden die Deklarationsanweisungen (declarative statements) wie z.B. WHERE, LENGTH, BY, KEEP, DROP, RENAME, FORMAT, LABEL wirksam und alle benötigten Variablen werden definiert und deklariert. Als Definition gilt die ersten Nennung einer Variable im Datenschritt, wodurch ihre Eigenschaften festgelegt werden: Name (Ab Version 8 ist die Groß-/Kleinschreibung bei der Definition maßgeblich), Typ (numerisch, alphanumerisch), Länge (in Bytes), Position, Label, Format, Informat, und ob die Variable im Data Step temporär (Drop) oder permanent (Keep) ist. Für jede Variable wird im Arbeitsspeicher, im so genannten Program data vector = PDV entsprechender Speicherplatz reserviert. Zusätzlich werden die Variablen _N_ und _ERROR_ erzeugt, welche für die Verwaltung benötigt werden und nur während der Ausführungsphase (temporär) zur Verfügung stehen. Sie werden nicht mit der Tabelle gespeichert. Mit _N_ werden alle Beobachtungen fortlaufend nummeriert und damit eindeutig identifiziert. _ERROR_ dient als Fehlerflag, welches die Werte 0 (fehlerfrei) und 1 (fehlerhaft) haben kann. PDV von KURS.KINO aus dem Beispielprogramm FILM1.SAS (siehe Grundlagen, Programme) Vorname $8. Nachname $12. Name $20. GebDatum 8. Sex $1. Alter 8. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 Laenge 8. Gewicht 8. Index 8. Bmi 8. _N_ _ERROR_ 44 Datenschritt (DATA STEP) 8.2 Grundlagen des Datenschritts Ausführungsphase Wenn die Kompilierung fehlerfrei war, kommt der Datenschritt zur Ausführung, wobei er automatisch für jede einzelne Beobachtung ausgeführt wird. Während dieser so genannten Impliziten DO-Schleife, die sich nacheinander über alle Beobachtungen erstreckt, werden jeweils folgende vier Schritte durchführt. 1. Initialisierung aller Variablen Gibt es weitere Datenzeilen? nein Datei schließen ja _N_+ 1 2. Datenzeile einlesen 3. Ausführbare Anweisungen in der gegebenen Reihenfolge abarbeiten 4. Beobachtung in die Datei schreiben Implizite-DO-Schleife als Flussdiagramm 1. Initialisierung aller Variablen: _N_ wird am Anfang auf 1 gesetzt. _ERROR_ = 0. Neu entstehende Variablen, die durch die INPUT Anweisung oder durch Zuweisung erzeugt werden, werden standardmäßig mit Missing Value initialisiert. Variablen, die mit SET, MERGE oder UPDATE aus einer bestehenden SAS Tabelle gelesen werden, behalten im PDV die Werte der vorangehenden Beobachtung („autoretain“). Ausnahme: Nur beim By-Gruppenwechsel und bei _N_=1 wird ebenfalls mit Missing Value initialisiert. 2. Nächste Datenzeile lesen mit der Anweisung SET, MERGE oder UPDATE aus einer bestehenden SAS Tabelle oder mit der Anweisung INPUT aus einer externen (Nicht-SAS) Datei bzw. aus eingebetteten Datenzeilen (DATALINES|CARDS) 3. Ausführbare Anweisungen (executable statements) werden in der gegebenen Reihenfolge abgearbeitet 4. Aktuellen Inhalt des PDV als eine Beobachtung in der(den) Tabelle(n) speichern (OUTPUT) Danach erfolgt ein Rücksprung zum Anfang des Datenschritts, wobei die Variable _N_ um eins erhöht wird. Die Schritte 1. bis 4. werden solange wiederholt, bis keine weiteren Datenzeilen mehr gelesen werden können. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 45 Datenschritt (DATA STEP) Grundlagen des Datenschritts Beispiel 1: Zähler für alle Beobachtungen bilden DATA kino; INFILE "C:\SASKURS\SchauspielerDaten.txt"; LfdNr=_N_; INPUT Vorname:$12.; PUT _ALL_; RUN; Ö Log Fenster LfdNr=1 Vorname=Benno _ERROR_=0 _N_=1 LfdNr=2 Vorname=Dustin _ERROR_=0 _N_=2 LfdNr=3 Vorname=Franka _ERROR_=0 _N_=3 LfdNr=4 Vorname=Gérard _ERROR_=0 _N_=4 LfdNr=5 Vorname=Götz _ERROR_=0 _N_=5 LfdNr=6 Vorname=Marianne _ERROR_=0 _N_=6 LfdNr=7 Vorname=Marlene _ERROR_=0 _N_=7 LfdNr=8 Vorname=Pierce _ERROR_=0 _N_=8 LfdNr=9 Vorname=Robert _ERROR_=0 _N_=9 LfdNr=10 Vorname=Senta _ERROR_=0 _N_=10 LfdNr=11 Vorname=Til _ERROR_=0 _N_=11 LfdNr=12 Vorname=Veronica _ERROR_=0 _N_=12 8.3 OUTPUT und DELETE Das (physikalische) Schreiben der Daten in die SAS Tabelle, welches normalerweise am Ende des Datenschritts automatisch erfolgt, kann mit Hilfe der OUTPUT Anweisung auch schon vorher erzwungen werden. Damit lassen sich gezielt neue Beobachtungen erzeugen. Dafür entfällt das automatische OUTPUT am Ende, wodurch alle nachfolgenden Anweisungen dann zwar noch ausgeführt, die von ihnen bewirkten Datenänderungen aber nicht mehr gespeichert werden. Beispiel 2: Die Daten der Frauen und Männer in getrennten Tabellen speichern. DATA frauen maenner; SET kurs.kino; IF sex="1" THEN OUTPUT maenner; ELSE IF sex="2" THEN OUTPUT frauen; RUN; Das Gegenteil der Output Anweisung bewirkt die DELETE Anweisung, mit der Beobachtungen gelöscht werden können. Durch die Delete Anweisung wird die Abarbeitung der aktuellen Beobachtung abgebrochen und - ohne die Beobachtung zu schreiben - mit der nächsten Beobachtung fortgesetzt (siehe "Selektion von Beobachtungen"). Beispiel 3: Alle Daten bis auf die der Frauen löschen DATA frauen; SET kurs.kino; IF sex^="2" THEN DELETE; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 46 Datenschritt (DATA STEP) Variablen 9. Variablen Eigenschaften von Variablen: Manche Eigenschaften einer Variable wie Typ, Länge und Position werden bei der Definition, d.h. bei der ersten Nennung der Variable im Datenschritt festgelegt und können anschließend nicht mehr geändert werden! • Name Variablennamen unterliegen der SAS Namenskonvention (siehe Seite 21). Der Name der Variable wird in der Form (Groß-/Kleinschreibung) gespeichert, wie er bei der Definition geschrieben wird. Die Groß-/Kleinschreibung spielt jedoch bei Zuweisungen und Abfragen keine Rolle, d.h. es kann keine gleichnamige zweite Variable mit anderer Schreibweise geben. • Typ (numerisch, character) SAS unterscheidet numerische und alphanumerische Variablen. Letztere heißen auch Character Variablen und können beliebige Zeichen speichern. Beide Variablentypen haben standardmäßig eine Länge von 8 Bytes. • Länge (Größe in Bytes) • Position (in der Tabelle) siehe 9.1 Variablenlänge (LENGTH),Seite 48 Durch die Position wird die Reihenfolge der Variablen in der Tabelle festgelegt. • Informat (Einleseformat) siehe 9.2 Einleseformate und Ausgabeformate (INFORMAT, FORMAT),Seite 50 • Format (Ausgabeformat) siehe 9.2 Einleseformate und Ausgabeformate (INFORMAT, FORMAT),Seite 50 • Label siehe 9.3 Variablenetikettierung (LABEL),Seite 53 Fehlende Werte (missing values) Wenn bei einer Variable die Ausprägung fehlt, setzt SAS automatisch die kleinstmögliche Ausprägung ein. . Bei numerischen Variablen ist dies die kleinste darstellbare Zahl - standardmäßig durch den Punkt " " dargestellt und bei Zeichenvariablen das Leerzeichen (blank) " " bzw. "". Nach einer Sortierung (aufsteigend) stehen die missing values an erster Stelle! Demnach liefert die Abfrage x < 0 (x numerisch) sowohl die negativen, als auch die fehlenden Ausprägungen. Ausschließlich die negativen Werte liefert die Abfrage . < x < 0! Datumswerte und Zeitwerte (date values, time values, datetime values) Datums- und Zeitwerte werden von SAS in numerischen Variablen nach folgendem Prinzip gespeichert: • • • Datumswert (date value) = Anzahl der Tage bezogen auf den 1.1.1960 Zeitwert (time value) = Anzahl der Sekunden seit Mitternacht Zeitstempel (datetime value) = Anzahl der Sekunden seit dem 1.1.1960, 0 Uhr Dadurch ist es möglich, zwei verschiedene Zeitpunkte zu vergleichen, z.B. um die Zeitspanne dazwischen zu berechnen oder um Zeitangaben zu sortieren. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 47 Datenschritt (DATA STEP) Variablen Erst durch die Verwendung eines Datums- oder Zeit- (Ausgabe-)Formats werden diese Zahlenwerte als brauchbare Datums- oder Zeitangaben angezeigt. Dazu steht eine Vielzahl von unterschiedlichen Formaten zur Verfügung. Zum Einlesen von Datums- oder Zeitwerten muss ein geeignetes Einleseformat verwendet werden. Siehe Kapitel 9.2 Einleseformate und Ausgabeformate (INFORMAT, FORMAT),Seite 50 Datums- und Zeitwerte können in Abfragen oder Zuweisungen als String mit dem Zusatz D, T bzw. DT angegeben werden. SAS berechnet dadurch den entsprechenden numerischen Datums- bzw. Zeitwert. Beispiel 4: Datums- und Zeitwert einer Variable (numerisch) zuweisen DATA a; Datum="01may2000"D; Zeit ="13:25"T; DatumZeit="29MAR2000:13:25"DT; RUN; HINWEIS zum Jahr 2000 Problem: Intern werden im SAS System Jahreszahlen immer korrekt gespeichert und können über verschiedene Datumsformate angezeigt werden. Probleme können ausschließlich beim Einlesen von zweistelligen Jahreszahlen aus Nicht-SAS Dateien auftreten. Die Jahresangabe "02" zum Beispiel ist nicht eindeutig, weil die Angabe des Jahrhunderts fehlt. SAS bietet dazu die Systemoption yearcutoff=jahreszahl; mit der eine 100-Jahres-Spanne ab Jahreszahl definiert wird. Beispiel: OPTIONS YEARCUTOFF=1900 interpretiert 00 - 99 als 1900 - 1999 OPTIONS YEARCUTOFF=1920 interpretiert 20 - 99 als 1920 - 1999 und 00 - 19 als 2000 bis 2019 Als Standardeinstellung ab dem Jahr 2000 gilt im SAS System yearcutoff=1920, d.h. alle zweistelligen Jahreszahlen von 00 - 19 werden als 2000 bis 2019 interpretiert. ACHTUNG: Damit können zweistellige Jahresangaben vor 1920 nicht korrekt verarbeitet werden! 9.1 Variablenlänge (LENGTH) Die Länge einer Variable entspricht ihrer Größe in Byte und legt fest, welche Datenmengen in der Variable gespeichert werden können. Numerische Variablen haben standardmäßig die Länge 8 (Byte). Dies erlaubt die Speicherung von Zahlen mit der höchst möglichen Genauigkeit des verwendeten Betriebssystems. Um Speicherplatz zu sparen, kann bei positiven Ganzzahlen die Länge verkleinert werden (Unter Windows bis auf 3 Byte). Länge in Bytes einer numerischen Variable 3 4 5 6 7 8 Größte exakt darstellbare Ganzzahl mit SAS unter Windows 8.192 2.097.152 536.870.912 137.438.953.472 35.184.372.088.832 9.007.199.254.740.992 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 48 Datenschritt (DATA STEP) Variablen Character Variablen haben standardmäßig ebenfalls die Länge 8 (Byte), wodurch höchstens 8 Zeichen gespeichert werden können. Die maximale Länge beträgt 32 767 Zeichen (32 kByte)(200 Zeichen vor Version 8)9. Mit Hilfe der LENGTH Anweisung (Deklarationsanweisung) kann die Länge von einer oder mehreren Variablen explizit festgelegt werden. Falls die LENGTH Anweisung verwendet wird, sollte sie immer die 1. Anweisung nach der DATA Anweisung sein, um sicherzustellen, dass sie auch wirksam wird. So wird durch die LENGTH Anweisung die Variable definiert und mit ihrer Länge auch der Typ, die Schreibweise des Namens und die Position festgelegt. Syntax: LENGTH variablenliste1 <$> länge <variablenliste2 <$> länge>...; Beispiel 5: Zwei Character Variablen der Länge 20 und eine numerische Variable mit Länge 3 definieren LENGTH Vorname Nachname $ 20 Sex 3; ACHTUNG: Bei Variablen, die durch Zuweisung in einem Datenschritt neu entstehen, wird ohne die LENGTH Anweisung Name, Länge, Typ und Position durch die erste Zuweisung automatisch festgelegt. Dies kann insbesondere bei Character Variablen zu Datenverlusten führen, wenn der erste zugewiesene String kürzer als einer der nachfolgenden ist. Beispiel 6: Datenverlust durch fehlende LENGTH Anweisung für neue Character Variable DATA zukurz; * LENGTH Gruppe $ 8; SET kurs.kino; IF MOD(_N_,2)=0 THEN gruppe="Gerade"; IF MOD(_N_,2)=1 THEN gruppe="Ungerade"; RUN; Ö kein Fehler oder Warnung im Log Fenster! Anstelle der LENGTH Anweisung kann auch die ATTRIB Anweisung (Deklarationsanweisung) verwendet werden, mit der neben der Länge zusätzlich auch Format, Label und Informat festgelegt werden kann. Syntax: ATTRIB variablenliste1 attributliste1 <varliste2 attributliste2>...; Attributliste: LENGTH=<$>länge FORMAT=ausgabeformat LABEL=‘ettikett‘ INFORMAT=einleseformat Beispiel 7: Länge und Label von zwei Variablen festlegen ATTRIB Name1 LENGTH=$20 LABEL="Vorname" Gewicht LENGTH=8 LABEL="Gewicht in [kg]"; 9 Hinweis: Ab einer Länge von 512 Zeichen erscheint im Log folgende Warnung, die jedoch meist ignoriert werden kann: WARNING 32-169: The quoted string currently being processed has become more than 512 characters long. You may have unbalanced quotation marks. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 49 Datenschritt (DATA STEP) 9.2 Variablen Einleseformate und Ausgabeformate (INFORMAT, FORMAT) Maßgeblich für die Darstellung der Ausprägungen (data values) aller Variablen sind Ausgabeformate (FORMATS), kurz Formate genannt, wodurch der intern gespeicherte Wert in einer bestimmten Art zur Erscheinung kommt. z B. die Anzahl der Nachkommastellen einer numerischen Variable, das Datumsformat. Die Ausgabeformate haben jedoch keinen Einfluss auf die interne Speicherung. Auch wenn eine Zahl durch ein Format z.B. ganzzahlig erscheint (und dabei automatisch gerundet wird), bleibt intern die volle Genauigkeit erhalten und wird für Berechnungen genutzt. Entsprechend gibt es Einleseformate (INFORMATS), die festlegen, in welcher Form die Daten zu lesen sind. Die Namen von Formaten und Informaten beinhalten immer einen Punkt (.) und sind so von Variablennamen zu unterscheiden. Außerdem beginnen Zeichen (Character)-Formate und -Informate immer mit dem Dollarzeichen ($). Mit der FORMAT Anweisung (Deklarationsanweisung) wird einer oder mehreren Variablen ein Ausgabeformat zugewiesen. Im Datenschritt eingesetzt wird das Format mit der SAS Tabelle gespeichert. Die Format Anweisung kann auch im Prozedurschritt verwendet werden und gilt dann ausschließlich für diese Prozedur. Die Anweisung kann an beliebiger Stelle im Daten- oder Prozedurschritt stehen. Für die Übersichtlichkeit eines Programms ist es hilfreich, die Anweisung immer an derselben Stelle z. B. am Ende zu verwenden. Syntax: FORMAT variablenliste_1 format1. <variablenliste_2 format2.>; Beispiel 8: Eine oder mehrere Variablen formatieren FORMAT laenge 3.1; FORMAT x y 5.1 gebdatum DATE9.; FORMAT nr: x1-x10 6.2; Format Zuordnung aufheben: FORMAT variablenliste; Beispiel 9: Eventuell bestehende Formatierung bei mehreren Variablen entfernen FORMAT FORMAT FORMAT FORMAT x y gebdatum; _NUMERIC_; _CHARACTER_; _ALL_; Sämtliche genannten Formate stehen in nahezu derselben Weise auch als Einleseformate zur Verfügung. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Language Dictionary Î Dictionary of Language Elements Î Formats bzw. Informats Oder im Handbuch SAS Languages Reference, Chapter FORMATS, Chapter INFORMATS. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 50 Datenschritt (DATA STEP) Variablen Klassenbildung Neben der reinen Darstellung können die Formate auch zur Klassenbildung (Gruppierung) verwendet werden. Diese Klassen lassen sich auch in der Auswertung mit den Prozeduren verwenden, wenn die Daten klassenweise verarbeitet werden sollen, beispielsweise klassenweise gelistet, ausgezählt oder berechnet werden sollen (siehe PROC PRINT, FREQ, MEANS). Die Format Anweisung ist allerdings wirkungslos, wenn die Variable selbst analysiert wird, z. B. mit der VAR Anweisung der Prozedur MEANS, SORT u. s. w. Beispiel 10: Ganzzahlige BMI-Klassen bilden FORMAT bmi F2.0; Kurzübersicht über die wichtigsten Formate, die als Einlese- und Ausgabeformat zur Verfügung stehen: Formatname Breite (engl. width) Dezimal- inkl. Dezimalpunkt, stellen Vorzeichen, etc. (decimals) Standard- Ausbreite richtung Numerisches Standardformat w.d 1-32 d < w-1 rechts Kommaformat (Neu ab 6.12) NUMXw.d 1-32 d < w-1 12 rechts Wiss. Notation (exponent) Ew. 7-32 - 12 rechts Hexadezimalformat HEXw. 1-16 - 8 links Character Standardformat $w. 1-32767 - Datumsformat (ddmmmyy) engl. DATEw. 5-9 - 7 rechts Datumsformat (ddmmmyy) deut. DEUDFDEw. 5-9 - 7 rechts Datumsformat (ddmmyy) engl. DDMMYYw. 2-10 - 8 rechts Zeitformat (hh:mm:ss.ss) TIMEw.d 2-20 d < w-1 8 rechts links Selbst definierte Formate Zusätzlich zu den Standardformaten lassen sich mit der Prozedur FORMAT selbst definierte Einlese- und Ausgabeformate erstellen. Dies kann sehr hilfreich sein, um gegebene Ausprägungen zu "übersetzen" z. B. für eine Antwortvariable 1=ja, 0=nein oder für eine Geschlechtsvariable 1=männlich, 2=weiblich oder für eine gezielte Klassenbildung. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 51 Datenschritt (DATA STEP) Variablen Im nachfolgenden Beispiel werden die Variablen "x", "abc" und "geboren" mit Hilfe der PUT Anweisung mit verschiedenen Formaten im Log Fenster angezeigt. Beispiel 11: DATA bsp1; x=2.71828; PUT x ; * ==> 2.71828; PUT x 7.5; * ==> 2.71828; PUT x 4.2; * ==> 2.72; PUT x 3.1; * ==> 2.7; PUT x 1.0; * ==> 3; PUT x 7.4; * ==> 2.7183; PUT x NUMX7.4; * ==> 2,7183; PUT x NUMX7.2; * ==> 2,72; PUT x Z7.; * ==> 0000003; PUT x E12.6; * ==> 2.71828E+00; PUT x HEX16.; * ==> 4005BF0995AAF790; abc="Morgen ist heute schon gestern"; PUT abc $16.; * ==> Morgen ist heute; geboren="29FEB1960"D; PUT geboren; PUT geboren DATE9.; PUT geboren DEUDFDE9.; PUT geboren YYMMDD10.; PUT geboren YYMMDDD10.; * * * * * * Datumsangabe; ==> 59 (=31+28 Tage); ==> 29FEB1960; ==> 29Feb1960; ==> 1960/02/29; ==> 1960-02-29; PUT geboren DDMMYY10.; PUT geboren DEUDFDD10.; PUT geboren DDMMYYP10.; * ==> 29/02/1960; * ==> 29.02.1960; * ==> 29.02.1960; PUT geboren WORDDATX.; * ==> PUT geboren DEUDFWDX.; * ==> PUT geboren DEUDFWDX12.; * ==> PUT geboren WEEKDATX.; PUT geboren DEUDFWKX.; PUT geboren WEEKDAY.; PUT geboren DOWNAME.; PUT geboren DEUDFDWN.; RUN; 29 February 1960; 29. Februar 1960; 29. Feb 1960; * ==> * ==> Monday, 29 February 1960; Montag, 29. Februar 1960; * ==> 2; * ==> Monday; * ==> Montag; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 52 Datenschritt (DATA STEP) 9.3 Variablen Variablenetikettierung (LABEL) Mit Hilfe der LABEL Anweisung (Deklarationsanweisung) kann einer oder mehreren Variablen ein beschreibender Text zugeordnet werden. Der Text kann auch Leer- und Sonderzeichen enthalten und darf maximal 256 Zeichen lang sein. Groß- und Kleinbuchstaben werden darin unterschieden. Im Datenschritt eingesetzt wird das Label mit der Tabelle gespeichert. Die Label Anweisung kann auch im Prozedurschritt verwendet werden und gilt damit ausschließlich für diese Prozedur. Die Anweisung kann an beliebiger Stelle im Daten- oder Prozedurschritt stehen. Für die Übersichtlichkeit eines Programms ist es hilfreich, die Anweisung immer an derselben Stelle z. B. am Ende zu verwenden. Trotzdem sollte im Hinblick auf die Verständlichkeit der Programme darauf geachtet werden, möglichst "sprechende", also selbsterklärende Variablennamen zu verwenden. Syntax: LABEL variable1="etikett1" <variable2="etikett2" ...>; variable bezeichnet den Namen einer Variable etikett ist eine beliebige Zeichenkette aus bis zu 256 Zeichen, welche auch Leerzeichen und Umlaute enthalten kann. Groß- und Kleinbuchstaben werden unterschieden. Beispiel 12: Für zwei Variablen ein Label definieren LABEL gebdatum="Geburtstag" Laenge ="Körperlänge in [m]"; Beispiel 13: Label löschen LABEL gebdatum=" "; Beispiel 14: Leeres Label definieren LABEL gebdatum="00"X; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 53 Datenschritt (DATA STEP) 9.4 Variablen Selektion von Variablen (KEEP, DROP) Wenn nicht alle Variablen, die in einem Datenschritt erzeugt werden, mit der/den entstehenden Tabellen gespeichert werden sollen, so können mit Hilfe der KEEP Anweisung die gewünschten Variablen ausgewählt oder mit der DROP Anweisung die unerwünschten ausgeschlossen werden (Deklarationsanweisungen). Die ausgeschlossenen Variablen stehen jedoch zur Laufzeit des Datenschritts noch zur Verfügung (temporäre Variablen), werden aber nicht mit der/den entstehenden Tabellen gespeichert. Die Anweisung kann an beliebiger Stelle im Datenschritt stehen. Für die Übersichtlichkeit eines Programms ist es hilfreich, die Anweisung immer an derselben Stelle z. B. am Ende zu verwenden. Syntax: KEEP variablenliste; DROP variablenliste; variablenliste ist dabei eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. Beispiel 15: Verschiedene Anwendungen der KEEP und DROP Anweisung KEEP gebdatum sex laenge; KEEP x y nr1-nr5; = x y nr1 nr2 nr3 nr4 nr5 DROP nr:; alle Variablen, die mit nr beginnen KEEP vorname--bmi; bezogen auf die Variablenreihenfolge in der Datei KEEP _NUMERIC_; alle numerischen Variablen DROP _CHARACTER_; alle Zeichenvariablen Die Auswahl gilt für alle in einem Datenschritt erzeugte Tabellen. Sollen für verschiedene Tabellen verschiedene Variablenlisten gelten, so müssen die Tabellenoptionen KEEP= bzw. DROP= verwendet werden (siehe 15 Tabellenoptionen (data set options), S. 74). Beispiel 16: KEEP= Tabellenoption DATA a (KEEP=name vorname) ... RUN; b (KEEP=alter gehalt); Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 54 Datenschritt (DATA STEP) 9.5 Variablen Umbenennen von Variablen (RENAME) Mit Hilfe der RENAME Anweisung (Deklarationsanweisung) kann eine oder mehrere Variablen im Datenschritt umbenannt werden. Die Umbenennung wird allerdings erst beim Speichern der Tabelle wirksam, d.h. zur Laufzeit des Datenschritts gelten noch die alten Namen! Die Anweisung kann an beliebiger Stelle im Datenschritt stehen. Für die Übersichtlichkeit eines Programms ist es hilfreich, die Anweisung immer an derselben Stelle z. B. am Ende zu verwenden. Syntax: RENAME alter_name1=neuer_name1 <alter_name2=neuer_name2 ...>; Beispiel 17: Zwei Variablen im Datenschritt umbenennen DATA neu; SET kurs.kino; RENAME Gebdatum=Birthdate Alter=Age; KEEP Gebdatum Alter; * alte Namen, weil neue noch nicht gültig!; RUN; Beispiel 18: Variablenliste umbenennen (ab Version 8) RENAME time1-time10=zeit1-zeit10; Die Umbenennung gilt für alle Tabellen, die in einem Datenschritt erzeugt und in denen die genannten Variablen vorkommen. Soll die Umbenennung ausschließlich für bestimmte Tabellen gelten, so muss die Tabellenoption RENAME= (alter_name=neuer_name) verwendet werden (siehe 15 Tabellenoptionen (data set options), S. 74). Beispiel 19: RENAME= Tabellenoption DATA eins (RENAME=(y=y1 z=z1)) zwei (RENAME=(y=y2 z=z2)); DO x=0 TO 10 BY 0.1; y=sin(x); z=cos(x); IF x<=5 THEN OUTPUT eins; ELSE OUTPUT zwei; END; KEEP x y z; * alte Namen, weil neue noch nicht gültig!; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 55 Datenschritt (DATA STEP) 9.6 Variablen Übung 5: Variablen, Formate, Label 1. An welchem Wochentag sind Sie geboren? Beantworten Sie diese Frage mit Hilfe eines geeigneten Datenschrittes. 2. Öffnen Sie Ihr Programm "Film2.sas" und ergänzen Sie das Programm um folgende Punkte: - Stellen Sie sicher, dass das Geburtsdatum aller Personen korrekt interpretiert wird. - Formatieren Sie die Variable GEBDATUM als Datum, die Variable ALTER ganzzahlig, sowie die Variablen INDEX und BMI jeweils mit zwei Nachkommastellen. - Definieren Sie folgende Labels Variable Label GEWICHT Gewicht [kg] LAENGE Länge [m] BMI Body Mass Index [kg/m²] Überlegen Sie an welchen Stellen im Programm die entsprechenden Anweisungen stehen könnten. Speichern Sie das geänderte Programm, führen Sie es aus und kontrollieren Sie die veränderten Ergebnisse im Listenfenster. 3. Optional: Öffnen Sie die Datei "FormatBeispiele.sas", das die Formatierungsbeispiele von Seite 52 enthält und machen Sie den Wert von X negativ, indem Sie ein Minuszeichen einsetzen. Lassen Sie das Programm ausführen und interpretieren Sie die Ergebnisse im Log Fenster. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 56 Datenschritt (DATA STEP) Funktionen 10. Funktionen SAS Funktionen sind vordefinierte Routinen, die im Datenschritt verwendet werden können. Sie liefern genau ein Ergebnis (numerisch oder alphanumerisch), das einer Variablen zugewiesen werden kann oder als Argument einer zweiten Funktion dienen kann (Schachtelung von Funktionen). Funktionen unterscheiden sich von Variablen durch das Klammerpaar. Syntax: funktion(argumente) Anzahl und Art der argumente hängt von der jeweiligen Funktion ab. Es können Variable(n) oder explizite Datenwerte sein. Manche Funktionen wie z. B. TODAY(), DATE(), TIME() haben keine Argumente. Variablen können einzeln durch Komma getrennt aufgezählt oder als Variablenliste nach dem Wort OF genannt werden, wobei verschiedene Kurzschreibweisen zulässig sind. Beispiele: funktion(OF funktion(OF funktion(OF funktion(OF funktion(OF funktion(OF funktion(OF funktion(OF a b c d) = funktion(a, b, c, d) x1-x10) x1-x10, OF y1-y5) y z x1-x10) x[*]) alle Elemente eines Arrays nr:) Alle Variablen, die mit "nr" beginnen vorname--gebdatum) bezogen auf die Reihenfolge der Variablen in der SAS Tabelle _NUMERIC_) alle numerischen Variablen Unterschied zwischen Funktionen und Prozeduren: Die Funktion MEAN(argumente) berechnet das arithmetische Mittel aller in argumente genannten Variablen. Die Funktion verwendet dazu die Datenwerte aller genannten Variablen aus jeweils einer Beobachtung (Horizontale Rechnung). Im Gegensatz dazu berechnet die Prozedur MEANS das arithmetische Mittel jeweils einer Variablen über Beobachtungen hinweg (vertikale Rechnung). Vorteil: Funktionen und Prozeduren berücksichtigen automatisch fehlende Werte bei der Berechnung. Wenn beispielsweise die folgende Datenlage vorliegt, so liefert die Funktion MEAN(OF a b c) in der ersten Beobachtung den Wert 10 und in der zweiten den Wert 15. a 5 10 10 b 7 . c 18 20 Über die Makrofunktion %SYSFUNC sind fast alle Funktionen auch außerhalb des Datenschritts z. B. in TITLE Anweisungen oder in der Makroumgebung verwendbar. z. B. TITLE ″%SYSFUNC(TIME(), TIME5.)″; SAS OnlineDoc: Base SAS Software Î SAS Macro Language: Reference Î Macro Language Dictionary Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 57 Datenschritt (DATA STEP) Funktionen SAS Funktionen werden in verschiedene Kategorien eingeteilt. Die nachfolgende Tabelle zeigt eine Auswahl. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Language Dictionary Î Dictionary of Language Elements Î Functions and Call Routines Syntax der Funktion Beispiel Bedeutung Typ des Rückgabewerts Arithmetische Funktionen ABS(var) ABS(-2.4) Absolutbetrag (2.4) numerisch EXP(var) EXP(1) Exponentialfunktion ex (2.7182818285) numerisch LOG(var) LOG(x) Logarithmus zur Basis e numerisch LOG10(var) LOG10(x) Logarithmus zur Basis 10 numerisch MOD(var1, var2) MOD(_N_, 2) Rest der ganzzahligen Division von numerisch var1/var2 (im Beispiel 0 bei geraden und 1 bei ungeraden Zahlen von _N_) SQRT(var) SQRT(x) Quadratwurzel (engl. square root) numerisch CEIL(var) CEIL(3.2) nächstgrößere Ganzzahl (engl. ceiling) numerisch (4) FLOOR(var) FLOOR(-3.2) nächstkleinere Ganzzahl (engl. floor) numerisch (-4) INT(var) INT(3.8) ganzzahliger Anteil (3) numerisch ROUND(var, unit) ROUND(x, 0.01) Rundungsfunktion numerisch BYTE(n) BYTE(65) ASCII-Zeichen der Nummer n ("A") RANK(zeichen) RANK("A") liefert ASCII-Nummer (65) numerisch COMPBL(string) COMPBL(name) Entfernt mehrfache Blanks text COMPRESS(string COMPRESS(name) Entfernt alle genannten Zeichen text Zeichenfunktionen text Standard ist Blank <, zeichen>) INDEX(string, INDEX(name, sucht text und liefert die Position des text) "Meier") ersten Auftretens oder 0 LEFT(string) LEFT(name) Richtet linksbündig aus text LENGTH(string) LENGTH(name) Länge der Zeichenfolge numerisch INPUT(var, INPUT("12",2.) liest Wert mit einem Informat, welches numerisch, text den Typ bestimmt. Text → Zahl, Datum informat) PUT(var, format) numerisch PUT(x, 5.2) schreibt Wert in einem Format text Zahl → Text SCAN(string,n <,delimiter>) SCAN(name,2) sucht das n-te Wort (Standard- text (200) trennzeichen " .<(+&!$*);^-/,%|") Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 58 Datenschritt (DATA STEP) Funktionen text 2) Zeichenfolge der Länge n aus string ab position. Falls n fehlt, wird bis zum Ende von string entnommen. TRANSLATE TRANSLATE(numt ersetzt das Zeichen from in to z. B. text (string,to,from) ext, ".", ",") Komma in Punkt TRANWRD(string, TRANWRD(name, ersetzt Zeichenfolge from in to z. B. from, to) "ue", "ü") "ue" in "ü" TRIM(string) TRIM(name) Entfernt nachfolgende (trailing) Blanks text UPCASE(string) UPCASE(name) Umwandlung in Großbuchstaben text SUBSTR(string, SUBSTR(name,5, position<, n>) text Datums- und Zeitfunktionen TODAY(), DATE() Aktuelles Datum als SAS Datumswert TODAY() numerisch (Anzahl Tage seit 1.1.1960) TIME() Aktuelle Zeit als SAS Zeitwert (Anzahl TIME() numerisch Sekunden seit Mitternacht) numerisch INTCK(intervall, INTCK('week', Anzahl bestimmter Zeitintervalle (Tage, from, to) "01jan98"D, Wochen, Monate, Quartale, Jahre) today()) zwischen zwei Datumswerten WEEKDAY( Wochentag eines Datums (1=Sonntag) "28aug1749"D) ab 1583 RANUNI(start) RANUNI(-1) gleichverteilte Zufallszahl numerisch RANNOR(start) RANNOR(-1) normalverteilte Zufallszahl numerisch Variationskoeffizient numerisch WEEKDAY(date) numerisch Zufallszahlenfunktionen Stichprobenfunktionen (Sample Statistic Functions) CV(varlist) cv(OF x1-x10) (engl. coefficient of variation) MAX(varlist) MAX(OF x1-x10) Maximum numerisch MIN(varlist) MIN(OF x y z) Minimum numerisch MEAN(varlist) MEAN(OF x y z) arithmetisches Mittel numerisch N(varlist) N(x, y, z) Anzahl nicht fehlender Werte numerisch NMISS(varlist) NMISS(x, y, z) Anzahl fehlender Werte numerisch ORDINAL(k, ORDINAL(5, OF k-größten Wert der Liste numerisch varlist) x1-x10) STD(varlist) STD(OF x1-x10) Standardabweichung numerisch SUM(varlist) SUM(OF x1-x10) Summe numerisch VAR(varlist) VAR(OF x1-x10) Varianz numerisch Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 59 Datenschritt (DATA STEP) 10.1 Funktionen Übung 6: Funktionen, Fehler und Fehlermeldungen 1. Öffnen Sie Ihre Programmdatei "Film2.sas" und ergänzen Sie den Datenschritt um folgende Punkte: - Bilden Sie die Variable NAME so, dass zwischen Vor- und Nachname genau ein Leerzeichen enthalten ist. - Erzeugen Sie eine neue Variable WOCHENTAG, die für jeden Schauspieler den Wochentag der Geburt als Nummer enthält (Funktion WEEKDAY). - Extrahieren Sie mit Hilfe einer geeigneten Funktion aus der Variable NAME den Vor- und Nachnamen der Schauspieler und speichern Sie diese in den Variablen NAME1 und NAME2. Speichern Sie das geänderte Programm, führen Sie es aus und kontrollieren Sie die Ergebnisse. 2. Das folgende SAS Programm "Fehler1.sas" enthält 4 Syntaxfehler und 3 logische Fehler. Im Gegensatz zu logischen Fehlern werden Syntaxfehler meistens automatisch erkannt und als WARNING oder ERROR im Log Fenster angezeigt. Lassen Sie das Programm ausführen und versuchen Sie alle Fehler zu beheben. DAT kino; INFILE "C:\SASKURS\SchauspielerDaten.txt"; Alter=(TODAY() – GebDat)/365.25; INPUT Vorname:$12. Nachname:$12 GebDatum:DDMMYY8. RUN; PROC PRINT DATA=kurs.kino RUN; 3. SAS Programm mit fehlenden Anführungszeichen (unbalanced quotation marks) Wenn Sie das folgende Programm ausführen, erhalten Sie keinen Output, aber auch im Log keinen Fehlerhinweis! Woran liegt das? Wie können Sie das Problem lösen? TITLE1 "Liste der Schauspieler; PROC PRINT DATA=kurs.kino; RUN; 4. Datentypkonvertierung: numerisch Î alphanumerisch Erstellen Sie aus den folgenden numerischen Variablen jeweils eine Charactervariable. sex=1; e=2.718; jetzt=TIME(); 5. Datentypkonvertierung: alphanumerisch Î numerisch Erstellen Sie aus den folgenden Charactervariablen jeweils eine numerische Variable mit dem entsprechenden Datumswert. Datum1C="12/05/02"; Datum2C="12-05-2002"; Optional: Machen Sie dasselbe mit den in der vorangegangenen Übung erstellten Charactervariablen. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 60 Datenschritt (DATA STEP) Bedingte Anweisungen (IF/THEN, SELECT) 11. Bedingte Anweisungen (IF/THEN, SELECT) Die IF/THEN Anweisung dient dazu, im Datenschritt bestimmte Anweisungen nur dann auszuführen, wenn eine bestimmte Bedingungen erfüllt ist (Siehe auch "Formulierung von Bedingungen" S. 63). IF bedingung THEN anweisung; <ELSE anweisung;> Falls eine ELSE Anweisung verwendet wird, muss diese die nächste Anweisung nach der THEN Anweisung sein, d.h. es darf keine andere Anweisung dazwischen stehen. Nach "THEN" oder "ELSE" wird jeweils genau eine Anweisung ausgeführt. Sollen mehrere Anweisungen bedingt ausgeführt werden, so müssen diese in einem DO Block zusammengefasst werden. IF bedingung THEN DO; Anweisung1; Anweisung2; END; ELSE DO; Anweisung3; Anweisung4; END; Beispiel 20: ELSE IF Schachtelung IF note=1 THEN ergebnis="Sehr gut"; ELSE IF note=2 THEN ergebnis="Gut"; ELSE IF note=3 THEN ergebnis="Befriedigend"; ELSE ergebnis="?"; Alternativ kann die SELECT Anweisung mit oder ohne Parameter verwendet werden, wobei ebenfalls genau eine Anweisung ausgeführt wird und gegebenenfalls DO Blöcke verwendet werden müssen. Syntax 1 mit Parameter (Anweisung1 wird ausgeführt, wenn variable=wert1, u. s. w.): SELECT (variable); WHEN (wert1) Anweisung1; WHEN (wert2) Anweisung2; <OTHERWISE anweisung;> END; Beispiel 21: SELECT Anweisung (Syntax 1) SELECT(note); WHEN (1) ergebnis="Sehr gut"; WHEN (2) ergebnis="Gut"; WHEN (3) ergebnis="Befriedigend"; OTHERWISE ergebnis="?"; END; Syntax 2 ohne Parameter: SELECT; WHEN (bedingung1) Anweisung1; WHEN (bedingung2) Anweisung2; <OTHERWISE anweisung;> END; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 61 Datenschritt (DATA STEP) Selektion von Beobachtungen (IF, WHERE, DELETE) 12. Selektion von Beobachtungen (IF, WHERE, DELETE) In vielen Fällen wird eine Teilmenge von Beobachtungen einer SAS Tabelle gesucht, die eine bestimmte Bedingung erfüllen. Die Bildung einer Teilmenge (engl. Subset) kann im Datenschritt mit den Anweisungen IF, WHERE oder DELETE erfolgen, im Prozedurschritt ausschließlich mit der WHERE Anweisung, oder in beiden Fällen mit der Tabellenoption WHERE= (siehe 15 Tabellenoptionen (data set options), S. 74). 1. Mit der DELETE Anweisung lassen sich bestimmte Beobachtungen aus einer SAS Tabelle löschen. Alle nachfolgenden Anweisungen werden dann für diese Beobachtungen übersprungen und SAS beginnt mit der nächsten Beobachtung. IF bedingung THEN DELETE; 2. Eine IF Anweisung ohne nachfolgendes "THEN" wird als "Subsetting If" bezeichnet. Es bewirkt, dass die Abarbeitung nachfolgender Anweisungen im Datenschritt nur bei den Beobachtungen fortgesetzt wird, welche die Bedingung erfüllen. Im anderen Fall werden alle nachfolgenden Anweisungen übersprungen und SAS beginnt mit der nächsten Beobachtung. IF bedingung; IF NOT (bedingung) THEN DELETE; führt zum selben Ergebnis Beispiel 22: Selektion mit Subsetting IF DATA maenner; SET kurs.kino; IF sex="1"; RUN; 3. Die WHERE Anweisung (Deklarationsanweisung) kann im Datenschritt nur in Verbindung mit den beiden Anweisungen SET und MERGE verwendet werden. Sie ist vergleichbar einem View auf die genannte(n) Tabelle(n), so dass die Daten vorselektiert werden. Die Selektion wird vor dem Einlesen der Daten in den Program data vector (PDV) ausgeführt und kann deshalb nur einmal im Datenschritt verwendet werden. WHERE bedingung; Beispiel 23: Selektion mit der WHERE Anweisung DATA maenner; SET kurs.kino; WHERE sex="1"; RUN; Beim Einlesen mehrerer Tabellen wird die Bedingung auf alle genannten Tabellen angewendet. Um für einzelne Tabellen unterschiedliche Bedingungen anzuwenden, eignet sich die WHERE= Tabellenoption (siehe 15 Tabellenoptionen (data set options), S. 74). Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 62 Datenschritt (DATA STEP) Selektion von Beobachtungen (IF, WHERE, DELETE) Formulierung von Bedingungen Eine Bedingung kann ein Vergleich sein, ein logischer Ausdruck (mit den Operatoren NOT, AND, OR), ein Funktionsergebnis, ein Datenwert oder eine beliebige Kombination davon. Das Ergebnis einer Bedingung wird im SAS System als Zahl interpretiert. Die Bedingung gilt als nicht erfüllt (falsch, false), wenn der Wert 0 ist oder fehlt (Ausprägung 'missing value'). In allen anderen Fällen gilt die Bedingung als erfüllt (wahr, true), d.h. bei allen von 0 und missing value verschiedenen numerischen Werten. Beispiele für Vergleiche IF sex=1; IF UPCASE(antwort)="JA"; gleich IF gruppe^=""; IF wert^=.; ungleich IF gebdatum<"01jan99"D; kleiner als das eingegebene Datum IF uhrzeit>="12:00"T; größer oder gleich dem angegebenen Zeitpunkt IF name=:"Me"; beginnt mit "Me" äquivalent zu IF SUBSTR(name,1,2)="Me"; IF name^=:"Me"; beginnt nicht mit "Me" IF name>=:"L"; beginnt mit "L" oder einem Buchstaben danach z.B. M, N, O usw. IF MOD(_N_,2)=0; nur die geradzahligen Beobachtungen Beispiele für logische Ausdrücke (Prioritäten Reihenfolge: NOT, AND, OR) IF gewicht>=70 AND laenge<=1.70; beide Bedingungen müssen erfüllt sein IF 1.70<=laenge<1.80; wert liegt im Intervall 1.70 und 1.80 (AND) IF NOT (gewicht>=70 AND laenge<=1.70); beide Bedingungen dürfen nicht gleichzeitig erfüllt sein IF gewicht<70 OR laenge>1.70; mindestens eine der beiden Bedingungen muss erfüllt sein IF datum=TODAY() AND (land="D" OR land="F"); Klammerausdruck wird zuerst ausgeführt. Anschließend die AND Verknüpfung. (Normalerweise hat "AND" Priorität vor "OR") IF nr IN (1 3 7); äquivalent zu: IF nr=1 OR nr=3 OR nr=7; IF name IN: ("L" "P"); beginnt mit "L" oder mit "P" äquivalent zu: IF name=:"L" OR name=:"P"; oder IF SUBSTR(name,1,1) IN ("L" P"); Beispiele für ein Funktionsergebnis als Bedingung IF MOD(_N_,2); nur die ungeradzahligen Beobachtungen (entspricht IF MOD(_N_,2) NOT IN (. 0);) Beispiele für eine Kombination IF (laenge*100-100)/gewicht<1 AND sex="2"; Beispiele für eine Ausprägung einer Variablen als Bedingung IF FIRST.gruppe; Jeweils erste Beobachtung jeder Ausprägung der Variable, nach der die SAS Tabelle sortiert ist. (BY Anweisung ist erforderlich.) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 63 Datenschritt (DATA STEP) Selektion von Beobachtungen (IF, WHERE, DELETE) Vergleichsoperatoren, die für IF und WHERE gelten Operator Bedeutung Beispiel =, EQ gleich IF name="FRIEDRICH"; ^=, NE ungleich IF klasse^=1; >, GT groesser als IF alter>80; >=, GE groesser oder gleich IF zeit>="10:15"t; <, LT kleiner als IF name<"KRAUSE"; <=, LE kleiner oder gleich IF gewicht<=50; =: beginnt mit IF name=:"KR"; >=: beginnt mit oder nachfolgende IF name>=:"KR"; IN gleich oder gleich... IF hausnr IN (10 12 18 20); IN: beginnt mit oder beginnt mit... IF name IN: ("SCH" "ST"); Vergleichsoperatoren, die ausschließlich für WHERE gelten Operator Bedeutung Beispiel Between.. liegt zwischen .. und .. AND .. einschließlich WHERE hausnr between 10 AND 20; CONTAINS, enthält WHERE hausnr CONTAINS "a"; ? WHERE hausnr ? "a"; LIKE Gleichheit mit Joker-Zeichen % steht für eine beliebige Anzahl von Zeichen WHERE name LIKE "Sch%z"; entspricht DOS * WHERE name LIKE "Sch_lz"; _ steht für genau ein Zeichen entspricht DOS ? =* klingt wie (sounds like) WHERE name=*"Schulz"; findet Schulz, Schulze, Schuhlz, Scholz, Schalk, Sculx, Skuls nicht Schultz, Schultze, Schulzer liefert phonetische Äquivalente der englischen und anderer indo-europäischer Sprachen nach dem Soundex Algorithmus von Odell und Russel (siehe SAS Technical Report P-222, oder D. Riba, Efficient Comparison of Nonprecise Character Data, Observations 1Q1997) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 64 Datenschritt (DATA STEP) Einlesen von Daten aus externen Dateien 13. Einlesen von Daten aus externen Dateien SAS bietet vordefinierte Schnittstellen zu allen gängigen Datenbanken. Diese sind jedoch nicht in Base SAS enthalten, sondern müssen gesondert lizenziert werden (SAS/ACCESS to …). Unabhängig davon können Dateien von SPSS, BMDP und OSIRIS direkt über eine entsprechende Engine gelesen werden. Besonders vielseitige Möglichkeiten zum Einlesen bietet SAS für Daten, die im ASCII Format vorliegen. Umgekehrt lassen sich ASCII Dateien auch mit SAS erzeugen. Über DDE (Dynamic data exchange) besteht die Möglichkeit des Datenaustausches mit anderen Windows Anwendungsprogrammen, wie zum Beispiel Microsoft Excel, Word, Access. 13.1 Einlesen von Daten im ASCII Format (INFILE, INPUT) Daten im ASCII Format können entweder in externen Dateien vorliegen oder aber - vor allem wenn es sich nur um wenige Daten handelt - mit der Anweisung DATALINES (oder CARDS) direkt im Quellcode des Programms integriert werden. Dies hat den Vorteil, dass nur eine einzige Datei benötigt wird und alle Informationen (Daten + Transaktionen) in der Programmdatei enthalten sind (siehe Grundlagen "Programmbeispiel Filmschauspieler"). Beim Einlesen aus externen Dateien wird dieselbe Syntax verwendet. Mit der INFILE Anweisung erfolgt der Hinweis auf die Datei, welche die Daten beinhaltet und mit der INPUT Anweisung wird diese Datei ausgelesen. Wie dies geschehen soll hängt davon ab, wie die Daten in der Datei angeordnet sind. Es ist zu unterscheiden, ob die Datenfelder in festen Spaltenpositionen stehen oder nur durch bestimmte Trennzeichen (delimiter) z.B. Blank unterschieden werden. In SAS werden drei Varianten unterschieden (column input, formatted input, list input), die sich beliebig kombinieren lassen. 1. Daten in festen Spaltenpositionen (column input, formatted input) Beispiel: ----|----10---|----20---|----30---|----40---|----50---|----60Benno Fürmann 17.01.71 1 1.85 79,0 Dustin Hoffmann 08.08.37 1 1.64 64,0 Franka Potente 22.07.74 2 1.74 62,0 Die gewünschten Daten können nun entweder durch Angabe der Spalten (column input) oder durch Angabe von geeigneten Einleseformaten und Positionierung des Pointers (formatted input) gelesen werden. Beispiel 24: column input INPUT name $ 1-30 gebdatum $ 31-38 sex 41 laenge 44-47 gewicht $ 50-53; Beispiel 25: formatted input INPUT name $30. gebdatum DDMMYY8. @41 sex 1. @44 laenge 4.2 @50 gewicht NUMX4.1; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 65 Datenschritt (DATA STEP) Einlesen von Daten aus externen Dateien Beide Methoden sind vergleichsweise mühsam, weil die Spaltenpositionen ausgezählt werden müssen. Bei der dritten Variante (list input) ist dies nicht notwendig, weil die Unterscheidung der Felder über ein einheitliches Trennzeichen (engl. delimiter) erfolgt. 2. Daten durch Trennzeichen unterscheidbar (list input) Voraussetzung hierfür ist ein einheitliches Trennzeichen, das mit der DLM= Option der INFILE Anweisung definiert wird (Voreinstellung ist Blank). Feste Spaltenpositionen sind hier nicht zwingend notwendig, aber möglich. Bis auf die Kennzeichnung von alphanumerischen Variablen durch ein nachgestelltes "$" sind keine Formatierungen notwendig, jedoch möglich (Informat kann mit ":" angehängt werden). Falls keine Formatierung erfolgt, gilt für numerische und alphanumerische Variablen die Standardlänge 8. Missing value ist auch für alphanumerische Variablen der Punkt. ACHTUNG: Einzulesende alphanumerische Variablen dürfen das Trennzeichen selbst nicht enthalten! Führende (leading), dazwischenliegende (embedded) und nachfolgende (trailing) Trennzeichen werden ignoriert. Unmittelbar aufeinanderfolgende Trennzeichen werden wie eines behandelt (Abschaltbar mit der DSD Option von INFILE). Beispiel 26: list input ohne Einleseformate INPUT vorname $ nachname $ gebdatum $ sex laenge gewicht $; Beispiel 27: list input mit Einleseformaten INPUT vorname $ nachname $ gebdatum:DDMMYY8. sex laenge gewicht:NUMX4.1; Gelesen wird ab der nächsten Spalte, welche das Trennzeichen nicht enthält, bis zum übernächsten Trennzeichen, jedoch höchstens bis zur vorgegebenen Länge des Einleseformates. ACHTUNG: INPUT name $30.; * liest immer 30 Zeichen; INPUT name:$30.; * liest bis zum nächsten Trennzeichen, jedoch höchstens 30 Zeichen; Der Nachteil des list input besteht darin, dass die Datenzeile als Ganzes gelesen und dann in einzelne Felder aufgeteilt wird, sodass die Felder in der vorgegebenen Reihenfolge gelesen werden müssen und keine Felder übersprungen werden können. Durch die gezielte Steuerung des Einlesezeigers mit "@" ist es möglich, dieselben Felder ggfs. mehrmals mit unterschiedlichen Informaten zu lesen oder zuerst ein bestimmtes Feld auszulesen und von seinem Inhalt das weitere Vorgehen abhängig zu machen. Beispiel 28: Nur bestimmte Daten einlesen INPUT @41 sex @; @ hält Einlesezeiger in der Datenzeile! IF sex=1 THEN INPUT @1 name $30. ELSE DELETE; @44 laenge gewicht:NUMX4.1; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 66 Datenschritt (DATA STEP) 13.2 Einlesen von Daten aus externen Dateien Übung 7: Daten aus ASCII Datei einlesen 1. Erstellen Sie ein neues (leeres) Programm "Einlesen.sas" für die folgende Übung. 2. Lesen Sie die ASCII Datei "Luftmesswerte_Frankfurt_Aug01.txt" mit SAS ein. Sie enthält für verschiedene Parameter in halbstündlichen Intervallen die Messwerte für Frankfurt am Main im August 2001. Quelle: Hessisches Landesamt für Umwelt und Geologie, http://www.hlug.de/ Hinweis: Die erste Zeile der Datei enthält beschreibende Informationen. Beginnen Sie das Einlesen der Daten mit der zweiten Zeile und verwenden Sie dazu in der INFILE Anweisung die Option FIRSTOBS=2. 3. Optional Lesen Sie dieselbe ASCII Datei mit Hilfe des Import Wizards von SAS ein. File Î Import Data..., Standard data source (Delimited File *.*) Luftmesswerte_Frankfurt_Aug01.txt Datum;Uhrzeit;Ozon;Luftfeuchte;Windrichtung;Stickstoffdioxid;Luftdruck;Schwefeldioxid;Temperatur 01.08.2001;00:00;93;64,5;295;15;1022;3;22,4 01.08.2001;00:30;84;65,2;294;13;1022;3;21,9 01.08.2001;01:00;72;65,8;281;15;1022;3;21,5 01.08.2001;01:30;66;65,8;325;11;1022;3;21,2 01.08.2001;02:00;62;66 ;308;12;1022;3;20,8 01.08.2001;02:30;56;67,2;333;14;1022;3;20,5 01.08.2001;03:00;54;68,4;360;14;1022;3;20,1 .... Einheiten (Label): "Ozon (O3) µg/m³"; "Relative Luftfeuchtigkeit %"; "Windrichtung Grad"; "Stickstoffdioxid (NO2) µg/m³"; "Luftdruck hPa"; "Schwefeldioxid (SO2) µg/m³"; "Temperatur °C" Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 67 Datenschritt (DATA STEP) 13.3 Einlesen von Daten aus externen Dateien Einlesen von Daten aus Microsoft Excel Tabellen via DDE Mit Hilfe der INFILE + INPUT Anweisung und DDE (dynamic data exchange) können Daten z. B. aus Microsoft Excel® Tabellen auch mit Base SAS gelesen werden11. Allerdings ist dieser Weg nicht besonders komfortabel und besitzt einige Einschränkungen, die im folgenden beschrieben werden. • Die Excel Tabelle muss in Excel geöffnet sein. • Gelesen wird ein frei definierbarer rechteckiger Zellbereich der Excel Tabelle (DDE Kanal), aus dem die Daten genauso übernommen werden wie sie in Excel aktuell formatiert und angezeigt sind. • Wenn als Dezimaltrennzeichen in Excel das Komma verwendet wird, muss eine Konvertierung in den Punkt erfolgen z. B. mit Hilfe der Informate NUMX (ab Version 6.12) oder COMMAX. • Die SAS Syntax hängt von der Sprachversion des verwendeten Excel ab. Das nachfolgende Beispiel bezieht sich auf eine deutsche Excel Version. Im Gegensatz dazu wird mit PROC IMPORT12 ein ganzes Tabellenblatt einer geschlossenen Excel Datei gelesen, wobei die Daten unformatiert in voller Genauigkeit gelesen werden. Die Excel Sprachversion und das Dezimaltrennzeichen spielt hierbei keine Rolle. Spaltenüberschriften können optional übernommen werden. Beispiel 29: Aus der Exceldatei "C:\Temp\Test.xls" die Zellen von Zeile1 Spalte1 bis Zeile12 Spalte3 nach SAS einlesen (siehe nebenstehende Abbildung). Dabei leere Zellen korrekt als fehlende Werte (missing values) erkennen. Syntax 1 ohne Angabe des Tabellenblattes, wodurch automatisch das erste Tabellenblatt verwendet wird. FILENAME daten DDE 'EXCEL|c:\temp\test.xls!Z1S1:Z12S3'; Syntax 2 mit Angabe des Tabellenblattes FILENAME daten DDE 'EXCEL|c:\temp\[test.xls]Tabelle1!Z1S1:Z12S3'; DATA in; INFILE daten DLM='09'X NOTAB DSD MISSOVER; INFORMAT var1 $10. var2 NUMX.; INPUT var1 var2 var3; RUN; 11 Siehe SAS Help and Documentation Î Using SAS Software in Your Operating System Î Using SAS in Windows Î Using SAS with Other Windows Applications Î Using Dynamic Data Exchange under Windows 12 Lizenz für das Modul „SAS/ACCESS to PC file formats“ wird hierbei vorausgesetzt. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 68 Datenschritt (DATA STEP) Verknüpfung von SAS Tabellen (SET, MERGE) 14. Verknüpfung von SAS Tabellen (SET, MERGE) Wenn die Daten bereits in SAS Tabellen (SAS data sets) vorliegen, kann über die Anweisungen SET oder MERGE auf diese lesend zugegriffen werden, wobei damit verschiedene Tabellen zu einer neuen Tabelle verknüpft werden können. Syntax: SET tabelle1 <tabelle2 ...>; MERGE tabelle1 <tabelle2 ...>; Beide Anweisungen erlauben das Lesen aus einer oder mehreren Tabellen. Für jede Tabelle können dabei Tabellenoptionen verwendet werden (siehe 15 Tabellenoptionen (data set options), S. 74). Falls mehrere Tabellen angegeben werden, so werden die Daten dieser Tabellen miteinander verknüpft, wobei verschiedene Varianten möglich sind13. SET MERGE A A B B Mit der SET Anweisung werden Tabellen vertikal Mit der MERGE Anweisung werden Tabellen verknüpft, horizontal verknüpft, sodass zusätzliche Variablen sodass zusätzliche Beobachtungen angefügt werden können. angefügt werden können. Dies ist sinnvoll für Tabellen mit verschiedenen Dies ist sinnvoll für Tabellen mit verschiedenen Beobachtungen und denselben Variablen. Variablen zu denselben Beobachtungen. 13 Darüber hinaus gibt es noch einige Untervarianten des horizontalen Verknüpfens (one-to-one reading, one-to-one merging, update) auf die hier nicht näher eingegangen werden soll. Siehe hierzu SAS OnlineDoc: Base SAS Software Î SAS Language Reference: Concepts Î Part 2: Reading, Combining, and Modifying SAS Data Sets Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 69 Datenschritt (DATA STEP) Verknüpfung von SAS Tabellen (SET, MERGE) Für die nachfolgenden Beispiele werden zur Veranschaulichung beispielhaft die folgenden beiden Tabellen EINS und ZWEI verwendet, welche unterschiedliche viele Beobachtungen, zwei übereinstimmende Variablen (ID, X) und jeweils eine weitere Variable besitzen. Beispieltabellen: EINS 14.1 ID X Y A 1 B C ZWEI ID X Z 10 B 4 40 2 20 D 5 50 3 30 SET Die SET Anweisung liest eine Beobachtung aus einer oder mehreren SAS Tabellen. Sie eignet sich dazu, an eine bestehende Tabelle weitere Beobachtungen anzuhängen (vertikale Verknüpfung). Syntax: SET tabelle1 <tabelle2 ...>; Im Falle mehrerer Tabellen werden zunächst alle Beobachtungen aus tabelle1, dann aus tabelle2 u. s. w. gelesen. Um eine SAS Tabelle zu kopieren, genügt es diese allein anzugeben. Fall 1: Kopieren einer Tabelle DATA neu; SET alt; <weitere Anweisungen...> RUN; Nacheinander wird jede Beobachtung aus der bestehenden Tabelle WORK.ALT eingelesen, steht damit für eine weitere Verarbeitung zur Verfügung und wird schließlich im der neuen Tabelle WORK.NEU gespeichert. Es ist auch möglich, für die resultierende Tabelle denselben Namen zu verwenden, um z. B. in einer bestehenden Tabelle Änderungen vorzunehmen. Die SET Anweisung arbeitet dann mit einer temporären Kopie, welche am Ende das Original überschreibt. DATA alt; SET alt; <weitere Anweisungen...> RUN; Analog könnte hierfür auch die MERGE Anweisung verwendet werden. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 70 Datenschritt (DATA STEP) Verknüpfung von SAS Tabellen (SET, MERGE) Fall 2: Hintereinanderhängen mehrerer Tabellen (concatenating) Wenn in einer SET Anweisung mehrere SAS Tabellen genannt werden, so entsteht eine neue Tabelle, welche unverändert alle Beobachtungen der ersten Tabelle, daran anschließend alle Beobachtungen der zweiten Tabelle u. s. w. enthält. Alle Einzeltabellen werden also in der angegebenen Reihenfolge vertikal miteinander verknüpft. Die Anzahl der Beobachtungen der resultierenden Tabelle ist gleich der Summe der Beobachtungen der Einzeltabellen. Im Einzelnen sind folgende Dinge zu beachten: • Gemeinsame Variablen müssen in allen Tabellen vom selben Typ sein. Sonst erscheint folgende Fehlermeldung: ERROR: Variable xxx has been defined as both character and numeric. • Gemeinsame Variablen sollten in allen Tabellen dieselbe Länge haben. Andernfalls ist die Länge der erstgenannten Datei maßgeblich. Wenn dies die kürzere ist, kann es zu Datenverlust kommen! Entsprechendes gilt auch für Label, Format und Informat der Variablen. • Haben die Einzeltabellen unterschiedliche Variablen, so enthält die resultierende Tabelle alle Variablen der Einzeltabellen, wobei an den entsprechenden Stellen fehlende Werte (missing values) auftreten. CONCAT: DATA concat; SET eins zwei; RUN; ID X Y Z A 1 10 . B 2 20 . C 3 30 . B 4 . 40 D 5 . 50 Es ist auch möglich, dieselbe Tabelle mehrmals zu lesen. Auf diese Weise lassen sich die Daten einer Tabelle beliebig oft vervielfältigen, indem diese Tabelle in einer SET Anweisung entsprechend oft angegeben wird. DREIFACH: DATA dreifach; SET zwei zwei zwei; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 ID X Z B 4 40 D 5 50 B 4 40 D 5 50 B 4 40 D 5 50 71 Datenschritt (DATA STEP) Verknüpfung von SAS Tabellen (SET, MERGE) Fall 3: Ineinandersortieren mehrerer Tabellen (interleaving) Diese Variante der vertikalen Verknüpfung eignet sich, wenn die zu verknüpfenden Tabellen alle in derselben Weise sortiert sind, und diese Sortierung beim Verknüpfen erhalten bleiben soll. Dazu werden die gemeinsamen Schlüsselvariablen (By-Variablen), nach denen die Dateien sortiert sind in einer BY Anweisung angegeben. (Zum Sortieren siehe Prozedur SORT) Die Anzahl der Beobachtungen der resultierenden Tabelle ist gleich der Summe der Beobachtungen der Einzeltabellen. Es gelten dieselben Regeln wie bei der Verknüpfung ohne BY (siehe Fall 2 "concatenating"). DATA setby; SET eins zwei; BY id; RUN; SETBY: Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 ID X Y Z A 1 10 . B 2 20 . B 4 . 40 C 3 30 . D 5 . 50 72 Datenschritt (DATA STEP) 14.2 Verknüpfung von SAS Tabellen (SET, MERGE) MERGE Die MERGE Anweisung eignet sich dazu, entsprechende Beobachtungen aus zwei oder mehreren Tabellen miteinander zu verknüpfen. Alle Einzeltabellen werden in der angegebenen Reihenfolge horizontal verknüpft. Syntax: MERGE tabelle1 <tabelle2 ...>; Fall 4: Match Merging (Gezieltes Mischen mit BY)14 Dies ist die "sicherste" Form des Mischen, weil die Verknüpfung kontrolliert erfolgen kann. Um sicherzustellen, dass ausschließlich einander entsprechende Beobachtungen miteinander verbunden werden, wird ein gemeinsames Verknüpfungsmerkmal benötigt. Dies ist eine oder mehrere Schlüsselvariablen (By-Variablen), die in allen zu verknüpfenden Tabellen vorkommen und wonach alle Einzeltabellen sortiert sind. Die gemeinsamen Schlüsselvariablen werden in einer BY Anweisung angegeben. (Zum Sortieren siehe Prozedur SORT) Die Anzahl der Beobachtungen der resultierenden Tabelle ist die Summe der verschiedenen Ausprägungen der ByVariablen der Einzeltabellen. Im Einzelnen sind folgende Dinge zu beachten: • Die By-Variablen müssen in allen Tabellen vomselben Typ sein. Sonst erscheint folgende Fehlermeldung: ERROR: Variable xxx has been defined as both character and numeric. • Die By-Variablen sollten in allen Tabellen dieselbe Länge haben. Andernfalls ist die Länge der erstgenannten Datei maßgeblich. Wenn dies die kürzere ist, kann es zu falschen Verknüpfungen kommen. WARNING: Multiple lengths were specified for the BY variable xxx by input data sets. This may cause unexpected results. • Die By-Variablen sollten in allen Tabellen in Label, Format und Informat übereinstimmen. Andernfalls sind die Attribute der erstgenannten Datei maßgeblich. • Die Verknüpfung sollte eindeutig sein, d.h. derselbe Schlüssel darf höchstens in einer Tabelle mehrfach vorkommen (1:1 oder 1:n Verknüpfung). Andernfalls (m:n) erscheint folgender Hinweis im Log. NOTE: MERGE statement has more than one data set with repeats of BY values. • Die Einzeltabellen sollten neben den By-Variablen keine weiteren gemeinsamen Variablen besitzen. Andernfalls überschreiben die Werte aus der letztgenannten Tabelle die Variablenwerte der vorhergehenden! Durch die Systemoption MSGLEVEL=I (info) wird zusätzlich zu Notes, Warnings und Errors in diesem Fall eine entsprechende Info im Log angezeigt. Standardeinstellung ist jedoch MSGLEVEL=N (note). INFO: The variable x on data set WORK.EINS will be overwritten by data set WORK.ZWEI. DATA mergeby; MERGE eins zwei; BY id; RUN; 14 MERGEBY: ID A X 1 B C 4 3 D 5 Y 10 20 Z . 30 40 . . 50 Über die Systemoption MERGENOBY=WARN|ERROR erscheint im Log eine Warnung bzw. Fehlermeldung, wenn MERGE ohne BY Anweisung verwendet wird. Standardeinstellung ist MERGENOBY=NOWARN. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 73 Datenschritt (DATA STEP) Tabellenoptionen (data set options) 15. Tabellenoptionen (data set options) Tabellenoptionen (data set options) sind optionale Angaben zu einer SAS Tabelle (data set). Sie können überall dort verwendet werden, wo der Name einer Tabelle steht, z. B. im Datenschritt in der DATA oder SET Anweisung und im Prozedurschritt. Tabellenoptionen werden in Klammern hinter dem Tabellennamen angegeben. Syntax: (option1= <option2= ...>) Tabellenoptionen unterscheiden sich von Anweisungen dadurch, dass sie in Klammern eingeschlossen sind, kein Semikolon benötigen und nach dem Schlüsselwort der Option immer ein Gleichheitszeichen (=) folgt. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Language Dictionary Î Dictionary of Language Elements Î SAS Data Set Options Nachfolgend werden einige allgemeine Tabellenoptionen beschrieben. Mit Ihnen lassen sich unter anderem bestimmte Variablen auswählen (KEEP=), ausschließen (DROP=), umbenennen (RENAME=), oder bestimmte Beobachtungen selektieren (WHERE=, FIRSTOBS=, OBS=). Eine Auswahl einiger wichtiger Tabellenoptionen: (KEEP=variablenliste) (DROP=variablenliste) variablenliste ist dabei eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. z. B. (KEEP=x y nr1-nr5) x y nr1 nr2 nr3 nr4 nr5 (KEEP=hilf:) alle Variablen, deren Name mit "hilf" beginnt (KEEP=alter--bmi) bezogen auf die Reihenfolge der Variablen in der Tabelle (KEEP=_NUMERIC_) alle numerischen Variablen (KEEP=_CHARACTER_) alle alphanumerischen Variablen (RENAME=(alter_name1=neuer_name1 <alter_name2=neuer_name2...>)) (WHERE=(Bedingung)) (FIRSTOBS=n) (OBS=n) erste zu verarbeitende Beobachtung letzte zu verarbeitende Beobachtung Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 74 Datenschritt (DATA STEP) Tabellenoptionen (data set options) Beispiele: DATA neu; SET sashelp.class (WHERE=(sex="F") RENAME=(age=alter) KEEP=sex age); RUN; DATA neu (WHERE=(sex="F") RENAME=(age=alter) KEEP=sex age); SET sashelp.class; RUN; DATA deutsch (RENAME=(age=alter)) englisch (RENAME=(name=firstname)); SET sashelp.class (KEEP=name age); RUN; DATA neu; MERGE stamm (RENAME=(patno=patid)) labor (RENAME=(patient=patid)); BY patid; RUN; PROC PRINT DATA=sashelp.class (FIRSTOBS=5 OBS=10 DROP=_NUMERIC_); RUN; PROC SORT DATA=sashelp.class OUT=class (KEEP=name age); WHERE sex="F"; BY age; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 75 Datenschritt (DATA STEP) 15.1 Tabellenoptionen (data set options) Übung 8: Tabellen verknüpfen, neue Tabellen erstellen, Tabellenoptionen 1. Erstellen Sie ein neues (leeres) Programm "Film3.sas" für die folgenden Übungen. 2. Erstellen Sie aus der Tabelle KURS.KINO zwei neue Tabellen KURS.FRAUEN und KURS.MAENNER, welche jeweils die Daten der weiblichen und männlichen Schauspieler enthalten. Lassen Sie beide Tabellen jeweils mit einer geeigneten Überschrift im Listenfenster anzeigen 3. Anonymisieren Sie die Daten der Schauspieler, indem Sie die Namen von den übrigen Daten trennen. Erstellen Sie dazu aus der SAS Tabelle KURS.KINO die beiden folgenden Tabellen: KURS.NAMEN (enthält ausschließlich die Namensvariablen) und KURS.WERTE (enthält keine Namensvariablen) Um beide Tabellen später wieder richtig miteinander verknüpfen zu können, erzeugen Sie in beiden Tabellen mit Hilfe der Variable _N_ eine anonyme Identifizierungsvariable IDNR, die bei 1001 beginnen soll. Lassen Sie beide Tabellen im Listenfenster anzeigen und speichern Sie ihr Programm. 4. Verknüpfen Sie die Tabellen der weiblichen und männlichen Schauspieler in der temporären Tabelle ALLE, sodass wieder eine vollständige Tabelle mit zwölf Beobachtungen entsteht. Fügen Sie den entsprechenden Datenschritt in Ihr Programm "Film3.sas" ein und kontrollieren Sie das Ergebnis. 5. Sortieren Sie die Tabellen der weiblichen und männlichen Schauspieler jeweils nach dem Alter und verknüpfen Sie sie anschließend wie in der letzten Übung, jedoch so, dass die Sortierung dabei erhalten bleibt. Fügen Sie den entsprechenden Datenschritt in Ihr Programm "Film3.sas" ein und kontrollieren Sie das Ergebnis. 6. Führen Sie in der temporären Tabelle TOTAL die anonymisierten Daten der Schauspieler aus der Tabelle WERTE wieder mit den zugehörigen Namen aus der Tabelle NAMEN zusammen. Fügen Sie den entsprechenden Datenschritt in Ihr Programm "Film3.sas" ein und kontrollieren Sie das Ergebnis. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 76 Prozedurschritt (PROC STEP) Grundlagen des Prozedurschritts Prozedurschritt (PROC STEP) 16. Grundlagen des Prozedurschritts Im Prozedurschritt (PROC STEP) wird eine SAS Tabelle (data set) mit Hilfe einer vordefinierten Auswerteprozedur verarbeitet. SAS stellt eine Vielzahl von Prozeduren zur Verfügung. Eine selbständige Programmierung wie im Datenschritt (DATA STEP) findet hier nicht statt, vielmehr sind aus der gegebenen Funktionalität die gewünschten Optionen auszuwählen. • Der Aufruf einer Prozedur kann vor oder nach einem Daten- oder Prozedurschritt erfolgen, jedoch nicht innerhalb (keine Schachtelung). • Jeder Prozeduraufruf beginnt mit der PROC Anweisung, dem Namen der Prozedur und nach der DATA= Option mit dem Namen der zu verarbeitenden SAS Tabelle. • Jede Prozedur sollte mit der RUN Anweisung beendet werden. • Jede Prozedur besitzt ihre spezifischen Anweisungen und Optionen. Alle zulässigen Anweisungen einer Prozedur erhält man am einfachsten über die SAS Online Hilfe, indem man im Enhanced Editor den Kursor auf den Prozedurenamen stellt und F1 drückt oder über das Kommando [help Prozedurname] z.B. [help univariate]. Für eine vollständige Übersicht der Prozeduren der Base SAS Software siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures bzw. im Handbuch SAS Procedures Guide. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 77 Prozedurschritt (PROC STEP) Grundlagen des Prozedurschritts Allen Prozeduren gemeinsam ist die folgende Syntax Struktur: PROC Prozedur_name DATA=Tabellen_name <Optionen>; Spezifische Anweisungen; <WHERE Bedingung;> <BY Variablen_name;> <FORMAT Formatzuweisungen;> <LABEL Labelzuweisungen;> RUN; • Die zu verarbeitende SAS Tabelle (data set) wird nach der DATA= Option angegeben, wobei diese durch Tabellenoptionen (data set options) eingeschränkt werden kann (siehe Kapitel "Tabellenoptionen"). Normalerweise wird die Tabelle durch die Prozedur nicht verändert und bleibt im Original erhalten (Ausnahme: PROC SORT). • Mit der WHERE Anweisung (optional) lassen sich Selektionsbedingungen für die Tabelle angeben. Dies ist sinnvoll, wenn nicht alle Beobachtungen einer Tabelle in der Prozedur verarbeitet werden sollen, sondern nur eine Teilmenge davon. Die Tabelle selbst bleibt dabei unverändert erhalten (Ausnahme: PROC SORT). • Durch die Verwendung einer BY Anweisung (optional) wird die Prozedur veranlasst, die Daten der Tabelle gruppenweise zu verarbeiten, z. B. nach Altersgruppen, Geschlecht, o. ä. Dies setzt jedoch voraus, dass die Tabelle nach der oder den entsprechenden By-Variablen sortiert ist (siehe Kapitel "PROC SORT"). • Mit der FORMAT und LABEL Anweisung (optional) können Variablen für diesen Prozedurschritt besonders formatiert und etikettiert werden. Die Anweisungen gelten dann ausschließlich für diesen Prozedurschritt und werden nicht dauerhaft mit der Tabelle gespeichert. Bei der Erstellung von Listenoutput richten sich die Prozeduren automatisch nach der aktuell eingestellten Seitengröße, genauer nach der verfügbaren Anzahl von Zeichen pro Zeile (linesize) und Zeilen pro Seite (pagesize). Der erstellte Listenoutput hat somit ein festgelegtes Seitenlayout, welches nachträglich nicht mehr geändert werden kann. Beim Drucken ist besonders darauf zu achten, dass dieses Seitenlayout zur aktuellen Druckereinstellung passt. Siehe hierzu das Kapitel "Drucken von Listenoutput" unter Grundlagen, 1. Benutzeroberfläche. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 78 Prozedurschritt (PROC STEP) PROC CONTENTS zur Dokumentation 17. PROC CONTENTS zur Dokumentation PROC CONTENTS zeigt den Inhalt einer Daten Bibliothek oder die beschreibenden Informationen einer SAS Tabelle (data set) im Listenfenster an. Dazu zählen die Informationen über die Variablen mit ihren Formaten und Labels, die Anzahl der Beobachtungen, das Erstellungsdatum, die Dateigröße, Sortierungsinformation und mehr. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures. Beispiel 30: Beschreibende Informationen zur Tabelle "kurs.kino" anzeigen PROC CONTENTS DATA=kurs.kino; RUN; ⇒ The CONTENTS Procedure Data Set Name Member Type Engine Created KURS.KINO DATA V9 Friday, January 04, 2008 01:51:08 PM Friday, January 04, 2008 01:51:08 PM Last Modified Protection Data Set Type Label Data Representation Encoding WINDOWS_32 wlatin1 Western (Windows) Observations Variables Indexes Observation Length 12 11 0 102 Deleted Observations 0 Compressed Reuse Space Point to Observations Sorted CHAR NO YES YES Engine/Host Dependent Information Data Set Page Size Number of Data Set Pages Number of Data Set Repairs File Name Release Created Host Created 8192 2 0 C:\saskurs\kino.sas7bdat 9.0101M3 XP_PRO Alphabetic List of Variables and Attributes # 8 10 4 7 9 6 3 1 5 2 11 Variable Type Len Format Alter BMI GebDatum Gewicht Index Laenge Nachname Name Sex Vorname Wochentag Num Num Num Num Num Num Char Char Char Char Num 8 8 8 8 8 8 12 25 1 8 8 3. 5.1 DATE9. Label Body Mass*Index [kg/m²] Geburtstag Körper-*gewicht [kg] 5.1 Körper-*länge [m] $SEXFMT. WTAGFMT. Geboren am Sort Information Sortedby Validated Character Set Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 Sex Alter YES ANSI 79 Prozedurschritt (PROC STEP) PROC CONTENTS zur Dokumentation Beispiel 31: Liste der Variablen in fortlaufender Reihenfolge, nach Variablennummer sortiert anzeigen PROC CONTENTS DATA=kurs.kino VARNUM; RUN; ... Variables in Creation Order # 1 2 3 4 5 6 7 8 9 10 11 ... Variable Type Len Name Vorname Nachname GebDatum Sex Laenge Gewicht Alter Index BMI Wochentag Char Char Char Num Char Num Num Num Num Num Num 25 8 12 8 1 8 8 8 8 8 8 Format Label DATE9. $SEXFMT. Geburtstag Körper-*länge [m] Körper-*gewicht [kg] 3. 5.1 5.1 WTAGFMT. Body Mass*Index [kg/m²] Geboren am Beispiel 32: Inhalt der WORK Bibliothek anzeigen inklusiv der beschreibenden Informationen zu allen darin enthaltenen SAS Tabellen PROC CONTENTS DATA=WORK._ALL_; RUN; ⇒ The CONTENTS Procedure -----Directory----Libref: Engine: Physical Name: File Name: # 1 2 3 4 5 6 7 8 Name EUROTAB FORMATS GEHALT JOBCODES KINO NEU SALARY SASGOPT Memtype DATA CATALOG DATA DATA DATA DATA DATA CATALOG WORK V9 C:\saswork\_TD151 C:\saswork\_TD151 File Size 5120 17408 33792 13312 13312 5120 17408 5120 Last Modified 09JAN2001:14:42:30 09JAN2001:14:45:52 09JAN2001:14:45:56 09JAN2001:14:45:56 09JAN2001:14:46:34 09JAN2001:14:42:48 09JAN2001:14:45:56 09JAN2001:14:41:36 ... Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 80 Prozedurschritt (PROC STEP) PROC FORMAT für eigene Formate 18. PROC FORMAT für eigene Formate Mit der Prozedur FORMAT lassen sich individuelle Formate zum Einlesen von Daten (Informat) und zur Ausgabe, d.h. zur Anzeige von Daten (Format) erstellen. Sie werden ebenso wie die Standardformate angewendet, wobei sie erst dann angewendet werden können, wenn sie vorher erstellt worden sind. Grundprinzip: Einer bestimmten Ausprägung (Code) oder einem Bereich von Ausprägungen (Klassenbildung) wird eine neue Ausprägung (Label; Decode) zugeordnet. Damit lassen sich kodierte Werte in "sprechende Bezeichnungen" verwandeln. Intern ist nur der kodierte (kurze) Wert gespeichert und erst bei der Ausgabe wird er in eine Langform (Decode) übersetzt. Dies spart Speicherplatz, weil die Langform nur einmal gespeichert werden muss. Syntax: PROC FORMAT <optionen>; VALUE <$>formatname <optionen> wertezuordnung; INVALUE <$>informatname <optionen> wertezuordnung; ... RUN; • Ausgabeformat Einleseformat Numerische Formate können ausschließlich auf numerische Variablen angewendet werden. Der Name muss ein gültiger SAS Name mit maximal 32 Zeichen (vor V9 8 Zeichen) sein und darf nicht mit einer Ziffer enden. • Zeichenformate können ausschließlich auf Charaktervariablen angewendet werden. Der Name muss mit einem Dollarzeichen "$" beginnen, ein gültiger SAS Name mit maximal 31 Zeichen (vor V9 7 Zeichen) sein (wegen "$") und darf nicht mit einer Ziffer enden. Die zu formatierenden Ausprägungen (codes) müssen in Hochkommata eingeschlossen sein. • HINWEIS: Formatnamen enthalten immer einen Punkt (zur Unterscheidung von Variablennamen). Bei der Definition des Formats wird der Punkt jedoch nicht angegeben! Siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures. Beispiel 33: Definition dreier Ausgabeformate mit Hilfe der VALUE Anweisung PROC FORMAT; * Numerisches Format; VALUE wtagfmt 1="Sonntag" 2="Montag" 3="Dienstag" 4="Mittwoch" 5="Donnerstag" 6="Freitag" 7="Samstag"; * Zeichenformat; VALUE $sexfmt "1"="männlich" "2"="weiblich"; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 81 Prozedurschritt (PROC STEP) PROC FORMAT für eigene Formate * Numerisches Format zur Klassenbildung; VALUE alterfmt 0-<20 ="unter 20 Jahre" 20-<40 ="unter 40 Jahre" 40-<60 ="unter 60 Jahre" 60-<80 ="unter 80 Jahre" 80-HIGH="über 80 Jahre"; RUN; Bei der Anwendung der Formate muss der abschließende Punkt angegeben werden FORMAT sex $sexfmt. 18.1 alter alterfmt.; Permanente Formate Standardmäßig werden alle selbst definierten Formate nur temporär gespeichert und stehen damit bei einem Neustart von SAS nicht mehr zur Verfügung. Formate lassen sich permanent speichern, indem bei der Formatdefinition die Option LIB= verwendet wird. Hierüber kann eine SAS Datenbibliothek angegeben werden, in welcher der entsprechende Formatkatalog gespeichert werden soll, der standardmäßig den Namen FORMATS erhält. Beispiel 34: Definition eines permanenten Ausgabeformates im Kursverzeichnis, wodurch dort die Datei "Formats.sas7bcat" (Katalog) angelegt wird. PROC FORMAT LIB=kurs; VALUE $sexfmt "1"="Männer" "2"="Frauen"; RUN; Um ein permanentes Format anwenden zu können, muss angegeben werden, in welcher Bibliothek es sich befindet. Standardmäßig sucht SAS zuerst in der Bibliothek WORK und dann in der Bibliothek LIBRARY nach einem Katalog mit dem Namen FORMATS und darin nach einem Einlese- bzw. Ausgabeformat mit dem entsprechenden Namen, wobei das zuerst gefundene Format verwendet wird. Die Suchreihenfolge für selbst definierte Formate ist also entscheidend und muss über die System Option FMTSEARCH= festgelegt werden. Standardeinstellung: OPTIONS FMTSEARCH=(WORK LIBRARY); Beispiel 35: Festlegen einer geänderten Suchreihenfolge für Formate, wobei zuerst im Kursverzeichnis und dann im WORK Verzeichnis gesucht werden soll und die Anwendung des Formats mit PROC PRINT. OPTIONS FMTSEARCH=(kurs WORK); PROC PRINT DATA=kurs.kino; BY sex; FORMAT sex $sexfmt.; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 82 Prozedurschritt (PROC STEP) PROC SORT zum Sortieren 19. PROC SORT zum Sortieren Mit dieser Prozedur lässt sich eine SAS Tabelle (data set) nach einer oder mehreren Variablen sortieren, wobei jede Variable auf- oder absteigend sortiert werden kann. Standard ist eine aufsteigende Sortierung. Um absteigend zu sortieren, wird vor der Variable die Option DESCENDING gesetzt. Normalerweise wird beim Sortieren die Tabelle überschrieben! Um dies zu verhindern, kann über die Option OUT= die sortierte Tabelle unter einem anderen Namen gespeichert werden. In der sortierten Tabelle wird die Sortierungsinformation gespeichert und vor einer neuerlichen Sortierung automatisch geprüft, ob die gewünschte Sortierung bereits vorliegt. In diesem Fall, unterbleibt die neuerliche Sortierung (Ausnahme: FORCE Option). Die Sortierungsinformation wird mit der SAS Tabelle gespeichert und von PROC CONTENTS angezeigt. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures. Syntax: PROC SORT DATA=original_Tabelle <OUT=neue_Tabelle> <optionen>; BY <DESCENDING> variable_1 <DESCENDING> variable_2 ...; RUN; Beispiel 36: Tabelle nach Geschlechtern sortieren, darin absteigend nach Alter. Originalsortierung überschreiben. PROC SORT DATA=kurs.kino; BY sex DESCENDING alter; RUN; ⇒Log NOTE: There were 12 observations read from the data set KURS.KINO. NOTE: The data set KURS.KINO has 12 observations and 13 variables. Beispiel 37: Daten der über 60jährigen nach Geschlecht und Name sortieren, ohne die Original Tabelle zu verändern. PROC SORT DATA=kurs.kino OUT=oldies; WHERE alter > 60; BY sex name; RUN; ⇒Log NOTE: There were 4 observations read from the data set KURS.KINO. WHERE alter>60; NOTE: The data set WORK.OLDIES has 4 observations and 13 variables. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 83 Prozedurschritt (PROC STEP) PROC PRINT zur Listenausgabe 20. PROC PRINT zur Listenausgabe Mit Hilfe der Prozedur PRINT wird der Inhalt einer SAS Tabelle (data set) angezeigt. Dabei stehen verschiedene Optionen zur Layoutgestaltung zur Verfügung. Einige davon werden nachfolgend beschrieben. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures. Syntax: PROC PRINT DATA=Tabelle_name <optionen>; < VAR variablenliste;> < ID variablenliste;> < BY variablenliste;> < PAGEBY By-variablen;> < SUM variablenliste;> < SUMBY By-variablen;> RUN; • In der VAR Anweisung (optional) kann die Reihenfolge der auszugebenden Variablen festgelegt werden. Standardmäßig werden alle Variablen in der Reihenfolge gelistet wie sie in der Tabelle definiert sind. variablenliste ist eine Aufzählung der Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. z. B. VAR x y nr1-nr5; = VAR x y nr1 nr2 nr3 nr4 nr5 VAR dif:; alle Variablen, die mit "dif" beginnen VAR alter--bmi; bezogen auf die Variablenreihenfolge in der Tabelle VAR _CHARACTER_; alle Zeichenvariablen VAR _NUMERIC_; alle numerischen Variablen • Mit Hilfe der BY Anweisung (optional) kann die Liste in Untergruppen (By-Gruppen) aufgeteilt werden, wobei jede Ausprägung der innersten By-Variable eine Untergruppe bildet. SAS setzt dabei voraus, dass die Tabelle nach diesen Variablen sortiert ist (siehe PROC SORT). Andernfalls erfolgt eine Fehlermeldung. Beispiel: BY sex alter; Bei stetigen Merkmalen kann eine Klassenbildung durch ein geeignetes Ausgabeformat erfolgen variablenliste ist dabei eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. • In der ID Anweisung (optional) können identifizierende Variablen genannt werden, deren Ausprägungen anstelle der fortlaufenden Nummer gesetzt wird (Spalte OBS entfällt automatisch). In Verbindung mit der BY Anweisung entsteht ein anderes By-Gruppen Layout (siehe Beispiel) variablenliste ist dabei eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 84 Prozedurschritt (PROC STEP) PROC PRINT zur Listenausgabe Einige Prozedur Optionen: • LABEL sorgt dafür, dass Labels (falls vorhanden) anstelle von Variablennamen ausgegeben werden • NOOBS unterdrückt die Spalte 'Obs' mit der fortlaufenden Nummerierung der Beobachtungen • OBS="Nr" Alternatives Label für die Spalte 'Obs' mit der fortlaufenden Nummerierung der Beobachtungen (V8) • SPLIT="Trennzeichen" erzwingt Zeilenumbrüche im Label (optional). Siehe Option LABEL. Standard ist Blank. Dies bewirkt einen Zeilenumbruch bei jedem Leerzeichen im Label Tipp: Variablennamen werden am Übergang von Klein- zu Großbuchstaben automatisch umgebrochen, wenn die Länge des Variablennamens größer als die Breite der Datenwerte ist (ab V8). Maßgeblich ist die Schreibweise mit der die Variable in der Tabelle gespeichert ist. z.B. "GebDatum" • N zeigt die Anzahl der ausgegebenen Beobachtungen am Ende bzw. pro By Gruppe • UNIFORM bewirkt eine einheitliche Formatierung aller Seiten (standardmäßig wird das Layout pro Seite optimiert) • HEADING= H Horizontale Ausgabe der Variablennamen V Vertikale Ausgabe der Variablennamen Voreinstellung ist die automatische Entscheidung • ROWS=PAGE Möglichst viele Beobachtungen auf eine Seite. Falls nicht genügend Platz für alle Variablen auf einer Seite ist, werden weitere Variablen auf der nächsten Seite gelistet. 1 Obs 1 2 ... ... ... ... ... 60 var1 var2 ... var10 2 Obs 1 2 ... ... ... ... ... 60 var11 var12 ... var20 Voreinstellung: Möglichst viele Variablen pro Seite; wenn nötig, wird die Seite geteilt 1 Obs 1 2 ... 30 Obs 1 2 ... 30 var1 var2 var11 var12 ... var10 ... var20 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 2 Obs 31 32 ... 60 Obs 31 32 ... 60 var1 var2 var11 var12 ... var10 ... var20 85 Prozedurschritt (PROC STEP) PROC PRINT zur Listenausgabe Beispiel 38: Liste der Filmschauspieler mit Alter (ganzzahlig), Name und Geburtsdatum getrennt für Frauen und Männer erstellen, wobei jede Gruppe aufsteigend nach Alter sortiert sein soll. PROC SORT DATA=kurs.kino; BY DESCENDING sex alter; RUN; PROC PRINT DATA=kurs.kino LABEL SPLIT="*" UNIFORM; VAR alter name gebdatum; LABEL gebdatum="Geburts-*datum" alter ="Alter"; FORMAT sex $sexfmt. alter 3. gebdatum DATE9.; BY DESCENDING sex; RUN; ⇒ ------------------ Sex=weiblich ----------------Obs 1 2 3 4 5 Alter Geburtsdatum Name 31 40 60 64 104 Franka Potente Veronica Ferres Marianne Sägebrecht Senta Berger Marlene Dietrich 22JUL1974 10JUN1965 27AUG1945 13MAY1941 27DEC1901 ------------------ Sex=männlich ----------------Obs 6 7 8 9 10 11 12 Alter Geburtsdatum Name 35 42 52 57 67 68 68 Benno Fürmann Til Schweiger Pierce Brosnan Gérard Depardieu Götz George Dustin Hoffmann Robert Redford 17JAN1971 19DEC1963 16MAY1953 27DEC1948 23JUL1938 08AUG1937 18AUG1937 Beispiel 39: Durch Kombination der BY und ID Anweisung entsteht ein anderes By-Gruppen Layout. ... BY DESCENDING sex; ID sex; RUN; ⇒ Sex Alter weiblich 31 40 60 64 104 männlich 35 42 52 57 67 68 68 Name Geburtsdatum Franka Potente Veronica Ferres Marianne Sägebrecht Senta Berger Marlene Dietrich 22JUL1974 10JUN1965 27AUG1945 13MAY1941 27DEC1901 Benno Fürmann Til Schweiger Pierce Brosnan Gérard Depardieu Götz George Dustin Hoffmann Robert Redford 17JAN1971 19DEC1963 16MAY1953 27DEC1948 23JUL1938 08AUG1937 18AUG1937 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 86 Prozedurschritt (PROC STEP) PROC PRINT zur Listenausgabe Beispiel 40: Geschlecht, Länge, Gewicht der Schauspieler nach ganzzahligen Klassen des Body-Mass-Index listen. PROC SORT DATA=kurs.kino; BY bmi; RUN; PROC PRINT DATA=kurs.kino; VAR sex laenge gewicht; BY bmi; ID bmi; FORMAT bmi F2.0; RUN; ⇒ BMI Sex Laenge Gewicht 20 weiblich 1.74 62.0 21 weiblich 1.75 64.5 22 männlich weiblich männlich 1.85 1.78 1.84 74.0 69.0 76.0 23 weiblich männlich 1.73 1.85 69.0 79.0 24 männlich männlich 1.64 1.82 64.0 79.0 26 männlich 1.88 90.5 28 männlich 1.85 95.0 33 weiblich 1.72 96.5 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 87 Prozedurschritt (PROC STEP) PROC FREQ für Häufigkeitstabellen 21. PROC FREQ für Häufigkeitstabellen Mit der Prozedur FREQ lassen sich die absoluten und relativen Häufigkeiten (frequency) aller auftretenden Ausprägungen einer oder mehrerer Variablen einer SAS Tabelle (data set) ermitteln. Dabei können ein- oder mehrdimensionale Häufigkeitstabellen (Mehrfeldertafeln, Kontingenztafeln, Kreuztabellen) erzeugt werden, welche die Häufigkeitsverteilung für einzelne oder kombinierte Merkmale zeigen. Zusätzlich können verschiedene statistische Tests (z.B. χ2-Test) durchgeführt werden. Die Prozedur geeignet sich besonders für Variablen mit diskreter Merkmalsausprägung. Bei stetigen Merkmalen ist eine Klassenbildung durch ein geeignetes Ausgabeformat möglich. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures. Syntax: PROC FREQ DATA=Tabelle_name <optionen>; < TABLES requests </ OUT=freq_Tabelle options>;> < WEIGHT variable;> < BY variablenliste;> < OUTPUT OUT=stat_Tabelle <statistiken>;> RUN; • In der TABLES Anweisung werden in requests die Variablen festgelegt, die untersucht werden sollen. Für alle durch Blank getrennte Variablen wird jeweils eine eindimensionale Tabelle erzeugt. Für zwei durch "" verknüpfte Variablen wird eine zweidimensionale Tabelle gebildet (Kreuzklassifikation), wobei die erstgenannte Variable vertikal und die letzte horizontal gelistet wird. Werden drei Variablen durch "" verknüpft, so wird für jede Ausprägung der ersten Variable eine zweidimensionale Tabelle mit den beiden letzten Variablen erstellt. u. s. w. Bei stetigen Merkmalen ist eine Klassenbildung durch ein geeignetes Ausgabeformat möglich. Standardausgabe bei eindimensionalen Tabellen: absolute und relative Häufigkeiten (frequency, percent), sowie die kumulierten absoluten und relativen Häufigkeiten (cumulative frequency, cumulative percent). Standardausgabe bei zweidimensionalen Tabellen: absolute und relative Häufigkeiten (frequency, percent), sowie die relativen Häufigkeiten bezogen auf die Zeilen und Spalten (row percent, column percent). • Einige Optionen der TABLES Anweisung, die nach "/" angegeben werden können. z.B. NOFREQ, NOPERCENT, NOCUM (Unterdrückt die jeweilige Auszählungsart) NOROW, NOCOL (Unterdrückt in zweidimensionalen Tabellen die Zeilen- bzw. Spaltenprozent) MISSING (Einbeziehung von fehlenden Werten), LIST (Ausgabe als Liste statt als Tabelle), OUT= (Zellhäufigkeiten in einer neuen Tabelle speichern (siehe auch Option OUTPCT)) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 88 Prozedurschritt (PROC STEP) PROC FREQ für Häufigkeitstabellen • Die WEIGHT Anweisung erlaubt die Angabe einer Variable, deren Ausprägungen als Gewichtungsfaktor für die jeweilige Beobachtung verwendet werden. Normalerweise geht jede Beobachtungen mit dem Gewicht 1 ein. • Die BY Anweisung erlaubt eine getrennte Auswertung nach Untergruppen, wobei jeder Gruppenwechsel einen Seitenumbruch bewirkt. variablenliste ist dabei eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. • Mit Hilfe der OUTPUT Anweisung können statistische Kenngrößen in einer AusgabeTabelle gespeichert werden. Beispiel 41: Geschlechterverteilung (eindimensionale Tabelle) "Wie viele Frauen und Männer gibt es?" oder genauer, welche Ausprägungen hat die Variable "SEX", und wie oft kommt jede Ausprägung vor? PROC FREQ DATA=kurs.kino; TABLES sex; RUN; ⇒ Sex männlich weiblich Frequency 7 5 Percent 58.33 41.67 Cumulative Frequency 7 12 Cumulative Percent 58.33 100.00 Die Prozedur FREQ eignet sich auch, um Klassenhäufigkeiten von Variablen mit stetiger Merkmalsausprägung zu bestimmen. Die Klassenbildung kann durch ein geeignetes Format erfolgen. Beispiel 42: Ganzzahlige Klassen für den Body-Mass-Index bilden. Welche Klassen kommen vor und wie stark sind sie besetzt (eindimensionale Tabelle)? PROC FREQ DATA=kurs.kino; TABLES bmi; FORMAT bmi F2.0; * Klassenbildung; RUN; ⇒ BMI 20 21 22 23 24 26 28 33 Frequency 1 1 3 2 2 1 1 1 Percent 8.33 8.33 25.00 16.67 16.67 8.33 8.33 8.33 Cumulative Frequency 1 2 5 7 9 10 11 12 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 Cumulative Percent 8.33 16.67 41.67 58.33 75.00 83.33 91.67 100.00 89 Prozedurschritt (PROC STEP) PROC FREQ für Häufigkeitstabellen Beispiel 43: Wie verteilen sich die Geschlechter auf die Altersklassen 0 bis 20, 20 bis 40, 40 bis 60, 60 bis 80 und über 80? (Zweidimensionale Tabelle) PROC FREQ DATA=kurs.kino; TABLES alter*sex; FORMAT alter alterfmt. sex $sexfmt.; Klassenbildung siehe PROC FORMAT RUN; In zweidimensionalen Tabellen werden neben den absoluten Häufigkeiten (Frequency) standardmäßig drei Arten von relativen Häufigkeiten berechnet: Gesamtprozent (Percent), Zeilenprozent (Row pct), Spaltenprozent (Col pct). ⇒ The FREQ Procedure Table of Alter by Sex Alter Sex Frequency ‚ Percent ‚ Row Pct ‚ Col Pct ‚männlich‚weiblich‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ unter 40 Jahre ‚ 1 ‚ 1 ‚ ‚ 8.33 ‚ 8.33 ‚ ‚ 50.00 ‚ 50.00 ‚ ‚ 14.29 ‚ 20.00 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ unter 60 Jahre ‚ 3 ‚ 1 ‚ ‚ 25.00 ‚ 8.33 ‚ ‚ 75.00 ‚ 25.00 ‚ ‚ 42.86 ‚ 20.00 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ unter 80 Jahre ‚ 3 ‚ 2 ‚ ‚ 25.00 ‚ 16.67 ‚ ‚ 60.00 ‚ 40.00 ‚ ‚ 42.86 ‚ 40.00 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ über 80 Jahre ‚ 0 ‚ 1 ‚ ‚ 0.00 ‚ 8.33 ‚ ‚ 0.00 ‚ 100.00 ‚ ‚ 0.00 ‚ 20.00 ‚ ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆƒƒƒƒƒƒƒƒˆ Total 7 5 58.33 41.67 Total 2 16.67 4 33.33 5 41.67 1 8.33 12 100.00 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 90 Prozedurschritt (PROC STEP) PROC FREQ für Häufigkeitstabellen Alle mit der Prozedur FREQ ermittelten Häufigkeiten lassen sich auch in einer (neuen) SAS Tabelle (data set) speichern und stehen so für weitere Auswertungen zur Verfügung. Dazu dienen die Optionen der TABLES Anweisung OUT= und OUTPCT (bei mehrdimensionalen Tabellen), sowie OUTCUM (bei eindimensionalen Tabellen). Die Option NOPRINT der Prozedur unterdrückt die normale Ausgabe im Listenfenster. Beispiel 44: Zellhäufigkeiten aus dem letzten Beispiel (zweidimensionale Tabelle) in einer SAS Tabelle (data set) speichern. PROC FREQ DATA=kurs.kino NOPRINT; TABLES alter*sex / OUT=freq1 OUTPCT; FORMAT alter alterfmt. sex $sexfmt.; RUN; PROC PRINT DATA=freq1; RUN; ⇒ Obs 1 2 3 4 5 6 7 Alter unter 40 Jahre unter 40 Jahre unter 60 Jahre unter 60 Jahre unter 80 Jahre unter 80 Jahre über 80 Jahre Sex männlich weiblich männlich weiblich männlich weiblich weiblich COUNT PERCENT PCT_ROW PCT_COL 1 1 3 1 3 2 1 8.3333 8.3333 25.0000 8.3333 25.0000 16.6667 8.3333 50 50 75 25 60 40 100 14.2857 20.0000 42.8571 20.0000 42.8571 40.0000 20.0000 Beispiel 45: Altersverteilung (eindimensionale Tabelle) inklusive der kumulierten Häufigkeiten in einer SAS Tabelle (data set) speichern. PROC FREQ DATA=kurs.kino NOPRINT; TABLES alter / OUT=freq2 OUTCUM; FORMAT alter alterfmt.; RUN; PROC PRINT DATA=freq2; RUN; ⇒ Obs 1 2 3 4 Alter unter 40 Jahre unter 60 Jahre unter 80 Jahre über 80 Jahre COUNT PERCENT CUM_FREQ CUM_PCT 2 4 5 1 16.6667 33.3333 41.6667 8.3333 2 6 11 12 16.667 50.000 91.667 100.000 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 91 Prozedurschritt (PROC STEP) PROC MEANS für Deskriptive Statistik 22. PROC MEANS für Deskriptive Statistik Die Prozedur MEANS berechnet Kennwerte für eine oder mehrere Variablen einer SAS Tabelle (data set), welche in Zusammenhang mit dem arithmetischen Mittel stehen: Arithmetisches Mittel (MEAN), Standardabweichung (STD), Varianz (VAR), Variationskoeffizient (CV), Konfidenzintervalle für den Erwartungswert (confidence limits = CLM) unter der Annahme, dass das Merkmal normalverteilt ist (LCLM = Lower confidence limit, UCLM = Upper confidence limit), Minimum (MIN), Maximum (MAX), Spannweite (RANGE), Summe, sowie Median (MEDIAN) und folgende Quantile (1%, 5%, 10%, 25%, 75%, 90%, 95%, 99%). Außerdem lassen sich Extremwerte identifizieren (z.B. die 10 größten Ausprägungen) und es kann der verbundene (Einstichproben) t-Test mit der Nullhypothese "Der Erwartungswert ist gleich Null" durchgeführt werden (Zum Test mit einem anderen Erwartungswert z muß die zu untersuchende Variable vorher durch Subtraktion von z transformiert werden). Siehe auch PROC UNIVARIATE. Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures. Syntax: PROC MEANS DATA=Tabelle_name <statistiken> <optionen>; < VAR variablenliste;> < CLASS variablenliste;> < BY variablenliste;> < OUTPUT OUT=AusgabeTabelle <statistiken=var-1 - var-n>;> RUN; • Statistiken bezeichnen die Schlüsselwörter N NMISS MEAN MEDIAN|P50 Q3|P75 P1 P90 P5 P95 P10 P99 Q1|P25 QRANGE STD MIN MAX RANGE SUM VAR USS CSS CV STDERR T PRT SUMWGT SKEWNESS KURTOSIS CLM LCLM UCLM der gewünschten Kenngrößen. Fehlen diese Angaben, so wird standardmäßig N, MEAN, STD, MIN, MAX verwendet. • Die Prozedur besitzt eine Vielzahl von Optionen. Darunter MAXDEC= und FW=, die über die Anzahl der Nachkommastellen (maximal decimals) und die Spaltenbreite (field width) das Layout der Ergebnisse beeinflussen. • In der VAR Anweisung (optional) werden die zu analysierenden Variablen festgelegt. Fehlt die VAR Anweisung, so werden alle numerischen Variablen der Tabelle ausgewertet. Vorhandene Variablenlabels werden bei der Ausgabe automatisch angezeigt. variablenliste ist eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. z. B. VAR x y nr1-nr5; = VAR x y nr1 nr2 nr3 nr4 nr5 VAR dif:; alle Variablen, die mit "dif" beginnen VAR alter--bmi; bezogen auf die Variablenreihenfolge in der Tabelle VAR _CHARACTER_; alle Zeichenvariablen VAR _NUMERIC_; alle numerischen Variablen Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 92 Prozedurschritt (PROC STEP) PROC MEANS für Deskriptive Statistik • Die CLASS Anweisung (optional) und die BY Anweisung erlauben eine getrennte Auswertung nach Untergruppen. Die CLASS Anweisung liefert eine übersichtlichere Ausgabe und setzt eine Sortierung der Tabelle nach den Klassenvariablen nicht zwingend voraus. Bei stetigen Merkmalen ist eine Klassenbildung durch ein geeignetes Ausgabeformat möglich. variablenliste ist dabei eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. • Mit Hilfe der OUTPUT (optional) Anweisung können die berechneten Kenngrößen in einer AusgabeTabelle gespeichert werden. Sie stehen damit für weitere Auswertungen zur Verfügung. (CLASS Anweisung und BY Anweisung liefern leicht unterschiedliche Tabellen) Statistiken bezeichnen die Schlüsselwörter der auszugebenden Kenngrößen. Fehlen diese Angaben, so wird automatisch N, MEAN, STD, MIN, MAX verwendet. Beispiel 46: Standardausgabe von PROC MEANS (standardmäßig für alle numerischen Variablen). Zusätzlich alle Kennwerte auf zwei Nachkommastellen runden und die Spaltenbreite für alle Kennwerte auf acht Zeichen begrenzen. PROC MEANS DATA=kurs.kino MAXDEC=2 FW=8; VAR alter laenge gewicht BMI; RUN; ⇒ The MEANS Procedure Variable Label N Mean Std Dev Minimum Maximum ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Alter Laenge Gewicht BMI 12 Körper-*länge [m] 12 Körper-*gewicht [kg] 12 Body Mass*Index [kg/m²] 12 57.33 1.79 76.54 23.93 19.79 0.07 11.99 3.39 31.00 1.64 62.00 20.48 104.00 1.88 96.50 32.62 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Beispiel 47: Wie groß ist das Durchschnittsalter bei Männern und Frauen? Für das Merkmal Alter Mittelwert, Median, 5% und 95% Perzentil (Quantil), sowie das 95%-Konfidenzintervall für den Erwartungswert berechnen. PROC MEANS DATA=kurs.kino MAXDEC=2 MEAN MEDIAN P5 P95 CLM ALPHA=0.05; VAR alter; CLASS sex; FORMAT sex $sexfmt.; RUN; ⇒ The MEANS Procedure Analysis Variable : Alter Sex N Obs Mean Median 5th Ptcl 95th Pctl Lower 95% CL for Mean Upper 95% CL for Mean ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ männlich 7 55.57 57.00 35.00 68.00 43.27 67.87 weiblich 5 59.80 60.00 31.00 104.00 24.72 94.88 ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 93 Prozedurschritt (PROC STEP) PROC MEANS für Deskriptive Statistik Beispiel 48: Mittelwert und Standardabweichung für die Merkmale Alter und Body-Mass-Index für Männer und Frauen getrennt in einer SAS Tabelle (data set) speichern. PROC MEANS DATA=kurs.kino NOPRINT; VAR alter bmi; CLASS sex; FORMAT sex $sexfmt.; OUTPUT OUT=stat1 MEAN= STD= / AUTONAME; RUN; PROC PRINT DATA=stat1; RUN; ⇒ Obs Sex 1 2 3 _TYPE_ 0 1 1 männlich weiblich _FREQ_ Alter_ Mean BMI_Mean Alter_ StdDev 12 7 5 57 56 60 23.9 24.0 23.8 20 13 28 BMI_ StdDev 3.4 2.1 5.0 Hinweis: Wenn statt der CLASS Anweisung für die Variable SEX die BY Anweisung verwendet wird, entfällt die gruppenübergreifende Auswertung (erste Beobachtung mit _TYPE_=0). Die Option AUTONAME bewirkt eine automatische Benennung der neuen Variablen in der Form OriginalVariable_Statistikschlüsselwort. Alternativ können die neuen Variablen auch selbst definiert werden. Beispiel: ... OUTPUT OUT=stat1 MEAN=m_alter m_bmi ... STD=s_alter s_bmi; Beispiel 49: Name und Alter der zwei jüngsten Frauen und Männer in verschiedenen Variablen speichern. PROC MEANS DATA=kurs.kino NOPRINT; VAR alter; CLASS sex; FORMAT sex $sexfmt.; OUTPUT OUT=stat2 IDGROUP (MIN(alter) OUT[2] (nachname alter)=) / AUTONAME; RUN; PROC PRINT DATA=stat2; RUN; ⇒ Obs 1 2 3 Sex männlich weiblich _TYPE_ 0 1 1 _FREQ_ 12 7 5 Nachname_1 Potente Fürmann Potente Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 Nachname_2 Fürmann Schweiger Ferres Alter_1 31 35 31 Alter_2 35 42 40 94 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale 23. PROC UNIVARIATE zur Analyse einzelner Merkmale Die Prozedur UNIVARIATE ist ein geeignetes Werkzeug, um die Verteilung eines Merkmals zu beurteilen. Sie berechnet deskriptive Statistiken, neben dem arithmetischen Mittel (MEAN) auch Median und Modalwert (MODE), sowie Konfidenzintervalle für Mittelwert, Standardabweichung und Varianz (Option CIBASIC), beliebige Quantile inklusive ihrer Konfidenzgrenzen mit und ohne Annahme einer Normalverteilung (Option CIPCTLNORMAL, CIPCTLDF), sowie robuste Schätzer für Streuungsparameter (ROBUSTSCALE) und Lageparameter (TRIMMED, WINSORIZED). Außerdem lassen sich verschiedene Tests auf Normalverteilung durchführen (Option NORMAL) und Extremwerte auflisten. Die Prozedur erstellt folgende Grafiken (hochauflösend oder zeichenbasiert): Boxplot, Stamm-und-Blatt Diagramm, Histogramm, Probability Plot und Quantil-Quantil Plots für verschiedene Verteilungen. Der umfangreiche Output der Prozedur ist in Ausgabeobjekte aufgeteilt, wodurch die Ausgabe übersichtlich strukturiert wird. Jedes Ausgabeobjekt kann separat erzeugt und auch gedruckt werden. Siehe auch Grundlagen, Kapitel "Output Delivery System (ODS)". Standardmäßig werden die folgenden fünf Ausgabeobjekte erzeugt: Moments, BasicMeasures, TestsForLocation, Quantiles, Extremes Für eine vollständige Übersicht siehe SAS Help and Documentation Î SAS Products Î Base SAS Î SAS Procedures Î Procedures. Syntax: PROC UNIVARIATE DATA=Tabelle_name <optionen>; < VAR variablenliste;> < CLASS variablenliste;> < BY variablenliste;> < OUTPUT OUT=AusgabeTabelle <statistiken=var-1 - var-n>;> < ID variablenliste;> < HISTOGRAM variablenliste </ optionen>;> < PROBPLOT variablenliste </ optionen>;> ... RUN; • Optionen von PROC UNIVARIATE (Auswahl) CIBASIC CIPCTNORMAL CIPCTLDF NORMAL NOPRINT PLOT ROBUSTSCALE TRIMMED WINSORIZED Konfidenzgrenzen für Mittelwert, Standardabweichung und Varianz basierend auf der Normalverteilung Konfidenzgrenzen für Quantile basierend auf der Normalverteilung Konfidenzgrenzen für Quantile verteilungsfrei Tests auf Normalverteilung Verhindert Listenausgabe (sinnvoll bei OUTPUT Anweisung oder Grafik) Boxplot, Stamm- und Blattdiagramm, Normal Probability Plot (zeichenbasiert) Robuste Schätzer für Streungsmaße Robuste Schätzer für Lagemaße (getrimmte Mittelwerte) Robuste Schätzer für Lagemaße (winsorisierte Mittelwerte) Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 95 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale • In der VAR Anweisung (optional) werden die zu analysierenden Variablen festgelegt. Fehlt die VAR Anweisung, so werden alle numerischen Variablen der Tabelle verwendet. Vorhandene Variablenlabel werden angezeigt. variablenliste ist eine Aufzählung von Variablen, wobei verschiedene Kurzschreibweisen zulässig sind. z. B. VAR x y nr1-nr5; = VAR x y nr1 nr2 nr3 nr4 nr5 VAR dif:; alle Variablen, die mit "dif" beginnen VAR alter--bmi; bezogen auf die Variablenreihenfolge in der Tabelle VAR _CHARACTER_; alle Zeichenvariablen VAR _NUMERIC_; alle numerischen Variablen • Die BY Anweisung (optional) erlaubt eine getrennte Auswertung nach Untergruppen und setzt eine Sortierung der Tabelle nach den Klassenvariablen zwingend voraus. Bei stetigen Merkmalen ist eine Klassenbildung durch ein geeignetes Ausgabeformat möglich. • Mit Hilfe der ID Anweisung (optional) kann eine Variable angegeben werden, mit deren Ausprägungen die Extremwerte identifiziert werden (sonst wird die Nummer der Beobachtung verwendet). • Mit Hilfe der OUTPUT Anweisung (optional) können ähnlich wie bei PROC MEANS die berechneten Kenngrößen in einer SAS Tabelle (data set) Ausgabetabelle gespeichert werden. Sie stehen damit für weitere Auswertungen zur Verfügung. Statistiken bezeichnen die zulässigen Schlüsselwörter der gewünschten Kenngrößen. Descriptive statistic keywords CSS Corrected sum of squares CV Coefficient of variation KURTOSIS Kurtosis MAX Largest value MEAN Sample mean MIN Smallest value MODE Most frequent value N Sample size NMISS Number of missing values NOBS Number of observations RANGE Range SKEWNESS Skewness STD Standard deviation STDMEAN Standard error of the mean SUM Sum of the observations SUMWGT Sum of the weights USS Uncorrected sum of squares VAR Variance Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 96 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale Quantile statistic keywords P1 1st percentile P5 5th percentile P10 10th percentile Q1 Lower quartile (25th percentile) MEDIAN Median (50th percentile) Q3 Upper quartile (75th percentile) P90 90th percentile P95 95th percentile P99 99th percentile QRANGE Interquartile range (Q3 - Q1) Robust statistic keywords GINI Gini's mean difference MAD Median absolute difference about the median QN Qn, alternative to MAD SN Sn, alternative to MAD STD_GINI Gini's standard deviation STD_MAD MAD standard deviation STD_QN Qn standard deviation STD_QRANGE Interquartile range standard deviation STD_SN Sn standard deviation Hypothesis testing keywords MSIGN Sign statistic NORMALTEST Test statistic for normality PNORMAL Probability value for the test of normality SIGNRANK Signed rank statistic PROBM Probability of greater absolute value for the sign statistic PROBN Probability value for the test of normality PROBS Probability value for the signed rank test PROBT Probability value for the Student's t test T Statistics for Student's t test Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 97 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale Beispiel 50: Wie ist die Altersverteilung der Filmschauspieler? (Standardausgabe von PROC UNIVARIATE) PROC UNIVARIATE DATA=kurs.kino; VAR alter; ID nachname; RUN; ⇒ The UNIVARIATE Procedure Variable: Alter Moments N Mean Std Deviation Skewness Schiefe Uncorrected SS Coeff Variation 12 57.3333333 19.7867418 0.94224209 43752 34.511759 Sum Weights Sum Observations Variance Kurtosis Corrected SS Std Error Mean 12 688 391.515152 1.78036754 Wölbung/Excess 4306.66667 5.71194036 Basic Statistical Measures Location Mean Median Mode Variability 57.33333 58.50000 68.00000 Std Deviation Variance Range Interquartile Range 19.78674 391.51515 73.00000 26.50000 Tests for Location: Mu0=0 Test -Statistic- -----p Value------ Student's t Sign Signed Rank t M S Pr > |t| Pr >= |M| Pr >= |S| 10.03745 6 39 <.0001 Verbundener t-Test 0.0005 Vorzeichentest 0.0005 Wilcoxon Vorzeichentest Quantiles (Definition 5) Quantile 100% Max 99% 95% 90% 75% Q3 50% Median 25% Q1 10% 5% 1% 0% Min Estimate 104.0 104.0 104.0 68.0 67.5 58.5 41.0 35.0 31.0 31.0 31.0 Extreme Observations ------------Lowest----------- -----------Highest----------- Value Obs Value Nachname Obs 1 6 2 7 8 64 67 68 68 104 Berger George Hoffmann Redford Dietrich 4 10 11 12 5 31 35 40 42 52 Nachname Potente Fürmann Ferres Schweiger Brosnan Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 98 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale Beispiel 51: Tests auf Normalverteilung für das Merkmal Alter. PROC UNIVARIATE DATA=kurs.kino NORMAL; VAR alter; RUN; ⇒ Tests for Normality 17 Test --Statistic--- -----p Value------ Shapiro-Wilk Kolmogorov-Smirnov Cramer-von Mises Anderson-Darling W D W-Sq A-Sq Pr Pr Pr Pr 0.912152 0.211582 0.054654 0.407346 < > > > W D W-Sq A-Sq 0.2273 0.1412 >0.2500 >0.2500 Beispiel 52: Konfidenzintervalle für Mittelwert, Standardabweichung und Varianz unter der Normalverteilungsannahme für das Merkmal Alter. PROC UNIVARIATE DATA=kurs.kino CIBASIC; VAR alter; RUN; ⇒ Basic Confidence Limits Assuming Normality Parameter Estimate Mean Std Deviation Variance 57.33333 19.78674 391.51515 95% Confidence Limits 44.76144 14.01683 196.47158 69.90523 33.59547 1129 Beispiel 53: Konfidenzintervalle für die Quantile mit Normalverteilungsannahme für das Merkmal Alter. PROC UNIVARIATE DATA=kurs.kino CIPCTLNORMAL; VAR alter; RUN; ⇒ Quantiles (Definition 5) Quantile 100% Max 99% 95% 90% 75% Q3 50% Median 25% Q1 10% 5% 1% 0% Min 17 Estimate 104.0 104.0 104.0 68.0 67.5 58.5 41.0 35.0 31.0 31.0 31.0 95% Confidence Limits Assuming Normality 87.0608 76.4655 70.4870 59.4968 44.7614 26.8562 8.8154 -2.4881 -24.2610 138.9277 117.1548 105.8512 87.8105 69.9052 55.1699 44.1796 38.2012 27.6059 Die Nullhypothese lautet: "Die dem Merkmal zugrundeliegende Population ist normalverteilt". Da der p-Wert durchgängig > 10% ist, kann sie nicht abgelehnt werden. Ö Das Alter kann aufgrund dieser Datenlage als normalverteilt gelten. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 99 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale Beispiel 54: Konfidenzintervalle für die Quantile ohne Normalverteilungsannahme für das Merkmal Alter. PROC UNIVARIATE DATA=kurs.kino CIPCTLDF; VAR alter; RUN; ⇒ Quantile 100% Max 99% 95% 90% 75% Q3 50% Median 25% Q1 10% 5% 1% 0% Min Estimate 104.0 104.0 104.0 68.0 67.5 58.5 41.0 35.0 31.0 31.0 31.0 95% Confidence Limits Distribution Free . 68 68 57 40 31 31 31 . -------Order Statistics------LCL Rank UCL Rank Coverage . 104 104 104 68 60 40 40 . . 10 10 6 3 1 1 1 . . 12 12 12 10 7 3 3 . . 44.01 60.67 95.41 96.14 95.41 60.67 44.01 . Beispiel 55: Einfaches (zeichenbasiertes) Stamm-und-Blatt Diagramm (Stem and Leaf), Boxplot und Normalverteilungsplot für das Merkmal Alter. PROC UNIVARIATE DATA=kurs.kino PLOT; VAR alter; RUN; ⇒ Stem 10 9 8 7 6 5 4 3 Leaf 4 # 1 04788 27 02 15 ----+----+----+----+ Multiply Stem.Leaf by 10**+1 Boxplot | | | | +-----+ *--+--* +-----+ | 5 2 2 2 Median Q3 Mean Q1 Normal Probability Plot 105+ | | | | | | 35+ * ++++ +++++ +++++ +++++ *+*+*+ * *+*++ *++*+ * ++*++ +----+----+----+----+----+----+----+----+----+----+ -2 -1 0 +1 +2 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 100 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale Beispiel 56: Mittelwert und Median des Alters für Frauen und Männern berechnen und in einer Tabelle speichern. PROC SORT DATA=kurs.kino; BY sex; RUN; PROC UNIVARIATE DATA=kurs.kino NOPRINT; VAR alter; BY sex; FORMAT sex $sexfmt.; OUTPUT OUT=stat1 MEAN=mittel MEDIAN=median; RUN; PROC PRINT DATA=stat1 LABEL; RUN; ⇒ OBS 1 2 the mean, ALTER SEX männlich weiblich the median, ALTER 55.5714 59.8000 57 60 Beispiel 57: Histogramm als hochauflösende Grafik für das Merkmal Alter. TITLE1 F='Arial' H=13 pt "Altersverteilung der Filmschauspieler"; PROC UNIVARIATE DATA=kurs.kino NOPRINT; HISTOGRAM alter / MIDPOINTS=0 TO 100 BY 20 CFILL=GRAY; INSET N MIN MAX MEAN (5.1) MEDIAN/ HEADER="Statistik" POS=NW HEIGHT=3; RUN; Altersverteilung der Filmschauspieler 60 Statistik 50 Percent 40 N 12 Minimum 31 Maximum 104 Mean 57.3 Median 58.5 30 20 10 0 0 20 40 60 80 100 Alter Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 101 Prozedurschritt (PROC STEP) PROC UNIVARIATE zur Analyse einzelner Merkmale Beispiel 58: Vergleichendes Histogramm für Gruppen mit überlagerter Normalverteilung. PROC UNIVARIATE DATA=sashelp.class NORMAL NOPRINT; HISTOGRAM height / NORMAL(MU=EST SIGMA=EST COLOR=RED); CLASS sex; INSET N MEAN(5.1) STD(5.1) PNORMAL / POS=NE HEIGHT=2; RUN; N 9 Mean 40 60.6 Std Deviation 5.0 Percent F Normal T est P -Value 0.493158 30 20 10 0 N 10 Mean 40 63.9 Std Deviation 4.9 Percent M Normal T est P -Value 0.724852 30 20 10 0 52.5 57.5 62.5 67.5 72.5 Height Beispiel 59: Probability Plot mit überlagerter Normalverteilung. PROC UNIVARIATE DATA=sashelp.class NORMAL NOPRINT; PROBPLOT age / NORMAL(MU=EST SIGMA=EST COLOR=RED); INSET N MEAN(5.1) STD(5.1) PNORMAL / POS=SE HEIGHT=2; RUN; 16 15 Age 14 13 12 N 19 Mean 13.3 Std Deviation Normal T es t P-Value 1.5 0.173704 11 1 5 10 25 50 75 90 95 99 Norm al Percentiles Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 102 Prozedurschritt (PROC STEP) Grafikprozeduren 24. Grafikprozeduren Es gibt eine Vielzahl verschiedener Grafikprozeduren in SAS. Sie sollen hier nur kurz erwähnt werden. Die hochauflösenden Grafikprozeduren wie PROC GPLOT, PROC GCHART, PROC G3D usw. zeigen die Ergebnisse im Grafikfenster. Sie beginnen alle mit "G" und werden im Modul SAS/GRAPH® gesondert verkauft. In Base SAS sind jedoch auch Grafikprozeduren wie PROC PLOT, PROC CHART usw. enthalten. Ihre Darstellungen erscheinen im Listenfenster und sind deshalb zeilen- und spaltenorientiert. Beispiel 60: Punktwolke Körperlänge gegen Körpergewicht. PROC PLOT DATA=kurs.kino; PLOT laenge*gewicht=sex / VAXIS=1.6 TO 1.9 BY 0.05; RUN; ⇒Plot 1.90 1.85 K ö 1.80 r p e r * l ä 1.75 n g e [ m ] 1.70 1.65 1.60 of LAENGE*GEWICHT. Symbol is value of SEX. | + | | | m | | | | + m m m | | m | | | m | | + | | | w | | | | + w | | w | w | | w | | + | | | | | | | + | | m | | | | | + ---+--------+--------+--------+--------+--------+--------+--------+--------+-60 65 70 75 80 85 90 95 100 Körper-*gewicht [kg] Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 103 Prozedurschritt (PROC STEP) Grafikprozeduren Beispiel 61: Punktwolke Körperlänge gegen Körpergewicht als hochauflösende Grafik. GOPTIONS RESET=ALL DEV=WIN TARGET=WINPRTC KEYMAP=WINANSI; TITLE1 F=SWISS H=3.0 PCT "Zusammenhang von Körperlänge und -gewicht"; TITLE2 F=SWISS H=2.5 PCT "Lineare Regression und 95%-Konfidenzbereich für die Mittelwerte"; SYMBOL1 C=BLACK V=DOT SYMBOL2 C=BLACK V=NONE Konfidenzgrenzen; I=NONE H=1; * Meßpunkte; I=RLCLM95 L=1; * Lin. Regression + 95% AXIS1 LABEL=(F=SWISS H=2.0 PCT "Körperlänge [m]") ORDER=1.6 TO 1.9 BY 0.05; AXIS2 LABEL=(F=SWISS H=2.0 PCT "Körpergewicht [kg]"); PROC GPLOT DATA=kurs.kino; PLOT laenge*gewicht=1 laenge*gewicht=2 / VAXIS=AXIS1 HAXIS=AXIS2 OVERLAY REGEQN; FORMAT laenge 5.2; RUN; QUIT; Zusammenhang von Körperlänge und -gewicht Lineare Regression und 95%-Konfidenzbereich für die Mittelwerte Körperlänge [m] 1.90 1.85 1.80 1.75 1.70 1.65 1.60 60 70 80 Körpergewicht [kg] 90 100 Regression Equation: Laenge = 1.563418 + 0.002928*Gewicht Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 104 Prozedurschritt (PROC STEP) Übung 9: Prozeduren 25. Übung 9: Prozeduren 7. Öffnen Sie Ihr Programm "Film2.sas" und ergänzen Sie darin die nachfolgenden Prozedurschritte. Speichern Sie das so veränderte Programm und lassen Sie es ablaufen. 8. PROC FORMAT Definieren Sie vor dem Datenschritt die drei in den Kursunterlagen als Beispiele genannten Ausgabeformate "WTAGFMT", "SEXFMT" und "ALTERFMT" als permanente Formate und verknüpfen Sie die entsprechenden Variablen damit. (Der Quellcode dazu befindet sich in der Datei "BenutzerdefinierteFormate.sas") 9. PROC SORT, PROC PRINT Erstellen Sie eine Liste aller Schauspieler, in der Frauen und Männer getrennt jeweils nach Alter sortiert erscheinen. Die Liste soll ausschließlich Name, Geburtsdatum, Alter in ganzen Jahren, den Wochentag der Geburt, sowie Körpergewicht und -länge und den zugehörigen Index enthalten. Zur besseren Gestaltung können Sie Labels für die Variablennamen verwenden. 10. PROC FREQ Wie ist die Altersverteilung unter den Schauspielern bezogen auf die oben genannte Klasseneinteilung? Wie viele Frauen und Männer fallen in die jeweiligen Altersklassen? Gibt es bei Frauen und Männern bevorzugte Wochentage ihrer Geburt? Wie ist die Verteilung der Geburtsmonate? (Suchen Sie ein geeignetes Format für das Geburtsdatum) 11. PROC MEANS, PROC UNIVARIATE Wie unterscheidet sich die Altersverteilung bei Frauen und Männern? Sind anhand der vorliegenden Daten Unterschiede hinsichtlich Körperlänge und Körpergewicht zwischen Frauen und Männern erkennbar? 12. (optional) Suchen Sie im Handbuch und in der Online-Hilfe des SAS Systems die Syntax der Prozedur PRINT. 13. (optional) Machen Sie sich ein Bild von der Gehaltsverteilung in der Tabelle SALARY aus dem Verzeichnis !SASROOT\CORE\SAMPLE. Definieren Sie dazu eine Libref "Beispiel", welche auf dieses Verzeichnis verweist. Wie groß ist das Durchschnittsgehalt, das kleinste bzw. größte Gehalt? Wie groß ist die Standardabweichung? 14. (optional) Untersuchen Sie die Gehaltsverteilung nach Tätigkeitsbereichen (Variable JOBCODE). Verknüpfen Sie dazu die Tabelle BEISPIEL.SALARY mit der Tabelle BEISPIEL.JOBCODES über die Variable JOBCODE, um für die Codenummern eine aussagekräftige die Tätigkeitsbezeichnung (TITLE) zu erhalten. Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 105 Links Übung 9: Prozeduren Links • SAS Institute Inc., Cary, North Carolina, USA http://www.sas.com • SAS-Anwenderhandbuch im Netz (SAS-Ah) http://web.urz.uni-heidelberg.de/statistik/sas-ah • Akademie der Ruhr-Universität gGmbH mit dem Zentrum Biometrie http://www.akademie.ruhr-uni-bochum.de • Ruhr-Universität Bochum mit Links zur Stadt http://www.ruhr-uni-bochum.de Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 106 Lösungsvorschläge Übung 9: Prozeduren Lösungsvorschläge Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 107 Lösungsvorschläge Übung 9: Prozeduren Übung 2.1 (Gültige SAS Namen) frauen männer ERGEBNIS erg1 erg_1 BlutWert1 blutw.1 a 1a a1 test-1 leukos op1_rr5 hämophil 1.wert alle a_b_c_d a/b lösung_1 messwert rr001 rr100 _Z_ ___ _test Übung 2.2 – 2.6 (Ein erstes SAS Programm) * Programmdateiname: Übung1_EinErstesSASProgramm.sas Übung 1, SAS-Kurs für Anfänger, Stürzl/01.01.01 ; TITLE1 "Mein erstes SAS Programm"; TITLE2 "Stürzl/Übung1_EinErstesSASProgramm.sas"; DATA neu; x=100; y=2*x; z=MEAN(OF x y); * Mittelwert aus den Variablen x und y; text1="Hallo! "; text2=text1||text1; OUTPUT; x=200; y=2*x; z=MEAN(OF x y); * Mittelwert aus den Variablen x und y; text1="Hallo! "; text2=text1||text1; OUTPUT; RUN; PROC PRINT DATA=neu; RUN; Übung 2.7 (Umrechnungstabelle DM in Euro) * Programmdateiname: Übung2_DMinEuro.sas Übung 2, SAS-Kurs für Anfänger, Stürzl/01.01.01 ; TITLE1 "Umrechnungstabelle DM in Euro"; TITLE2 "Stürzl/Übung2_DMinEuro.sas"; FOOTNOTE1 ; DATA eurotab; DO DM=1 TO 20; Euro=DM/1.95583; OUTPUT; END; RUN; PROC PRINT DATA=eurotab; VAR Euro DM; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 108 Lösungsvorschläge Übung 9: Prozeduren Übung 6.3 (Syntaxfehler und logische Fehler) DATA kino; INFILE "C:\SASKURS\SchauspielerDaten.txt"; INPUT Vorname:$12. Nachname:$12. GebDatum:DDMMYY8.; Alter=(TODAY() – GebDat)/365.25; RUN; PROC PRINT DATA=kurs.kino; RUN; Syntaxfehler (4) Logische Fehler (3) Übung 6.5 und 6.6 (Datentypkonvertierung) * Programmdateiname: Übung6_Datentypkonvertierung.sas Übung 6, SAS Programmierung für Anfänger, Stürzl/26.06.02 ; OPTIONS DTRESET DATE NUMBER PAGENO=1 MSGLEVEL=I; TITLE1 "Übung 6.5: Datentypkonvertierung: numerisch -> alphanumerisch"; TITLE2 "Stürzl/Übung6_Datentypkonvertierung.sas"; FOOTNOTE1; DATA num2char; sex=1; e=2.718; jetzt=TIME(); sexC=PUT(sex, 1.); eC=PUT(e, best.); jetztC=PUT(jetzt, TIME5.); AlleC=sexC||eC||jetztC; * Variablen können führende Blanks enthalten!; PUT _ALL_; RUN; PROC CONTENTS DATA=num2char varnum; RUN; TITLE1 "Übung 6.6: Datentypkonvertierung: alphanumerisch -> numerisch"; TITLE2 "Stürzl/Übung6_Datentypkonvertierung.sas"; DATA char2num; Datum1C="12/05/02"; Datum2C="12-05-2002"; Datum1 =INPUT(Datum1C, DDMMYY8.); * Andere Informate wären möglich, wie z.B. MMDDYY, YYMMDD; Datum2 =INPUT(Datum2C, DDMMYY10.); * Andere Informate wären möglich, wie z.B. MMDDYY; FORMAT Datum1-Datum2 DATE9.; PUT _ALL_; RUN; PROC CONTENTS DATA=char2num varnum; RUN; * Die in Übung 6.5 erzeugten Charactervariablen in numerische Variablen zurückverwandeln; DATA char2num; SET num2char; sex2=INPUT(sexC, 1.); e2=INPUT(eC, best.); jetzt2=INPUT(jetztC, time5.); PUT _ALL_; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 109 Lösungsvorschläge Übung 9: Prozeduren Übung 7 (ASCII-Datei einlesen) * Programmdateiname: Übung7_ASCII_Import.sas SAS-Kurs für Anfänger, Stürzl/04.12.01 Übung 7: Daten aus ASCII Datei einlesen, Beispiel Luftmesswerte; OPTIONS DTRESET DATE NUMBER PAGENO=1 MSGLEVEL=I; TITLE1 "Übung 7: Daten aus ASCII Datei einlesen"; TITLE2 "Stürzl/Übung7_ASCII_Import.sas"; DATA WORK.Luftmesswerte1; INFILE 'C:\SASKURS\Luftmesswerte_Frankfurt_Aug01.txt' DLM=';' FIRSTOBS=2; INPUT Datum:DDMMYY10. Uhrzeit:TIME5. Ozon RelLuftfeuchte:COMMAX. Windrichtung Stickstoffdioxid Luftdruck Schwefeldioxid Temperatur:COMMAX.; FORMAT Datum DATE9. Uhrzeit TIME5.; RUN; PROC PRINT DATA=Luftmesswerte1; RUN; * Alternative: Einlesen mit Hilfe des Import Wizards (File -> Import Data..., Standard data source (Delimited File *.*) Der nachfolgende Programmcode wurde automatisch aufgezeichnet und an verschiedenen Stellen nachträglich manuell korrigiert; /********************************************************************** * PRODUCT: SAS * VERSION: 8.2 * CREATOR: External File Interface * DATE: 06SEP01 * DESC: Generated SAS Datastep Code * TEMPLATE SOURCE: (None Specified.) ***********************************************************************/ data WORK.Luftmesswerte2 ; %let _EFIERR_ = 0; /* set the ERROR detection macro variable */ infile 'C:\SASKURS\Luftmesswerte_Frankfurt_Aug01.txt' delimiter = ';' MISSOVER DSD lrecl=32767 firstobs=2 ; informat Datum DDMMYY10. ; * manuell korrigiert; informat Uhrzeit TIME5. ; * manuell korrigiert; informat Ozon best32. ; informat RelLuftfeuchte commaX32. ; * manuell korrigiert; informat Windrichtung best32. ; informat Stickstoffdioxid best32. ; informat Luftdruck best32. ; informat Schwefeldioxid best32. ; * manuell korrigiert; informat Temperatur commaX32. ; * manuell korrigiert; format Datum DATE7. ; * manuell korrigiert; format Uhrzeit TIME5. ; * manuell korrigiert; format Ozon best12. ; format RelLuftfeuchte best12. ; * manuell korrigiert; format Windrichtung best12. ; format Stickstoffdioxid best12. ; format Luftdruck best12. ; format Schwefeldioxid best12. ; format Temperatur best12. ; * manuell korrigiert; input Datum Uhrzeit Ozon RelLuftfeuchte Windrichtung Stickstoffdioxid Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 110 Lösungsvorschläge Übung 9: Prozeduren Luftdruck Schwefeldioxid Temperatur ; if _ERROR_ then call symput('_EFIERR_',1); variable */ run; /* set ERROR detection macro PROC PRINT DATA=Luftmesswerte2; RUN; Übung 8 (Tabellen verknüpfen, Neue Tabellen erstellen, Tabellenoptionen) * Programmdateiname: Übung8_Film3.sas SAS-Kurs für Anfänger, Stürzl/01.01.01 Übung 8: Tabellen verknüpfen, neue Tabellen erstellen SET, MERGE, Tabellenoptionen OPTIONS DTREST DATE NUMBER PAGENO=1 MSGLEVEL=I; LIBNAME kurs "C:\SASkurs"; * Verzeichnis zum Speichern von permanenten SAS Tabellen (data sets); TITLE1; TITLE2 "Filmschauspieler"; TITLE3 "Stürzl/Übung8_film3.sas"; *** Übung 8.2 ***; /* DATA kurs.maenner; SET kurs.kino; WHERE sex="1"; RUN; DATA kurs.frauen; SET kurs.kino (WHERE=(sex="2")); ; RUN; */ DATA kurs.frauen SET kurs.kino; kurs.maenner; IF sex="1" THEN OUTPUT kurs.maenner; ELSE IF sex="2" THEN OUTPUT kurs.frauen ; RUN; TITLE3 "Übung 8.2 Weibliche Schauspieler"; PROC PRINT DATA=kurs.frauen LABEL; RUN; TITLE3 "Übung 8.2 Männliche Schauspieler"; PROC PRINT DATA=kurs.maenner LABEL; RUN; *** Übung 8.3 ***; DATA kurs.namen (KEEP= name: vorname nachname idnr) kurs.werte (DROP= name: vorname nachname); IDNr=_n_+1000; * Identifizierungsvariable; SET kurs.kino; RUN; TITLE3 "Übung 8.3 Namen"; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 111 Lösungsvorschläge Übung 9: Prozeduren PROC PRINT DATA=kurs.namen; RUN; TITLE3 "Übung 8.3 Anonymisierte Daten"; PROC PRINT DATA=kurs.werte; RUN; *** Übung 8.4 ***; DATA alle; SET kurs.frauen kurs.maenner; RUN; TITLE3 "Übung 8.4 Frauen + Männer"; PROC PRINT DATA=alle; RUN; *** Übung 8.5 ***; PROC SORT DATA=kurs.frauen ; BY alter; RUN; PROC SORT DATA=kurs.maenner; BY alter; RUN; DATA alle; SET kurs.frauen kurs.maenner; BY alter; RUN; TITLE3 "Übung 8.5 Frauen + Männer nach Alter sortiert"; PROC PRINT DATA=alle; RUN; *** Übung 8.6 ***; PROC SORT DATA=kurs.namen; BY idnr; RUN; PROC SORT DATA=kurs.werte; BY idnr; RUN; DATA total; MERGE kurs.namen kurs.werte; BY idnr; RUN; TITLE3 "Übung 8.6 Namen + anonyme Werte zusammengeführt"; PROC PRINT DATA=total; RUN; Übung 3, 5, 6, 9 (Schauspielerdaten) * Programmdateiname: Übung3,5,6,9_Film2.sas Einführungsbeispiel im SAS-Kurs für Anfänger, Stürzl/01.01.01 18.06.02 Übung 3, 5, 6, 9 zu Formaten und Funktionen, sowie zu PROC FORMAT, SORT, PRINT, FREQ, MEANS, UNIVARIATE Nachname in voller Länge, Name mit genau einem Leerzeichen, YEARCUTOFF=1900, Wochentag der Geburt, Geburtsdatum, Alter, BMI, Index formatiert, Labels; OPTIONS DTRESET DATE NUMBER PAGENO=1 MSGLEVEL=I; OPTIONS FMTSEARCH=(kurs WORK); * Zum Wiederfinden selbstdefinierter permanenter Formate; OPTIONS YEARCUTOFF=1900; * zum korrekten Einlesen von zweistelligen Jahreszahlen im Bereich 1900 - 1999; LIBNAME kurs "F:\SASkurs"; * Verzeichnis zum Speichern von permanenten SAS Tabellen (data sets); TITLE1; TITLE2 "Filmschauspieler"; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 112 Lösungsvorschläge Übung 9: Prozeduren TITLE3 "Stürzl/Übung3,5,6,9_Film2.sas"; PROC FORMAT LIB=kurs; * Formate permanent speichern; * Format für numerische Variable; VALUE wtagfmt 1="Sonntag" 2="Montag" 3="Dienstag" 4="Mittwoch" 5="Donnerstag" 6="Freitag" 7="Samstag"; * Format für alphanumerische Variable; VALUE $sexfmt "1"="männlich" "2"="weiblich"; * Bereichsformatierung; VALUE alterfmt 0-<20 ="unter 20 Jahre" 20-<40 ="unter 40 Jahre" 40-<60 ="unter 60 Jahre" 60-<80 ="unter 80 Jahre" 80-high="über 80 Jahre"; RUN; DATA kurs.kino; LENGTH Name $25 Name1 Name2 $12; INFILE DATALINES; * Rohdaten in Variablen einlesen; INPUT Vorname $ Nachname:$12. Gewicht:COMMAX5.1; GebDatum:DDMMYY8. Sex:$1. Laenge * zusätzliche Variablen erzeugen; Name=COMPBL(vorname||" "||nachname); * genau ein Blank zwischen Vor- und Nachname; name1=SCAN(name, 1); name2=SCAN(name, 2); Alter=FLOOR((INTCK('MONTH', gebdatum, TODAY()) - (DAY(TODAY()) < DAY(gebdatum)) )/12); * ganzzahlig korrekt; * Alter=(TODAY()-gebdatum)/365.25; * Alter in mittleren Jahren; Index=gewicht/((laenge-1)*100); * BROCA-Index (Verhältniszahl von Gewicht zu Körperlänge); BMI=gewicht/(laenge**2); * Body Mass Index (Normbereich: 19-24 kg/m²); Wochentag=WEEKDAY(gebdatum); * Wochentag der Geburt; FORMAT gebdatum DATE9. alter 3. index bmi 5.1; FORMAT wochentag wtagfmt. sex $sexfmt. alter 3.; LABEL gewicht ="Körper-*gewicht [kg]" laenge ="Körper-*länge [m]" bmi ="Body Mass*Index [kg/m²]" gebdatum ="Geburtstag" wochentag="Geboren am" ; * Körperlänge und -gewicht der Schauspieler sind DATALINES; Benno Fürmann 17.01.71 1 1.85 Dustin Hoffmann 08.08.37 1 1.64 Franka Potente 22.07.74 2 1.74 Gérard Depardieu 27.12.48 1 1.85 Götz George 23.07.38 1 1.88 Marianne Sägebrecht 27.08.45 2 1.72 Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 frei erfunden; 79,0 64,0 62,0 95,0 90,5 96,5 113 Lösungsvorschläge Marlene Pierce Robert Senta Til Veronica RUN; Übung 9: Prozeduren Dietrich Brosnan Redford Berger Schweiger Ferres 27.12.01 16.05.53 18.08.37 13.05.41 19.12.63 10.06.65 2 1 1 2 1 2 1.75 1.84 1.82 1.73 1.85 1.78 64,5 76,0 79,0 69,0 74,0 69,0 *** Übung 9.3 ***; TITLE2 "Männer und Frauen jeweils nach Alter sortiert"; PROC SORT DATA=kurs.kino; BY sex alter; RUN; PROC PRINT DATA=kurs.kino LABEL UNIFORM SPLIT="*"; VAR alter name gebdatum wochentag laenge gewicht index bmi; FORMAT alter 3.; BY sex; ID sex; RUN; *** Übung 9.4 ***; TITLE2 "Geburtsmonate, Altersklassen und Wochentage der Geburt für Männer und Frauen"; PROC FREQ DATA=kurs.kino ; TABLES gebdatum alter; TABLES alter*sex; * / nopercent norow nocol; TABLES wochentag*sex; * / nopercent norow nocol; FORMAT gebdatum MONNAME. alter alterfmt.; RUN; *** Übung 9.5 ***; TITLE2 "Unterschiede zwischen Männern und Frauen hinsichtlich Alter, Größe und Gewicht"; PROC MEANS DATA=kurs.kino MAXDEC=1 FW=7 N MIN MAX MEAN STD CLM ; VAR alter laenge gewicht bmi; CLASS sex; RUN; PROC UNIVARIATE DATA=kurs.kino PLOT NORMAL; VAR alter laenge gewicht bmi; BY sex; RUN; PROC PLOT DATA=kurs.kino; PLOT laenge*gewicht=sex; RUN; PROC TTEST DATA=kurs.kino; VAR alter laenge gewicht bmi; CLASS sex; RUN; *** Übung 9.7 + 9.8 ***; LIBNAME beispiel "!SASROOT\CORE\SAMPLE"; TITLE1; TITLE2 "Gehaltsverteilung nach Tätigkeitsbereichen"; * temporäre sortierte Kopien erstellen; PROC SORT DATA=beispiel.salary OUT=salary; BY jobcode; RUN; PROC SORT DATA=beispiel.jobcodes OUT=jobcodes; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 114 Lösungsvorschläge Übung 9: Prozeduren BY jobcode; RUN; DATA gehalt; MERGE salary jobcodes; BY jobcode; RUN; PROC UNIVARIATE DATA=gehalt; VAR salary; RUN; PROC MEANS DATA=gehalt; VAR salary; CLASS title; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 115 Lösungsvorschläge Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 Übung 9: Prozeduren 116 Interaktive Einführung Übung 9: Prozeduren Interaktive Einführung Anwendungsbeispiel 1: Körperlänge zufälliger Probanden /*--------------------------------------------------------------------------SAS Programm: Beispiel1 Tutorium.sas ----------------------------------------------------------------------------erstellt am: 2010-09-14 von: Heinrich Stürzl Zweck: Tutorium der KSFE 2011 in Heidelberg Einführung in das Programmieren mit Base SAS an Hand praktischer Beispiele aus dem Bereich Medizin. Themen: Benutzeroberfläche, SAS Programm, Datenschritt (DATA STEP), Basis Prozeduren (PROC STEP), SAS Tabelle (data set), Bibliothekskonzept, ODS Anwendungsbeispiel 1: Körperlänge zufälliger Probanden nach Geschlecht (n=30) Daten aus: Graf, Ortseifen, Statistische und grafische Datenanalyse mit SAS, Spektrum Akad. Verl., 1995, S. 85 ---------------------------------------------------------------------------*/ TITLE1 "KSFE 2011 Tutorium: Einführung in das Programmieren mit Base SAS"; TITLE3 "Körperlänge zufälliger Probanden nach Geschlecht (n=30)"; DATA maenner; Sex="m"; INPUT Laenge ; DATALINES; 161 177 171 168 172 165 174 164 170 180 168 175 178 166 170 177 RUN; * Einfache deskriptive Statistiken; PROC MEANS DATA=maenner; RUN; * Umfangreiche deskriptive Statistiken, Test auf Normalverteilung, Histogramm; PROC UNIVARIATE DATA=maenner NORMAL; HISTOGRAM; RUN; DATA frauen; Sex="w"; INPUT Laenge ; DATALINES; 155 176 159 169 165 166 163 173 172 162 169 165 167 168 RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 117 Interaktive Einführung Übung 9: Prozeduren DATA alle; SET maenner frauen; RUN; * By-Gruppen Verarbeitung; PROC MEANS DATA=alle; BY Sex; RUN; PROC UNIVARIATE DATA=alle NORMAL; HISTOGRAM; BY Sex; RUN; * Häufigkeitstabellen; PROC FREQ DATA=alle; RUN; * Kreuztabellen; PROC FREQ DATA=alle; TABLES Laenge*Sex; TABLES Laenge*Sex / nopercent norow nocol; * nur absolute Häufikeit; RUN; * Selbstdefinierte Klassen durch benutzerdefiniertes Ausgabeformat; PROC FORMAT; * numerisches Ausgabeformat; VALUE LaengeCmFmt LOW-160 = "< 160 cm" 160-<170 = "< 170 cm" 170-<180 = "< 180 cm" 180-HIGH = ">=180 cm" ; * alphanumerisches Ausgabeformat; VALUE $SexFmt "m" = "männlich" "w" = "weiblich" ; RUN; PROC FREQ DATA=alle; TABLES Laenge*Sex ; FORMAT Laenge LaengeCmFmt. Sex $SexFmt.; * Anwendung des selbstdefinierten Ausgabeformats; RUN; * Daten erweitern; DATA alle; SET alle; * Neue Variablen hinzufügen; Laenge2=Laenge/100; * Körperlänge in m; Nummer=_N_; * fortlaufende Nummerierung der Datensätze; IF .<laenge<=170 THEN Gruppe="Eins"; * Bedingte Wertezuweisung; ELSE IF laenge> 170 THEN Gruppe="Zwei"; * Label für Variablen; LABEL Laenge = "Körperlänge in cm" Laenge2 = "Körperlänge in m" ; RUN; * Datenliste; PROC PRINT DATA=alle; BY Sex; RUN; * MERGE: Daten zu jeder Beobachtung hinzufügen (neue Variable). Beispiel: Den Mittelwert pro Geschlecht hinzufügen; * Mittelwert pro Geschlecht berechnen und als Tabelle speichern; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 118 Interaktive Einführung Übung 9: Prozeduren PROC MEANS DATA=alle; VAR Laenge; BY Sex; OUTPUT OUT=stat1 MEAN= / AUTONAME; RUN; DATA alle2; MERGE alle stat1; BY Sex; * Differenz zum Mittelwert; Differenz=Laenge - Laenge_Mean; LABEL Laenge_Mean = "Mittelwert in cm" Differenz = "Differenz zum Mittelwert in cm" ; RUN; * Tabellenstruktur anzeigen/dokumentieren; PROC CONTENTS DATA=alle2 VARNUM; * Nach Variablennummer geordnet; RUN; * Daten sortieren; PROC SORT DATA=alle2; * Achtung: überschreibt die Tabelle!; BY Sex Gruppe Laenge; * Nach Gruppe und darin nach Geschlecht und darin nach Länge jeweils aufsteigend sortieren; RUN; * Datenausgabe mit HTML, RTF oder PDF Format (ODS = Output Delivery System); ODS HTML FILE="C:\temp\Ausgabe1.HTML"; * Öffnen der Ausgabedatei; ODS RTF FILE="C:\temp\Ausgabe1.RTF"; * Öffnen der Ausgabedatei; ODS PDF FILE="C:\temp\Ausgabe1.PDF"; * Öffnen der Ausgabedatei; * Datenliste mit Labels; PROC PRINT DATA=alle2 LABEL; VAR Nummer Laenge Laenge2 Laenge_Mean Differenz; BY Sex Gruppe; ID Sex Gruppe; FORMAT Sex $Sexfmt.; RUN; PROC FREQ DATA=alle; TABLES Laenge*Sex ; FORMAT Laenge LaengeCmFmt. Sex $SexFmt.; * Anwendung des selbstdefinierten Ausgabeformats; RUN; PROC MEANS DATA=alle2 N MIN MEAN MEDIAN MAX STD; VAR Laenge Laenge2 Differenz; BY Sex; FORMAT Sex $Sexfmt.; RUN; PROC UNIVARIATE DATA=alle NORMAL; VAR Laenge; HISTOGRAM Laenge; CLASS Sex; * Histogramm beider Geschlechter in einer Grafik nebeneinander; FORMAT Sex $Sexfmt.; RUN; ODS PDF CLOSE; * Schließen der Ausgabedatei; ODS RTF CLOSE; * Schließen der Ausgabedatei; ODS HTML CLOSE; * Schließen der Ausgabedatei; * Datentabelle permanent speichern; libname Projekt1 "C:\temp"; * SAS Bibliothek definieren (Link auf einen existierenden Ordner/Verzeichnis); * Sämtliche Observations (Datenzeilen) von 'work.alle2' lesen und in 'Projekt1.alle2' schreiben; data Projekt1.alle2; set alle2; * Tabellenname 'alle2' ist die Kurzform für 'work.alle2'; run; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 119 Interaktive Einführung Übung 9: Prozeduren Anwendungsbeispiel 2: Alter, Körperlänge und Gewicht fiktiver Schüler (SASHELP.CLASS) /*--------------------------------------------------------------------------SAS Programm: Beispiel2 Tutorium.sas ----------------------------------------------------------------------------erstellt am: 2010-09-21 von: Heinrich Stürzl Zweck: Tutorium der KSFE 2011 in Heidelberg Einführung in das Programmieren mit Base SAS an Hand praktischer Beispiele aus dem Bereich Medizin. Themen: Benutzeroberfläche, SAS Programm, Datenschritt (DATA STEP), Basis Prozeduren (PROC STEP), SAS Tabelle (data set), Bibliothekskonzept, ODS Anwendungsbeispiel 2: SASHELP.CLASS Alter, Körperlänge, Körpergewicht fiktiver Schüler nach Geschlecht (n=19). ---------------------------------------------------------------------------*/ TITLE1 "KSFE 2011 Tutorium: Einführung in das Programmieren mit Base SAS"; TITLE3 "Alter, Körperlänge, Körpergewicht fiktiver Schüler nach Geschlecht (n=19)"; DATA klasse; SET SASHELP.class; * Alle Observations (Datenzeilen) der Tabelle 'class' der Bibliothek 'sashelp' lesen; * weitere Variablen bilden; Laenge=height*2.54/100; * Umrechnung inch in m; Gewicht=weight*0.45359237; * Umrechnung lbs in kg; BMI=gewicht/Laenge**2; * Body Mass Index; LABEL Laenge Gewicht BMI age ; RUN; = = = = "Körperlänge in m" "Körpergewicht in kg" "Body Mass Index in kg/m²" "Alter in Jahren" * Einfache deskriptive Statistiken; PROC MEANS DATA=klasse N MIN MEAN MEDIAN MAX STD CV MAXDEC=2; * 2 Nachkommastellen (decimals); RUN; * Umfangreiche deskriptive Statistiken, Test auf Normalverteilung, Histogramm; PROC UNIVARIATE DATA=klasse NORMAL; VAR age laenge gewicht bmi; /* HISTOGRAM;*/ RUN; * Daten sortieren; PROC SORT DATA=klasse; * Achtung: überschreibt die Tabelle!; BY Sex Age; * Nach Geschlecht aufsteigend und darin nach Alter aufsteigend sortieren; RUN; * By-Gruppen Verarbeitung; PROC MEANS DATA=klasse ; BY Sex; RUN; PROC UNIVARIATE DATA=klasse NORMAL; HISTOGRAM; BY Sex; RUN; * Häufigkeitstabellen; PROC FREQ DATA=klasse; TABLES Sex Age Laenge Gewicht BMI; FORMAT BMI 2.; * ganzzahlige BMI Klassen durch Rundung z.B. 19.5-20.4999 => 20; RUN; * Kreuztabellen; PROC FREQ DATA=klasse; TABLES Age*Sex; TABLES Age*Sex / nopercent norow nocol; * nur absolute Häufikeit; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 120 Interaktive Einführung Übung 9: Prozeduren RUN; * Selbstdefinierte Klassen durch benutzerdefiniertes Ausgabeformat; PROC FORMAT; * numerisches Ausgabeformat; VALUE LaengeMFmt LOW-1.60 = "< 1.60 m" 1.60-<1.70 = "< 1.70 m" 1.70-<1.80 = "< 1.80 m" 1.80-HIGH = ">=1.80 m" ; * alphanumerisches Ausgabeformat; VALUE $SexFmt "M","m" = "männlich" "F","w" = "weiblich" ; RUN; PROC FREQ DATA=klasse; TABLES Age*Sex / nopercent norow nocol; * nur absolute Häufikeit; TABLES Laenge*Sex ; FORMAT Laenge LaengeMFmt. Sex $SexFmt.; * Anwendung des selbstdefinierten Ausgabeformats; RUN; * Datenliste; PROC PRINT DATA=klasse ; BY Sex; RUN; * Datenliste mit Labels; PROC PRINT DATA=klasse LABEL UNIFORM; VAR Name Age Laenge Gewicht BMI; BY Sex; ID Sex; FORMAT Sex $Sexfmt.; FORMAT Laenge 5.2 Gewicht BMI 5.1; * Auf 2 bzw. 1 Nachkommastelle gerundet ausgeben; RUN; * Tabellenstruktur anzeigen/dokumentieren; PROC CONTENTS DATA=klasse VARNUM; * Nach Variablennummer geordnet; RUN; * Punktwolken Grafik; SYMBOL1 V=TRIANGLE C=BLUE H=2.0 I=NONE; SYMBOL2 V=DOT C=RED H=2.0 I=NONE; PROC GPLOT DATA=klasse ; PLOT (Laenge Gewicht BMI)*age=sex; /* BY Sex; */ FORMAT Sex $Sexfmt.; RUN; QUIT; SYMBOL1 V=TRIANGLE C=BLUE H=2.0 I=RL; * Lineare Regressionsgerade (RL=regression line); SYMBOL2 V=DOT C=RED H=2.0 I=RL; * Lineare Regressionsgerade (RL=regression line); PROC GPLOT DATA=klasse ; PLOT Laenge*age=sex / REGEQN; FORMAT Sex $Sexfmt. Laenge 5.2; RUN; QUIT; * Datenausgabe mit HTML, RTF oder PDF Format (ODS = Output Delivery System); ODS HTML FILE="C:\temp\Ausgabe1.HTML"; * Öffnen der Ausgabedatei; ODS RTF FILE="C:\temp\Ausgabe1.RTF"; * Öffnen der Ausgabedatei; ODS PDF FILE="C:\temp\Ausgabe1.PDF"; * Öffnen der Ausgabedatei; * Datenliste mit Labels; PROC PRINT DATA=klasse LABEL UNIFORM; VAR Name Age Laenge Gewicht BMI; BY Sex; ID Sex; FORMAT Sex $Sexfmt.; FORMAT Laenge 5.2 Gewicht BMI 5.1; * Auf 2 bzw. 1 Nachkommastelle gerundet ausgeben; RUN; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 121 Interaktive Einführung Übung 9: Prozeduren PROC FREQ DATA=klasse; TABLES Age*Sex; FORMAT Sex $Sexfmt.; RUN; PROC MEANS DATA=klasse N MIN MEAN MEDIAN MAX STD CV; VAR Age Laenge Gewicht BMI; BY Sex; FORMAT Sex $Sexfmt.; RUN; PROC GPLOT DATA=klasse ; PLOT Laenge*age=sex / REGEQN; FORMAT Sex $Sexfmt. Laenge 5.2; RUN; QUIT; ODS PDF CLOSE; * Schließen der Ausgabedatei; ODS RTF CLOSE; * Schließen der Ausgabedatei; ODS HTML CLOSE; * Schließen der Ausgabedatei; * Datentabelle permanent speichern; libname Projekt1 "C:\temp"; * SAS Bibliothek definieren (Link auf einen existierenden Ordner/Verzeichnis); * Sämtliche Observations (Datenzeilen) von 'work.klasse' lesen und in 'Projekt1.klasse' schreiben; data Projekt1.klasse; set klasse; * Tabellenname 'klasse' ist die Kurzform für 'work.klasse'; run; Stürzl, Einführung in das Programmieren mit Base SAS unter Windows, Februar 2011 122