SAS9

Analyse der Entwicklung vor und nach einem Schlüsselereignis

Simon 14 views

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.

1DATA diff_date;
2 INPUT Date_Visit : mmddyy10. ID surgery BMI;
3 FORMAT Date_Visit mmddyy10.;
4 CARDS;
507/02/2002 1 0 40
611/14/2002 1 0 35
705/15/2003 1 1 35 /* Date de chirurgie pour ID 1 */
811/04/2003 1 0 25
905/04/2004 2 0 50
1011/10/2004 2 0 53
1105/03/2005 2 1 45 /* Date de chirurgie pour ID 2 */
1205/03/2006 2 0 32
1305/03/2007 2 0 25
14;
15RUN;

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.

  1. Tabelle A (Basis): Enthält den gesamten Patientenverlauf.

  2. 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:

1DATA want;
2 /* On fusionne la table complète avec une version filtrée d'elle-même */
3 MERGE diff_date
4 diff_date(keep=id date_visit surgery
5 rename=(date_visit=_Date_Ref surgery=_surgery_flag)
6 where=(_surgery_flag=1));
7 BY id;
8 
9 /* Calcul de la fenêtre temporelle */
10 /* On cherche les dates hors de la fenêtre 'Chirurgie +/- 6 mois' ou l'inverse selon le besoin */
11
12 /* Exemple : Identifier les visites proches de -6 mois ou +6 mois */
13 Months_Diff = intck('month', _Date_Ref, Date_Visit);
14
15 /* Optionnel : Filtrer pour ne garder que les visites d'intérêt */
16 /* Ici, on garde ce qui est entre 5 et 7 mois avant ou après */
17 IF (Months_Diff between -7 and -5) or (Months_Diff between 5 and 7) or (_surgery_flag=1);
18RUN;

Detaillierte technische Erklärung

  1. 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.

  2. 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.

  3. 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:

1/* Garder uniquement les données situées au-delà de 6 mois d'écart (avant ou après) */
2IF date_visit < intnx('month', _Date_Ref, -6, 's')
3or date_visit > intnx('month', _Date_Ref, 6, 's');
4 
Das Argument 's' (same) in INTNX stellt sicher, dass, wenn die Operation am 15. des Monats stattfindet, die Berechnung auf dem 15. der vorhergehenden/folgenden Monate basiert.

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.