{"id":9573,"date":"2026-10-14T18:02:33","date_gmt":"2026-10-14T18:02:33","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/sas-comment-selectionner-les-observations-qui-ne-sont-pas-nulles\/"},"modified":"2026-10-14T18:02:33","modified_gmt":"2026-10-14T18:02:33","slug":"sas-comment-selectionner-les-observations-qui-ne-sont-pas-nulles","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=sas-comment-selectionner-les-observations-qui-ne-sont-pas-nulles","title":{"rendered":"SAS : Comment s\u00e9lectionner les observations qui ne sont pas nulles"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;analyse statistique avanc\u00e9e, du traitement de donn\u00e9es massives et de l&rsquo;\u00e9conom\u00e9trie appliqu\u00e9e, l&rsquo;environnement logiciel SAS (Statistical Analysis System) s&rsquo;est impos\u00e9 depuis plusieurs d\u00e9cennies comme une r\u00e9f\u00e9rence incontournable au sein des institutions de recherche, des agences gouvernementales et des grandes industries r\u00e9glement\u00e9es telles que la pharmacovigilance, la banque et l&rsquo;assurance. La robustesse de ce syst\u00e8me repose sur sa capacit\u00e9 \u00e0 traiter de mani\u00e8re d\u00e9terministe et rigoureuse des volumes consid\u00e9rables d&rsquo;informations structur\u00e9es, tout en offrant une tra\u00e7abilit\u00e9 totale des flux de calcul. N\u00e9anmoins, la validit\u00e9 empirique et la fiabilit\u00e9 des conclusions inf\u00e9rentielles issues de ces analyses d\u00e9pendent en premier lieu de la qualit\u00e9 intrins\u00e8que du nettoyage des donn\u00e9es, op\u00e9ration pr\u00e9alable indispensable dont la s\u00e9lection des observations non nulles constitue l&rsquo;un des piliers m\u00e9thodologiques les plus critiques.<\/p>\n<p>L&rsquo;omnipr\u00e9sence des donn\u00e9es incompl\u00e8tes repr\u00e9sente un d\u00e9fi r\u00e9current pour les statisticiens et les ing\u00e9nieurs de donn\u00e9es. Qu&rsquo;elles r\u00e9sultent d&rsquo;un d\u00e9faut de saisie, d&rsquo;une non-r\u00e9ponse lors d&rsquo;enqu\u00eates d\u00e9mographiques, d&rsquo;une panne d&rsquo;instrumentation dans des dispositifs de captation continue ou de m\u00e9canismes d&rsquo;attrition au cours d&rsquo;essais cliniques longitudinaux, les valeurs manquantes imposent une vigilance particuli\u00e8re. En SAS, la gestion de cette vacuit\u00e9 informationnelle ne se limite pas \u00e0 une simple exclusion m\u00e9canique : elle requiert une compr\u00e9hension aigu\u00eb de l&rsquo;architecture logicielle, des formats de stockage machine, des structures m\u00e9moire sous-jacentes et de la s\u00e9mantique formelle r\u00e9gissant l&rsquo;\u00e9valuation des conditions bool\u00e9ennes. Une manipulation imprudente des crit\u00e8res de s\u00e9lection risque d&rsquo;introduire des distorsions syst\u00e9matiques dans les distributions d&rsquo;\u00e9chantillonnage ou de provoquer des comportements computationnels impr\u00e9vus.<\/p>\n<p>Le pr\u00e9sent article constitue une \u00e9tude exhaustive et d\u00e9taill\u00e9e des m\u00e9thodologies requises pour identifier, filtrer et extraire avec une rigueur absolue les observations non nulles au sein de l&rsquo;\u00e9cosyst\u00e8me SAS. En abordant successivement les fondements th\u00e9oriques de la repr\u00e9sentation binaire des donn\u00e9es manquantes, les syntaxes compar\u00e9es de l&rsquo;\u00e9tape DATA et du module PROC SQL, la gestion diff\u00e9rentielle des types num\u00e9riques et alphanum\u00e9riques, ainsi que les strat\u00e9gies d&rsquo;optimisation algorithmique pour le traitement de volum\u00e9tries massives, ce guide offre une r\u00e9f\u00e9rence compl\u00e8te destin\u00e9e aux chercheurs, data scientists et biostatisticiens soucieux de garantir l&rsquo;int\u00e9grit\u00e9, l&rsquo;efficience et la reproductibilit\u00e9 de leurs protocoles de programmation.<\/p>\n<h2>1. Introduction aux valeurs manquantes et non nulles dans l&rsquo;environnement SAS<\/h2>\n<h3>1.1 Typologie et repr\u00e9sentation des donn\u00e9es manquantes en SAS<\/h3>\n<p>L&rsquo;architecture interne du syst\u00e8me SAS repose sur une diff\u00e9renciation stricte et immuable entre deux cat\u00e9gories fondamentales de variables : les variables num\u00e9riques et les variables alphanum\u00e9riques (caract\u00e8res). Cette distinction \u00e9l\u00e9mentaire engendre des cons\u00e9quences architecturales profondes sur le mode d&rsquo;encodage et la s\u00e9mantique de l&rsquo;absence d&rsquo;information. Pour les grandeurs scalaires num\u00e9riques, cod\u00e9es selon la norme de repr\u00e9sentation en virgule flottante double pr\u00e9cision sur huit octets (standard IEEE 754 adapt\u00e9), l&rsquo;absence de valeur ne se traduit pas par un pointeur nul ou un \u00e9tat ind\u00e9fini g\u00e9n\u00e9ralis\u00e9, mais par une valeur binaire d\u00e9di\u00e9e mat\u00e9rialis\u00e9e \u00e0 l&rsquo;affichage par un point standard (<code>.<\/code>).<\/p>\n<p>Ce point standard constitue la manifestation visible d&rsquo;une configuration de bits sp\u00e9cifique dans laquelle l&rsquo;exposant et la mantisse signalent au moteur analytique que la cellule est d\u00e9pourvue de mesure observable. De surcro\u00eet, SAS enrichit cette notion par l&rsquo;introduction de vingt-sept valeurs manquantes sp\u00e9ciales, d\u00e9sign\u00e9es par le point suivi d&rsquo;un caract\u00e8re alphab\u00e9tique (de <code>.A<\/code> \u00e0 <code>.Z<\/code>) ou par un trait de soulignement (<code>._<\/code>). Cette taxonomie \u00e9tendue permet aux chercheurs de classifier l&rsquo;\u00e9tiologie de l&rsquo;absence de mesure, en distinguant par exemple un refus cat\u00e9gorique de r\u00e9ponse (<code>.R<\/code>) d&rsquo;une omission accidentelle (<code>.O<\/code>) ou d&rsquo;une in\u00e9ligibilit\u00e9 structurelle du sujet (<code>.I<\/code>).<\/p>\n<p>\u00c0 l&rsquo;inverse, le traitement des variables alphanum\u00e9riques ne repose pas sur une valeur sentinelle num\u00e9rique. Une cha\u00eene de caract\u00e8res absente est techniquement encod\u00e9e sous la forme d&rsquo;un vecteur d&rsquo;octets exclusivement compos\u00e9 d&rsquo;espaces simples (code ASCII 32, ou caract\u00e8re hexad\u00e9cimal 0x20). En vertu de la gestion des cha\u00eenes \u00e0 longueur fixe inh\u00e9rente \u00e0 l&rsquo;architecture historique de SAS, une variable de texte d\u00e9clar\u00e9e pour une longueur de vingt caract\u00e8res contiendra exactement vingt espaces si aucune valeur significative ne lui est assign\u00e9e. Cette dichotomie conceptuelle implique que le test de vacuit\u00e9 ne peut \u00eatre appr\u00e9hend\u00e9 de fa\u00e7on identique selon la nature de la variable, les conditions bool\u00e9ennes devant s&rsquo;adapter \u00e0 la r\u00e9alit\u00e9 binaire sous-jacente afin d&rsquo;\u00e9viter toute \u00e9valuation erron\u00e9e lors de la compilation et de l&rsquo;ex\u00e9cution du code.<\/p>\n<h3>1.2 Enjeux \u00e9pist\u00e9mologiques et m\u00e9thodologiques de la s\u00e9lection de donn\u00e9es compl\u00e8tes<\/h3>\n<p>D&rsquo;un point de vue \u00e9pist\u00e9mologique, l&rsquo;exclusion d&rsquo;enregistrements pr\u00e9sentant des donn\u00e9es lacunaires ne constitue jamais un acte neutre sur le plan scientifique. Dans le cadre de l&rsquo;inf\u00e9rence statistique et de l&rsquo;estimation \u00e9conom\u00e9trique, la s\u00e9lection d&rsquo;un sous-ensemble d&rsquo;observations dites \u00ab compl\u00e8tes \u00bb (commun\u00e9ment d\u00e9sign\u00e9e sous l&rsquo;appellation d&rsquo;analyse de cas complets ou <em>complete case analysis<\/em>) repose sur l&rsquo;hypoth\u00e8se sous-jacente forte que les m\u00e9canismes g\u00e9n\u00e9rateurs de l&rsquo;absence de donn\u00e9es rel\u00e8vent d&rsquo;un processus compl\u00e8tement al\u00e9atoire, th\u00e9oris\u00e9 dans la litt\u00e9rature sous le vocable de <a rel=\"noopener noreferrer\" href=\"https:\/\/www.jstor.org\/stable\/2335739\">Missing Completely at Random (MCAR)<\/a>.<\/p>\n<p>Lorsque cette condition d&rsquo;ind\u00e9pendance statistique entre la probabilit\u00e9 de vacuit\u00e9 et les valeurs observ\u00e9es ou non observ\u00e9es n&rsquo;est pas rigoureusement v\u00e9rifi\u00e9e, la suppression des observations incompl\u00e8tes expose le protocole de recherche \u00e0 un biais de s\u00e9lection substantiel. Si les donn\u00e9es manquantes d\u00e9pendent de variables observ\u00e9es (<em>Missing at Random<\/em>, MAR) ou, plus gravement encore, de la valeur manquante elle-m\u00eame (<em>Missing Not at Random<\/em>, MNAR), l&rsquo;\u00e9chantillon tronqu\u00e9 perd sa repr\u00e9sentativit\u00e9 vis-\u00e0-vis de la population cible. Les estimateurs des moindres carr\u00e9s ordinaires ou du maximum de vraisemblance perdent d\u00e8s lors leurs propri\u00e9t\u00e9s asymptotiques de non-biais et de convergence.<\/p>\n<p>Parall\u00e8lement, la r\u00e9duction drastique de la taille effective de l&rsquo;\u00e9chantillon cons\u00e9cutive \u00e0 l&rsquo;\u00e9viction syst\u00e9matique de toute ligne non exhaustive diminue la puissance statistique des tests d&rsquo;hypoth\u00e8ses, augmentant de mani\u00e8re exponentielle le risque d&rsquo;erreur de type II (non-rejet \u00e0 tort de l&rsquo;hypoth\u00e8se nulle). Il devient donc imp\u00e9ratif, dans le cadre de bonnes pratiques de recherche auditables, de documenter pr\u00e9cis\u00e9ment les r\u00e8gles de s\u00e9lection de donn\u00e9es non nulles, de chiffrer l&rsquo;attrition de l&rsquo;\u00e9chantillon \u00e0 chaque \u00e9tape du pipeline et d&rsquo;attester de la non-vacuit\u00e9 des variables selon des crit\u00e8res algorithmiques explicites et reproductibles.<\/p>\n<h3>1.3 Aper\u00e7u comparatif : PROC SQL versus \u00e9tape DATA<\/h3>\n<p>L&rsquo;architecture logicielle de SAS met \u00e0 la disposition des programmeurs deux paradigmes fondamentaux pour l&rsquo;interrogation et la manipulation des donn\u00e9es : l&rsquo;\u00e9tape DATA s\u00e9quentielle imp\u00e9rative et la proc\u00e9dure <code>PROC SQL<\/code> d&rsquo;inspiration d\u00e9clarative. L&rsquo;\u00e9tape DATA op\u00e8re selon un mod\u00e8le it\u00e9ratif explicite, mat\u00e9rialis\u00e9 par le vecteur de donn\u00e9es de programme (<em>Program Data Vector<\/em> ou PDV). Dans cette architecture, les observations sont lues, transform\u00e9es et filtr\u00e9es s\u00e9quentiellement, une par une, au sein d&rsquo;une boucle implicite r\u00e9gie par le moteur d&rsquo;ex\u00e9cution s\u00e9quentiel. Cette approche offre une granularit\u00e9 de contr\u00f4le maximale, permettant d&rsquo;ex\u00e9cuter des instructions conditionnelles complexes, d&rsquo;instancier des variables interm\u00e9diaires ou de diriger conditionnellement des flux vers des tables cibles multiples.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, la proc\u00e9dure <code>PROC SQL<\/code> impl\u00e9mente une variante robuste du standard SQL relationnel, reposant sur une philosophie purement d\u00e9clarative. L&rsquo;utilisateur y sp\u00e9cifie le r\u00e9sultat attendu \u2014 en d\u00e9finissant la projection des colonnes et les pr\u00e9dicats de restriction via les clauses <code>SELECT<\/code> et <code>WHERE<\/code> \u2014 sans d\u00e9crire explicitement la proc\u00e9dure algorithmique de parcours des fichiers. L&rsquo;optimiseur de requ\u00eates SQL de SAS se charge alors d&rsquo;\u00e9laborer un plan d&rsquo;ex\u00e9cution optimal, tirant parti d&rsquo;\u00e9ventuels index et g\u00e9rant de fa\u00e7on transparente les allocations de m\u00e9moire tampon.<\/p>\n<p>Sur le plan de la portabilit\u00e9, <code>PROC SQL<\/code> pr\u00e9sente un avantage ind\u00e9niable pour les \u00e9quipes de recherche \u00e9voluant dans des infrastructures h\u00e9t\u00e9rog\u00e8nes, dans la mesure o\u00f9 les instructions de filtrage de non-vacuit\u00e9 respectent les standards <a rel=\"noopener noreferrer\" href=\"https:\/\/www.iso.org\/standard\/63555.html\">ISO\/IEC 9075 SQL<\/a> couramment exploit\u00e9s dans des syst\u00e8mes de gestion de bases de donn\u00e9es relationnelles comme Oracle, PostgreSQL ou Teradata. N\u00e9anmoins, l&rsquo;\u00e9tape DATA demeure structurellement sup\u00e9rieure d\u00e8s lors qu&rsquo;il s&rsquo;agit d&rsquo;ex\u00e9cuter des traitements de nettoyage en flux tendu sur des tables plates massives n\u00e9cessitant des calculs vectoris\u00e9s ou des lectures parall\u00e8les, gr\u00e2ce \u00e0 une surcharge syntaxique minimale et une consommation pr\u00e9visible des cycles processeur.<\/p>\n<h2>2. Fondements de la fonction MISSING() et son inversion logique<\/h2>\n<h3>2.1 M\u00e9canisme interne et universalit\u00e9 de la fonction MISSING()<\/h3>\n<p>Conscient des difficult\u00e9s induites par la divergence d&rsquo;encodage binaire entre grandeurs scalaires et cha\u00eenes de caract\u00e8res, l&rsquo;\u00e9diteur SAS a introduit dans son moteur de calcul la fonction polymorphique native <code>MISSING()<\/code>. Cette fonction constitue le standard algorithmique absolu pour tester la vacuit\u00e9 d&rsquo;une variable ou d&rsquo;une expression \u00e9valu\u00e9e. Son m\u00e9canisme interne repose sur une analyse pr\u00e9liminaire de l&rsquo;en-t\u00eate de m\u00e9tadonn\u00e9es associ\u00e9 \u00e0 l&rsquo;argument transmis : que la variable soit d\u00e9clar\u00e9e comme un flottant de huit octets ou comme un champ textuel de longueur arbitraire, <code>MISSING()<\/code> applique la r\u00e8gle d&rsquo;\u00e9valuation appropri\u00e9e sans n\u00e9cessiter de conversion explicite de type de la part du programmeur.<\/p>\n<p>Lorsqu&rsquo;elle traite un argument num\u00e9rique, la fonction <code>MISSING()<\/code> examine les bits de configuration de la mantisse et de l&rsquo;exposant. Elle renvoie le bool\u00e9en entier 1 (repr\u00e9sentant la valeur logique VRAI) si la valeur est le point standard (<code>.<\/code>) ou l&rsquo;une quelconque des vingt-sept valeurs manquantes sp\u00e9ciales (<code>._<\/code>, <code>.A<\/code>, &#8230;, <code>.Z<\/code>). Si la cellule contient un nombre r\u00e9el fini, qu&rsquo;il soit n\u00e9gatif, nul ou positif, elle renvoie le bool\u00e9en entier 0 (repr\u00e9sentant FAUX). Lorsqu&rsquo;elle re\u00e7oit un argument de type caract\u00e8re, la fonction inspecte la s\u00e9quence d&rsquo;octets et v\u00e9rifie si celle-ci est exclusivement constitu\u00e9e d&rsquo;espaces ou si elle pr\u00e9sente une longueur nulle, renvoyant 1 dans ces cas et 0 d\u00e8s lors qu&rsquo;un caract\u00e8re non blanc est d\u00e9tect\u00e9.<\/p>\n<p>Cette universalit\u00e9 fait de la fonction <code>MISSING()<\/code> un composant indispensable pour l&rsquo;\u00e9criture d&rsquo;un code source s\u00e9curis\u00e9, robuste et agnostique quant aux conventions d&rsquo;encodage textuel sous-jacentes. Elle garantit une abstraction totale vis-\u00e0-vis des formats de repr\u00e9sentation physique des donn\u00e9es sur les supports de stockage secondaires.<\/p>\n<h3>2.2 L&rsquo;inversion logique avec l&rsquo;op\u00e9rateur NOT<\/h3>\n<p>L&rsquo;identification et l&rsquo;extraction des donn\u00e9es valides, utiles et exploitables exigent d&rsquo;isoler le compl\u00e9mentaire math\u00e9matique de l&rsquo;ensemble des donn\u00e9es manquantes. Cette op\u00e9ration s&rsquo;accomplit par l&rsquo;application de l&rsquo;op\u00e9rateur unaire de n\u00e9gation logique <code>NOT<\/code> (ou son \u00e9quivalent symbolique tilde <code>~<\/code> et point d&rsquo;exclamation <code>!<\/code> selon les configurations de table de caract\u00e8res). L&rsquo;expression syntactique r\u00e9sultante, <code>NOT MISSING(variable)<\/code>, \u00e9value la n\u00e9gation stricte du r\u00e9sultat fourni par la fonction sous-jacente.<\/p>\n<p>Sur le plan de l&rsquo;alg\u00e8bre de Boole appliqu\u00e9e au moteur d&rsquo;ex\u00e9cution SAS, cette expression se comporte de fa\u00e7on parfaitement bivalente : elle ne peut renvoyer que 1 (vrai) si la variable d\u00e9tient une valeur substantielle, ou 0 (faux) si elle est vide. En \u00e9valuant l&rsquo;expression pour un enregistrement donn\u00e9, le processeur de requ\u00eates SAS d\u00e9termine avec certitude si l&rsquo;observation doit \u00eatre retenue dans le cadre du filtrage. L&rsquo;instruction formelle <code>WHERE NOT MISSING(points);<\/code> ou l&rsquo;expression <code>WHERE MISSING(points) = 0;<\/code> neutralisent toute ambigu\u00eft\u00e9 interpr\u00e9tative.<\/p>\n<p>Cette approche par n\u00e9gation unaire \u00e9vite les effets de bord fr\u00e9quents qui se manifestent lors de l&rsquo;utilisation d&rsquo;op\u00e9rateurs arithm\u00e9tiques d&rsquo;in\u00e9galit\u00e9. Dans un syst\u00e8me o\u00f9 les valeurs manquantes poss\u00e8dent un statut ordinal au sein de l&rsquo;architecture de calcul, l&rsquo;inversion logique directe d&rsquo;un pr\u00e9dicat de vacuit\u00e9 constitue la formulation la plus pure sur le plan s\u00e9mantique, \u00e9liminant tout risque de faux positif ou de faux n\u00e9gatif d\u00e9coulant d&rsquo;une conversion de type silencieuse.<\/p>\n<h3>2.3 Avantages comparatifs face aux op\u00e9rateurs relationnels classiques<\/h3>\n<p>De nombreux programmeurs form\u00e9s empiriquement ont pris l&rsquo;habitude d&rsquo;\u00e9crire des filtres d&rsquo;exclusion bas\u00e9s sur des comparaisons directes, telles que <code>var ^= .<\/code> ou <code>var &gt; .<\/code> pour les variables num\u00e9riques, et <code>chaine ^= ''<\/code> ou <code>chaine ^= ' '<\/code> pour les variables alphanum\u00e9riques. Bien que ces formulations puissent sembler fonctionnelles dans des sc\u00e9narios simplistes, elles souffrent de failles m\u00e9thodologiques majeures susceptibles de corrompre l&rsquo;int\u00e9grit\u00e9 de la s\u00e9lection.<\/p>\n<p>En premier lieu, l&rsquo;expression <code>var ^= .<\/code> v\u00e9rifie exclusivement l&rsquo;in\u00e9galit\u00e9 par rapport au point standard. Dans le cas critique o\u00f9 une table de donn\u00e9es \u00e9pid\u00e9miologiques contient des valeurs manquantes sp\u00e9ciales telles que <code>.A<\/code> ou <code>.N<\/code> (utilis\u00e9es pour d\u00e9signer des mesures non r\u00e9alis\u00e9es), la comparaison <code>var ^= .<\/code> sera \u00e9valu\u00e9e \u00e0 VRAI, car dans l&rsquo;ordre de classement interne de SAS, ces valeurs sont distinctes du point standard. En cons\u00e9quence, l&rsquo;observation lacunaire franchira le filtre et sera incluse \u00e0 tort dans les calculs param\u00e9triques, faussant les moyennes, variances et r\u00e9gressions ult\u00e9rieures.<\/p>\n<p>De m\u00eame, pour les donn\u00e9es alphanum\u00e9riques, l&rsquo;\u00e9criture <code>chaine ^= ''<\/code> d\u00e9pend de la mani\u00e8re dont le syst\u00e8me interpr\u00e8te une cha\u00eene vide par rapport \u00e0 un ensemble d&rsquo;espaces ins\u00e9cables ou de caract\u00e8res de contr\u00f4le. La fonction <code>MISSING()<\/code> combin\u00e9e \u00e0 l&rsquo;op\u00e9rateur <code>NOT<\/code> unifie ces deux paradigmes sous une signature unique, \u00e9limine le risque d&rsquo;erreur humaine li\u00e9 \u00e0 la confusion entre types de variables, et assure une maintenabilit\u00e9 p\u00e9renne du code source au sein des \u00e9quipes de d\u00e9veloppement.<\/p>\n<h2>3. Impl\u00e9mentation via PROC SQL : Syntaxe et cas d&rsquo;usage canonique<\/h2>\n<h3>3.1 Structure fondamentale de la requ\u00eate de filtrage<\/h3>\n<p>La mise en \u0153uvre d&rsquo;un pr\u00e9dicat de s\u00e9lection non nulle au sein de la proc\u00e9dure <code>PROC SQL<\/code> r\u00e9pond aux principes stricts de la grammaire SQL d\u00e9clarative. La requ\u00eate fondamentale s&rsquo;articule autour de trois composants majeurs : la clause <code>SELECT<\/code> qui sp\u00e9cifie la liste des champs \u00e0 projeter, la clause <code>FROM<\/code> identifiant la table source physique ou la vue logique interrog\u00e9e, et la clause <code>WHERE<\/code> qui impose la condition de restriction bool\u00e9enne en amont de toute phase d&rsquo;agr\u00e9gation ou de tri.<\/p>\n<p>Dans cet environnement, la d\u00e9tection des lignes valides peut \u00eatre formalis\u00e9e soit au moyen du pr\u00e9dicat standard ANSI SQL <code>IS NOT NULL<\/code>, soit en faisant appel \u00e0 la fonction native <code>NOT MISSING()<\/code> que le compilateur SQL de SAS reconna\u00eet et ex\u00e9cute avec une parfaite efficacit\u00e9. Il convient de clore imp\u00e9rativement la proc\u00e9dure par l&rsquo;instruction <code>QUIT;<\/code> afin de lib\u00e9rer le contexte de thread associ\u00e9 et d&rsquo;achever la transaction au sein de la session de travail active.<\/p>\n<p>L&rsquo;optimiseur de requ\u00eates analyse la clause <code>WHERE<\/code> d\u00e8s la phase d&rsquo;analyse syntaxique. Si la colonne soumise au pr\u00e9dicat de non-vacuit\u00e9 dispose d&rsquo;un index simple ou compos\u00e9 pr\u00e9existant, le moteur SQL peut choisir de parcourir l&rsquo;arbre d&rsquo;indexation pour isoler instantan\u00e9ment les identifiants d&rsquo;enregistrements (RID &#8211; <em>Record Identifiers<\/em>) qualifi\u00e9s, \u00e9vitant ainsi la lecture int\u00e9grale s\u00e9quentielle (<em>table scan<\/em>) du jeu de donn\u00e9es source.<\/p>\n<h3>3.2 Analyse pas \u00e0 pas de l&rsquo;exemple d&rsquo;application<\/h3>\n<p>Afin d&rsquo;illustrer de mani\u00e8re concr\u00e8te l&rsquo;exclusion des valeurs nulles dans une structure relationnelle SAS, consid\u00e9rons la construction d&rsquo;une table d&rsquo;exp\u00e9rimentation nomm\u00e9e <code>DONNEES_TEST<\/code> contenant l&rsquo;\u00e9valuation quantitative des performances d&rsquo;une s\u00e9rie de sujets cliniques identifi\u00e9s par leur code matricule. Certaines observations contiennent des valeurs manquantes standardis\u00e9es sur la m\u00e9trique cible <code>score_clinique<\/code> :<\/p>\n<p>L&rsquo;\u00e9tape pr\u00e9liminaire de saisie g\u00e9n\u00e8re une table comportant cinq enregistrements. Les sujets 101, 102 et 105 disposent d&rsquo;un score num\u00e9rique parfaitement valide (respectivement 45.5, 78.2 et 62.0), tandis que les sujets 103 et 104 pr\u00e9sentent pour l&rsquo;un un point d&rsquo;absence standard (<code>.<\/code>) et pour l&rsquo;autre une valeur manquante sp\u00e9ciale (<code>.D<\/code> pour mesure d\u00e9viante).<\/p>\n<p>L&rsquo;application de la requ\u00eate SQL d&rsquo;extraction s&rsquo;articule comme suit dans le journal d&rsquo;ex\u00e9cution SAS :<\/p>\n<p>L&rsquo;instruction <code>PROC SQL;<\/code> initialise le compilateur. La d\u00e9claration <code>SELECT identifiant, score_clinique FROM DONNEES_TEST WHERE NOT MISSING(score_clinique);<\/code> instruit le moteur de n&rsquo;extraire que les lignes pour lesquelles la fonction renvoie z\u00e9ro avant inversion. Lors de l&rsquo;ex\u00e9cution, les lignes correspondant aux sujets 103 et 104 sont rejet\u00e9es de mani\u00e8re d\u00e9terministe. Le r\u00e9sultat affich\u00e9 dans le visualiseur de donn\u00e9es ou export\u00e9 vers une table fille ne comportera rigoureusement que les trois observations compl\u00e8tes, attestant de la validit\u00e9 de l&rsquo;exclusion.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/null1.jpg\" alt=\"\" \/><\/figure>\n<h3>3.3 Projection s\u00e9lective versus projection globale<\/h3>\n<p>Lors de la r\u00e9daction de la clause <code>SELECT<\/code>, le choix d&rsquo;utiliser l&rsquo;ast\u00e9risque globale (<code>SELECT *<\/code>) ou d&rsquo;\u00e9num\u00e9rer de mani\u00e8re exhaustive les colonnes pertinentes rel\u00e8ve d&rsquo;arbitrages de performance et de gouvernance informatique. La projection globale pr\u00e9sente ind\u00e9niablement un avantage de rapidit\u00e9 d&rsquo;\u00e9criture dans les phases exploratoires d&rsquo;analyse de donn\u00e9es, puisqu&rsquo;elle conserve l&rsquo;int\u00e9gralit\u00e9 du dictionnaire des variables sans exiger une saisie fastidieuse des noms de champs.<\/p>\n<p>Cependant, dans un environnement de production ou lors du traitement de tables massives comptant plusieurs centaines de variables, la projection <code>SELECT *<\/code> induit un gaspillage massif de m\u00e9moire vive et de bande passante d&rsquo;entr\u00e9e\/sortie (I\/O). En for\u00e7ant le syst\u00e8me \u00e0 charger dans la m\u00e9moire tampon (<em>buffer pool<\/em>) l&rsquo;ensemble des colonnes de chaque observation filtr\u00e9e, le temps d&rsquo;ex\u00e9cution global de la requ\u00eate peut cro\u00eetre de mani\u00e8re exponentielle, m\u00eame si la condition de filtrage <code>WHERE NOT MISSING()<\/code> est elle-m\u00eame tr\u00e8s s\u00e9lective.<\/p>\n<p>La projection s\u00e9lective, consistant \u00e0 ne mentionner que les identifiants pivots et les covariables n\u00e9cessaires aux analyses ult\u00e9rieures, permet au moteur SAS de minimiser la taille de l&rsquo;enregistrement logique transf\u00e9r\u00e9 du disque vers la m\u00e9moire vive. Cette pratique garantit en outre la p\u00e9rennit\u00e9 des scripts face \u00e0 d&rsquo;\u00e9ventuelles \u00e9volutions ult\u00e9rieures de la table source, telles que l&rsquo;ajout inopin\u00e9 de nouvelles colonnes volumineuses qui viendraient d\u00e9grader la performance globale des flux sans justification analytique.<\/p>\n<h2>4. Filtrage des donn\u00e9es non nulles avec l&rsquo;\u00e9tape DATA<\/h2>\n<h3>4.1 L&rsquo;instruction WHERE au sein de l&rsquo;\u00e9tape DATA<\/h3>\n<p>L&rsquo;instruction <code>WHERE<\/code> au sein d&rsquo;une \u00e9tape DATA constitue le m\u00e9canisme de filtrage le plus efficient de l&rsquo;architecture s\u00e9quentielle SAS. Son positionnement hi\u00e9rarchique au sein du moteur d&rsquo;ex\u00e9cution lui conf\u00e8re une propri\u00e9t\u00e9 fondamentale : elle op\u00e8re comme un filtre d&rsquo;entr\u00e9e de bas niveau, intervenant directement lors de la lecture des blocs de donn\u00e9es sur le disque physique ou dans la m\u00e9moire tampon, avant m\u00eame que l&rsquo;enregistrement ne soit d\u00e9cod\u00e9 et transf\u00e9r\u00e9 dans le vecteur de donn\u00e9es de programme (<em>Program Data Vector<\/em> ou PDV).<\/p>\n<p>Sur le plan de l&rsquo;optimisation des ressources computationnelles, cette pr\u00e9-s\u00e9lection procure une \u00e9conomie substantielle de cycles d&rsquo;horloge du processeur central (CPU). Les observations qui ne satisfont pas la condition logique <code>WHERE NOT MISSING(nom_variable);<\/code> sont imm\u00e9diatement ignor\u00e9es par le sous-syst\u00e8me d&rsquo;acc\u00e8s aux fichiers, sans subir l&rsquo;initialisation des variables, la r\u00e9initialisation des pointeurs ou le traitement s\u00e9quentiel des instructions de transformation d\u00e9finies dans l&rsquo;\u00e9tape.<\/p>\n<p>De plus, l&rsquo;utilisation de l&rsquo;instruction <code>WHERE<\/code> dans l&rsquo;\u00e9tape DATA b\u00e9n\u00e9ficie d&rsquo;une compatibilit\u00e9 directe avec les m\u00e9canismes d&rsquo;indexation SAS. Si un index existe sur la colonne test\u00e9e, le moteur exploite les structures arborescentes de l&rsquo;index pour cibler exclusivement les enregistrements pertinents, garantissant un d\u00e9bit de traitement maximal, en particulier lorsque le ratio d&rsquo;observations non nulles par rapport \u00e0 la population totale est faible.<\/p>\n<h3>4.2 L&rsquo;instruction de sous-ensemble IF conditionnelle<\/h3>\n<p>\u00c0 c\u00f4t\u00e9 de l&rsquo;instruction <code>WHERE<\/code>, l&rsquo;\u00e9tape DATA met \u00e0 disposition l&rsquo;instruction de sous-ensemble conditionnelle <code>IF<\/code> (commun\u00e9ment appel\u00e9e <em>subsetting IF<\/em>). Contrairement \u00e0 <code>WHERE<\/code>, le <code>IF<\/code> conditionnel intervient de mani\u00e8re tardive dans le cycle de vie de l&rsquo;it\u00e9ration, apr\u00e8s que l&rsquo;observation a \u00e9t\u00e9 extraite de la source de donn\u00e9es, copi\u00e9e dans le PDV et soumise aux \u00e9ventuels calculs arithm\u00e9tiques ou logiques situ\u00e9s en amont dans le script.<\/p>\n<p>L&rsquo;\u00e9valuation <code>IF NOT MISSING(variable_calculee);<\/code> interrompt l&rsquo;ex\u00e9cution de l&rsquo;it\u00e9ration courante pour l&rsquo;observation en cours si la condition est fausse, emp\u00eachant son \u00e9criture dans la table cible par l&rsquo;instruction implicite <code>OUTPUT<\/code> situ\u00e9e \u00e0 la fin de l&rsquo;\u00e9tape, et ordonne au moteur de passer imm\u00e9diatement \u00e0 l&rsquo;observation suivante (instruction implicite <code>RETURN<\/code>). Cette cin\u00e9matique d&rsquo;ex\u00e9cution post-lecture conf\u00e8re au <code>IF<\/code> une flexibilit\u00e9 absolue, car il permet de filtrer les donn\u00e9es en se basant sur des variables d\u00e9riv\u00e9es dynamiquement au sein de l&rsquo;\u00e9tape courante, ce dont l&rsquo;instruction <code>WHERE<\/code> est structurellement incapable.<\/p>\n<p>Toutefois, cette souplesse s&rsquo;accompagne d&rsquo;un co\u00fbt op\u00e9rationnel non n\u00e9gligeable. M\u00eame si une observation est vou\u00e9e \u00e0 \u00eatre rejet\u00e9e, elle consomme des ressources de transfert de donn\u00e9es et de traitement machine jusqu&rsquo;au point d&rsquo;\u00e9valuation de la condition <code>IF<\/code>. L&rsquo;instruction ne peut en outre tirer aucun parti des index SAS existants sur les tables sources, contraignant syst\u00e9matiquement le syst\u00e8me \u00e0 un balayage lin\u00e9aire exhaustif de la table d&rsquo;entr\u00e9e.<\/p>\n<h3>4.3 \u00c9tude comparative approfondie : WHERE versus IF<\/h3>\n<p>Le choix entre l&rsquo;instruction <code>WHERE<\/code> et l&rsquo;instruction <code>IF<\/code> sous-ensemble doit \u00eatre guid\u00e9 par une analyse rigoureuse de la provenance des variables et de la structure du traitement. Le tableau mental suivant r\u00e9sume les divergences structurelles entre ces deux op\u00e9rateurs essentiels :<\/p>\n<p>D&rsquo;un c\u00f4t\u00e9, <code>WHERE<\/code> s&rsquo;applique imp\u00e9rativement \u00e0 des variables pr\u00e9existantes dans les tables d&rsquo;entr\u00e9e d\u00e9clar\u00e9es dans les instructions <code>SET<\/code>, <code>MERGE<\/code> ou <code>MODIFY<\/code>. Il est totalement inop\u00e9rant pour filtrer une variable g\u00e9n\u00e9r\u00e9e par une affectation interne \u00e0 l&rsquo;\u00e9tape DATA courante (par exemple, le ratio de deux colonnes brutes). Tenter d&rsquo;utiliser une variable dynamique dans une clause <code>WHERE<\/code> g\u00e9n\u00e8re imm\u00e9diatement une erreur de compilation dans le journal SAS : <em>\u00ab ERROR: Variable nom_var is not on file WORK.TABLE \u00bb<\/em>.<\/p>\n<p>D&rsquo;un autre c\u00f4t\u00e9, lorsque le filtrage porte sur une colonne native de la table d&rsquo;origine, l&rsquo;usage de <code>WHERE NOT MISSING(var)<\/code> surpasse syst\u00e9matiquement l&rsquo;instruction <code>IF<\/code> en mati\u00e8re de temps processeur et de r\u00e9duction des op\u00e9rations d&rsquo;entr\u00e9es\/sorties (I\/O). La recommandation m\u00e9thodologique pr\u00e9dominante dans le cadre de projets industriels ou acad\u00e9miques consiste donc \u00e0 filtrer le plus en amont possible au moyen de l&rsquo;instruction <code>WHERE<\/code> pour expurger les lignes incompl\u00e8tes, et \u00e0 r\u00e9server l&rsquo;instruction <code>IF<\/code> de sous-ensemble aux seuls cas o\u00f9 la condition de non-vacuit\u00e9 d\u00e9pend d&rsquo;un calcul interm\u00e9diaire complexe ou de l&rsquo;\u00e9valuation de variables automatiques syst\u00e8me (telles que <code>_N_<\/code> ou <code>FIRST.variable<\/code>).<\/p>\n<h2>5. Distinctions critiques entre types num\u00e9riques et cha\u00eenes de caract\u00e8res<\/h2>\n<h3>5.1 Traitement rigoureux des variables num\u00e9riques<\/h3>\n<p>L&rsquo;\u00e9valuation des grandeurs scalaires num\u00e9riques au sein du syst\u00e8me SAS est conditionn\u00e9e par un principe de tri et de comparaison h\u00e9rit\u00e9 de sa conception initiale : dans l&rsquo;ordre s\u00e9quentiel des valeurs r\u00e9elles, <strong>toutes les valeurs manquantes sont consid\u00e9r\u00e9es comme \u00e9tant inf\u00e9rieures au plus petit nombre r\u00e9el n\u00e9gatif concevable<\/strong> sur l&rsquo;architecture machine.<\/p>\n<p>L&rsquo;ordonnancement interne strict adopt\u00e9 par le moteur SAS respecte la hi\u00e9rarchie ascendante suivante :<\/p>\n<p><code>._ &lt; . &lt; .A &lt; .B &lt; ... &lt; .Z &lt; -1E308 &lt; ... &lt; 0 &lt; ... &lt; +1E308<\/code><\/p>\n<p>Cette relation d&rsquo;ordre engendre un pi\u00e8ge classique mais d\u00e9vastateur pour les programmeurs imprudents. Si un analyste tente de s\u00e9lectionner les observations positives ou non nulles en r\u00e9digeant l&rsquo;instruction apparemment intuitive <code>WHERE valeur &gt;= 0;<\/code>, le r\u00e9sultat sera formellement exact car toutes les valeurs manquantes \u00e9tant inf\u00e9rieures \u00e0 z\u00e9ro, elles seront rejet\u00e9es. En revanche, si la condition vise \u00e0 s\u00e9lectionner toutes les observations diff\u00e9rentes de z\u00e9ro au moyen de l&rsquo;expression <code>WHERE valeur ^= 0;<\/code> ou <code>WHERE valeur &gt; -9999;<\/code>, l&rsquo;ensemble des donn\u00e9es manquantes (point standard et lettres sp\u00e9ciales) satisfera la condition logique et sera incorpor\u00e9 dans la table finale.<\/p>\n<p>De m\u00eame, l&rsquo;\u00e9criture fr\u00e9quente <code>WHERE valeur &gt; .;<\/code> pr\u00e9sente un d\u00e9faut critique : si elle exclut le point standard (<code>.<\/code>) et la valeur de soulignement (<code>._<\/code>), elle inclut en revanche toutes les valeurs manquantes sp\u00e9ciales de <code>.A<\/code> \u00e0 <code>.Z<\/code>, puisque celles-ci sont class\u00e9es comme sup\u00e9rieures au point standard. Seule l&rsquo;utilisation rigoureuse de la formulation <code>WHERE NOT MISSING(valeur);<\/code> garantit l&rsquo;exclusion absolue et inconditionnelle de la totalit\u00e9 des repr\u00e9sentations de la vacuit\u00e9 num\u00e9rique.<\/p>\n<h3>5.2 Gestion des cha\u00eenes de caract\u00e8res et des espaces blancs<\/h3>\n<p>La nature du stockage des cha\u00eenes de caract\u00e8res en SAS \u2014 champs \u00e0 longueur pr\u00e9d\u00e9finie compl\u00e9t\u00e9s \u00e0 droite par des espaces blancs de remplissage \u2014 requiert des pr\u00e9cautions m\u00e9thodologiques sp\u00e9cifiques lors de l&rsquo;\u00e9valuation de leur statut de vacuit\u00e9. Une variable alphanum\u00e9rique d\u00e9clar\u00e9e d&rsquo;une longueur de dix octets ne peut jamais \u00eatre \u00ab vide \u00bb au sens d&rsquo;un pointeur nul ou d&rsquo;une cha\u00eene de longueur z\u00e9ro comme dans les langages C ou Python : elle contient intrins\u00e8quement dix caract\u00e8res.<\/p>\n<p>Si la cha\u00eene ne contient que des espaces standards (code ASCII 32), la fonction <code>MISSING(chaine)<\/code> renvoie la valeur 1, identifiant ad\u00e9quatement la cellule comme vacante. N\u00e9anmoins, les donn\u00e9es textuelles import\u00e9es depuis des fichiers plats, des extractions Web ou des fichiers bureautiques non normalis\u00e9s contiennent fr\u00e9quemment des caract\u00e8res invisibles parasites : tabulations horizontales (code ASCII 09), sauts de ligne (ASCII 10 et 13), ou espaces ins\u00e9cables (ASCII 160). Face \u00e0 ces s\u00e9quences d&rsquo;octets, la fonction <code>MISSING()<\/code> standard peut \u00eatre mise en \u00e9chec et renvoyer 0, consid\u00e9rant \u00e0 tort le champ comme une observation textuelle informative.<\/p>\n<p>Pour immuniser les protocoles de nettoyage contre cette pathologie des donn\u00e9es textuelles, la pratique recommand\u00e9e consiste \u00e0 associer la fonction <code>MISSING()<\/code> aux fonctions de normalisation de cha\u00eenes <code>STRIP()<\/code> ou <code>COMPBL()<\/code>. La fonction <code>STRIP()<\/code> purge de mani\u00e8re exhaustive les espaces situ\u00e9s en t\u00eate et en queue de cha\u00eene. L&rsquo;expression <code>WHERE NOT MISSING(STRIP(variable_texte))<\/code> procure une assurance m\u00e9thodologique absolue quant au fait que seules les observations d\u00e9tenant un contenu textuel r\u00e9el et s\u00e9mantiquement porteur d&rsquo;information seront s\u00e9lectionn\u00e9es.<\/p>\n<h3>5.3 Comportement des variables d\u00e9riv\u00e9es et calcul\u00e9es<\/h3>\n<p>L&rsquo;\u00e9valuation des observations non nulles devient plus complexe d\u00e8s lors que les donn\u00e9es analys\u00e9es proviennent d&rsquo;expressions arithm\u00e9tiques interm\u00e9diaires ex\u00e9cut\u00e9es au fil de l&rsquo;eau. Dans l&rsquo;architecture SAS, toute op\u00e9ration arithm\u00e9tique \u00e9l\u00e9mentaire (addition, soustraction, multiplication, division, exponentiation) impliquant au moins un op\u00e9rande manquant produit imm\u00e9diatement et silencieusement une valeur manquante standard (<code>.<\/code>) comme r\u00e9sultat.<\/p>\n<p>Par exemple, l&rsquo;affectation arithm\u00e9tique <code>score_composite = var_a + var_b;<\/code> renverra in\u00e9vitablement une valeur manquante si <code>var_b<\/code> est absente, m\u00eame si <code>var_a<\/code> d\u00e9tient une valeur num\u00e9rique valide. Un filtrage post\u00e9rieur appliqu\u00e9 sur <code>score_composite<\/code> via <code>WHERE NOT MISSING(score_composite)<\/code> provoquera l&rsquo;\u00e9limination de la totalit\u00e9 de l&rsquo;enregistrement, entra\u00eenant une perte d&rsquo;information qui aurait pu \u00eatre \u00e9vit\u00e9e par l&rsquo;utilisation de fonctions d&rsquo;agr\u00e9gation d&rsquo;\u00e9tape DATA telles que <code>SUM(var_a, var_b)<\/code>, laquelle ignore nativement les valeurs manquantes pour sommer les termes renseign\u00e9s.<\/p>\n<p>Par ailleurs, les op\u00e9rations math\u00e9matiques dont le r\u00e9sultat est ind\u00e9termin\u00e9 au plan analytique, comme la division d&rsquo;un nombre par z\u00e9ro (<code>taux = numerateur \/ denominateur;<\/code> lorsque <code>denominateur = 0<\/code>), ne suspendent pas l&rsquo;ex\u00e9cution du programme. SAS consigne un message d&rsquo;avertissement dans le journal, assigne une valeur manquante \u00e0 la variable r\u00e9sultat, et poursuit son it\u00e9ration. L&rsquo;analyste doit imp\u00e9rativement anticiper ces m\u00e9canismes d&rsquo;\u00e9crasement silencieux afin de concevoir des pr\u00e9dicats de s\u00e9lection capables de distinguer une donn\u00e9e originellement manquante d&rsquo;un artefact arithm\u00e9tique provoqu\u00e9 par une singularit\u00e9 computationnelle.<\/p>\n<h2>6. S\u00e9lection multivari\u00e9e : Gestion conjointe de multiples colonnes non nulles<\/h2>\n<h3>6.1 Conjonction stricte avec l&rsquo;op\u00e9rateur logique AND<\/h3>\n<p>Dans la majorit\u00e9 des protocoles exp\u00e9rimentaux ou des \u00e9tudes observationnelles quantitatives, les mod\u00e8les statistiques tels que les r\u00e9gressions multivari\u00e9es ou les analyses en composantes principales exigent que l&rsquo;ensemble des dimensions de l&rsquo;espace des covariables soit simultan\u00e9ment et rigoureusement document\u00e9 pour chaque unit\u00e9 statistique. Cette contrainte se traduit algorithmiquement par une conjonction stricte de pr\u00e9dicats de non-vacuit\u00e9 reli\u00e9s par l&rsquo;op\u00e9rateur bool\u00e9en <code>AND<\/code>.<\/p>\n<p>La formalisation d&rsquo;une telle s\u00e9lection s&rsquo;exprime sous la forme :<\/p>\n<p><code>WHERE NOT MISSING(age) AND NOT MISSING(pression_arterielle) AND NOT MISSING(taux_cholesterol);<\/code><\/p>\n<p>Cette condition impose que l&rsquo;enregistrement doit comporter une valeur d\u00e9finie pour chacune des m\u00e9triques list\u00e9es pour franchir le filtre. D\u00e8s lors qu&rsquo;une seule des variables pr\u00e9sente une absence de donn\u00e9e, l&rsquo;expression globale bascule vers l&rsquo;\u00e9tat logique FAUX, entra\u00eenant le rejet de l&rsquo;observation.<\/p>\n<p>L&rsquo;impact de la conjonction stricte sur l&rsquo;attrition de l&rsquo;\u00e9chantillon d&rsquo;analyse peut \u00eatre colossal. Dans un jeu de donn\u00e9es contenant cinquante covariables pr\u00e9sentant chacune seulement 2 % de donn\u00e9es manquantes distribu\u00e9es de fa\u00e7on ind\u00e9pendante, l&rsquo;application d&rsquo;un filtre conjonctif strict sur l&rsquo;int\u00e9gralit\u00e9 des variables peut conduire \u00e0 l&rsquo;\u00e9viction de plus de 63 % de l&rsquo;\u00e9chantillon initial (selon la loi binomiale <span class=\"arabpsy-math-inline\" data-latex=\"(1 - 0.02)^{50} \\approx 0.364\">$(1 &#8211; 0.02)^{50} \\approx 0.364$<\/span>). Ce ph\u00e9nom\u00e8ne met en exergue l&rsquo;importance de cibler avec parcimonie les seules variables v\u00e9ritablement requises par le mod\u00e8le conceptuel lors de l&rsquo;application de filtres <code>AND<\/code> exhaustifs.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/null2.jpg\" alt=\"\" \/><\/figure>\n<h3>6.2 Disjonction inclusive via l&rsquo;op\u00e9rateur OR<\/h3>\n<p>Dans des contextes d&rsquo;investigation diff\u00e9rents, notamment lors de l&rsquo;analyse de dossiers m\u00e9dicaux partag\u00e9s ou de donn\u00e9es d&rsquo;enqu\u00eates complexes \u00e0 filtres de questionnement multiples, la r\u00e8gle de s\u00e9lection exige souvent de retenir une observation d\u00e8s lors qu&rsquo;elle comporte au moins une modalit\u00e9 ou une mesure significative parmi un ensemble d&rsquo;indicateurs potentiels. Ce cas d&rsquo;usage rel\u00e8ve de la disjonction inclusive op\u00e9r\u00e9e au moyen de l&rsquo;op\u00e9rateur <code>OR<\/code>.<\/p>\n<p>L&rsquo;impl\u00e9mentation syntaxique s&rsquo;\u00e9crit de mani\u00e8re analogue :<\/p>\n<p><code>WHERE NOT MISSING(telephone_fixe) OR NOT MISSING(telephone_mobile) OR NOT MISSING(adresse_courriel);<\/code><\/p>\n<p>Cette structure permet de conserver l&rsquo;enregistrement si au moins un moyen de communication a \u00e9t\u00e9 collect\u00e9, garantissant que l&rsquo;unit\u00e9 statistique demeure joignable dans le cadre d&rsquo;un protocole de suivi longitudinal.<\/p>\n<p>L&rsquo;utilisation conjointe des op\u00e9rateurs <code>AND<\/code> et <code>OR<\/code> exige une vigilance extr\u00eame quant \u00e0 la pr\u00e9c\u00e9dence des op\u00e9rateurs logiques au sein du compilateur SAS. Conform\u00e9ment aux r\u00e8gles d&rsquo;\u00e9valuation formelle, l&rsquo;op\u00e9rateur <code>AND<\/code> poss\u00e8de une priorit\u00e9 intrins\u00e8que sup\u00e9rieure \u00e0 celle de l&rsquo;op\u00e9rateur <code>OR<\/code>. Ainsi, l&rsquo;instruction <code>WHERE condA OR condB AND condC<\/code> est implicitement analys\u00e9e comme <code>WHERE condA OR (condB AND condC)<\/code>. L&rsquo;absence d&rsquo;encadrement explicite au moyen de parenth\u00e8ses appropri\u00e9es risque d&rsquo;alt\u00e9rer profond\u00e9ment le p\u00e9rim\u00e8tre des donn\u00e9es retenues, faussant la repr\u00e9sentativit\u00e9 statistique du sous-ensemble final sans qu&rsquo;aucun message d&rsquo;erreur syntaxique ne vienne alerter le chercheur dans le journal.<\/p>\n<h3>6.3 Utilisation des fonctions vectorielles NMISS, CMISS et N<\/h3>\n<p>Lorsque le p\u00e9rim\u00e8tre de s\u00e9lection s&rsquo;\u00e9tend \u00e0 un nombre \u00e9lev\u00e9 de variables (par exemple dans le traitement de batteries psychom\u00e9triques ou de panels g\u00e9nomiques), l&rsquo;\u00e9criture r\u00e9p\u00e9titive de pr\u00e9dicats <code>NOT MISSING()<\/code> combin\u00e9s par des op\u00e9rateurs bool\u00e9ens devient source d&rsquo;alourdissement du code et accro\u00eet le risque d&rsquo;erreurs d&rsquo;inattention. Pour pallier cette contrainte, le syst\u00e8me SAS propose une famille de fonctions vectorielles sp\u00e9cialis\u00e9es : <code>N()<\/code>, <code>NMISS()<\/code> et <code>CMISS()<\/code>.<\/p>\n<p>La fonction <code>NMISS()<\/code> calcule le nombre total d&rsquo;arguments num\u00e9riques manquants parmi une liste de variables pass\u00e9e en param\u00e8tre. Son invocation vectorielle simplifi\u00e9e permet de condenser une clause de s\u00e9lection complexe en une \u00e9criture compacte et \u00e9l\u00e9gante :<\/p>\n<p><code>WHERE NMISS(OF score1-score20) = 0;<\/code><\/p>\n<p>Cette clause impose que la quantit\u00e9 de variables manquantes parmi les vingt colonnes de la s\u00e9rie soit rigoureusement nulle, mat\u00e9rialisant une conjonction stricte de compl\u00e9tude. Inversement, l&rsquo;instruction <code>WHERE NMISS(OF score1-score20) &lt; 20;<\/code> \u00e9quivaut \u00e0 exiger qu&rsquo;au moins une des vingt variables soit document\u00e9e (disjonction inclusive).<\/p>\n<p>La fonction <code>N()<\/code> r\u00e9alise le d\u00e9compte inverse pour les variables num\u00e9riques, en renvoyant le nombre exact de param\u00e8tres dot\u00e9s d&rsquo;une valeur r\u00e9elle non manquante. L&rsquo;expression <code>WHERE N(OF var_a var_b var_c) &gt;= 2;<\/code> offre ainsi la possibilit\u00e9 de filtrer les observations sur un crit\u00e8re de compl\u00e9tude partielle, en imposant qu&rsquo;au moins deux grandeurs sur trois soient document\u00e9es.<\/p>\n<p>Enfin, la fonction <code>CMISS()<\/code> apporte une flexibilit\u00e9 sup\u00e9rieure en acceptant indiff\u00e9remment des arguments de type num\u00e9rique et de type caract\u00e8re au sein de la m\u00eame liste vectorielle. Elle \u00e9value l&rsquo;\u00e9tat de vacuit\u00e9 de chaque argument selon son type respectif et totalise le nombre d&rsquo;\u00e9l\u00e9ments non renseign\u00e9s. Cette fonction s&rsquo;av\u00e8re particuli\u00e8rement puissante pour \u00e9tablir des m\u00e9triques de qualit\u00e9 globales au sein d&rsquo;enregistrements h\u00e9t\u00e9rog\u00e8nes sans n\u00e9cessiter de conversion pr\u00e9alable des formats de donn\u00e9es.<\/p>\n<h2>7. Quantification et d\u00e9nombrement des observations non nulles<\/h2>\n<h3>7.1 Agr\u00e9gation par COUNT() dans PROC SQL<\/h3>\n<p>Avant ou apr\u00e8s l&rsquo;extraction d&rsquo;un sous-ensemble d&rsquo;observations, l&rsquo;audit de qualit\u00e9 des donn\u00e9es requiert fr\u00e9quemment de d\u00e9nombrer avec pr\u00e9cision le volume de lignes compl\u00e8tes par rapport \u00e0 la volum\u00e9trie brute. Au sein de la proc\u00e9dure <code>PROC SQL<\/code>, la fonction d&rsquo;agr\u00e9gation <code>COUNT()<\/code> pr\u00e9sente une dualit\u00e9 s\u00e9mantique majeure qu&rsquo;il convient de ma\u00eetriser rigoureusement pour \u00e9viter toute erreur de comptage.<\/p>\n<p>Lorsque la fonction est invoqu\u00e9e avec l&rsquo;ast\u00e9risque globale sous la forme <code>SELECT COUNT(*) FROM table;<\/code>, le moteur SQL d\u00e9nombre l&rsquo;int\u00e9gralit\u00e9 physique des lignes constituant la table, sans op\u00e9rer la moindre inspection du contenu informationnel des colonnes. En revanche, lorsque le statisticien fournit le nom sp\u00e9cifique d&rsquo;une colonne comme argument de la fonction, sous la forme <code>SELECT COUNT(score_clinique) FROM table;<\/code>, la s\u00e9mantique formelle du langage SQL standard impose l&rsquo;exclusion implicite de toutes les valeurs nulles. Le r\u00e9sultat renvoy\u00e9 quantifie alors pr\u00e9cis\u00e9ment le nombre d&rsquo;observations d\u00e9tenant une valeur non nulle pour cette m\u00e9trique pr\u00e9cise.<\/p>\n<p>La combinaison d&rsquo;une clause <code>WHERE NOT MISSING()<\/code> avec la fonction d&rsquo;agr\u00e9gation permet par ailleurs de ventiler ces d\u00e9nombrements par strates ou cat\u00e9gories sociod\u00e9mographiques en introduisant une clause de regroupement <code>GROUP BY<\/code>. Cette formulation permet d&rsquo;auditer en une passe unique les \u00e9carts de compl\u00e9tude relative entre diff\u00e9rentes cohortes ou centres investigateurs au sein d&rsquo;essais cliniques multicentriques.<\/p>\n<h3>7.2 Proc\u00e9dures d&rsquo;inspection statistique : PROC FREQ et PROC MEANS<\/h3>\n<p>Pour l&rsquo;analyse exploratoire et l&rsquo;assurance qualit\u00e9 des jeux de donn\u00e9es, les proc\u00e9dures analytiques natives de SAS fournissent des m\u00e9canismes d&rsquo;inspection automatis\u00e9s hautement informatifs. Pour les variables cat\u00e9gorielles ou qualitatives, la proc\u00e9dure <code>PROC FREQ<\/code> dresse le tableau exhaustif de distribution des fr\u00e9quences. Par d\u00e9faut, <code>PROC FREQ<\/code> exclut les valeurs manquantes du calcul des pourcentages d&rsquo;\u00e9chantillonnage, consignant en bas de tableau le volume total d&rsquo;observations omises sous la mention <em>\u00ab Frequency Missing \u00bb<\/em>.<\/p>\n<p>Si l&rsquo;analyste souhaite analyser la structure des donn\u00e9es manquantes en tant que modalit\u00e9 informative \u00e0 part enti\u00e8re, l&rsquo;option <code>\/ MISSING<\/code> adoss\u00e9e \u00e0 l&rsquo;instruction <code>TABLES<\/code> r\u00e9int\u00e8gre ces donn\u00e9es au sein du tableau de contingence, permettant de mesurer pr\u00e9cis\u00e9ment leur proportion relative. L&rsquo;\u00e9valuation pr\u00e9alable de cette r\u00e9partition guide la pertinence d&rsquo;une \u00e9tape ult\u00e9rieure de s\u00e9lection stricte par <code>WHERE NOT MISSING()<\/code>.<\/p>\n<p>Pour les variables quantitatives continues, la proc\u00e9dure <code>PROC MEANS<\/code> (ou son homologue <code>PROC SUMMARY<\/code>) g\u00e9n\u00e8re automatiquement des m\u00e9triques d&rsquo;audit gr\u00e2ce aux mots-cl\u00e9s de statistiques descriptives <code>N<\/code> et <code>NMISS<\/code>. L&rsquo;instruction suivante en fournit l&rsquo;arch\u00e9type analytique :<\/p>\n<p><code>PROC MEANS DATA=source N NMISS MIN MEAN MAX; VAR score1 score2; RUN;<\/code><\/p>\n<p>La m\u00e9trique <code>N<\/code> certifie le volume d&rsquo;enregistrements non nuls pris en compte pour l&rsquo;estimation de la moyenne et des moments statistiques d&rsquo;ordre sup\u00e9rieur, tandis que <code>NMISS<\/code> quantifie l&rsquo;attrition. Ce diagnostic pr\u00e9alable est indispensable pour valider la repr\u00e9sentativit\u00e9 d&rsquo;un \u00e9chantillon avant d&rsquo;appliquer des filtres de non-vacuit\u00e9 drastiques.<\/p>\n<h3>7.3 Comptage algorithmique direct dans l&rsquo;\u00e9tape DATA<\/h3>\n<p>Bien que les proc\u00e9dures pr\u00e9programm\u00e9es offrent une efficacit\u00e9 ind\u00e9niable, il est des architectures de traitement en temps r\u00e9el ou des cha\u00eenes de production de donn\u00e9es o\u00f9 le d\u00e9compte des observations valides doit \u00eatre calcul\u00e9 de mani\u00e8re incr\u00e9mentale directement au sein de l&rsquo;\u00e9tape DATA, sans g\u00e9n\u00e9rer de lectures de tables additionnelles.<\/p>\n<p>Ce r\u00e9sultat est obtenu en recourant \u00e0 l&rsquo;instruction <code>RETAIN<\/code>, laquelle neutralise la r\u00e9initialisation automatique du PDV \u00e0 chaque nouvelle it\u00e9ration de la boucle de lecture. Le m\u00e9canisme est formalis\u00e9 par l&rsquo;impl\u00e9mentation algorithmique d&rsquo;un compteur incr\u00e9mental :<\/p>\n<p>Une variable <code>compteur_non_nulles<\/code> est d\u00e9clar\u00e9e et initialis\u00e9e \u00e0 z\u00e9ro via l&rsquo;instruction <code>RETAIN compteur_non_nulles 0;<\/code>. \u00c0 chaque it\u00e9ration de l&rsquo;\u00e9tape DATA, l&rsquo;\u00e9valuation conditionnelle est ex\u00e9cut\u00e9e : <code>IF NOT MISSING(metrique) THEN compteur_non_nulles = compteur_non_nulles + 1;<\/code>. En exploitant l&rsquo;option de d\u00e9tection de fin de fichier <code>END=EOF<\/code> sur l&rsquo;instruction <code>SET<\/code>, le programmeur peut capturer l&rsquo;ultime cycle de lecture (<code>IF EOF THEN DO; ... END;<\/code>) pour exporter la volum\u00e9trie globale consolid\u00e9e vers le journal d&rsquo;ex\u00e9cution via l&rsquo;instruction <code>PUT<\/code>, ou pour diriger cette m\u00e9trique vers une table d&rsquo;audit d\u00e9di\u00e9e.<\/p>\n<p>Cette technique permet d&rsquo;extraire la sous-population non nulle et d&rsquo;obtenir simultan\u00e9ment sa quantification exacte au sein d&rsquo;une unique travers\u00e9e s\u00e9quentielle du jeu de donn\u00e9es brut, optimisant drastiquement les performances d&rsquo;E\/S sur les volum\u00e9tries de l&rsquo;ordre de plusieurs dizaines de gigaoctets.<\/p>\n<h2>8. Cr\u00e9ation de sous-ensembles de donn\u00e9es permanents et temporaires<\/h2>\n<h3>8.1 Mat\u00e9rialisation de tables \u00e9pur\u00e9es par PROC SQL<\/h3>\n<p>L&rsquo;extraction d&rsquo;observations compl\u00e8tes n&rsquo;a pas seulement pour objet l&rsquo;affichage dans un rapport de restitution : elle vise le plus souvent \u00e0 mat\u00e9rialiser une nouvelle table \u00e9pur\u00e9e destin\u00e9e \u00e0 servir de socle aux \u00e9tapes analytiques ult\u00e9rieures. Dans <code>PROC SQL<\/code>, cette op\u00e9ration s&rsquo;effectue via la directive de cr\u00e9ation de table <code>CREATE TABLE<\/code> coupl\u00e9e \u00e0 la clause de restriction.<\/p>\n<p>La syntaxe canonique s&rsquo;articule comme suit :<\/p>\n<p><code>PROC SQL; CREATE TABLE work.cohorte_valide AS SELECT id, traitement, resultat FROM work.source WHERE NOT MISSING(resultat); QUIT;<\/code><\/p>\n<p>Cette instruction d\u00e9clenche l&rsquo;allocation d&rsquo;un nouvel espace physique au sein de la biblioth\u00e8que temporaire <code>WORK<\/code> (ou d&rsquo;une biblioth\u00e8que permanente si un identifiant de libell\u00e9 sp\u00e9cifique tel que <code>PERM.<\/code> est utilis\u00e9). L&rsquo;optimiseur SQL effectue le transfert des seules observations qualifi\u00e9es, en reconstruisant un nouveau dictionnaire de colonnes d\u00e9barrass\u00e9 des enregistrements ind\u00e9sirables.<\/p>\n<p>Il importe de souligner que cette cr\u00e9ation mat\u00e9rialise une copie physique des donn\u00e9es. Si cette duplication assure l&rsquo;ind\u00e9pendance totale de la table fille vis-\u00e0-vis des modifications futures de la table m\u00e8re, elle implique une consommation proportionnelle d&rsquo;espace disque. D\u00e8s lors, sur des bases de donn\u00e9es massives, le recours \u00e0 la s\u00e9lection de colonnes strictes au lieu du <code>SELECT *<\/code> devient imp\u00e9ratif pour ne pas saturer l&rsquo;espace de stockage temporaire allou\u00e9 \u00e0 la session SAS.<\/p>\n<h3>8.2 Partitionnement conditionnel multiple dans l&rsquo;\u00e9tape DATA<\/h3>\n<p>L&rsquo;\u00e9tape DATA offre un avantage fonctionnel majeur sur <code>PROC SQL<\/code> : la possibilit\u00e9 de r\u00e9aliser un partitionnement conditionnel simultan\u00e9 d&rsquo;une table source vers de multiples tables cibles au cours d&rsquo;un parcours de lecture unique. Dans le cadre de l&rsquo;assurance qualit\u00e9 des flux de donn\u00e9es, il est souvent exig\u00e9 de ne pas simplement d\u00e9truire les enregistrements nuls, mais de les isoler dans une table de quarantaine afin d&rsquo;en analyser les causes profondes et d&rsquo;assurer une tra\u00e7abilit\u00e9 int\u00e9grale de l&rsquo;attrition.<\/p>\n<p>Ce partitionnement est mis en \u0153uvre en d\u00e9clarant plusieurs noms de tables sur l&rsquo;instruction d&rsquo;ouverture <code>DATA<\/code>, puis en aiguillant les observations via des instructions <code>OUTPUT<\/code> sous contr\u00f4le d&rsquo;une structure d\u00e9cisionnelle :<\/p>\n<p>L&rsquo;instruction s&rsquo;ouvre par <code>DATA table_valides table_rejets; SET table_source;<\/code>. La logique conditionnelle est ensuite formalis\u00e9e : <code>IF NOT MISSING(score_principal) THEN OUTPUT table_valides; ELSE OUTPUT table_rejets;<\/code>. Le moteur SAS oriente chaque ligne de mani\u00e8re herm\u00e9tique et d\u00e9terministe vers l&rsquo;un ou l&rsquo;autre des conteneurs physiques sans doubler le temps de lecture de la source.<\/p>\n<p>Cette m\u00e9thodologie d&rsquo;aiguillage constitue un standard incontournable dans les protocoles cliniques r\u00e9glement\u00e9s par la <a rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\/\">Food and Drug Administration (FDA)<\/a>, o\u00f9 la conservation exhaustive de la tra\u00e7abilit\u00e9 des observations \u00e9cart\u00e9es est une condition <em>sine qua non<\/em> pour la recevabilit\u00e9 scientifique des dossiers d&rsquo;enregistrement de nouveaux m\u00e9dicaments.<\/p>\n<h3>8.3 Gestion des formats et \u00e9tiquettes lors du sous-ensemble<\/h3>\n<p>Lors de la cr\u00e9ation d&rsquo;une sous-table \u00e9pur\u00e9e de ses valeurs nulles, la pr\u00e9servation des m\u00e9tadonn\u00e9es de description associ\u00e9es aux variables est un enjeu de rigueur documentaire. Par d\u00e9faut, qu&rsquo;il s&rsquo;agisse de <code>PROC SQL<\/code> ou de l&rsquo;\u00e9tape DATA, le compilateur SAS reporte fid\u00e8lement la plupart des attributs fondamentaux des colonnes : les \u00e9tiquettes descriptives (<em>labels<\/em>), les longueurs de stockage physique (<em>lengths<\/em>) ainsi que les formats d&rsquo;affichage externe (<em>formats<\/em>) et de lecture (<em>informat<\/em>).<\/p>\n<p>Toutefois, certaines op\u00e9rations d&rsquo;extraction impliquant des transformations au vol ou des fonctions scalaires peuvent alt\u00e9rer ces m\u00e9tadonn\u00e9es si elles ne sont pas explicitement g\u00e9r\u00e9es. Par exemple, l&rsquo;application d&rsquo;une fonction de conversion de cha\u00eene sur une variable filtr\u00e9e peut entra\u00eener l&rsquo;assignation d&rsquo;une longueur par d\u00e9faut excessive (souvent 200 octets), induisant une inflation inutile du volume du fichier r\u00e9sultat.<\/p>\n<p>Il est d\u00e8s lors recommand\u00e9 d&rsquo;expliciter la structure des m\u00e9tadonn\u00e9es lors de la cr\u00e9ation de la table sous-ensemble en mobilisant les instructions <code>ATTRIB<\/code>, <code>LABEL<\/code> ou <code>FORMAT<\/code> :<\/p>\n<p>L&rsquo;int\u00e9gration de directives telles que <code>LABEL score_clinique = \"Score clinique valid\u00e9 (sans donn\u00e9es manquantes)\";<\/code> garantit que la documentation s\u00e9mantique de l&rsquo;indicateur refl\u00e8te fid\u00e8lement le processus d&rsquo;\u00e9puration dont il a fait l&rsquo;objet, \u00e9liminant tout risque d&rsquo;\u00e9quivoque pour les biostatisticiens appel\u00e9s \u00e0 manipuler secondairement les tables finales de mod\u00e9lisation.<\/p>\n<h2>9. Utilisation des vues SAS pour un filtrage dynamique sans duplication<\/h2>\n<h3>9.1 Cr\u00e9ation de vues relationnelles avec PROC SQL<\/h3>\n<p>La mat\u00e9rialisation physique de sous-ensembles de donn\u00e9es complets, bien qu&rsquo;efficace sur le plan de l&rsquo;isolation des processus, engendre des surco\u00fbts majeurs en termes d&rsquo;espace disque et introduit un risque de d\u00e9synchronisation si la table de base subit des mises \u00e0 jour incr\u00e9mentales. Pour s&rsquo;affranchir de ces limitations, l&rsquo;architecture logicielle de SAS permet l&rsquo;instanciation de vues dynamiques de donn\u00e9es via la commande <code>CREATE VIEW<\/code> au sein de <code>PROC SQL<\/code>.<\/p>\n<p>La d\u00e9claration formelle prend la structure suivante :<\/p>\n<p><code>PROC SQL; CREATE VIEW work.vue_patients_complets AS SELECT identifiant, mesure_biologique FROM work.base_source WHERE NOT MISSING(mesure_biologique); QUIT;<\/code><\/p>\n<p>Contrairement \u00e0 une table standard, la vue ne contient aucun enregistrement physique sur le disque de stockage : elle n&rsquo;enregistre au sein du catalogue que l&rsquo;arbre syntaxique de la requ\u00eate SQL compil\u00e9e. Chaque fois qu&rsquo;une proc\u00e9dure analytique ult\u00e9rieure fait r\u00e9f\u00e9rence \u00e0 <code>work.vue_patients_complets<\/code>, l&rsquo;optimiseur de requ\u00eates r\u00e9ex\u00e9cute \u00e0 la vol\u00e9e le filtre de non-vacuit\u00e9.<\/p>\n<p>Cette approche garantit une fra\u00eecheur absolue des donn\u00e9es s\u00e9lectionn\u00e9es : toute correction ou ajout d&rsquo;enregistrement valide au sein de la table m\u00e8re <code>work.base_source<\/code> se r\u00e9percute instantan\u00e9ment dans les r\u00e9sultats de la vue, sans n\u00e9cessiter d&rsquo;op\u00e9ration de recalcul ou de maintenance manuelle des tables interm\u00e9diaires.<\/p>\n<h3>9.2 Vues de traitement s\u00e9quentiel dans l&rsquo;\u00e9tape DATA<\/h3>\n<p>L&rsquo;\u00e9tape DATA offre une fonctionnalit\u00e9 analogue, souvent m\u00e9connue des praticiens mais redoutablement puissante pour l&rsquo;\u00e9laboration de cha\u00eenes de traitement s\u00e9quentiel complexes : la cr\u00e9ation de vues de donn\u00e9es de type \u00e9tape DATA. Cette construction s&rsquo;op\u00e8re par l&rsquo;adjonction de l&rsquo;option <code>\/ VIEW=nom_vue<\/code> sur l&rsquo;instruction d&rsquo;ouverture.<\/p>\n<p>L&rsquo;architecture de code correspondante s&rsquo;\u00e9crit comme suit :<\/p>\n<p><code>DATA work.vue_mesures_valides \/ VIEW=work.vue_mesures_valides; SET work.donnees_capteurs; WHERE NOT MISSING(valeur_pression); calcul_derive = log(valeur_pression); RUN;<\/code><\/p>\n<p>Dans ce sc\u00e9nario, le code source de l&rsquo;\u00e9tape DATA est pr\u00e9compil\u00e9 et conserv\u00e9 sous forme de pseudocode ex\u00e9cutable encapsul\u00e9 dans une coquille de m\u00e9tadonn\u00e9es. L&rsquo;instruction <code>WHERE NOT MISSING(valeur_pression);<\/code> garantit que seules les valeurs autorisant le calcul logarithmique sans erreur num\u00e9rique seront charg\u00e9es dans le PDV lors des lectures ult\u00e9rieures.<\/p>\n<p>Cette modalit\u00e9 s&rsquo;av\u00e8re particuli\u00e8rement pertinente au sein des architectures de mod\u00e9lisation statistique en continu, car elle autorise l&rsquo;encha\u00eenement de multiples \u00e9tapes de filtrage et de transformation sans jamais \u00e9crire de tables interm\u00e9diaires temporaires sur le syst\u00e8me de fichiers, soulageant ainsi substantiellement les sous-syst\u00e8mes d&rsquo;E\/S des serveurs d&rsquo;analyse.<\/p>\n<h3>9.3 Consid\u00e9rations architecturales et compromis de performance<\/h3>\n<p>Le recours aux vues dynamiques SAS impose n\u00e9anmoins un arbitrage technique rigoureux entre la consommation de stockage physique et la sollicitation des unit\u00e9s de calcul arithm\u00e9tique (CPU). Si les vues \u00e9liminent la duplication d&rsquo;espace disque, elles d\u00e9portent l&rsquo;int\u00e9gralit\u00e9 de la charge de calcul sur chaque proc\u00e9dure consommatrice qui les interroge.<\/p>\n<p>Si un analyste utilise une vue de s\u00e9lection non nulle comme source pour dix proc\u00e9dures successives (par exemple <code>PROC MEANS<\/code>, <code>PROC FREQ<\/code>, <code>PROC REG<\/code>, <code>PROC GLM<\/code>, etc.), le moteur SAS ex\u00e9cutera dix fois de mani\u00e8re cons\u00e9cutive l&rsquo;int\u00e9gralit\u00e9 du parcours s\u00e9quentiel et du filtrage <code>NOT MISSING()<\/code> sur la table m\u00e8re d&rsquo;origine. Sur des jeux de donn\u00e9es atteignant plusieurs centaines de millions de lignes, cette redondance computationnelle peut d\u00e9grader consid\u00e9rablement les temps d&rsquo;ex\u00e9cution globaux par rapport \u00e0 un sc\u00e9nario o\u00f9 la table aurait \u00e9t\u00e9 mat\u00e9rialis\u00e9e physiquement une fois pour toutes.<\/p>\n<p>La r\u00e8gle empirique d&rsquo;architecture applicative consiste \u00e0 privil\u00e9gier l&rsquo;usage des vues lorsque la table source est volatile ou lorsque le pipeline de mod\u00e9lisation ne consomme la vue qu&rsquo;au travers d&rsquo;une unique proc\u00e9dure synth\u00e9tique finale, et \u00e0 pr\u00e9f\u00e9rer la cr\u00e9ation de tables physiques \u00e9pur\u00e9es permanentes lorsque les donn\u00e9es compl\u00e8tes doivent faire l&rsquo;objet de multiples explorations it\u00e9ratives lourdes.<\/p>\n<h2>10. Optimisation des performances et strat\u00e9gies d&rsquo;indexation<\/h2>\n<h3>10.1 R\u00f4le des index SAS sur les pr\u00e9dicats de s\u00e9lection<\/h3>\n<p>L&rsquo;optimisation des temps d&rsquo;acc\u00e8s aux enregistrements non nuls constitue un enjeu critique d\u00e8s lors que la volum\u00e9trie des tables franchit le seuil des dizaines de millions d&rsquo;observations. Dans cette perspective, la mise en place d&rsquo;un index SAS \u2014 structure physique auxiliaire en arbre binaire balanc\u00e9 (B-tree) stock\u00e9e dans un fichier d&rsquo;extension <code>.sas7bndx<\/code> \u2014 peut m\u00e9tamorphoser les performances d&rsquo;extraction en permettant au moteur d&rsquo;acc\u00e9der directement aux lignes \u00e9ligibles sans parcourir l&rsquo;int\u00e9gralit\u00e9 des blocs du fichier principal.<\/p>\n<p>Toutefois, l&rsquo;interaction entre les index et la s\u00e9lection des valeurs non nulles pr\u00e9sente des particularit\u00e9s comportementales d\u00e9terminantes. Au sein d&rsquo;un index SAS, les valeurs manquantes sont regroup\u00e9es au tout d\u00e9but de la structure arborescente en vertu de leur ordre ordinal minimal. Si le jeu de donn\u00e9es comporte une proportion \u00e9crasante de donn\u00e9es manquantes (par exemple dans le cas de matrices creuses issues de logs t\u00e9l\u00e9m\u00e9triques o\u00f9 99 % des lignes sont vides), l&rsquo;instruction <code>WHERE NOT MISSING(variable)<\/code> s&rsquo;av\u00e8re hautement s\u00e9lective : l&rsquo;optimiseur de requ\u00eates SAS exploitera imm\u00e9diatement l&rsquo;index pour cibler le reliquat de 1 % d&rsquo;enregistrements valides, r\u00e9duisant le temps d&rsquo;ex\u00e9cution d&rsquo;un facteur cent.<\/p>\n<p>\u00c0 l&rsquo;inverse, si la variable \u00e9tudi\u00e9e est quasiment exhaustive (par exemple 98 % d&rsquo;observations non nulles), le co\u00fbt d&rsquo;acc\u00e8s dispers\u00e9 aux enregistrements via les pointeurs de l&rsquo;index devient tr\u00e8s sup\u00e9rieur au co\u00fbt d&rsquo;un simple balayage s\u00e9quentiel direct par blocs contigus de la table. Dans cette configuration, le moteur SAS choisira d\u00e9lib\u00e9r\u00e9ment d&rsquo;ignorer l&rsquo;index existant pour privil\u00e9gier une lecture s\u00e9quentielle exhaustive (<em>table scan<\/em>), neutralisant ainsi l&rsquo;investissement d&rsquo;espace consenti pour la construction de l&rsquo;index.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/null3.jpg\" alt=\"\" \/><\/figure>\n<h3>10.2 Param\u00e9trage des m\u00e9moires tampons et acc\u00e8s disques<\/h3>\n<p>Lorsque le balayage s\u00e9quentiel s&rsquo;av\u00e8re in\u00e9vitable pour extraire les observations non nulles d&rsquo;une table massive, l&rsquo;optimisation des performances d\u00e9pend principalement du r\u00e9glage fin de l&rsquo;allocation des m\u00e9moires tampons d&rsquo;entr\u00e9e\/sortie r\u00e9gies par les options syst\u00e8me <code>BUFSIZE<\/code> et <code>BUFNO<\/code>.<\/p>\n<p>L&rsquo;option <code>BUFSIZE=<\/code> contr\u00f4le la taille des pages physiques allou\u00e9es pour les transferts de blocs entre le disque de stockage et l&rsquo;espace d&rsquo;adressage de la session SAS, tandis que l&rsquo;option <code>BUFNO=<\/code> sp\u00e9cifie le nombre de tampons m\u00e9moire fonctionnant de concert. Lors de l&rsquo;ex\u00e9cution d&rsquo;un filtre massif de donn\u00e9es compl\u00e8tes sur de tr\u00e8s grandes tables, le param\u00e9trage par d\u00e9faut du syst\u00e8me (souvent des tampons de 8 Ko ou 64 Ko) force le contr\u00f4leur d&rsquo;E\/S \u00e0 effectuer des millions de micro-lectures disques hautement p\u00e9nalisantes.<\/p>\n<p>L&rsquo;ajustement de ces param\u00e8tres via l&rsquo;instruction syst\u00e8me <code>OPTIONS BUFSIZE=256K BUFNO=64;<\/code> permet de configurer un pipeline de lecture par blocs massifs contigus. Combin\u00e9e avec l&rsquo;application de la clause <code>WHERE NOT MISSING()<\/code> qui purge les donn\u00e9es au niveau le plus bas du pilote d&rsquo;acc\u00e8s, cette allocation m\u00e9moire lib\u00e8re la bande passante du contr\u00f4leur et r\u00e9duit drastiquement les temps de latence de lecture, assurant une saturation optimale des canaux de transfert de donn\u00e9es sur les serveurs de calcul haute performance.<\/p>\n<h3>10.3 Traitement des volumes massifs de donn\u00e9es (Big Data)<\/h3>\n<p>Dans les environnements modernes de m\u00e9gadonn\u00e9es d&rsquo;entreprise, les tables d&rsquo;enregistrement ne r\u00e9sident plus syst\u00e9matiquement au format natif SAS sur des disques locaux, mais sont h\u00e9berg\u00e9es au sein d&rsquo;entrep\u00f4ts de donn\u00e9es distribu\u00e9s ou de bases relationnelles massives telles que Snowflake, Teradata, Oracle ou des clusters Apache Spark \/ Hadoop. Dans ce contexte, l&rsquo;extraction de donn\u00e9es non nulles par SAS doit imp\u00e9rativement s&rsquo;appuyer sur la technologie d&rsquo;optimisation <strong>SAS In-Database Processing<\/strong>.<\/p>\n<p>Lorsqu&rsquo;un analyste formule une requ\u00eate <code>PROC SQL<\/code> ou une \u00e9tape DATA avec une instruction <code>WHERE NOT MISSING(colonne)<\/code> \u00e0 destination d&rsquo;une table externe li\u00e9e via une biblioth\u00e8que <code>LIBNAME<\/code> pourvue d&rsquo;un moteur d&rsquo;acc\u00e8s sp\u00e9cifique (SAS\/ACCESS), le composant logiciel d&rsquo;optimisation g\u00e9n\u00e8re un m\u00e9canisme de d\u00e9l\u00e9gation de requ\u00eate (<em>SQL Push-Down<\/em>). La clause de s\u00e9lection de non-vacuit\u00e9 est traduite instantan\u00e9ment dans le dialecte SQL natif de la base distante (g\u00e9n\u00e9ralement convertie en <code>WHERE colonne IS NOT NULL<\/code>) et transmise directement au moteur du serveur distant.<\/p>\n<p>Cette cin\u00e9matique garantit que le filtrage massif s&rsquo;op\u00e8re au sein du cluster de calcul distant hautement parall\u00e9lis\u00e9. Seules les lignes satisfaisant rigoureusement le crit\u00e8re de non-vacuit\u00e9 transitent sur le r\u00e9seau local vers la session SAS du chercheur. Ce principe pr\u00e9vient l&rsquo;effondrement des performances d&rsquo;infrastructure cons\u00e9cutif au transfert r\u00e9seau de plusieurs t\u00e9raoctets de donn\u00e9es brutes compos\u00e9es majoritairement d&rsquo;enregistrements nuls vou\u00e9s \u00e0 \u00eatre imm\u00e9diatement supprim\u00e9s d\u00e8s leur r\u00e9ception.<\/p>\n<h2>11. Pi\u00e8ges courants, erreurs d&rsquo;interpr\u00e9tation et d\u00e9bogage<\/h2>\n<h3>11.1 Confusion fr\u00e9quente entre z\u00e9ro arithm\u00e9tique et vacuit\u00e9<\/h3>\n<p>L&rsquo;une des d\u00e9faillances conceptuelles les plus fr\u00e9quentes en analyse de donn\u00e9es consiste \u00e0 assimiler la valeur num\u00e9rique z\u00e9ro (0) \u00e0 une valeur manquante, ou inversement \u00e0 imputer la valeur z\u00e9ro \u00e0 une cellule lacunaire de mani\u00e8re arbitraire. Cette confusion, particuli\u00e8rement pernicieuse dans les \u00e9tudes \u00e9conomiques ou \u00e9pid\u00e9miologiques, peut alt\u00e9rer gravement la structure distributionnelle des donn\u00e9es.<\/p>\n<p>Sur le plan math\u00e9matique et informatique, le nombre 0 est une mesure scalaire valide, un point fixe sur l&rsquo;axe des r\u00e9els d\u00e9tenant une valeur d&rsquo;information pleine et enti\u00e8re (par exemple, une glyc\u00e9mie nulle, bien que physiologiquement incompatible avec la vie, ou un revenu mensuel de z\u00e9ro euro traduisant une absence de ressources d\u00e9clar\u00e9es). \u00c0 l&rsquo;oppos\u00e9, une valeur manquante (<code>.<\/code>) signifie l&rsquo;absence totale de mesure : le ph\u00e9nom\u00e8ne n&rsquo;a pas \u00e9t\u00e9 observ\u00e9 ou n&rsquo;a pas pu \u00eatre collect\u00e9.<\/p>\n<p>Toute op\u00e9ration de s\u00e9lection qui remplacerait silencieusement les valeurs nulles par des z\u00e9ros via des fonctions de type <code>COALESCE()<\/code> avant d&rsquo;appliquer des filtres de s\u00e9lection introduit des distorsions massives : la moyenne d&rsquo;\u00e9chantillon est artificiellement d\u00e9cal\u00e9e vers le bas, l&rsquo;\u00e9cart-type est fauss\u00e9, et la significativit\u00e9 statistique des tests d&rsquo;hypoth\u00e8ses est totalement compromise. La r\u00e8gle d&rsquo;audit fondamentale impose de toujours v\u00e9rifier empiriquement la distribution de la valeur z\u00e9ro distinctement de celle du point d&rsquo;absence avant d&rsquo;arr\u00eater d\u00e9finitivement les pr\u00e9dicats d&rsquo;extraction dans l&rsquo;\u00e9tape de s\u00e9lection.<\/p>\n<h3>11.2 Les espaces insoup\u00e7onn\u00e9s dans les champs alphanum\u00e9riques<\/h3>\n<p>L&rsquo;univers des donn\u00e9es textuelles h\u00e9berge un pi\u00e8ge r\u00e9current li\u00e9 \u00e0 la pr\u00e9sence de cha\u00eenes apparemment vides \u00e0 l&rsquo;\u0153il nu lors de la visualisation sous SAS Enterprise Guide ou SAS Studio, mais qui abritent en r\u00e9alit\u00e9 des caract\u00e8res non imprimables. Le cas le plus insidieux r\u00e9side dans les cha\u00eenes constitu\u00e9es de caract\u00e8res d&rsquo;espacement ins\u00e9cables ou de cha\u00eenes de longueur fixe renseign\u00e9es uniquement avec des espaces prot\u00e9g\u00e9s issus d&rsquo;outils de saisie tiers.<\/p>\n<p>Dans ce sc\u00e9nario, si l&rsquo;analyste formule son exclusion sous la forme rudimentaire :<\/p>\n<p><code>WHERE variable_texte ^= '';<\/code><\/p>\n<p>Le moteur compare la colonne \u00e0 un litt\u00e9ral de cha\u00eene vide. Selon les options syst\u00e8me d&rsquo;alignement et de troncature de cha\u00eenes actives, cette condition peut \u00e9valuer \u00e0 VRAI une cellule ne contenant qu&rsquo;une tabulation ou un espace prot\u00e9g\u00e9. D\u00e8s lors, des dizaines d&rsquo;observations priv\u00e9es de tout contenu analytique utile traversent ind\u00fbment le filtre de s\u00e9lection, causant des erreurs d&rsquo;ex\u00e9cution ult\u00e9rieures (notamment lors de tentatives de conversion de ces cha\u00eenes en formats temporels ou num\u00e9riques).<\/p>\n<p>L&rsquo;\u00e9criture d\u00e9fensive syst\u00e9matique requiert le d\u00e9ploiement d&rsquo;une cha\u00eene de fonctions de nettoyage au sein du pr\u00e9dicat d&rsquo;extraction :<\/p>\n<p><code>WHERE NOT MISSING(STRIP(COMPRESS(variable_texte, '091013A0'x)));<\/code><\/p>\n<p>Cette formulation s\u00e9curis\u00e9e supprime pr\u00e9alablement tous les octets de tabulations, retours chariots et espaces ins\u00e9cables avant d&rsquo;\u00e9valuer la vacuit\u00e9 par la fonction <code>MISSING()<\/code>, sanctuarisant ainsi la cohorte d&rsquo;observations retenues.<\/p>\n<h3>11.3 Diagnostic des avertissements et anomalies dans le journal SAS<\/h3>\n<p>Le journal d&rsquo;ex\u00e9cution (<em>SAS Log<\/em>) constitue le r\u00e9ceptacle absolu de v\u00e9rit\u00e9 pour quiconque souhaite auditer la qualit\u00e9 d&rsquo;une s\u00e9lection de donn\u00e9es. L&rsquo;absence de message d&rsquo;erreur bloquant (<em>ERROR<\/em>) ne garantit aucunement que le filtrage des observations non nulles s&rsquo;est op\u00e9r\u00e9 conform\u00e9ment aux intentions de l&rsquo;analyste.<\/p>\n<p>Une anomalie particuli\u00e8rement pernicieuse \u00e0 surveiller est l&rsquo;\u00e9mission d&rsquo;un message d&rsquo;avertissement de conversion implicite : <em>\u00ab NOTE: Numeric values have been converted to character values at the place given by&#8230; \u00bb<\/em> ou inversement. Cet avertissement survient typiquement lorsqu&rsquo;une variable num\u00e9rique est test\u00e9e par inadvertance contre une cha\u00eene d&rsquo;espaces (<code>WHERE var_num ^= ' ';<\/code>) ou qu&rsquo;une variable textuelle est compar\u00e9e au point standard num\u00e9rique (<code>WHERE var_char ^= .;<\/code>). Bien que SAS proc\u00e8de automatiquement \u00e0 un transcodage interne pour tenter de r\u00e9soudre la condition, cette op\u00e9ration d\u00e9grade drastiquement les performances et aboutit tr\u00e8s souvent \u00e0 des assignations logiques erron\u00e9es qui corrompent le sous-ensemble extrait.<\/p>\n<p>Il est par cons\u00e9quent indispensable d&rsquo;instaurer des contr\u00f4les stricts du journal apr\u00e8s l&rsquo;ex\u00e9cution de toute \u00e9tape de filtrage, en v\u00e9rifiant que le nombre de lignes \u00e9crites dans la table cible (signal\u00e9 par la ligne <em>\u00ab NOTE: The data set WORK.CIBLE has X observations and Y variables \u00bb<\/em>) correspond scrupuleusement aux d\u00e9nombrements de compl\u00e9tude th\u00e9oriques \u00e9tablis pr\u00e9alablement par les proc\u00e9dures d&rsquo;inspection <code>PROC FREQ<\/code> ou <code>PROC MEANS<\/code>.<\/p>\n<h2>12. Applications avanc\u00e9es et automatisation dans les pipelines de recherche<\/h2>\n<h3>12.1 G\u00e9n\u00e9ration de filtres dynamiques via les macros SAS<\/h3>\n<p>Dans les infrastructures industrielles de recherche clinique ou d&rsquo;\u00e9valuation actuarielle, les op\u00e9rations de s\u00e9lection ne portent pas sur une poign\u00e9e de tables statiques mais sur des centaines de jeux de donn\u00e9es dont le sch\u00e9ma d&rsquo;agencement des colonnes est susceptible de varier selon les phases d&rsquo;exp\u00e9rimentation. L&rsquo;automatisation du filtrage des observations non nulles exige alors la conception de programmes macro dynamiques modulaires.<\/p>\n<p>Le compilateur macro de SAS permet de requ\u00e9rir dynamiquement les tables de m\u00e9tadonn\u00e9es du syst\u00e8me \u2014 notamment la vue syst\u00e8me <code>DICTIONARY.COLUMNS<\/code> (accessible \u00e9galement via <code>SASHELP.VCOLUMN<\/code>) \u2014 afin d&rsquo;extraire la liste exhaustive des variables num\u00e9riques ou de caract\u00e8res associ\u00e9es \u00e0 une table cible, puis d&rsquo;assembler automatiquement une clause <code>WHERE<\/code> conjonctive ou disjonctive sans aucune intervention manuelle de l&rsquo;utilisateur.<\/p>\n<p>Un macro-programme arch\u00e9typal peut ainsi recevoir en argument le nom d&rsquo;une table source et une liste de colonnes d&rsquo;int\u00e9r\u00eat. En recourant \u00e0 la clause <code>CALL SYMPUTX<\/code> au sein d&rsquo;une \u00e9tape DATA d&rsquo;inspection des m\u00e9tadonn\u00e9es, le syst\u00e8me stocke dans une variable macro globale une cha\u00eene de caract\u00e8res assemblant dynamiquement la s\u00e9quence <code>NOT MISSING(var1) AND NOT MISSING(var2) ... AND NOT MISSING(varN)<\/code>. Cette macro-variable est ensuite r\u00e9solue au sein de l&rsquo;instruction <code>WHERE &amp;clause_dynamique;<\/code> de l&rsquo;\u00e9tape DATA de production, garantissant l&rsquo;extensibilit\u00e9 et l&rsquo;adaptabilit\u00e9 int\u00e9grale du pipeline face \u00e0 toute modification du sch\u00e9ma relationnel sous-jacent.<\/p>\n<h3>12.2 Pr\u00e9paration de donn\u00e9es pour la mod\u00e9lisation statistique avanc\u00e9e<\/h3>\n<p>L&rsquo;extraction rigoureuse d&rsquo;enregistrements exhaustifs constitue l&rsquo;\u00e9tape pr\u00e9paratoire obligatoire pour le d\u00e9ploiement de mod\u00e8les \u00e9conom\u00e9triques sophistiqu\u00e9s, tels que les mod\u00e8les lin\u00e9aires g\u00e9n\u00e9ralis\u00e9s \u00e0 effets mixtes (<code>PROC GLIMMIX<\/code>), les mod\u00e8les de survie \u00e0 risques proportionnels de Cox (<code>PROC PHREG<\/code>) ou les algorithmes d&rsquo;apprentissage statistique supervis\u00e9 (arbres de d\u00e9cision, for\u00eats al\u00e9atoires via <code>PROC HPFOREST<\/code>). La quasi-totalit\u00e9 de ces proc\u00e9dures computationnelles int\u00e8gre un comportement par d\u00e9faut d&rsquo;exclusion par ligne (<em>listwise deletion<\/em>) d\u00e8s lors qu&rsquo;une seule des variables ind\u00e9pendantes ou d\u00e9pendantes requises par la syntaxe du mod\u00e8le fait d\u00e9faut.<\/p>\n<p>Si l&rsquo;analyste laisse le mod\u00e8le appliquer silencieusement cette suppression au moment de l&rsquo;ajustement, les m\u00e9triques d&rsquo;information telles que le crit\u00e8re d&rsquo;Akaike (AIC) ou le crit\u00e8re bay\u00e9sien (BIC) ne peuvent plus \u00eatre valablement compar\u00e9es d&rsquo;un mod\u00e8le \u00e0 l&rsquo;autre si le p\u00e9rim\u00e8tre des variables explicatives change, car les bases d&rsquo;\u00e9chantillonnage sous-jacentes varient en fonction des patterns de vacuit\u00e9 propres \u00e0 chaque sous-ensemble de covariables. Pour garantir la comparabilit\u00e9 scientifique stricte des mod\u00e8les embo\u00eet\u00e9s ou concurrents, la r\u00e8gle m\u00e9thodologique impose de cr\u00e9er pr\u00e9alablement un jeu de donn\u00e9es commun d&rsquo;analyse d&rsquo;o\u00f9 sont expurg\u00e9es toutes les observations pr\u00e9sentant la moindre vacuit\u00e9 sur l&rsquo;ensemble du faisceau de variables candidates.<\/p>\n<p>Cette standardisation du jeu de donn\u00e9es en amont de l&rsquo;estimation garantit en outre la convergence des algorithmes it\u00e9ratifs d&rsquo;optimisation num\u00e9rique (tels que Newton-Raphson ou Quasi-Newton), \u00e9liminant les instabilit\u00e9s de calcul induites par des sous-matrices de variances-covariances non d\u00e9finies positives g\u00e9n\u00e9r\u00e9es par l&rsquo;introduction fortuite de cellules vides dans les blocs d&rsquo;it\u00e9rations matricielles.<\/p>\n<h3>12.3 Int\u00e9gration dans un cadre de reproductibilit\u00e9 scientifique<\/h3>\n<p>Dans un contexte international marqu\u00e9 par les exigences accrues de reproductibilit\u00e9 des protocoles de recherche (notamment impuls\u00e9es par les directives <a rel=\"noopener noreferrer\" href=\"https:\/\/www.nature.com\/articles\/sdata201618\">FAIR &#8211; Findable, Accessible, Interoperable, Reusable<\/a>), la s\u00e9lection des donn\u00e9es non nulles ne saurait \u00eatre cantonn\u00e9e \u00e0 une s\u00e9rie de manipulations ponctuelles et opaques. Elle doit faire partie int\u00e9grante d&rsquo;un pipeline d&rsquo;extraction de donn\u00e9es auditable, document\u00e9 et reproductible \u00e0 l&rsquo;identique par des inspecteurs ou des comit\u00e9s d&rsquo;\u00e9thique ind\u00e9pendants.<\/p>\n<p>L&rsquo;instauration d&rsquo;un tel standard de gouvernance logicielle dans l&rsquo;\u00e9cosyst\u00e8me SAS repose sur la formalisation de scripts d\u00e9di\u00e9s au contr\u00f4le qualit\u00e9 et \u00e0 l&rsquo;attrition. Chaque filtre de non-vacuit\u00e9 ex\u00e9cut\u00e9 doit \u00eatre consign\u00e9 au sein d&rsquo;un tableau d&rsquo;audit tra\u00e7ant chronologiquement le volume d&rsquo;enregistrements entrants, le nombre exact d&rsquo;observations rejet\u00e9es pour motif de vacuit\u00e9 sur chaque variable, le volume d&rsquo;enregistrements finaux retenus, ainsi que la date et la signature cryptographique (hachage SHA-256) du script ayant op\u00e9r\u00e9 la s\u00e9lection.<\/p>\n<p>Cette discipline de d\u00e9veloppement assure la parfaite transparence des r\u00e9sultats de l&rsquo;\u00e9tude. En pr\u00e9servant la tra\u00e7abilit\u00e9 int\u00e9grale de la logique de s\u00e9lection \u2014 de l&rsquo;instruction fondamentale <code>WHERE NOT MISSING()<\/code> jusqu&rsquo;aux macro-programmes de contr\u00f4le d&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle \u2014 le chercheur prot\u00e8ge ses travaux contre toute contestation m\u00e9thodologique, fournissant \u00e0 la communaut\u00e9 scientifique des bases d&rsquo;\u00e9chantillonnage saines, conformes aux exigences les plus s\u00e9v\u00e8res de l&rsquo;inf\u00e9rence statistique contemporaine.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Allison, P. D. (2001). <em>Missing Data<\/em> (Quantitative Applications in the Social Sciences, Vol. 136). SAGE Publications. https:\/\/doi.org\/10.4135\/9781412985079<\/li>\n<li>Cody, R. (2018). <em>Cody&rsquo;s Data Cleaning Techniques Using SAS<\/em> (3rd ed.). SAS Institute Inc. https:\/\/www.sas.com\/store\/books\/categories\/usage-and-reference\/cody-s-data-cleaning-techniques-using-sas-third-edition\/prodBK_69654_en.html<\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6th ed.). SAS Institute Inc. https:\/\/support.sas.com\/en\/books\/little-sas-book.html<\/li>\n<li>International Organization for Standardization. (2016). <em>Information technology \u2014 Database languages \u2014 SQL \u2014 Part 2: Foundation (SQL\/Foundation)<\/em> (ISO\/IEC Standard No. 9075-2:2016). https:\/\/www.iso.org\/standard\/63555.html<\/li>\n<li>Little, R. J. A., &amp; Rubin, D. B. (2019). <em>Statistical Analysis with Missing Data<\/em> (3rd ed.). John Wiley &amp; Sons. https:\/\/doi.org\/10.1002\/9781119482260<\/li>\n<li>Rubin, D. B. (1976). Inference and missing data. <em>Biometrika<\/em>, 63(3), 581\u2013592. https:\/\/doi.org\/10.1093\/biomet\/63.3.581<\/li>\n<li>SAS Institute Inc. (2020). <em>SAS(R) 9.4 Statements: Reference<\/em>. SAS Institute Inc. https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lestmtsref\/titlepage.htm<\/li>\n<li>SAS Institute Inc. (2021). <em>SAS(R) 9.4 SQL Procedure User&rsquo;s Guide<\/em> (4th ed.). SAS Institute Inc. https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/sqlproc\/titlepage.htm<\/li>\n<li>Wilkinson, M. D., Dumontier, M., Aalbersberg, I. J., Appleton, G., Axton, M., Baak, A., &#8230; &amp; Mons, B. (2016). The FAIR Guiding Principles for scientific data management and stewardship. <em>Scientific Data<\/em>, 3(1), 160018. https:\/\/doi.org\/10.1038\/sdata.2016.18<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide m\u00e9thodologique et acad\u00e9mique sur la s\u00e9lection des observations non nulles dans SAS \u00e0 l&rsquo;aide de PROC SQL et du DATA Step.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,9499],"tags":[10221,3002,10466,235,3065],"class_list":["post-9573","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-sas","tag-data-step","tag-nettoyage-de-donnees","tag-proc-sql","tag-sas","tag-valeurs-manquantes"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9573","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=9573"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9573\/revisions"}],"predecessor-version":[{"id":9578,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9573\/revisions\/9578"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}