Der SAS-DATA-Step: Teil 4

R. Becker


    

Falls ich Sie mit den vorhergehenden Folgen über den SAS-DATA-Step noch nicht von dessen Flexibilität und Strukturiertheit überzeugen konnte, so will ich mit diesem Artikel einen vorläufig letzten Versuch starten. Diesmal geht es um das flexible Einlesen und Abspeichern von Dateien.

Was bedeutet hier flexibles Einlesen und Abspeichern?

SAS bietet im DATA-Step die Möglichkeit an, Daten aus mehreren Dateien gleichzeitig bzw. aus einer Datei mehrfach zu lesen. Zusätzlich können Daten mit einem Data-Step in verschiedenen Dateien abgespeichert werden. Dies alles läßt sich mit Bedingungen und DO-Schleifen verknüpfen und soll im folgenden anhand von Beispielen dargestellt werden. In diesen Beispielen haben die Statements 'OUTPUT' und 'SET' eine besondere Bedeutung:
Im OUTPUT-Statement können eine oder mehrere Zieldateien angegeben werden und in einem DATA-Step können mehrere OUTPUT-Statements enthalten sein (vgl. [1], S. 447 ff).

Programm 1:

	PROC SORT DATA=eins OUT=zwei;
	  BY grad;
	PROC MEANS DATA=eins MEAN STD N;
	  VAR grad;
	    OUTPUT OUT=md MEAN=m STD=s N=n;
	DATA drei;
	  SET md;
	  -------
	  DO k=1 to n;
	    SET zwei POINT=k;
	    -----------------
	    quant=PROBIT(k/(n+1));
	    twert=s * quant + m;
	    OUTPUT;
	  END; STOP;
	SYMBOL1 V=DOT C=G H=0.3;
	SYMBOL2 V=NONE I=JOIN L=1;
	TITLE1 'Normal-Prob.-Plot';
	PROC GPLOT DATA=data1;
	  PLOT grad*quant=1
	     twert*quant=2 / OVERLAY;
 	RUN; QUIT;

Im SET-Statement können eine oder mehrere Quell-Dateien angegeben werden und es können ebenfalls mehrere SET-Statements in einem DATA-Step enthalten sein. Mit der POINT-Option können spezielle Beobachtungen ausgewählt werden (vgl. [1], S. 484 ff). Ebenso flexibel wie diese beiden o.g. Befehle ist das INPUT-Statement, auf welches im Programm 3 eingegangen wird. Im Unterschied zum SET-Statement werden mit INPUT im allgemeinen ASCII-Daten (flatfiles) eingelesen. Hier besteht die Flexibilität in den reichhaltigen Möglichkeiten der Einlesesteuerung und darin, daß auch das INPUT-Statement mehrfach oder in DO-Schleifen verwendet werden kann (vgl. [1], S. 393 ff).

Mit diesem Programm wird ein Normal-Probability-Plot (NPP) erzeugt. Dazu wird die Ausgangs-Datei 'eins' nach dem Merkmal 'grad' sortiert und die sortierte Datei unter dem Namen 'zwei' abgespeichert. Für den NPP benötigen wir zu den Werten von 'grad' die zugehörigen theoretischen Werte 'twert', die sich durch:

    twert=std.-Abw. * quant + Mittelw.
berechnen lassen, mit:
    quant=F**(-1)(k/n+1).
Die Berechnung erfolgt im DATA-Step und kann wie folgt beschrieben werden:
Durch den Befehl 'SET md;' sind die Ergebnisse aus 'PROC MEANS' immer verfügbar (MEAN=m, STD=s und N=n). Zu diesen Werten wird in der DO-Schleife mit 'SET zwei POINT=k;' der k-te Wert der sortierten Daten hinzugeladen. Der Wert für 'twert' wird berechnet und für jedes 'k' mit dem Befehl 'OUTPUT' in der Datei 'drei' abgespeichert (dabei muß bei Verwendung der POINT-Option nach dem 'END;' der DO-Schleife ein 'STOP;' stehen).

Weitere Anwendungsmöglichkeiten dieser Technik sind z.B. spezielle Standardisierungen von Variablen oder das Ersetzen von fehlenden Werten durch geeignete Schätzer (z.B. Mittelwert). Durch Verwendung der SAS-Makro-Sprache koennen diese Vorgänge einfach automatisiert werden.

Programm 2:

	DATA teil1 teil2;
	     ------------
	   SET gesamtf;
	   IF MOD(_N_,2)=1 THEN
	         OUTPUT teil1;
	         -------------
	    ELSE OUTPUT teil2;
	         ------------- 
     	RUN;
In diesem zweiten Beispiel wird die Datei 'gesamt' in zwei Teile geteilt. Hieran ist zu erkennen, dass mit einem DATA-Statement zwei oder mehr Dateien erzeugt werden können. Mit 'SET gesamt;' werden nacheinander alle Beobachtungen aus der Datei 'gesamt' geladen. In den IF-THEN-Zeilen werden dann die Beobachtungen, die die Bedingung erfüllen, mit 'OUTPUT teil1' in die erste Teil-Datei geschrieben. Die restlichen Beobachtungen ('ELSE') kommen nach 'teil2'. In dem vorliegenden Beispiel bedeutet die Funktion 'MOD' modulo und
      'MOD(_N_,2)=1'
bedeutet, daß bei Teilung der Zahl _N_ durch 2 der Rest 1 bleibt. Zur Erinnerung: Die automatische SAS-Variable _N_ enthält die fortlaufende Beobachtungsnummer. Auf diese Weise stehen in der Datei 'teil1' die 'ungeraden' Beobachtungen und in 'teil2' die 'geraden'.

Programm 3:

 	DATA data1 (DROP=i);
 	  DO dueng='M', 'O';
 	    DO sorte='A', 'B', 'C';
 	      DO i=1 TO 10;
 	        INPUT menge @@;
 	      END;
 	    END;
 	    CARDS;
	....  daten  ....
	....  daten  ....
	;
	weitere SAS-Befehle.
Die in Programm 3 vorgestellte Technik ist besonders nützlich, falls die Daten aus Block-Plänen (split-plot-design) stammen. Im konkreten Beispiel wurde ein Weizen-Feld in zwei Teile geteilt (mit und ohne Dünger). Jede Hälfte wurde dann in drei weitere Teile geteilt (Weizen-Sorten: A, B und C). Aus jedem der sechs Teile wurden dann 10 Stichproben entnommen, um den Ertrag zu bestimmen. Stehen die Ergebnisse dann als 60 aufeinanderfolgende Zahlen in einer Datei, können diese mit o.a. Programm eingelesen werden. Daraufhin stehen in der resultierenden Datei zu jedem Ertragswert die entsprechenden Informationen von Dünger und Sorte.

Literatur:

 [1] SAS Language, Reference, Version 6
     - S. 160-171
     - S. 292-306


Ansprechpartner im URZ:

Rainer Becker         Zimmer Ei: eO-106          CEO-Mail: becker
                      Tel.: -351                 PMail: rainer.becker 
Ingo Kemmerzell       Zimmer In: AS-301          CEO-Mail: kemmerzell
                      Tel.: -249                 PMail: ingo.kemmerzell