In Längsschnittstudien, insbesondere in den Bereichen Medizin oder Marketing, ist es häufig notwendig, die Entwicklung einer Variablen (wie BMI, Umsatz oder Risikoscore) in Bezug auf ein Schlüsselereignis (eine Operation, eine Marketingkampagne, ein Abonnement) zu analysieren.
Im Gegensatz zu einem einfachen „Datum-zu-Datum“-Vergleich liegt die Schwierigkeit hier darin, dass das Referenzdatum (das Ereignis) für jedes Individuum spezifisch ist und selbst in den Daten verborgen liegt.
Dieser Artikel erklärt, wie Daten in präzisen Intervallen (z. B. 6 Monate vor und 6 Monate nach) um ein Zielereignis herum extrahiert und verglichen werden.
Das Szenario
Nehmen wir das Beispiel von Patienten, deren BMI überwacht wird. Wir haben mehrere Messungen pro Patient. Eine dieser Messungen entspricht einer Operation (surgery = 1). Ziel ist es, die Messungen zu identifizieren, die 6 Monate vor und 6 Monate nach dieser Operation vorgenommen wurden, um die Auswirkungen des Eingriffs zu bewerten.
Die Rohdaten
Die Daten umfassen eine ID, ein Besuchsdatum, einen Operationsindikator (0 = nein, 1 = ja) und die BMI-Messung.
Wichtiger Hinweis: Stellen Sie immer sicher, dass Ihre Daten als numerische Variablen (Datumsformat) und nicht als Text importiert werden, um arithmetische Berechnungen zu ermöglichen.
Das Logikproblem
Um Zeilen zu filtern, die sich auf „t - 6 Monate“ oder „t + 6 Monate“ befinden, muss SAS© das Datum „t“ (die Operation) kennen, wenn es andere Zeilen desselben Patienten liest. Bei einem klassischen sequenziellen Lesen „kennt“ SAS© jedoch nur die aktuelle Zeile.
Die Lösung: Das „Self-Merge“ (Selbst-Zusammenführung)
Die effektivste Methode besteht darin, die Tabelle mit sich selbst zu verschmelzen.
Tabelle A (Basis): Enthält den gesamten Patientenverlauf.
Tabelle B (Referenz): Ist gefiltert, um nur die Zeile des Ereignisses (Operation) zu enthalten.
Durch das Zusammenführen von A und B nach ID (ID) werden wir das Operationsdatum auf alle Zeilen des Patienten „verteilen“. Jede Beobachtung hat dann ihr eigenes Datum (Date_Visit) und das Referenzdatum (_Date_Ref) in derselben Zeile, was den Vergleich trivial macht.
Der SAS©-Code
Hier ist, wie diese Logik in einem einzigen DATA-Schritt implementiert wird:
Detaillierte technische Erklärung
rename=(date_visit=_Date_Ref ...):
Bei der zweiten Erwähnung der Tabelle diff_date benennen wir das Besuchsdatum um. Dies verhindert, dass das Zusammenführen das ursprüngliche Datum überschreibt. _Date_Ref wird eine neue Spalte, die das Operationsdatum enthält, das auf jeder Zeile des Patienten wiederholt wird.
where=(_surgery_flag=1):
Dieser Filter wird auf die zweite Tabelle vor dem Zusammenführen angewendet. Für jede ID behält SAS© nur die Operationszeile. Beim MERGE wird diese einzelne Zeile mit allen Zeilen des Verlaufs dieser ID (One-to-Many-Beziehung) verbunden.
intck('month', ...) oder intnx(...):
Sobald wir beide Daten in derselben Zeile haben, können wir verwenden:
INTCK, um die Anzahl der Intervalle (Monate) zwischen den beiden Daten zu zählen.
INTNX, um ein theoretisches Zieldatum zu berechnen (z.B. _Date_Ref + 6 Monate) und es mit dem tatsächlichen Datum zu vergleichen.
Variante: Strikte Filterung mit INTNX
Wenn Ihr Ziel darin besteht, zu überprüfen, ob ein Datum genau (oder streng) vor oder nach einem 6-Monats-Fenster liegt, können Sie die Funktion INTNX direkt in einer IF-Bedingung verwenden.
Das folgende Beispiel zeigt, wie man die „neutrale“ Periode ausschließt und nur die weiter entfernten Daten (mehr als 6 Monate Unterschied) behält:
Das Self-Merge ist eine leistungsstarke Technik in SAS© für relationale Intra-Subjekt-Analysen. Es vermeidet die komplexe Verwendung von Schleifen oder Variablenretention (RETAIN) und ermöglicht die massive Verarbeitung von Vergleichen relativer Daten.
Was man sich merken sollte:
Verwenden Sie MERGE data data(...), um einzelne Informationen (Ereignisdatum) über den gesamten Verlauf eines Subjekts zu berichten.
Benennen Sie die Variablen der Referenztabelle immer um, um Überschreibungen zu vermeiden.
Verwenden Sie INTCK oder INTNX, um die Kalenderlogik sauber zu handhaben.