Rohdateneingabe über einen DATA-Step

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Ein DATA-Step ist die einfachste Möglichkeit, eine SAS-Datei zu erzeugen, und wird deshalb auch in den meisten Fällen von den Anwendern hierzu benutzt. Ein großer Vorteil dieser Vorgehensweise liegt auch darin, daß der Anwender die Daten einschließlich Data-Step sich auf Diskette übertragen, mit nach Hause nehmen und dort mit einem normalen Editor ergänzen oder verbessern kann, ohne daß er auf dem Rechner zu Hause das SAS-System installiert hat. Wir gehen zunächst davon aus, daß die Daten nur in Form von handschriftlichen Notizen vorliegen, etwa auf einem gut strukturierten Datenbogen, der dann leicht in die Form einer Rechteckstruktur umgewandelt werden kann. Die einfachste Grundstruktur eines DATA-Steps besteht aus folgenden Elementen

DATA name ; 
INPUT ..... ; 
CARDS ; 
. . . . . 
. . . . . Daten oder 
. . . . . Zahlenwerte der Variablen . . . . 
. . . . . 
RUN ;

die im Programm-Fenster eingegeben werden. Das RUN-Statement markiert dabei das Ende der Daten sowie des DATA-Steps (und auch eines PROC-Steps!). Das CARDS-Statement zeigt den Beginn der Daten an. In den Daten darf dabei kein Semikolon vorkommen, da dies auch das Ende der Daten anzeigt. Die anderen Schlüsselworte sowie einige weitere Elemente eines DATA-Steps werden in den nachfolgenden Abschnitten erläutert. Wie man sich leicht vorstellen kann wird diese Form der Dateneingabe (SAS-Datei-Erzeugung) schnell unübersichtlich, wenn man viele Variablen und / oder viele Beobachtungen auswerten will. In diesen Fällen sei auf die Vorgehensweisen in den Abschnitten 3.1 oder 3.2 verwiesen. Ein Vorteil ist, daß man die SAS-Statements des DATA-Steps sowie die das Auflisten der Daten nach CARDS auf einem beliebigen Computer mit Hilfe eines normalen Text-Editors vornehmen, auf Diskette oder einen anderen Datenträger abspeichern und verschicken bzw. mit File-Transfer verschieben kann. Das SAS-System ist bis zu diesem Schritt nicht notwendig. Ein DATA-Step bietet sehr viele Möglichkeiten Daten abzuspeichern, zu verändern oder zu ergänzen. Alle Varianten können aber hier nicht behandelt werden. Vielmehr soll im folgenden nur einige wenige Grundschritte erläutert werden.

DATA-Statement, temoräre und permanente Dateien, Bibliotheken (LIBNAME)

In obigem Beispiel der Grundstruktur eines DATA-Steps bezeichnet DATA das Schlüsselwort, das den Beginn eines DATA-Steps anzeigt. „name“ ist der Name der SAS-Datei, die erzeugt werden soll, und muß ein gültiger SAS-Name sein. Man unterscheidet zwei Arten von SAS-Dateien:

  • temporäre und
  • permanente SAS-Dateien.

Während temoräre Dateien sich durch einen einstufigen Namen auszeichnen, wie z.B.

DATA bsp1 ; 
DATA studie_a ;

sind die Namen permanenter SAS-Dateien zweistufig, z.B.

DATA studien.j_1996 ; 
DATA uebung.ss96 ;

Im zweistufigen Dateinamen wird vor dem Punkt „.“ die Bibliothek bezeichnet, in der die Datendatei abgelegt werden soll und nach dem Punkt der Dateiname angegeben. Die Namen bsp1, studie_a, j_1996 oder ss96 bezeichnen also jeweils die SAS-Dateinamen und die Namen studien bzw. uebung den der jeweiligen Bibliothek, in die die Datei abgespeichert werden soll. Die Bibliothek, in die die temorären Dateien abgelegt werden, wird im SAS-System mit WORK bezeichnet. Ihr Inhalt steht nach dem Ende einer SAS-Sitzung allerdings nicht mehr zur Verfügung. Die Bibliothek muß dabei schon dem SAS-System bekannt sein. Sie wird am einfachsten über das LIBNAME-Statement vereinbart, was einfach vor dem DATA-Step angegeben wird. Für einen PC-Benutzer sieht das LIBNAME-Statement dann etwa folgendermaßen aus:

LIBNAME  bibname engine 'Verzeichnis'  ;

wobei „bibname“ den Bibliotheksnamen (Referenzname) für den SAS-internen Zugriff und "Verzeichnis" das Unterverzeichnis auf dem Rechner bezeichnet, wo die Datei hingeschrieben werden soll. Das Verzeichnis ist dabei in Hochkomma einzuschließen. Die Bibliothek WORK braucht nicht besonders vereinbart werden, sondern steht bei jeder SAS-Sitzung zur Verfügung. engine bezeichnet die SAS-Version mit der die Datenmenge benutzbar sein soll. Für SAS Vs6.12 unter Windows sind z.B. folgende Schlüsselworte für engine erlaubt: V604, V606, V608, V609, V610 oder V611. Anstelle von V611 kann auch das Schlüsselwort BASE benutzt werden. Die Schlüsselwort XPORT, BMDP, OSIRIS oder SPSS sind für den Zugriff oder die Erstellung auf/von Exportdateien bzw. BMDP-, SPSS oder OSIRIS-Dateien. engine ist vor allem dann wichtig, wenn man SAS-Dateien mit verschiedenen SAS-Versionen benutzen will. Zweckmäßigerweise richtet man sich für seinen Arbeitsplatz standardmäßig verschiedene SAS-Bibliotheken ein, indem man verschiedene LIBNAME-Befehle im autoexec.sas angibt, mit entsprechenden Verweisen auf bestimmte Pfade.

INPUT-Statement

Das INPUT-Statement gibt an, in welcher Reihenfolge die einzelnen Variablen in die Datei eingelesen bzw. welche Zahlenwerte den jeweiligen Variablen zugeordnet werden sollen. Nach dem Schlüsselwort INPUT folgen die genauen Spezifikationen für jede einzulesende Variable in einem Datensatz, und zwar stets zuerst der Variablenname und nachfolgend die Variablenspezifikation, z.B.:

INPUT   var1name var1spez   var2name var2spez   var3name var3spez  . . . . variname varispez . . . .   ;

Das Semikolon schließt das INPUT-Statement ab. Es darf nicht vergessen werden!

Wir unterscheiden zwei Typen von Daten

  • numerische, d.h. es kommen nur Zahlenwerte vor, und
  • alphanumerische, wo auch Buchstaben und bestimmte Sonderzeichen erlaubt sind.

Der Typ einer Variable und auch der Typ der Merkmalsausprägung entscheiden darüber, welche Auswertungsverfahren (SAS-Prozeduren) angewendet werden können.

Es gibt drei wichtige Arten von Spezifikationen einen Datensatz zu beschreiben, wobei natürlich der Datentyp eine wichtige Rolle spielt:

  • Spaltenangaben,
  • freies Format (Listenformat) und
  • formatiert.

Bei der Eingabe im Spaltenformat muß für jede Variable beschrieben werden, in welchem Spaltenbereich sie vom SAS-System zu lesen ist, z.B.

INPUT    name $ 1-10   alter 11-12   groesse 13-15   gew 16-18  . . .   ;

Das $-Zeichen hinter der Variablen name zeigt an, daß diese Variable von Typ alphanumerisch ist, wobei aber bei den Variablenausprägungen Leerzeichen (Blanks) unbefriedigend behandelt werden. Für alphanumerische Variablen besser geeignet ist in einem solchen Fall die weiter unten besprochene formatierte Datenspezifikation "$charw.". Für die Variablen alter und groesse werden zwei bzw. drei Stellen jeweils vom System gelesen. Die Variable Körpergewicht gew wird in diesem Beispiel vom SAS-System so eingelesen, daß es keine Nachkommastellen gibt, das Gewicht also nur in ganzen Zahlen (etwa kg) angegeben ist. Sollen eine oder mehrere Nachkommastellen eingelesen werden, so muß dies spezifiziert werden, eine Nachkommastelle etwa in der Form:

INPUT    . . . . . . .    gew 16-19 .1  . . .   ;

Das Feld für die Variable gew ist jetzt vier Zeichen lang und die letzte Angabe bezeichnet die Nachkommastelle. Mehrere Nachkommastellen werden dann analog mit .2, .3, usw. angezeigt. Für den Fall der Dateneingabe (nicht nur bei wenigen Variablen und wenigen Probanden) ist diese Form der Dateneingabe unpraktisch, da man sich alle Variablen genau an die Spaltenangaben halten muß. Beispiel:. . .

INPUT    name $ 1-10   alter 11-12   groesse 13-15   gew 16-19 .1   . . .   ; 
CARDS ; 
FRITZ_____18185 750 
ANNE_____19175 656 
CAROLINE_21172 681 
. . . .

Praktischer ist das Listen- oder freie Format, bei dem einfach nur die Variablen nacheinander aufgelistet werden. Alphanumerische Variablen werden dabei einfach wieder mit einem $-Zeichen hinter dem Namen gekennzeichnet. Variablenausprägungen mit Nachkommastellen braucht man nur mit einem Dezimalpunkt im Datenlisting aufschreiben. Als Trennzeichen zwischen den Variablen dient lediglich mindestens ein Leerzeichen. Dies impliziert, daß alphanumerische Variablen keine Leerzeichen enthalten dürfen, da dies dann als Trennzeichen zur nächsten Variablen aufgefaßt wird! Beispiel:

. . . 
INPUT    name $    alter    groesse    gew   ; 
CARDS ; 
FRITZ  18  185  75 
ANNE  19  175  65.6 
CAROLINE  21  172  68.1 
. . . .

Zu einem falschen Einlesen des Datensatzes würde folgender Datensatz führen:

CAROL  ANN  21  172  68.1

Die Variablen haben dann folgende Ausprägungen, name = CAROL

alter =. 
groesse =21 
gew =172

und die Variable alter ist mit „fehlender Wert“ (engl. „missing value“) besetzt worden. Am flexibelsten ist die formatierte Eingabe. Hier schreibt man einfach hinter den jeweiligen Variablennamen das dazugehörende Eingabeformat, etwa

INPUT    name $char20.    alter      groesse      gew  4.1  ;

(das Eingabeformat $char20. liest dabei 20 Zeichen lange Zeichenketten identisch ein ohne Leerzeichen zu löschen und das Leerzeichen ist auch kein Trennzeichen!) oder in Form einer Variablenliste gefolgt von der Liste der entsprechenden Formate, jeweils in Klammern gesetzt, z.B.:

INPUT    (name $  vorname $   alter    groesse    gew ) ( 20.  @22 10. 2.  3.  4.1 )   ;

In diesem Beispiel wird im Datensatz der name von den ersten 20 Zeichen gelesen, gefolgt von einem Leerzeichen der vorname max. 10 Zeichen lang, alter zwei Zeichen, groesse drei Zeichen und gew vier Zeichen lang mit einer Nachkommastelle. Das @-Zeichen dient hier zum Positionieren des Einlesepointers des SAS-Systemes. Damit kann man den Pointer beliebig in einem Datensatz positionieren, beispielsweise auch bestimmte Zeichenfolgen mehrmals in einer gewünschten Reihenfolge einlesen. Im Beispiel bewirkt die Angabe des Pointers, daß zwischen name und vorname stets ein Zeichen überlesen wird (es sollte also nach dem Namen stets ein Leerzeichen eingegeben worden sein!). Das SAS-System erlaubt sehr viele Eingabeformate, etwa auch bestimmte Datumsangaben u.ä. Die folgende Tabelle gibt einige wenige nützliche Formate wieder. Für eine ausführliche Dokumentation sei auf die Handbücher von SAS oder die Hilfefunktion verwiesen.

 w. numerisches Format (Standard), 1<= w <= 32 
w.d numerisches Format mit Nachkommastellen (Dezimalpunkt), 1<= w <= 32, 0<= d <= 31  
BZw.d numerisches Format mit Nachkommastellen (Dezimalpunkt), 1<= w <= 32, 0<= d <= 31, Leerzeichen werden als null gelesen 
COMMAw.d numerisches Format mit Nachkommastellen (Dezimalpunkt), 1<= w <= 32, 0<= d <= 31, falls die Zeichen Komma,  Leerzeichen, Dollar- oder Prozentzeichen enthalten sind, werden diese eliminiert 
$w. alphanumerisches Zeichen, 1<= w <= 200 
$charw. alphanumerisches Zeichen, 1<= w <= 200, führende Leerzeichen oder Leerzeichen in der Zeichenfolge bleiben erhalten  
   / Pointer rückt in die nächste Eingabezeile vor 
  + n Pointer rückt um n Zeichen vor 
  @@ Zeilenhalter vor dem abschließenden Semikolon, bewirkt, daß mehrere Datensätze aus einer Eingabezeile gelesen werden. 


Normalerweise wird vom SAS-System erwartet, daß die Variablen eines Datensatzes in einer Zeile geschrieben wurden. Sind die Variablen eines Datensatzes über mehrere Zeilen verteilt, so kann man mit dem Schrägstrich „/“ den Pointer an den Anfang der nächsten Eingabezeile setzen. Dies empfiehlt sich, der Übersichtlichkeit wegen, stets dann, wenn viele Variablen eingelesen werden sollen. Sollen mehrere Datensätze aus einer Zeile erzeugt werden, so muß man dies mit Hilfe des sog. Zeilenhalters „@@“ machen, z.B. erzeugt

DATA  test ; 
INPUT    alter    groesse    gew  4.1   @@  ; 
CARDS ; 
24   185  78.2   25  184  72   21  175  67  18  170  71.5 
RUN ;

eine SAS-Datei test mit vier Datensätzen und den drei Variablen alter, groesse und gew. Alle genannten INPUT-Formate können in einem INPUT-Statement natürlich gemischt benutzt werden, und man kann in einer Datenzeile beliebig „hin und her“ springen.

Das folgende Beispiel faßt noch einmal die wichtigsten Aspekte eines Datenschrittes zusammen.

Beispiel

In einer Studie werden aus Datenschutzgründen die beteiligten Probanden nur mit einer Identifikationsnummer (I-Zahl) erfaßt, die aus einer Kombination von Buchstaben und Zahlen besteht und 13 Zeichen lang sein kann. Daneben wurden eine ganze Reihe die Probanden beschreibenden Variablen erfaßt, wie z.B. Alter (in Jahren), Geschlecht (M/F), Größe (in cm) usw. Für die Datenanalyse relevante Größen waren Variablen wie die verabreichte Dosis, eine Beurteilung des Behandlungserfolges (Stufen: gut (1), mittel (2), schlecht (3), wobei diese genannten Stufen genau definiert wurden), die Zeitdauer bis zur vollständigen Genesung (in Tagen) und der Status des Probanden (1=erholt, 2=krank). Ein Fall besteht aus zwei Datenzeilen, wobei in der ersten Zeile die Variablen erfaßt werden die den Probanden / Population beschreiben und in der zweiten Zeile die Variablen zur eigentlichen Datenanalyse.

Ein entsprechender Datenschritt könnte dann folgendermaßen aussehen:


DATA  studie1 ; 
INPUT    izahl $char13.   alter   geschl $   groesse    gew  4.1  . . . . . 
          /   dosis    erfolg $   zeit    status  . . . . .           ; 
CARDS ; 
COCOSAL140778  24  M  185  78.2   . . . . . 
 25  gut  12  2   . . . . 
ALCOSAL060556  .  F  178  68.2   . . . . . 
 25  schlecht  15  1   . . . . 
MEYEHUB240871  20  F  180  78.5   . . . . . 
 35  maessig  26  .   . . . . 
. . . . 
. . . . 
RUN ; 
PROC PRINT DATA=studie1 ; 
RUN ;

Der nachfolgende Prozedurschritt (SAS-Prozedur PRINT) dient zur Kontrolle, ob auch alle Variablen richtig gelesen wurden. In Fall zwei fehlte im Beispiel der Wert für das Alter und in Fall drei der Wert für den Status des Probanden, und es wurden deshalb „fehlende Werte“ (durch einen Punkt gekennzeichnet) eingegeben.

CARDS-Statement

Das CARDS-Statement zeigt dem SAS-System an, daß die Rohdaten in der gleichen Datei stehen wie das INPUT-Statement. Die Eingabe der Daten direkt im Programmfile ist meist nur bei wenigen Beobachtungen sinnvoll.

RUN-Statement

Das RUN-Statement veranlaßt die Ausführung des davorstehenden Daten- oder auch Prozedur-Steps. Es markiert außerdem das Ende der Daten, wenn ein CARDS-Statement verwendet wurde.