Dans les études longitudinales, notamment dans le domaine médical ou marketing, il est fréquent de devoir analyser l'évolution d'une variable (comme l'IMC, le chiffre d'affaires, ou un score de risque) par rapport à un événement pivot (une chirurgie, une campagne marketing, une souscription).
Contrairement à une simple comparaison "date à date", la difficulté réside ici dans le fait que la date de référence (l'événement) est spécifique à chaque individu et se trouve elle-même enfouie dans les données.
Cet article explique comment extraire et comparer des données situées à des intervalles précis (par exemple : 6 mois avant et 6 mois après) autour d'un événement cible.
Le Scénario
Prenons l'exemple de patients suivis pour leur IMC (BMI). Nous avons plusieurs relevés par patient. L'un de ces relevés correspond à une chirurgie (surgery = 1). L'objectif est d'identifier les mesures prises 6 mois avant et 6 mois après cette chirurgie pour évaluer l'impact de l'opération.
Les données brutes
Les données comportent un identifiant, une date de visite, un indicateur de chirurgie (0 = non, 1 = oui) et la mesure de l'IMC.
Note importante : Assurez-vous toujours que vos dates sont importées comme des variables numériques (format date) et non comme du texte, pour permettre les calculs arithmétiques.
Le Problème de Logique
Pour filtrer les lignes situées à "t - 6 mois" ou "t + 6 mois", SAS© doit connaître la date "t" (la chirurgie) lorsqu'il lit n'importe quelle autre ligne du même patient. Or, lors d'une lecture séquentielle classique, SAS© ne "connaît" que la ligne en cours.
La Solution : Le "Self-Merge" (Auto-jointure)
La méthode la plus efficace consiste à fusionner la table avec elle-même.
Table A (Base) : Contient tout l'historique du patient.
Table B (Référence) : Est filtrée pour ne contenir que la ligne de l'événement (chirurgie).
En fusionnant A et B par identifiant (ID), nous allons "diffuser" la date de chirurgie sur toutes les lignes du patient. Chaque observation aura alors sa propre date (Date_Visit) et la date de référence (_Date_Ref) sur la même ligne, rendant la comparaison triviale.
Le Code SAS©
Voici comment implémenter cette logique en une seule étape DATA :
Explication technique détaillée
rename=(date_visit=_Date_Ref ...) :
Dans la seconde mention de la table diff_date, nous renommons la date de visite. Cela évite que la fusion n'écrase la date originale. _Date_Ref deviendra une nouvelle colonne contenant la date de chirurgie, répétée sur chaque ligne du patient.
where=(_surgery_flag=1) :
Ce filtre est appliqué à la seconde table avant la fusion. Pour chaque ID, SAS© ne retient que la ligne de la chirurgie. Lors du MERGE, cette ligne unique est jointe à toutes les lignes de l'historique de cet ID (relation One-to-Many).
intck('month', ...) ou intnx(...) :
Une fois que nous avons les deux dates sur la même ligne, nous pouvons utiliser :
Variante : Filtrage strict avec INTNX
Si votre objectif est de vérifier si une date tombe exactement (ou strictement) avant ou après une fenêtre de 6 mois, vous pouvez utiliser la fonction INTNX directement dans une condition IF.
L'exemple ci-dessous illustre comment exclure la période "neutre" et ne garder que les données lointaines (plus de 6 mois d'écart) :
L'auto-jointure (Self-Merge) est une technique puissante dans SAS© pour les analyses relationnelles intra-sujet. Elle évite l'utilisation complexe de boucles ou de retenues de variables (RETAIN) et permet de traiter massivement des comparaisons de dates relatives.
Ce qu'il faut retenir :
Utilisez MERGE data data(...) pour rapporter une information unique (date d'événement) sur l'ensemble de l'historique d'un sujet.
Renommez toujours les variables de la table de référence pour éviter les écrasements.
Utilisez INTCK ou INTNX pour gérer proprement la logique calendaire.