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.
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.
Tabla A (Base): Contiene todo el historial del paciente.
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:
Explicación técnica detallada
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.
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).
intck('month', ...) o intnx(...):
Una vez que tenemos ambas fechas en la misma línea, podemos usar:
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):
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.