Einführung in das Programmieren mit Base SAS unter - SAS-Wiki

Werbung
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
Herunterladen