SAS9

Analizar la evolución antes y después de un evento clave

Simon 10 vues

En los estudios longitudinales, especialmente en el ámbito médico o de marketing, es frecuente tener que analizar la evolución de una variable (como el IMC, la facturación o una puntuación de riesgo) en relación con un evento pivotal (una cirugía, una campaña de marketing, una suscripción).

A diferencia de una simple comparación "fecha a fecha", la dificultad reside aquí en el hecho de que la fecha de referencia (el evento) es específica para cada individuo y se encuentra, a su vez, oculta en los datos.

Este artículo explica cómo extraer y comparar datos situados en intervalos precisos (por ejemplo: 6 meses antes y 6 meses después) alrededor de un evento objetivo.

El Escenario

Tomemos como ejemplo a pacientes seguidos por su IMC (BMI). Tenemos varios registros por paciente. Uno de estos registros corresponde a una cirugía (surgery = 1). El objetivo es identificar las medidas tomadas 6 meses antes y 6 meses después de esta cirugía para evaluar el impacto de la operación.

Los datos brutos

Los datos incluyen un identificador, una fecha de visita, un indicador de cirugía (0 = no, 1 = sí) y la medida del IMC.

Nota importante: Asegúrese siempre de que sus fechas se importan como variables numéricas (formato de fecha) y no como texto, para permitir los cálculos aritméticos.

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;

El Problema Lógico

Para filtrar las líneas situadas en "t - 6 meses" o "t + 6 meses", SAS© necesita conocer la fecha "t" (la cirugía) cuando lee cualquier otra línea del mismo paciente. Sin embargo, durante una lectura secuencial clásica, SAS© solo "conoce" la línea actual.

La Solución: El "Self-Merge" (Auto-unión)

El método más eficaz consiste en fusionar la tabla consigo misma.

  1. Tabla A (Base): Contiene todo el historial del paciente.

  2. Tabla B (Referencia): Está filtrada para contener solo la línea del evento (cirugía).

Al fusionar A y B por identificador (ID), "difundiremos" la fecha de la cirugía a todas las líneas del paciente. Cada observación tendrá entonces su propia fecha (Date_Visit) y la fecha de referencia (_Date_Ref) en la misma línea, lo que hace que la comparación sea trivial.

El Código SAS©

Así es como se implementa esta lógica en un solo paso DATA:

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;

Explicación técnica detallada

  1. rename=(date_visit=_Date_Ref ...): En la segunda mención de la tabla diff_date, renombramos la fecha de visita. Esto evita que la fusión sobrescriba la fecha original. _Date_Ref se convertirá en una nueva columna que contiene la fecha de cirugía, repetida en cada línea del paciente.

  2. where=(_surgery_flag=1): Este filtro se aplica a la segunda tabla antes de la fusión. Para cada ID, SAS© solo retiene la línea de la cirugía. Durante el MERGE, esta línea única se une a todas las líneas del historial de ese ID (relación Uno a Muchos).

  3. intck('month', ...) o intnx(...): Una vez que tenemos ambas fechas en la misma línea, podemos usar:

    • INTCK para contar el número de intervalos (meses) entre las dos fechas.

    • INTNX para calcular una fecha objetivo teórica (ej: _Date_Ref + 6 meses) y compararla con la fecha real.

Variante: Filtrado estricto con INTNX

Si su objetivo es verificar si una fecha cae exactamente (o estrictamente) antes o después de una ventana de 6 meses, puede usar la función INTNX directamente en una condición IF.

El siguiente ejemplo ilustra cómo excluir el período "neutro" y conservar solo los datos lejanos (más de 6 meses de diferencia):

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 
El argumento 's' (same) en INTNX asegura que si la cirugía es el día 15 del mes, el cálculo se basará en el día 15 de los meses anteriores/siguientes.

La auto-unión (Self-Merge) es una técnica potente en SAS© para los análisis relacionales intra-sujeto. Evita el uso complejo de bucles o retenciones de variables (RETAIN) y permite procesar masivamente comparaciones de fechas relativas.

Lo que hay que recordar:

  • Utilice MERGE data data(...) para reportar una información única (fecha de evento) sobre todo el historial de un sujeto.

  • Renombre siempre las variables de la tabla de referencia para evitar sobrescrituras.

  • Utilice INTCK o INTNX para gestionar correctamente la lógica calendárica.