{"id":9548,"date":"2026-10-14T18:02:32","date_gmt":"2026-10-14T18:02:32","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-ajouter-numeros-ligne-sas-exemples\/"},"modified":"2026-10-14T18:02:32","modified_gmt":"2026-10-14T18:02:32","slug":"comment-ajouter-numeros-ligne-sas-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-ajouter-numeros-ligne-sas-exemples","title":{"rendered":"Comment ajouter des num\u00e9ros de ligne dans SAS (avec exemples)"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;ing\u00e9nierie des donn\u00e9es et de l&rsquo;analyse biostatistique, la manipulation rigoureuse des tables d&rsquo;observations constitue le fondement de toute inf\u00e9rence scientifique valide. Le syst\u00e8me SAS (Statistical Analysis System), reconnu mondialement pour sa robustesse dans le traitement des donn\u00e9es massives et son omnipr\u00e9sence au sein des industries hautement r\u00e9gul\u00e9es telles que la recherche clinique et l&rsquo;\u00e9conom\u00e9trie financi\u00e8re, repose sur un paradigme de traitement s\u00e9quentiel particuli\u00e8rement optimis\u00e9. Cependant, contrairement aux syst\u00e8mes de gestion de bases de donn\u00e9es relationnelles traditionnels qui int\u00e8grent fr\u00e9quemment des pseudo-colonnes automatiques ou des index physiques visibles, SAS ne g\u00e9n\u00e8re pas de mani\u00e8re explicite et permanente une colonne d\u00e9di\u00e9e \u00e0 l&rsquo;indexation s\u00e9quentielle des lignes lors de la cr\u00e9ation d&rsquo;une table de donn\u00e9es standard.<\/p>\n<p>Cette particularit\u00e9 architecturale impose aux analystes, statisticiens et ing\u00e9nieurs de donn\u00e9es la ma\u00eetrise compl\u00e8te des m\u00e9canismes internes r\u00e9gissant l&rsquo;\u00e9tape DATA. L&rsquo;attribution d&rsquo;un identifiant num\u00e9rique unique ou d&rsquo;un compteur s\u00e9quentiel, qu&rsquo;il soit global ou conditionn\u00e9 par des sous-groupes cat\u00e9goriels, repr\u00e9sente bien plus qu&rsquo;une simple commodit\u00e9 cosm\u00e9tique. Il s&rsquo;agit d&rsquo;un imp\u00e9ratif m\u00e9thodologique conditionnant la tra\u00e7abilit\u00e9 des observations, la reproductibilit\u00e9 des analyses longitudinales, l&rsquo;impl\u00e9mentation d&rsquo;algorithmes d&rsquo;\u00e9chantillonnage stratifi\u00e9 et la mise en conformit\u00e9 avec les normes d&rsquo;audit les plus strictes, notamment les directives des agences de r\u00e9gulation sanitaire et financi\u00e8re.<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;analyser en profondeur les principes th\u00e9oriques, les m\u00e9canismes computationnels sous-jacents et les impl\u00e9mentations pratiques permettant d&rsquo;ajouter des num\u00e9ros de ligne au sein de l&rsquo;environnement SAS. De la variable automatique sous-jacente au vecteur de donn\u00e9es de programme (PDV) jusqu&rsquo;aux requ\u00eates avanc\u00e9es sous la proc\u00e9dure SQL, en passant par la gestion subtile de l&rsquo;instruction de somme implicite et le traitement par groupe, cet article explore l&rsquo;ensemble du spectre m\u00e9thodologique requis pour structurer et fiabiliser vos jeux de donn\u00e9es de recherche.<\/p>\n<h2>1. 1. Introduction \u00e0 l&rsquo;indexation des observations sous l&rsquo;environnement SAS<\/h2>\n<h3>1.1 1.1 Importance m\u00e9thodologique de la num\u00e9rotation des lignes<\/h3>\n<p>Dans le cadre de la recherche quantitative moderne, l&rsquo;auditabilit\u00e9 et la reproductibilit\u00e9 des cha\u00eenes de traitement statistique constituent des crit\u00e8res d&rsquo;\u00e9valuation fondamentaux. L&rsquo;adjonction d&rsquo;un identifiant s\u00e9quentiel au sein d&rsquo;une table d&rsquo;observations brutes permet de mat\u00e9rialiser une piste de v\u00e9rification (audit trail) indispensable, notamment dans les contextes assujettis aux exigences de la r\u00e9glementation <a rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\/regulatory-information\/search-fda-guidance-documents\/part-11-electronic-records-electronic-signatures-scope-and-application\">FDA 21 CFR Part 11<\/a>. Lorsqu&rsquo;un jeu de donn\u00e9es subit des transformations successives\u2014telles que des transpositions, des sous-\u00e9chantillonnages, des imputations de valeurs manquantes ou des jointures relationnelles\u2014la pr\u00e9sence d&rsquo;une num\u00e9rotation de ligne native garantit qu&rsquo;il est toujours possible de remonter avec une pr\u00e9cision absolue \u00e0 l&rsquo;enregistrement source initial. Cette tra\u00e7abilit\u00e9 pr\u00e9vient la perte d&rsquo;informations contextuelles et permet de d\u00e9tecter d&rsquo;\u00e9ventuelles anomalies d&rsquo;appariement lors d&rsquo;op\u00e9rations de fusion complexes.<\/p>\n<p>Dans les protocoles de recherche en psychom\u00e9trie, en \u00e9pid\u00e9miologie ou en sociologie quantitative, la mod\u00e9lisation des donn\u00e9es requiert souvent une s\u00e9paration stricte entre l&rsquo;unit\u00e9 statistique d&rsquo;observation et les attributs temporels ou environnementaux qui lui sont associ\u00e9s. L&rsquo;introduction d&rsquo;un index s\u00e9quentiel sert de pivot pour identifier de mani\u00e8re univoque un participant, une session exp\u00e9rimentale ou une passation de questionnaire sp\u00e9cifique. En l&rsquo;absence de cl\u00e9 primaire composite fiable fournie en amont, la g\u00e9n\u00e9ration d&rsquo;un num\u00e9ro de ligne unique devient la m\u00e9thode de r\u00e9f\u00e9rence pour pr\u00e9venir l&rsquo;ambigu\u00eft\u00e9 r\u00e9f\u00e9rentielle, stabiliser les proc\u00e9dures d&rsquo;\u00e9chantillonnage probabiliste (comme le tirage al\u00e9atoire syst\u00e9matique) et faciliter le partitionnement des donn\u00e9es d&rsquo;apprentissage et de validation dans les mod\u00e9lisations pr\u00e9dictives.<\/p>\n<p>D&rsquo;un point de vue conceptuel et th\u00e9orique, il convient d&rsquo;op\u00e9rer une distinction rigoureuse entre l&rsquo;ordre physique de stockage des donn\u00e9es sur le support disque et l&rsquo;ordre logique d&rsquo;analyse d\u00e9termin\u00e9 par les instructions de programmation. Les architectures de stockage distribu\u00e9es ou les formats de fichiers compress\u00e9s peuvent modifier l&rsquo;agencement physique des blocs d&rsquo;octets sans modifier la hi\u00e9rarchie logique des variables. L&rsquo;attribution explicite d&rsquo;une colonne de num\u00e9rotation transforme une propri\u00e9t\u00e9 d&rsquo;ordre implicite, tributaire du syst\u00e8me de fichiers et de la m\u00e9thode de lecture s\u00e9quentielle, en une variable de donn\u00e9es persistante, immuable et manipulable par les op\u00e9rateurs alg\u00e9briques et relationnels du langage SAS.<\/p>\n<h3>1.2 1.2 Sp\u00e9cificit\u00e9s de l&rsquo;architecture de donn\u00e9es SAS<\/h3>\n<p>Pour appr\u00e9hender la m\u00e9canique de num\u00e9rotation sous le logiciel <a rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\/\">SAS Institute<\/a>, il est indispensable de comprendre le fonctionnement fondamental de l&rsquo;\u00e9tape DATA (DATA step). Contrairement aux architectures de bases de donn\u00e9es relationnelles (RDBMS) fond\u00e9es sur la th\u00e9orie des ensembles o\u00f9 les donn\u00e9es sont appr\u00e9hend\u00e9es comme des tuples non ordonn\u00e9s, le compilateur SAS traite l&rsquo;information de mani\u00e8re fondamentalement s\u00e9quentielle. L&rsquo;\u00e9tape DATA ex\u00e9cute une boucle implicite qui proc\u00e8de ligne par ligne, lisant une observation source, la chargeant dans une structure de m\u00e9moire tampon interm\u00e9diaire, ex\u00e9cutant les instructions de transformation s\u00e9quentielle, puis \u00e9crivant l&rsquo;enregistrement r\u00e9sultant dans la table cible avant de r\u00e9initialiser la m\u00e9moire pour l&rsquo;it\u00e9ration suivante.<\/p>\n<p>Au c\u0153ur de cette architecture se trouvent les m\u00e9canismes de gestion interne des pointeurs d&rsquo;enregistrement. Lors de la lecture d&rsquo;un jeu de donn\u00e9es SAS standard (table de type .sas7bdat), le moteur de stockage interne g\u00e8re un descripteur d&rsquo;en-t\u00eate qui maintient l&rsquo;\u00e9tat des m\u00e9tadonn\u00e9es, incluant le nombre total d&rsquo;observations, la longueur fixe de chaque enregistrement physique et la position courante du pointeur de lecture. Bien que le moteur sous-jacent sache en permanence quel enregistrement physique il est en train de traiter via son adresse relative ou son d\u00e9calage (offset), cette information d&rsquo;infrastructure demeure confin\u00e9e aux couches basses du syst\u00e8me et n&rsquo;est pas expos\u00e9e directement sous la forme d&rsquo;une variable accessible dans l&rsquo;espace de calcul utilisateur.<\/p>\n<p>Cette absence par d\u00e9faut d&rsquo;une colonne d&rsquo;indexation explicite dans les tables de sortie SAS surprend fr\u00e9quemment les programmeurs form\u00e9s \u00e0 d&rsquo;autres \u00e9cosyst\u00e8mes logiciels. Dans un fichier de donn\u00e9es SAS finalis\u00e9, seules les colonnes d\u00e9clar\u00e9es ou cr\u00e9\u00e9es explicitement figurent dans le dictionnaire des variables. Il n&rsquo;existe pas d&rsquo;\u00e9quivalent persistant direct automatique aux concepts de cl\u00e9s primaires auto-incr\u00e9ment\u00e9es (telles que le champ AUTO_INCREMENT en MySQL ou IDENTITY en Microsoft SQL Server). Par cons\u00e9quent, c&rsquo;est au programmeur qu&rsquo;incombe la responsabilit\u00e9 architecturale d&rsquo;instancier, de valoriser et de documenter la colonne qui portera le num\u00e9ro d&rsquo;ordre de chaque observation.<\/p>\n<h2>2. 2. La variable automatique _N_ : fondements th\u00e9oriques et cycle d&rsquo;ex\u00e9cution<\/h2>\n<h3>2.1 2.1 D\u00e9finition et comportement du vecteur de donn\u00e9es de programme (PDV)<\/h3>\n<p>Le Programme Data Vector (PDV), ou vecteur de donn\u00e9es de programme, constitue la zone m\u00e9moire logique fondamentale cr\u00e9\u00e9e par le compilateur SAS lors de la phase de pr\u00e9paration de l&rsquo;\u00e9tape DATA. Le PDV agit comme une structure tampon bidirectionnelle qui re\u00e7oit les variables lues depuis la table source ou instanci\u00e9es par le code utilisateur, avant leur transfert d\u00e9finitif vers la table de destination. Lors de la compilation, SAS alloue dans le PDV des emplacements fixes pour chaque variable, accompagn\u00e9s d&rsquo;indicateurs de statut r\u00e9gissant leur comportement, notamment l&rsquo;attribut d&rsquo;initialisation (remise \u00e0 blanc ou \u00e0 valeur manquante \u00e0 chaque tour de boucle) et l&rsquo;indicateur de conservation (sauvegarde de la variable dans la table de sortie finale).<\/p>\n<p>Au sein de cette m\u00e9canique interne, le syst\u00e8me initialise automatiquement des variables syst\u00e8me sp\u00e9ciales, dont la plus notable est la variable automatique _N_. Par nature, _N_ est une variable \u00e9ph\u00e9m\u00e8re : elle r\u00e9side exclusivement dans le PDV pendant le temps de calcul de l&rsquo;\u00e9tape DATA, mais elle poss\u00e8de intrins\u00e8quement un indicateur d&rsquo;exclusion permanent qui emp\u00eache son \u00e9criture automatique dans la table SAS r\u00e9sultante. Sa valeur num\u00e9rique est automatiquement incr\u00e9ment\u00e9e d&rsquo;une unit\u00e9 \u00e0 chaque fois que l&rsquo;\u00e9tape DATA franchit le point d&rsquo;entr\u00e9e de son cycle d&rsquo;ex\u00e9cution principal, agissant ainsi comme un compteur d&rsquo;it\u00e9rations de la boucle sous-jacente.<\/p>\n<p>Une confusion m\u00e9thodologique fr\u00e9quente consiste \u00e0 assimiler la variable _N_ au num\u00e9ro physique de l&rsquo;observation au sein de la table d&rsquo;entr\u00e9e. Il s&rsquo;agit d&rsquo;une approximation th\u00e9orique erron\u00e9e. La variable _N_ mesure strictement le nombre de fois o\u00f9 l&rsquo;\u00e9tape DATA a recommenc\u00e9 son cycle d&rsquo;instructions. Dans le cas d&rsquo;une lecture s\u00e9quentielle simple d&rsquo;un fichier source sans branchements conditionnels complexes, sans instruction OUTPUT explicite et sans boucle it\u00e9rative interne de type DO, la valeur de _N_ co\u00efncide parfaitement avec le num\u00e9ro de la ligne en cours de lecture. Toutefois, d\u00e8s lors que la topologie du code int\u00e8gre des instructions de saut conditionnel, des boucles de lecture multiples par it\u00e9ration ou des filtrages en amont, la divergence entre le compteur d&rsquo;it\u00e9rations du PDV et l&rsquo;identifiant physique de la ligne devient effective.<\/p>\n<h3>2.2 2.2 Impact de l&rsquo;instruction SET sur la variable _N_<\/h3>\n<p>L&rsquo;interaction entre l&rsquo;instruction de lecture s\u00e9quentielle SET et la variable automatique _N_ conditionne la justesse des m\u00e9triques d&rsquo;indexation. Dans un sch\u00e9ma d&rsquo;ex\u00e9cution direct sans clause restrictive, \u00e0 l&rsquo;instant o\u00f9 l&rsquo;instruction de compilation commence la premi\u00e8re it\u00e9ration, _N_ prend la valeur 1. L&rsquo;instruction SET d\u00e9place le pointeur d&rsquo;enregistrement sur la premi\u00e8re ligne de la table d&rsquo;entr\u00e9e et charge ses variables dans le PDV. Lorsque le flot d&rsquo;instructions atteint la fin logique de l&rsquo;\u00e9tape DATA mat\u00e9rialis\u00e9e par l&rsquo;instruction RUN, une \u00e9criture implicite se produit, le PDV est r\u00e9initialis\u00e9 selon les r\u00e8gles de persistance, le pointeur d&rsquo;it\u00e9ration _N_ est incr\u00e9ment\u00e9 \u00e0 2, et le cycle se r\u00e9p\u00e8te jusqu&rsquo;\u00e0 ce que l&rsquo;instruction SET rencontre le marqueur de fin de fichier (End-Of-File ou EOF).<\/p>\n<p>Les cons\u00e9quences des m\u00e9canismes de filtrage sur la relation entre _N_ et les observations g\u00e9n\u00e9r\u00e9es sont hautement critiques. Il est primordial de distinguer le filtrage pr\u00e9-chargement op\u00e9r\u00e9 par la clause WHERE du filtrage post-chargement op\u00e9r\u00e9 par l&rsquo;instruction conditionnelle IF. Lorsque l&rsquo;on applique une clause WHERE sur l&rsquo;instruction SET, le moteur de stockage SAS filtre les enregistrements avant m\u00eame qu&rsquo;ils ne soient transmis au PDV. Dans ce cas de figure, l&rsquo;\u00e9tape DATA ne commence une nouvelle it\u00e9ration que pour les observations qui satisfont la condition logique ; par cons\u00e9quent, _N_ s&rsquo;incr\u00e9mente de mani\u00e8re continue sans rupture par rapport aux lignes filtr\u00e9es retenues. \u00c0 l&rsquo;inverse, si l&rsquo;on utilise une condition de sous-ensemble de type IF logique apr\u00e8s le chargement par SET, chaque observation de la table source entra\u00eene l&rsquo;incr\u00e9mentation de _N_. Si l&rsquo;observation ne valide pas le crit\u00e8re du IF, l&rsquo;ex\u00e9cution s&rsquo;interrompt pour cette ligne et l&rsquo;\u00e9criture dans la table de sortie est ignor\u00e9e, cr\u00e9ant ainsi des discontinuit\u00e9s majeures si l&rsquo;on tente d&rsquo;affecter _N_ directement comme index s\u00e9quentiel.<\/p>\n<p>Un autre pi\u00e8ge classique dans la construction de l&rsquo;\u00e9tape DATA r\u00e9side dans l&#8217;emplacement chronologique de l&rsquo;affectation de la variable personnalis\u00e9e par rapport \u00e0 l&rsquo;instruction SET. Consid\u00e9rons une \u00e9criture o\u00f9 l&rsquo;affectation de la variable d&rsquo;indexation pr\u00e9c\u00e8de l&rsquo;instruction SET dans le bloc de code. Bien que le compilateur SAS assemble l&rsquo;ensemble des instructions selon un ordre strict, placer l&rsquo;assignation avant l&rsquo;instruction SET implique que la valeur de _N_ est captur\u00e9e dans le PDV avant que les variables de l&rsquo;observation ne soient charg\u00e9es et que la condition de fin de fichier ne soit \u00e9valu\u00e9e. Si une interruption ou un branchement intervient au niveau du SET, la valeur de l&rsquo;index peut se d\u00e9synchroniser. La bonne pratique d&rsquo;ing\u00e9nierie logicielle SAS impose d&rsquo;ordonner les instructions de mani\u00e8re \u00e0 ce que la lecture des donn\u00e9es sources stabilise d&rsquo;abord le PDV avant toute affectation de m\u00e9triques positionnelles d\u00e9riv\u00e9es.<\/p>\n<h2>3. 3. M\u00e9thode standard : attribution globale d&rsquo;un identifiant s\u00e9quentiel<\/h2>\n<h3>3.1 3.1 Syntaxe fondamentale de la num\u00e9rotation absolue<\/h3>\n<p>La technique la plus \u00e9l\u00e9mentaire, mais n\u00e9anmoins la plus robuste pour attribuer un num\u00e9ro s\u00e9quentiel unique \u00e0 l&rsquo;ensemble des observations d&rsquo;une table non subdivis\u00e9e, repose sur la capture directe de la variable syst\u00e8me _N_ dans une variable permanente nouvellement d\u00e9clar\u00e9e. La syntaxe canonique de cette op\u00e9ration s&rsquo;articule de la mani\u00e8re suivante :<\/p>\n<p><em>data table_cible;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set table_source;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;numero_ligne = _N_;<br \/>\nrun;<\/em><\/p>\n<p>Dans cette structure, le compilateur SAS analyse les instructions, dimensionne le PDV pour accueillir l&rsquo;ensemble des colonnes pr\u00e9sentes dans la table source, et ajoute une case m\u00e9moire suppl\u00e9mentaire nomm\u00e9e <em>numero_ligne<\/em>. Au cours de la phase d&rsquo;ex\u00e9cution, pour chaque passage au sein de la boucle de l&rsquo;\u00e9tape DATA, l&rsquo;instruction SET transf\u00e8re l&rsquo;enregistrement courant de la table source dans le PDV. L&rsquo;instruction d&rsquo;affectation attribue ensuite la valeur courante de l&rsquo;entier _N_ \u00e0 la variable <em>numero_ligne<\/em>. Contrairement \u00e0 _N_ qui reste masqu\u00e9e et \u00e9ph\u00e9m\u00e8re, la variable <em>numero_ligne<\/em> ne poss\u00e8de aucun indicateur d&rsquo;exclusion et sera donc physiquement \u00e9crite dans la table finale lors de la r\u00e9solution de l&rsquo;\u00e9tape RUN.<\/p>\n<p>Cette variable nouvellement g\u00e9n\u00e9r\u00e9e est syst\u00e9matiquement typ\u00e9e par d\u00e9faut comme un nombre flottant \u00e0 double pr\u00e9cision (format num\u00e9rique SAS standard de 8 octets), garantissant une capacit\u00e9 de num\u00e9rotation s&rsquo;\u00e9tendant sans perte de pr\u00e9cision jusqu&rsquo;\u00e0 plusieurs millions d&rsquo;enregistrements. L&rsquo;ordre d&rsquo;\u00e9valuation des instructions rev\u00eat ici une importance primordiale : en pla\u00e7ant l&rsquo;affectation imm\u00e9diatement apr\u00e8s la clause SET, l&rsquo;analyste s&rsquo;assure que seules les lignes effectivement lues et valid\u00e9es par les filtres amont h\u00e9ritent d&rsquo;une estampille s\u00e9quentielle strictement croissante, d\u00e9butant obligatoirement \u00e0 la valeur 1 pour la premi\u00e8re observation trait\u00e9e.<\/p>\n<h3>3.2 3.2 Exemple empirique appliqu\u00e9 sur un \u00e9chantillon univari\u00e9<\/h3>\n<p>Afin de concr\u00e9tiser ce paradigme fondamental, prenons l&rsquo;exemple empirique d&rsquo;un jeu de donn\u00e9es issu de l&rsquo;\u00e9valuation des performances sportives de franchises de basketball, r\u00e9pertoriant les \u00e9quipes et leurs scores offensifs moyens. Consid\u00e9rons la cr\u00e9ation initiale d&rsquo;une table d&rsquo;exp\u00e9rimentation nomm\u00e9e <em>resultats_equipes<\/em>, compil\u00e9e \u00e0 partir du code ci-apr\u00e8s :<\/p>\n<p><em>data resultats_equipes;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;input franchise $ score;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;datalines;<br \/>\nMavs 102<br \/>\nRockets 98<br \/>\nSpurs 115<br \/>\nWarriors 120<br \/>\nCeltics 108<br \/>\n;<br \/>\nrun;<\/em><\/p>\n<p>Pour indexer de mani\u00e8re absolue ces cinq enregistrements, nous instancions une nouvelle table de donn\u00e9es dans laquelle nous formalisons notre variable de num\u00e9rotation s\u00e9quentielle :<\/p>\n<p><em>data resultats_indexe;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set resultats_equipes;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;id_observation = _N_;<br \/>\nrun;<\/em><\/p>\n<p>L&rsquo;ex\u00e9cution de la proc\u00e9dure standard d&rsquo;affichage documentaire, via l&rsquo;appel <em>proc print data=resultats_indexe; run;<\/em>, permet de valider le comportement du moteur d&rsquo;ex\u00e9cution. Dans la sortie SAS g\u00e9n\u00e9r\u00e9e, chaque observation se voit attribuer un entier strictly monotone : la franchise Mavs est \u00e9tiquet\u00e9e avec la valeur 1, Rockets avec la valeur 2, Spurs avec la valeur 3, Warriors avec la valeur 4, et Celtics avec la valeur 5. L&rsquo;int\u00e9grit\u00e9 s\u00e9quentielle continue est ainsi confirm\u00e9e : il n&rsquo;existe aucune discontinuit\u00e9 d&rsquo;indice, aucune troncature, et la variable g\u00e9n\u00e9r\u00e9e se pr\u00eate sans restriction \u00e0 des tris post\u00e9rieurs ou \u00e0 des op\u00e9rations d&rsquo;appariement relationnel.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/row1.jpg\" alt=\"\" \/><\/figure>\n<h3>3.3 3.3 Gestion de l&rsquo;ordre des colonnes dans la table finale<\/h3>\n<p>Bien que le code pr\u00e9c\u00e9dent ajoute fonctionnellement le num\u00e9ro d&rsquo;observation, il induit une disposition structurelle o\u00f9 la colonne <em>id_observation<\/em> est rejet\u00e9e \u00e0 l&rsquo;extr\u00e9mit\u00e9 droite de la table SAS. En effet, par conception, le compilateur SAS ordonne les colonnes au sein du descripteur de table selon leur ordre d&rsquo;apparition textuel au cours de l&rsquo;analyse du code source de l&rsquo;\u00e9tape DATA. Les variables import\u00e9es via l&rsquo;instruction SET \u00e9tant r\u00e9solues en premier, elles occupent les positions vectorielles initiales, rel\u00e9guant toute variable calcul\u00e9e ult\u00e9rieurement aux derni\u00e8res positions de la table.<\/p>\n<p>Dans une perspective d&rsquo;ergonomie documentaire, de pr\u00e9sentation de rapports statistiques ou d&rsquo;exportation vers des revues scientifiques, il est g\u00e9n\u00e9ralement requis que la cl\u00e9 primaire ou l&rsquo;index s\u00e9quentiel figure en premi\u00e8re colonne (position la plus \u00e0 gauche). Pour contraindre l&rsquo;ordonnancement structurel sans alt\u00e9rer la dynamique de lecture, il est n\u00e9cessaire de d\u00e9clarer la variable d&rsquo;indexation avant l&rsquo;instruction SET au moyen d&rsquo;instructions d\u00e9claratives non ex\u00e9cutables telles que RETAIN ou LENGTH. Consid\u00e9rons l&rsquo;impl\u00e9mentation suivante :<\/p>\n<p><em>data resultats_indexe_ordonne;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;retain id_observation;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set resultats_equipes;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;id_observation = _N_;<br \/>\nrun;<\/em><\/p>\n<p>L&rsquo;instruction RETAIN indique au compilateur d&rsquo;allouer la premi\u00e8re position du PDV \u00e0 la variable <em>id_observation<\/em> avant m\u00eame la d\u00e9tection des variables de la table source transmise par SET. De plus, pour respecter scrupuleusement les exigences de documentation des donn\u00e9es pr\u00e9conis\u00e9es par la communaut\u00e9 scientifique, il est hautement recommand\u00e9 d&rsquo;associer un libell\u00e9 formel et un format d&rsquo;affichage \u00e0 cette variable, garantissant ainsi que les propri\u00e9t\u00e9s m\u00e9trologiques du jeu de donn\u00e9es sont int\u00e9gralement document\u00e9es au niveau des dictionnaires SAS de type DICTIONARY.COLUMNS ou PROC CONTENTS.<\/p>\n<h2>4. 4. Pr\u00e9traitement et ordonnancement des donn\u00e9es avec PROC SORT<\/h2>\n<h3>4.1 4.1 N\u00e9cessit\u00e9 du tri pr\u00e9alable pour le traitement group\u00e9<\/h3>\n<p>D\u00e8s lors que l&rsquo;objectif analytique d\u00e9passe la simple num\u00e9rotation globale pour s&rsquo;orienter vers une indexation stratifi\u00e9e ou intra-groupe\u2014par exemple, num\u00e9roter les patients au sein de chaque centre hospitalier ou num\u00e9roter les transactions au sein de chaque compte client\u2014, la ma\u00eetrise de l&rsquo;ordonnancement des donn\u00e9es devient une condition sine qua non. Le compilateur SAS, fid\u00e8le \u00e0 sa philosophie de traitement s\u00e9quentiel par flux, ne dispose pas de m\u00e9moire associative native lui permettant d&rsquo;effectuer des calculs d&rsquo;agr\u00e9gation ou de rupture sur des donn\u00e9es dispers\u00e9es al\u00e9atoirement sans un alignement s\u00e9quentiel pr\u00e9alable.<\/p>\n<p>L&rsquo;utilisation de la clause BY au sein de l&rsquo;\u00e9tape DATA impose que les donn\u00e9es d&rsquo;entr\u00e9e soient strictement organis\u00e9es selon les valeurs de la variable de regroupement. Si l&rsquo;interpr\u00e9teur SAS rencontre une rupture de s\u00e9quence au cours de la lecture d&rsquo;une table non ordonn\u00e9e associ\u00e9e \u00e0 une instruction BY, l&rsquo;ex\u00e9cution s&rsquo;interrompt brutalement et g\u00e9n\u00e8re une erreur critique dans le journal (SAS Log) : <em>ERROR: Data set is not sorted in ascending order<\/em>. Cette contrainte architecturale s\u00e9v\u00e8re garantit en contrepartie une vitesse d&rsquo;ex\u00e9cution optimale et une consommation de m\u00e9moire vive constante, dans la mesure o\u00f9 le syst\u00e8me n&rsquo;a jamais besoin de conserver en m\u00e9moire plus d&rsquo;une observation \u00e0 la fois pour statuer sur les fronti\u00e8res de chaque groupe.<\/p>\n<p>L&rsquo;algorithme sous-jacent de la proc\u00e9dure standard <a rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/proc\/61895\/HTML\/default\/viewer.htm#a000146960.htm\">PROC SORT<\/a> assure une stabilit\u00e9 d&rsquo;ordonnancement indispensable pour la reproductibilit\u00e9 scientifique. Lorsque des observations poss\u00e8dent des valeurs identiques sur la cl\u00e9 de tri sp\u00e9cifi\u00e9e, le respect de l&rsquo;ordre d&rsquo;origine ou l&rsquo;application de cl\u00e9s de tri secondaires permet de lever toute ind\u00e9termination math\u00e9matique. Ainsi, le passage syst\u00e9matique par une \u00e9tape de tri contr\u00f4l\u00e9e constitue le point de d\u00e9part incontournable de tout pipeline de donn\u00e9es SAS impliquant une logique d&rsquo;indexation conditionnelle.<\/p>\n<h3>4.2 4.2 Mise en \u0153uvre technique de PROC SORT<\/h3>\n<p>La syntaxe de base de la proc\u00e9dure d&rsquo;ordonnancement PROC SORT s&rsquo;ex\u00e9cute selon une structure d&rsquo;une grande sobri\u00e9t\u00e9 op\u00e9rationnelle :<\/p>\n<p><em>proc sort data=table_brute out=table_triee;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by variable_groupe;<br \/>\nrun;<\/em><\/p>\n<p>L&rsquo;utilisation explicite du param\u00e8tre <em>out=<\/em> est une excellente pratique de programmation d\u00e9fensive. Elle permet d&rsquo;\u00e9viter l&rsquo;\u00e9crasement destructif de la table source originale, autorisant ainsi des comparaisons d&rsquo;audit a posteriori. Lorsque l&rsquo;analyse exige une num\u00e9rotation des observations ordonn\u00e9e selon une grandeur statistique interne au groupe\u2014par exemple, num\u00e9roter les athl\u00e8tes d&rsquo;une franchise de basketball par ordre d\u00e9croissant de performance individuelle\u2014, la hi\u00e9rarchisation des cl\u00e9s de tri multiples devient imp\u00e9rative :<\/p>\n<p><em>proc sort data=resultats_equipes out=equipes_ordonnees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by franchise descending score;<br \/>\nrun;<\/em><\/p>\n<p>Dans ce bloc d&rsquo;instructions, le mot-cl\u00e9 <em>descending<\/em> s&rsquo;applique exclusivement \u00e0 la m\u00e9trique de score qui lui succ\u00e8de imm\u00e9diatement, garantissant que pour chaque franchise, le joueur ayant cumul\u00e9 le plus grand nombre de points appara\u00eetra en t\u00eate de s\u00e9quence dans la table ordonn\u00e9e. Sur le plan de la performance informatique appliqu\u00e9e aux jeux de donn\u00e9es massifs (plusieurs dizaines de gigaoctets), la proc\u00e9dure SORT peut \u00eatre param\u00e9tr\u00e9e \u00e0 l&rsquo;aide d&rsquo;options de compilation avanc\u00e9es telles que TAGSORT. Cette option stocke uniquement les variables d&rsquo;index et l&rsquo;adresse physique des enregistrements dans les tables temporaires de tri, all\u00e9geant drastiquement les op\u00e9rations d&rsquo;entr\u00e9es\/sorties sur les disques durs. De m\u00eame, l&rsquo;option PRESORTED permet d&rsquo;\u00e9viter un cycle complet de tri si le syst\u00e8me de fichiers ou la base de donn\u00e9es source atteste d\u00e9j\u00e0 de la conformit\u00e9 de l&rsquo;ordre requis.<\/p>\n<h2>5. 5. Num\u00e9rotation intra-groupe : logique des variables FIRST. et LAST.<\/h2>\n<h3>5.1 5.1 Fonctionnement interne des variables temporaires g\u00e9n\u00e9r\u00e9es par l&rsquo;instruction BY<\/h3>\n<p>L&rsquo;association de l&rsquo;instruction BY \u00e0 une \u00e9tape DATA transforme radicalement l&rsquo;environnement d&rsquo;ex\u00e9cution du PDV. Pour chaque variable \u00e9num\u00e9r\u00e9e dans l&rsquo;instruction BY, le superviseur d&rsquo;ex\u00e9cution SAS g\u00e9n\u00e8re automatiquement deux variables syst\u00e8me temporaires : FIRST.variable et LAST.variable. \u00c0 l&rsquo;instar de la variable _N_, ces variables d&rsquo;\u00e9tat sont strictement confin\u00e9es \u00e0 la m\u00e9moire vive volatile du PDV et ne sont jamais transf\u00e9r\u00e9es dans la table de donn\u00e9es finale, sauf si le programmeur d\u00e9cide explicitement de copier leur contenu dans une variable personnalis\u00e9e permanente.<\/p>\n<p>Ces variables temporaires fonctionnent comme des drapeaux logiques bool\u00e9ens, prenant exclusivement les valeurs enti\u00e8res 1 (vrai) ou 0 (faux). La variable FIRST.variable prend la valeur 1 lorsque l&rsquo;observation courante constitue la toute premi\u00e8re ligne associ\u00e9e \u00e0 une nouvelle valeur de la variable de regroupement sp\u00e9cifi\u00e9e, et elle prend la valeur 0 pour toutes les observations suivantes appartenant au m\u00eame groupe. R\u00e9ciproquement, LAST.variable prend la valeur 1 lorsque l&rsquo;enregistrement en cours de traitement repr\u00e9sente l&rsquo;ultime observation de la modalit\u00e9 courante de cette m\u00eame variable de groupe, et 0 dans tous les autres cas.<\/p>\n<p>La d\u00e9tection de ces transitions repose sur un m\u00e9canisme de pr\u00e9lecture (look-ahead buffer) op\u00e9r\u00e9 par le moteur SAS. D\u00e8s le traitement de l&rsquo;enregistrement courant, le moteur inspecte la valeur de la ligne suivante dans la table source afin de d\u00e9terminer si une fronti\u00e8re de groupe est franchie. Cette prouesse algorithmique conf\u00e8re au langage SAS une puissance analytique remarquable pour l&rsquo;\u00e9valuation s\u00e9quentielle sans n\u00e9cessiter la mise en cache de l&rsquo;int\u00e9gralit\u00e9 du groupe de donn\u00e9es, garantissant un traitement en temps lin\u00e9aire d&rsquo;une complexit\u00e9 computationnelle th\u00e9orique optimale d&rsquo;ordre O(N).<\/p>\n<h3>5.2 5.2 R\u00e9initialisation du compteur au changement de strate<\/h3>\n<p>L&rsquo;attribution d&rsquo;un num\u00e9ro d&rsquo;observation qui red\u00e9marre \u00e0 1 pour chaque nouvelle sous-population statistique (num\u00e9rotation intra-groupe) s&rsquo;appuie directement sur l&rsquo;interception du marqueur FIRST.variable. Puisque la variable globale _N_ continue de cro\u00eetre de mani\u00e8re univoque sans \u00e9gard pour les fronti\u00e8res cat\u00e9gorielles des sous-groupes, elle ne peut \u00eatre employ\u00e9e directement pour cette t\u00e2che. Il est n\u00e9cessaire de concevoir une variable de comptage d\u00e9di\u00e9e, asservie aux signaux bool\u00e9ens g\u00e9n\u00e9r\u00e9s par l&rsquo;architecture BY-group.<\/p>\n<p>La r\u00e8gle algorithmique fondamentale pour impl\u00e9menter cette r\u00e9initialisation repose sur l&rsquo;\u00e9valuation de la condition logique suivante :<\/p>\n<p><em>if first.variable_groupe then compteur_groupe = 0;<\/em><\/p>\n<p>Ce positionnement conditionnel permet de forcer la remise \u00e0 z\u00e9ro de la cellule m\u00e9moire du compteur d\u00e8s que le moteur d&rsquo;ex\u00e9cution d\u00e9tecte le passage vers une nouvelle modalit\u00e9 cat\u00e9gorielle. Toutefois, pour que ce compteur puisse progresser et incr\u00e9menter sa valeur au fil des enregistrements cons\u00e9cutifs d&rsquo;une m\u00eame strate, l&rsquo;affectation simple ne suffit pas : elle doit \u00eatre imp\u00e9rativement coupl\u00e9e soit \u00e0 une instruction d&rsquo;accumulation implicite, soit au m\u00e9canisme de r\u00e9tention explicite. L&rsquo;absence de ce couplage provoquerait la r\u00e9initialisation de la variable \u00e0 une valeur manquante lors de chaque cycle de l&rsquo;\u00e9tape DATA, an\u00e9antissant toute possibilit\u00e9 de suivi cumulatif intra-strate.<\/p>\n<h2>6. 6. L&rsquo;instruction d&rsquo;addition implicite et le m\u00e9canisme de r\u00e9tention<\/h2>\n<h3>6.1 6.1 D\u00e9composition syntaxique de l&rsquo;instruction d&rsquo;accumulation (row_number + 1)<\/h3>\n<p>Le langage SAS met \u00e0 disposition des d\u00e9veloppeurs une syntaxe compacte et performante, formellement d\u00e9sign\u00e9e sous le nom d&rsquo;instruction de somme (Sum Statement) ou d&rsquo;addition implicite. Cette construction syntaxique se mat\u00e9rialise par l&rsquo;expression math\u00e9matique :<\/p>\n<p><em>compteur + 1;<\/em><\/p>\n<p>Sous cette formulation d&rsquo;une grande sobri\u00e9t\u00e9 textuelle se dissimule une double propri\u00e9t\u00e9 architecturale fondamentale au fonctionnement du PDV. En premier lieu, l&rsquo;instruction de somme impose automatiquement l&rsquo;attribut de r\u00e9tention (RETAIN) \u00e0 la variable situ\u00e9e \u00e0 gauche de l&rsquo;op\u00e9rateur d&rsquo;addition. Cela signifie que la valeur num\u00e9rique stock\u00e9e dans cette variable n&rsquo;est pas r\u00e9initialis\u00e9e \u00e0 une valeur manquante (not\u00e9e &lsquo;.&rsquo;) \u00e0 la fin du cycle d&rsquo;it\u00e9ration de l&rsquo;\u00e9tape DATA, mais demeure pr\u00e9serv\u00e9e en m\u00e9moire vive pour \u00eatre accessible lors du cycle d&rsquo;ex\u00e9cution suivant.<\/p>\n<p>En second lieu, l&rsquo;instruction de somme g\u00e8re de mani\u00e8re autonome l&rsquo;initialisation arithm\u00e9tique. Si l&rsquo;on utilisait l&rsquo;instruction explicite concurrente :<\/p>\n<p><em>retain compteur;<br \/>\ncompteur = compteur + 1;<\/em><\/p>\n<p>et que la variable <em>compteur<\/em> n&rsquo;avait pas \u00e9t\u00e9 pr\u00e9alablement valoris\u00e9e, sa valeur initiale dans le PDV serait une valeur manquante num\u00e9rique. En vertu des r\u00e8gles de l&rsquo;alg\u00e8bre SAS, toute addition appliqu\u00e9e \u00e0 une valeur manquante produit irr\u00e9m\u00e9diablement une valeur manquante (missing value propagation). En revanche, l&rsquo;instruction d&rsquo;accumulation implicite <em>compteur + 1;<\/em> initialise automatiquement la variable \u00e0 z\u00e9ro d\u00e8s la compilation, transformant toute valeur manquante initiale en valeur arithm\u00e9tique neutre pour l&rsquo;addition. Cette gestion native simplifie l&rsquo;\u00e9criture du code et \u00e9limine le risque d&rsquo;\u00e9chec de comptage cons\u00e9cutif \u00e0 une initialisation omise.<\/p>\n<h3>6.2 6.2 Analyse \u00e9tape par \u00e9tape du flux d&rsquo;ex\u00e9cution dans le PDV<\/h3>\n<p>Pour appr\u00e9hender avec rigueur la synchronisation entre la r\u00e9initialisation de fronti\u00e8re et l&rsquo;accumulation s\u00e9quentielle, il est \u00e9clairant de d\u00e9composer la cin\u00e9matique du PDV lors de la lecture de deux enregistrements cons\u00e9cutifs d\u00e9limitant un changement de strate.<\/p>\n<p>Lors de la lecture du premier enregistrement d&rsquo;une nouvelle modalit\u00e9 (par exemple, la premi\u00e8re observation de l&rsquo;\u00e9quipe Spurs apr\u00e8s le traitement de l&rsquo;\u00e9quipe Rockets), l&rsquo;instruction SET charge les donn\u00e9es. Le compilateur \u00e9value le contexte et positionne la variable temporaire FIRST.franchise \u00e0 la valeur 1. Le flux d&rsquo;instructions rencontre ensuite le test conditionnel : <em>if first.franchise then rang_equipe = 0;<\/em>. La condition \u00e9tant valid\u00e9e, la m\u00e9moire du PDV pour <em>rang_equipe<\/em> est imm\u00e9diatement \u00e9cras\u00e9e avec la valeur 0. La ligne de code suivante ex\u00e9cute l&rsquo;instruction de somme implicite : <em>rang_equipe + 1;<\/em>. Le syst\u00e8me prend la valeur courante (0), lui ajoute l&rsquo;incr\u00e9ment de 1, et stocke le r\u00e9sultat 1 dans le PDV. L&rsquo;\u00e9tape DATA atteint sa conclusion, \u00e9crit l&rsquo;enregistrement dans la table cible avec la variable <em>rang_equipe<\/em> valant 1, et boucle vers l&rsquo;it\u00e9ration suivante.<\/p>\n<p>Au d\u00e9but de l&rsquo;it\u00e9ration consacr\u00e9e au second enregistrement des Spurs, l&rsquo;instruction SET charge la nouvelle observation. Le m\u00e9canisme de surveillance BY constate que la franchise est toujours Spurs : par cons\u00e9quent, FIRST.franchise bascule \u00e0 0. Lorsque le flux de contr\u00f4le \u00e9value le test conditionnel <em>if first.franchise then&#8230;<\/em>, la condition est d\u00e9clar\u00e9e fausse, et l&rsquo;instruction de r\u00e9initialisation \u00e0 0 est totalement ignor\u00e9e. La m\u00e9moire du PDV conserve ainsi la valeur 1 h\u00e9rit\u00e9e du cycle pr\u00e9c\u00e9dent gr\u00e2ce \u00e0 la r\u00e9tention implicite. L&rsquo;instruction d&rsquo;accumulation <em>rang_equipe + 1;<\/em> est ensuite \u00e9valu\u00e9e : le syst\u00e8me prend la valeur retenue 1, lui ajoute 1, et met \u00e0 jour le PDV avec la valeur 2. L&rsquo;observation est alors transcrite dans la table de destination. Ce m\u00e9canisme d&rsquo;horlogerie interne se poursuit de mani\u00e8re d\u00e9terministe jusqu&rsquo;\u00e0 l&rsquo;ultime observation du jeu de donn\u00e9es.<\/p>\n<h2>7. 7. Exemple pratique d\u00e9taill\u00e9 : segmentation par \u00e9quipe et m\u00e9triques associ\u00e9es<\/h2>\n<h3>7.1 7.1 Mod\u00e9lisation de la table exp\u00e9rimentale d&rsquo;athl\u00e8tes<\/h3>\n<p>Afin d&rsquo;illustrer la puissance op\u00e9rationnelle de cette m\u00e9thode dans un cadre exp\u00e9rimental contr\u00f4l\u00e9, nous construisons une table SAS de travail repr\u00e9sentative, int\u00e9grant des s\u00e9ries de donn\u00e9es asym\u00e9triques issues de quatre franchises sportives de la NBA (Mavs, Rockets, Spurs, Warriors). Le code d&rsquo;instanciation de cet \u00e9chantillon s&rsquo;\u00e9tablit comme suit :<\/p>\n<p><em>data cohortes_sportives;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;input franchise $ points;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;datalines;<br \/>\nWarriors 110<br \/>\nWarriors 105<br \/>\nMavs 99<br \/>\nMavs 104<br \/>\nSpurs 95<br \/>\nSpurs 98<br \/>\nSpurs 102<br \/>\nRockets 112<br \/>\n;<br \/>\nrun;<\/em><\/p>\n<p>Ce jeu de donn\u00e9es pr\u00e9sente volontairement une structure non ordonn\u00e9e selon les standards alphab\u00e9tiques de la variable <em>franchise<\/em>, ainsi que des effectifs d&rsquo;\u00e9chantillonnage in\u00e9gaux d&rsquo;un groupe \u00e0 l&rsquo;autre : la modalit\u00e9 Warriors comprend 2 observations, Mavs comprend 2 observations, Spurs en compte 3, tandis que Rockets ne comporte qu&rsquo;un unique enregistrement (n=1). Cette variabilit\u00e9 structurelle est id\u00e9ale pour tester la robustesse des algorithmes de r\u00e9initialisation de compteurs s\u00e9quentiels.<\/p>\n<h3>7.2 7.2 Application du script complet de num\u00e9rotation group\u00e9e<\/h3>\n<p>Le traitement complet n\u00e9cessite d&rsquo;encha\u00eener deux \u00e9tapes distinctes : la phase de tri formel via PROC SORT, suivie de l&rsquo;\u00e9tape DATA incorporant la logique BY-group et l&rsquo;instruction de somme. Voici le script d&rsquo;ing\u00e9nierie de donn\u00e9es correspondant :<\/p>\n<p><em>proc sort data=cohortes_sportives out=cohortes_triees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by franchise;<br \/>\nrun;<\/em><\/p>\n<p><em>data cohortes_indexees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set cohortes_triees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by franchise;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if first.franchise then numero_joueur = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;numero_joueur + 1;<br \/>\nrun;<\/em><\/p>\n<p>Dans ce bloc de programmation, la proc\u00e9dure SORT r\u00e9arrange les enregistrements selon l&rsquo;ordre alphab\u00e9tique des \u00e9quipes (Mavs, puis Rockets, puis Spurs, et enfin Warriors). L&rsquo;\u00e9tape DATA lit ensuite s\u00e9quentiellement ce flux ordonn\u00e9. \u00c0 chaque changement de franchise, la variable <em>numero_joueur<\/em> est initialis\u00e9e \u00e0 0 avant d&rsquo;\u00eatre imm\u00e9diatement incr\u00e9ment\u00e9e \u00e0 1, garantissant une num\u00e9rotation intra-groupe continue et exempte d&rsquo;artefacts.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/row2.jpg\" alt=\"\" \/><\/figure>\n<h3>7.3 7.3 Interpr\u00e9tation acad\u00e9mique des r\u00e9sultats obtenus<\/h3>\n<p>L&rsquo;inspection des r\u00e9sultats via la proc\u00e9dure d&rsquo;affichage <em>proc print data=cohortes_indexees; run;<\/em> confirme l&rsquo;exactitude de l&rsquo;attribution des index au sein de chaque groupe. Pour la franchise Mavs, les deux lignes se voient affecter les num\u00e9ros 1 et 2. Pour les Rockets, l&rsquo;observation unique re\u00e7oit la valeur 1. Pour les Spurs, les trois lignes g\u00e9n\u00e8rent la suite 1, 2 et 3. Enfin, pour les Warriors, les observations re\u00e7oivent les valeurs 1 et 2.<\/p>\n<p>D&rsquo;un point de vue m\u00e9thodologique, cette indexation intra-groupe pr\u00e9sente des applications analytiques majeures dans le domaine de l&rsquo;\u00e9chantillonnage statistique. Elle permet notamment d&rsquo;extraire instantan\u00e9ment des sous-\u00e9chantillons \u00e9quilibr\u00e9s, par exemple en s\u00e9lectionnant les <em>n<\/em> premiers individus de chaque strate via une clause logique du type : <em>if numero_joueur &lt;= 2;<\/em>. Elle constitue \u00e9galement le socle technique du calcul des statistiques de rang univari\u00e9es et autorise des op\u00e9rations de transposition horizontale ou verticale sans perte de tra\u00e7abilit\u00e9 des identit\u00e9s individuelles au sein des blocs exp\u00e9rimentaux.<\/p>\n<h2>8. 8. Num\u00e9rotations conditionnelles avanc\u00e9es et hi\u00e9rarchies multiniveaux<\/h2>\n<h3>8.1 8.1 Gestion des structures de donn\u00e9es hi\u00e9rarchiques \u00e0 plusieurs facteurs<\/h3>\n<p>Dans les sch\u00e9mas de recherche \u00e9pid\u00e9miologique ou \u00e9conomique, les jeux de donn\u00e9es pr\u00e9sentent fr\u00e9quemment une structure imbriqu\u00e9e ou hi\u00e9rarchique complexe, par exemple des patients regroup\u00e9s au sein d&rsquo;h\u00f4pitaux, eux-m\u00eames situ\u00e9s dans diff\u00e9rentes r\u00e9gions g\u00e9ographiques. Le langage SAS permet d&rsquo;\u00e9tendre la logique des variables FIRST. et LAST. \u00e0 des niveaux d&rsquo;arborescence multiples via l&rsquo;instruction BY multi-factorielle :<\/p>\n<p><em>proc sort data=donnees_multiniveaux;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by region hopital patient;<br \/>\nrun;<\/em><\/p>\n<p><em>data hierarchie_indexee;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set donnees_multiniveaux;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by region hopital;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if first.region then index_region + 1;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if first.hopital then index_hopital_dans_region = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;index_hopital_dans_region + 1;<br \/>\nrun;<\/em><\/p>\n<p>Une r\u00e8gle architecturale critique r\u00e9git l&rsquo;\u00e9valuation hi\u00e9rarchique des variables automatiques FIRST.variable dans SAS : si une variable de niveau sup\u00e9rieur dans l&rsquo;instruction BY change de valeur (par exemple, transition vers une nouvelle <em>region<\/em>), la variable syst\u00e8me FIRST. correspondante prend la valeur 1, mais toutes les variables FIRST. des niveaux subordonn\u00e9s (ici <em>first.hopital<\/em>) prennent \u00e9galement et obligatoirement la valeur 1, m\u00eame si la cha\u00eene textuelle ou l&rsquo;identifiant de l&rsquo;h\u00f4pital venait fortuitement \u00e0 co\u00efncider d&rsquo;une r\u00e9gion \u00e0 l&rsquo;autre. Cette cascade logique interne garantit l&rsquo;\u00e9tanch\u00e9it\u00e9 des fronti\u00e8res hi\u00e9rarchiques et pr\u00e9vient toute contamination des compteurs subordonn\u00e9s \u00e0 travers les strates m\u00e8res.<\/p>\n<h3>8.2 8.2 Num\u00e9rotation filtr\u00e9e selon des crit\u00e8res statistiques<\/h3>\n<p>Il est parfois n\u00e9cessaire de restreindre l&rsquo;attribution d&rsquo;un num\u00e9ro d&rsquo;observation \u00e0 une sous-population v\u00e9rifiant des contraintes quantitatives rigoureuses\u2014comme un seuil de score minimal ou une compliance clinique\u2014tout en conservant l&rsquo;exhaustivit\u00e9 du jeu de donn\u00e9es dans la table finale. Ce cas d&rsquo;usage requiert une disjonction stricte entre le flux global d&rsquo;\u00e9criture des enregistrements et l&rsquo;\u00e9valuation conditionnelle du compteur :<\/p>\n<p><em>data cohortes_filtrees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set cohortes_triees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if points &gt;= 100 then do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compteur_haute_performance + 1;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;end;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;else do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compteur_haute_performance = .;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;end;<br \/>\nrun;<\/em><\/p>\n<p>Dans ce sc\u00e9nario, seules les observations franchissant le seuil critique m\u00e9trique de 100 points incr\u00e9mentent la variable <em>compteur_haute_performance<\/em>. Pour les observations non conformes au crit\u00e8re statistique, le programme assigne explicitement une valeur manquante (.), sans alt\u00e9rer la progression du compteur pour les observations ult\u00e9rieures satisfaisant le crit\u00e8re. Cette approche permet de construire des r\u00e9pertoires d&rsquo;observations index\u00e9es conditionnellement sans d\u00e9structurer l&rsquo;alignement matriciel initial de la base de donn\u00e9es de recherche.<\/p>\n<h2>9. 9. Approche alternative via le langage SQL sous SAS (PROC SQL)<\/h2>\n<h3>9.1 9.1 Utilisation de la fonction non document\u00e9e MONOTONIC()<\/h3>\n<p>Bien que l&rsquo;\u00e9tape DATA constitue l&rsquo;outil historique et idiomatique par excellence de l&rsquo;\u00e9cosyst\u00e8me SAS, de nombreux ing\u00e9nieurs de donn\u00e9es habitu\u00e9s \u00e0 la syntaxe SQL sollicitent r\u00e9guli\u00e8rement la proc\u00e9dure <a rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/sqlproc\/62234\/HTML\/default\/viewer.htm#titlepage.htm\">PROC SQL<\/a> pour manipuler les tables. Au sein de cette proc\u00e9dure, il existe une fonction sp\u00e9cifique, connue sous le nom de <em>monotonic()<\/em>, qui permet de g\u00e9n\u00e9rer un entier s\u00e9quentiel croissant sans avoir recours aux boucles de l&rsquo;\u00e9tape DATA :<\/p>\n<p><em>proc sql;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;create table donnees_sql_index as<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;select monotonic() as numero_ligne, *<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;from resultats_equipes;<br \/>\nquit;<\/em><\/p>\n<p>Cette formulation s\u00e9duit par sa concision textuelle et son \u00e9l\u00e9gance d\u00e9clarative. Toutefois, d&rsquo;un point de vue acad\u00e9mique et r\u00e9glementaire, il est capital de souligner que la fonction <em>monotonic()<\/em> n&rsquo;est pas officiellement document\u00e9e ni formellement support\u00e9e par l&rsquo;\u00e9diteur SAS Institute pour les environnements de production critique. Dans des requ\u00eates complexes impliquant des clauses WHERE, des regroupements GROUP BY, des sous-requ\u00eates imbriqu\u00e9es ou des jointures multiples, l&rsquo;ordre d&rsquo;\u00e9valuation interne de l&rsquo;optimiseur de requ\u00eates SQL peut conduire \u00e0 des r\u00e9sultats impr\u00e9visibles, tels que des sauts de num\u00e9rotation, des doublons d&rsquo;index ou des r\u00e9initialisations inopin\u00e9es du compteur en cours de traitement. Son emploi doit donc demeurer cantonn\u00e9 \u00e0 l&rsquo;exploration interactive rapide et proscrit des pipelines de validation clinique certifi\u00e9s.<\/p>\n<h3>9.2 9.2 Simulation d&rsquo;indexation group\u00e9e en SQL ANSI sous SAS<\/h3>\n<p>Pour impl\u00e9menter une num\u00e9rotation intra-groupe rigoureuse et enti\u00e8rement conforme aux standards de l&rsquo;ANSI SQL sans recourir \u00e0 l&rsquo;\u00e9tape DATA ni aux fonctions non document\u00e9es, l&rsquo;analyste doit mettre en \u0153uvre une auto-jointure non \u00e9quitable (non-equi self-join) coupl\u00e9e \u00e0 une fonction d&rsquo;agr\u00e9gation COUNT. Consid\u00e9rons le cas d&rsquo;application suivant sur notre table d&rsquo;\u00e9quipes sportives :<\/p>\n<p><em>proc sql;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;create table sql_rang_equipe as<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;select a.franchise, a.score,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count(b.score) as rang_intra_groupe<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;from cohortes_sportives a<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;inner join cohortes_sportives b<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;on a.franchise = b.franchise<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and a.score &lt;= b.score<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;group by a.franchise, a.score;<br \/>\nquit;<\/em><\/p>\n<p>Cette formulation purement d\u00e9clarative g\u00e9n\u00e8re un rang d&rsquo;observation en comptant le nombre d&rsquo;\u00e9l\u00e9ments au sein de la m\u00eame franchise poss\u00e9dant un score sup\u00e9rieur ou \u00e9gal \u00e0 l&rsquo;enregistrement \u00e9valu\u00e9. Bien que th\u00e9oriquement robuste, cette m\u00e9thodologie pr\u00e9sente une complexit\u00e9 computationnelle quadratique d&rsquo;ordre O(N^2) par groupe d&rsquo;agr\u00e9gation. Sur des tables contenant des centaines de milliers de lignes, cette approche g\u00e9n\u00e8re une surcharge exponentielle de temps de calcul CPU et d&rsquo;espace de m\u00e9moire temporaire, soulignant la sup\u00e9riorit\u00e9 architecturale incontestable de l&rsquo;\u00e9tape DATA native (en complexit\u00e9 lin\u00e9aire O(N)) pour ce type d&rsquo;ing\u00e9nierie statistique.<\/p>\n<h2>10. 10. Analyse comparative des performances et optimisation des ressources<\/h2>\n<h3>10.1 10.1 Efficacit\u00e9 computationnelle sur les jeux de donn\u00e9es massifs<\/h3>\n<p>L&rsquo;\u00e9valuation des performances sur des volum\u00e9tries massives de donn\u00e9es (Big Data) r\u00e9v\u00e8le des disparit\u00e9s majeures entre les diff\u00e9rentes approches m\u00e9thodologiques d&rsquo;indexation sous SAS. Pour quantifier ces \u00e9carts, il convient d&rsquo;analyser la consommation des ressources selon trois axes fondamentaux : l&rsquo;utilisation du processeur (temps CPU), la dur\u00e9e d&rsquo;horloge r\u00e9elle (temps r\u00e9el \u00e9coul\u00e9 ou Elapsed Time) et les op\u00e9rations d&rsquo;entr\u00e9es\/sorties (I\/O) sur les syst\u00e8mes de stockage.<\/p>\n<p>L&rsquo;\u00e9tape DATA utilisant l&rsquo;instruction <em>numero_ligne = _N_;<\/em> ou le compteur \u00e0 somme implicite <em>compteur + 1;<\/em> pr\u00e9sente le co\u00fbt computationnel le plus faible de l&rsquo;ensemble de l&rsquo;\u00e9cosyst\u00e8me SAS. Sa consommation de m\u00e9moire vive demeure infinit\u00e9simale et constante, car la taille du PDV est fix\u00e9e d\u00e8s la phase de compilation. En revanche, les requ\u00eates PROC SQL n\u00e9cessitent l&rsquo;instanciation de tables de tri temporaires dans l&rsquo;espace SASWORK et mobilisent des algorithmes d&rsquo;appariement en m\u00e9moire qui saturent rapidement les caches processeur lorsque la table d\u00e9passe plusieurs gigaoctets.<\/p>\n<p>Pour optimiser le traitement lors de l&rsquo;indexation de tables massives, il est crucial de restreindre le dimensionnement du PDV au strict minimum n\u00e9cessaire en utilisant les options de filtrage de colonnes KEEP= ou DROP=. De plus, si la table d&rsquo;entr\u00e9e est d\u00e9j\u00e0 physiquement ordonn\u00e9e sur le disque (par exemple en provenance d&rsquo;un flux s\u00e9quentiel chronologique), l&rsquo;utilisation du mot-cl\u00e9 <em>notsorted<\/em> au sein de l&rsquo;instruction BY permet d&rsquo;exploiter les variables FIRST. et LAST. sans subir le co\u00fbt computationnel prohibitif d&rsquo;un passage pr\u00e9alable par la proc\u00e9dure PROC SORT :<\/p>\n<p><em>data table_optimisee;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set table_chronologique;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by variable_groupe notsorted;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if first.variable_groupe then rang_groupe = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;rang_groupe + 1;<br \/>\nrun;<\/em><\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/row3.jpg\" alt=\"\" \/><\/figure>\n<h3>10.2 10.2 Bonnes pratiques d&rsquo;ing\u00e9nierie de donn\u00e9es en contexte de recherche<\/h3>\n<p>Dans un centre de recherche acad\u00e9mique ou un d\u00e9partement d&rsquo;\u00e9tudes biom\u00e9dicales, la robustesse du code doit toujours s&rsquo;accompagner d&rsquo;une rigueur documentaire irr\u00e9prochable. L&rsquo;adjonction d&rsquo;une colonne de num\u00e9rotation s\u00e9quentielle ne doit jamais \u00eatre effectu\u00e9e au d\u00e9triment de l&rsquo;int\u00e9grit\u00e9 des m\u00e9tadonn\u00e9es du jeu de donn\u00e9es h\u00f4te. Chaque variable d&rsquo;index g\u00e9n\u00e9r\u00e9e doit \u00eatre explicitement qualifi\u00e9e au moyen d&rsquo;une instruction LABEL afin de documenter sa finalit\u00e9 au sein des outils de catalogage de donn\u00e9es :<\/p>\n<p><em>label numero_ligne = \u00ab\u00a0Identifiant s\u00e9quentiel unique d&rsquo;auditabilit\u00e9 protocolaire\u00a0\u00bb;<\/em><\/p>\n<p>Par ailleurs, lors de la cr\u00e9ation de tables volumineuses index\u00e9es, l&rsquo;activation de la compression binaire via l&rsquo;option d&rsquo;ensemble de donn\u00e9es <em>compress=yes<\/em> ou <em>compress=binary<\/em> s&rsquo;av\u00e8re particuli\u00e8rement judicieuse. L&rsquo;introduction d&rsquo;une variable num\u00e9rique de type flottant double pr\u00e9cision (8 octets par ligne) peut augmenter sensiblement le volume d&rsquo;occupation sur disque d&rsquo;un jeu de donn\u00e9es contenant des dizaines de millions d&rsquo;enregistrements. L&rsquo;algorithme de compression SAS permet d&rsquo;absorber l&#8217;empreinte physique de cette nouvelle variable sans d\u00e9grader la bande passante lors des op\u00e9rations d&rsquo;E\/S ult\u00e9rieures.<\/p>\n<h2>11. 11. Diagnostic des erreurs fr\u00e9quentes et techniques de d\u00e9bogage<\/h2>\n<h3>11.1 11.1 Erreurs de positionnement de l&rsquo;instruction d&rsquo;affectation<\/h3>\n<p>L&rsquo;une des anomalies les plus pernicieuses observ\u00e9es dans le code produit par les analystes d\u00e9butants concerne le conflit temporel entre l&rsquo;attribution de la variable syst\u00e8me _N_ et les instructions conditionnelles d&rsquo;\u00e9limination d&rsquo;enregistrements. Consid\u00e9rons le cas d&rsquo;\u00e9cole probl\u00e9matique suivant :<\/p>\n<p><em>data echantillon_biaise;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set donnees_initiales;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if statut = \u00ab\u00a0Incomplet\u00a0\u00bb then delete;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;id_ligne = _N_;<br \/>\nrun;<\/em><\/p>\n<p>Dans ce sc\u00e9nario, le programmeur souhaite \u00e9liminer les observations incompl\u00e8tes tout en attribuant un num\u00e9ro de ligne continu aux observations retenues. Or, ce script produit une anomalie majeure : des ruptures de s\u00e9quence et des sauts de num\u00e9rotation au sein de la colonne <em>id_ligne<\/em>. En effet, la variable _N_ s&rsquo;incr\u00e9mente \u00e0 chaque passage de la boucle principale de l&rsquo;\u00e9tape DATA, y compris pour les observations portant le statut \u00ab\u00a0Incomplet\u00a0\u00bb. Lorsque l&rsquo;instruction DELETE s&rsquo;ex\u00e9cute, l&rsquo;\u00e9criture de la ligne est annul\u00e9e, mais le compteur _N_ a d\u00e9j\u00e0 progress\u00e9. La prochaine observation conserv\u00e9e se voit donc affecter une valeur de _N_ qui saute par-dessus les it\u00e9rations supprim\u00e9es.<\/p>\n<p>Pour r\u00e9soudre rigoureusement cette anomalie et obtenir une s\u00e9quence parfaitement continue d&rsquo;entiers cons\u00e9cutifs sans saut, il est imp\u00e9ratif de dissocier le comptage de la variable d&rsquo;it\u00e9ration _N_ et de s&rsquo;appuyer sur l&rsquo;instruction de somme implicite post-filtrage :<\/p>\n<p><em>data echantillon_corrige;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set donnees_initiales;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if statut ne \u00ab\u00a0Incomplet\u00a0\u00bb;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;id_ligne + 1;<br \/>\nrun;<\/em><\/p>\n<p>Ici, le filtrage par l&rsquo;instruction de sous-ensemble IF s&rsquo;op\u00e8re en amont absolu. Si la condition n&rsquo;est pas valid\u00e9e, l&rsquo;ex\u00e9cution s&rsquo;interrompt imm\u00e9diatement pour la ligne courante sans atteindre l&rsquo;instruction d&rsquo;addition. L&rsquo;incr\u00e9ment de la variable <em>id_ligne<\/em> n&rsquo;a lieu que pour les enregistrements effectivement valid\u00e9s et \u00e9crits dans la table finale, restaurant ainsi une s\u00e9quentialit\u00e9 continue et exempte de discontinuit\u00e9s d&rsquo;indice.<\/p>\n<h3>11.2 11.2 Mauvaise manipulation des donn\u00e9es group\u00e9es et contournements<\/h3>\n<p>Dans le traitement des donn\u00e9es group\u00e9es, l&rsquo;omission la plus fr\u00e9quente r\u00e9side dans l&rsquo;oubli de la r\u00e9initialisation du compteur lors de la premi\u00e8re observation d&rsquo;un groupe. Si l&rsquo;analyste utilise l&rsquo;instruction <em>rang + 1;<\/em> sous une clause BY sans ins\u00e9rer au pr\u00e9alable l&rsquo;instruction <em>if first.variable then rang = 0;<\/em>, le syst\u00e8me maintient la r\u00e9tention de la variable d&rsquo;un groupe \u00e0 l&rsquo;autre sans jamais la remettre \u00e0 z\u00e9ro. Il en r\u00e9sulte un compteur global cumulatif d\u00e9guis\u00e9, ruinant l&rsquo;objectif d&rsquo;une num\u00e9rotation intra-groupe \u00e9tanche.<\/p>\n<p>Pour diagnostiquer ces anomalies de comportement au sein du PDV lors de d\u00e9veloppements complexes, SAS met \u00e0 disposition des instructions de tra\u00e7abilit\u00e9 en temps r\u00e9el via l&rsquo;instruction PUT et le journal syst\u00e8me (SAS Log). L&rsquo;insertion de points de contr\u00f4le permet d&rsquo;afficher l&rsquo;\u00e9tat exact des variables internes \u00e0 chaque it\u00e9ration :<\/p>\n<p><em>put \u00ab\u00a0DEBUG: It\u00e9ration=\u00a0\u00bb _N_ \u00a0\u00bb Groupe=\u00a0\u00bb franchise \u00a0\u00bb FIRST=\u00a0\u00bb first.franchise \u00a0\u00bb Rang=\u00a0\u00bb rang_joueur;<\/em><\/p>\n<p>Pour les pipelines industriels hautement critiques, l&rsquo;environnement SAS propose \u00e9galement le mode interactif de d\u00e9bogage de l&rsquo;\u00e9tape DATA, activable en ins\u00e9rant l&rsquo;option <em>\/ debug<\/em> sur l&rsquo;instruction DATA. Ce mode permet d&rsquo;ex\u00e9cuter le code pas \u00e0 pas, d&rsquo;inspecter visuellement le contenu dynamique de chaque adresse m\u00e9moire du PDV et de d\u00e9tecter imm\u00e9diatement les \u00e9crasements accidentels de compteurs ou les mauvais embranchements conditionnels.<\/p>\n<h2>12. 12. Synth\u00e8se pratique et recommandations pour une recherche reproductible<\/h2>\n<h3>12.1 12.1 Matrice d\u00e9cisionnelle pour le choix de la m\u00e9thode d&rsquo;indexation<\/h3>\n<p>Le choix de la m\u00e9thodologie appropri\u00e9e pour ajouter des num\u00e9ros de ligne dans l&rsquo;environnement SAS doit r\u00e9sulter d&rsquo;un arbitrage rigoureux entre la typologie des donn\u00e9es, les objectifs de l&rsquo;analyse statistique et les contraintes computationnelles de l&rsquo;infrastructure d&rsquo;h\u00e9bergement. Le tableau ci-dessous synth\u00e9tise les propri\u00e9t\u00e9s m\u00e9trologiques et les conditions optimales de mise en \u0153uvre de chaque approche explor\u00e9e :<\/p>\n<table>\n<thead>\n<tr>\n<th>M\u00e9thode SAS<\/th>\n<th>Type d&rsquo;indexation<\/th>\n<th>Complexit\u00e9 algorithmique<\/th>\n<th>Fiabilit\u00e9 en production<\/th>\n<th>Cas d&rsquo;usage privil\u00e9gi\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>_N_ direct<\/strong><\/td>\n<td>Globale \/ Absolue<\/td>\n<td>O(N) &#8211; Lin\u00e9aire optimale<\/td>\n<td>Maximale certifi\u00e9e<\/td>\n<td>Indexation s\u00e9quentielle globale de tables brutes sans filtres conditionnels IF complexes.<\/td>\n<\/tr>\n<tr>\n<td><strong>Compteur implicite (Sum statement)<\/strong><\/td>\n<td>Globale filtr\u00e9e ou Intra-groupe<\/td>\n<td>O(N) &#8211; Lin\u00e9aire optimale<\/td>\n<td>Maximale certifi\u00e9e<\/td>\n<td>Num\u00e9rotation apr\u00e8s exclusions de donn\u00e9es et indexation stratifi\u00e9e via BY-groups.<\/td>\n<\/tr>\n<tr>\n<td><strong>PROC SQL : monotonic()<\/strong><\/td>\n<td>Globale<\/td>\n<td>O(N) th\u00e9orique<\/td>\n<td>Non recommand\u00e9e (Non document\u00e9e)<\/td>\n<td>Requ\u00eates SQL interactives rapides ad hoc hors environnements r\u00e9glement\u00e9s.<\/td>\n<\/tr>\n<tr>\n<td><strong>PROC SQL : Auto-jointure<\/strong><\/td>\n<td>Intra-groupe \/ Rangs<\/td>\n<td>O(N^2) &#8211; Quadratique<\/td>\n<td>Norm\u00e9e ANSI SQL<\/td>\n<td>Environnements purement d\u00e9claratifs sur tables de dimensions restreintes.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Pour les protocoles d&rsquo;essais cliniques, les cohortes \u00e9pid\u00e9miologiques longitudinales et les \u00e9tudes de bio\u00e9quivalence, la combinaison de l&rsquo;\u00e9tape DATA native, de la clause BY et de l&rsquo;instruction de somme implicite repr\u00e9sente la r\u00e9f\u00e9rence m\u00e9thodologique absolue (gold standard). Elle offre une reproductibilit\u00e9 math\u00e9matique totale, insensible aux variations mat\u00e9rielles ou aux versions ult\u00e9rieures de l&rsquo;interpr\u00e9teur SAS.<\/p>\n<h3>12.2 12.2 Mod\u00e8le de code standardis\u00e9 r\u00e9utilisable<\/h3>\n<p>Dans une optique d&rsquo;industrialisation du code et de standardisation des pratiques d&rsquo;ing\u00e9nierie statistique, il est particuli\u00e8rement efficace d&rsquo;encapsuler la logique d&rsquo;indexation au sein d&rsquo;une macro-commande SAS param\u00e9trable. Ce composant logiciel r\u00e9utilisable automatise la d\u00e9tection des regroupements, le tri pr\u00e9alable et la s\u00e9curisation des compteurs :<\/p>\n<p><em>%macro AjouterNumerotation(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;table_entree=,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;table_sortie=,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;var_index=numero_ligne,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;var_groupe=,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;var_ordre=<br \/>\n);<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;%if %length(&amp;var_groupe) &gt; 0 %then %do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc sort data=&amp;table_entree out=work._tmp_sorted;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by &amp;var_groupe &amp;var_ordre;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data &amp;table_sortie;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retain &amp;var_index;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set work._tmp_sorted;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by &amp;var_groupe;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if first.&amp;var_groupe then &amp;var_index = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;var_index + 1;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label &amp;var_index = \u00ab\u00a0Num\u00e9ro d&rsquo;observation intra-groupe (&amp;var_groupe)\u00a0\u00bb;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc datasets library=work nolist;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete _tmp_sorted;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quit;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%end;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%else %do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data &amp;table_sortie;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retain &amp;var_index;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set &amp;table_entree;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;var_index + 1;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label &amp;var_index = \u00ab\u00a0Num\u00e9ro d&rsquo;observation s\u00e9quentiel absolu\u00a0\u00bb;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%end;<\/p>\n<p>%mend AjouterNumerotation;<\/em><\/p>\n<p>Cette architecture macro analytique \u00e9value dynamiquement les param\u00e8tres fournis : en l&rsquo;absence de variable de regroupement, elle g\u00e9n\u00e8re une indexation globale continue \u00e0 l&rsquo;aide de l&rsquo;instruction de somme implicite ; lorsqu&rsquo;une variable de groupe est fournie, elle orchestre automatiquement l&rsquo;ordonnancement via PROC SORT, d\u00e9ploie les balises conditionnelles de groupe, documente la colonne r\u00e9sultante et nettoie les tables temporaires g\u00e9n\u00e9r\u00e9es dans la biblioth\u00e8que de travail WORK. L&rsquo;adoption de tels patrons d&rsquo;architecture logicielle garantit la maintenabilit\u00e9 \u00e0 long terme de vos processus analytiques et hisse vos pratiques de traitement des donn\u00e9es sous SAS aux plus hauts standards de rigueur scientifique et technique.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Cody, R. (2018). <em>Learning SAS by Example: A Programmer&rsquo;s Guide<\/em> (2nd ed.). SAS Institute Inc. <a rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/books.html\">https:\/\/support.sas.com\/en\/books.html<\/a><\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6th ed.). SAS Institute Inc.<\/li>\n<li>Food and Drug Administration. (2003). <em>Guidance for Industry: Part 11, Electronic Records; Electronic Signatures \u2014 Scope and Application<\/em>. U.S. Department of Health and Human Services. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\/regulatory-information\/search-fda-guidance-documents\/part-11-electronic-records-electronic-signatures-scope-and-application\">https:\/\/www.fda.gov\/regulatory-information\/search-fda-guidance-documents\/part-11-electronic-records-electronic-signatures-scope-and-application<\/a><\/li>\n<li>SAS Institute Inc. (2020). <em>SAS(R) 9.4 Statements: Reference<\/em>. SAS Institute Inc. <a rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/titlepage.htm\">https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/titlepage.htm<\/a><\/li>\n<li>SAS Institute Inc. (2021). <em>Base SAS(R) 9.4 Procedures Guide: Statistical Procedures<\/em> (4th ed.). SAS Institute Inc. <a rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/proc\/titlepage.htm\">https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/proc\/titlepage.htm<\/a><\/li>\n<li>SAS Institute Inc. (2023). <em>SAS SQL Procedure User&rsquo;s Guide<\/em>. SAS Institute Inc. <a rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/sqlproc\/62234\/HTML\/default\/viewer.htm#titlepage.htm\">https:\/\/support.sas.com\/documentation\/cdl\/en\/sqlproc\/62234\/HTML\/default\/viewer.htm#titlepage.htm<\/a><\/li>\n<li>Whitlock, I. (2007). <em>Categorizing and Ordering Data with SAS BY-Group Processing<\/em>. Proceedings of the SAS Global Forum 2007 Conference.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour ajouter des num\u00e9ros de ligne dans SAS : utilisation de _N_, traitement par groupe avec FIRST. et alternatives avanc\u00e9es avec exemples.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,9499],"tags":[10195,10613,10611,235,10612],"class_list":["post-9548","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-sas","tag-etape-data","tag-numerotation-de-ligne","tag-proc-sort","tag-sas","tag-vecteur-de-donnees-de-programme"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9548"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9548\/revisions"}],"predecessor-version":[{"id":9552,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9548\/revisions\/9552"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}