Gegenstück zur Lag-Funktion - Wie kann man auf die nachfolgende(n) Beobachtung(en) im Data Step zugreifen?

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Heinrich Stürzl: Hans-Peter Altenburg, Heinrich Stürzl, Almut Hahn, Carina Ortseifen, Grischa Pfister: Tipps und Tricks für den leichteren Umgang mit der SAS Software, KSFE 2008

Die Funktion LAGn() mit n=1, 2, … liefert im Data Step den n-ten Vorgänger einer Beobachtung. Sie erlaubt dadurch Vergleiche mit vorangegangenen Beobachtungen. In manchen Situationen wird jedoch die Ausprägung einer nachfolgenden Beobachtung benötigt, um davon die Behandlung der aktuellen Beobachtung abhängig zu machen. Dafür gibt es bisher keine entsprechende Funktion in SAS. Nachfolgend wird gezeigt, wie man auf einen beliebigen Nachfolger einer Beobachtung zugreifen kann.

Anwendungsbeispiel: Blöcke ohne By-Variable

Gegeben: Unterschiedlich lange Blöcke jeweils aufsteigender Zahlenreihen, wobei eine By-Variable zur Identifizierung der Blöcke nicht zur Verfügung steht.

10
20
40
80
5
10
20
1
2
4
8
16

Gesucht: Die jeweils letzte Beobachtung eines Blockes aufsteigender Zahlen d.h. diejenige Beobachtung, bei der die Kette der aufsteigenden Zahlen endet und nach der eine kleinere Zahl oder keine weitere Zahl folgt. Im Beispiel die 4., 7. und 12. Beobachtung. Das heißt, die Bedingung für das Blockende lautet: Nachfolger ist kleiner als die aktuelle Zahl.

Die besondere Schwierigkeit dieser Aufgabe liegt darin, dass keine By-Variable zur Unterscheidung der Blöcke genutzt werden kann. Andernfalls wäre das Blockende direkt über die entsprechende LAST.Variable zu identifizieren.

Lösung: Versetzter Merge der Tabelle mit sich selbst

Um auf den direkten Nachfolger jeder Beobachtung zugreifen zu können, genügt es, die Tabelle (data set) mit einer um eine Beobachtung versetzten Kopie zu mergen. Die Kopie beginnt mit der 2. Beobachtung des Originals (Option FIRSTOBS=2) und wird zur 1. Beobachtung in Form einer weiteren Variable hinzugefügt.

Angenommen die zu untersuchenden Zahlenreihen sind in der Variable Z in der Tabelle WERTE enthalten.

DATA neu;
MERGE werte
      werte (FIRSTOBS=2 KEEP=z RENAME=(z=Next_z))
        ;
  IF Next_z < z THEN Blockende=1;
RUN;

->

z Next_z Blockende
10 20 .
20 40 .
40 80 .
80 5 1
5 10 .
10 20 .
20 1 1
1 2 .
2 4 .
4 8 .
8 16 .
16 . 1

Verallgemeinerung

Durch die Einstellung der Option FIRSTOBS= lässt sich der Versatz beider Tabellen steuern d.h. auf den wievielten Nachfolger zugegriffen werden soll. Für den n-ten Nachfolger gilt FIRSTOBS=1+n.

Diese Lösung nutzt die Eigenschaft des „Merge ohne By“ (one-to-one merging), dass beim Mischen von Tabellen mit unterschiedlich vielen Beobachtungen die Ergebnistabelle genau so viele Beobachtungen hat wie die größte Einzeltabelle. Dadurch bleiben alle originalen Beobachtungen erhalten. Außerdem werden dadurch in der Variable mit den Nachfolger Werten (Next_z) am Ende der Tabelle entsprechende Missing Values erzeugt.