{"id":9773,"date":"2026-10-14T18:02:32","date_gmt":"2026-10-14T18:02:32","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-remplacer-valeurs-manquantes-par-zero-sas\/"},"modified":"2026-10-14T18:02:32","modified_gmt":"2026-10-14T18:02:32","slug":"comment-remplacer-valeurs-manquantes-par-zero-sas","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-remplacer-valeurs-manquantes-par-zero-sas","title":{"rendered":"Comment remplacer les valeurs manquantes par z\u00e9ro dans SAS"},"content":{"rendered":"<p>Dans le domaine du traitement des donn\u00e9es massives et de l&rsquo;analyse biostatistique ou actuarielle, le syst\u00e8me SAS (Statistical Analysis System) demeure une r\u00e9f\u00e9rence technologique fondamentale en raison de sa robustesse, de sa rigueur math\u00e9matique et de sa gestion optimis\u00e9e des ressources de calcul. Cependant, l&rsquo;un des d\u00e9fis permanents auxquels sont confront\u00e9s les ing\u00e9nieurs de donn\u00e9es, les statisticiens et les data scientists r\u00e9side dans la gestion rigoureuse des donn\u00e9es lacunaires. Dans un environnement op\u00e9rationnel, l&rsquo;apparition de champs non renseign\u00e9s d\u00e9coule d&rsquo;une multitude de facteurs, allant des ruptures de captation de signaux instrumentaux aux omissions volontaires dans les questionnaires psychom\u00e9triques ou \u00e9pid\u00e9miologiques, en passant par des anomalies structurelles survenues lors des processus d&rsquo;extraction, de transformation et de chargement (ETL).<\/p>\n<p>Le traitement des valeurs manquantes ne saurait se r\u00e9duire \u00e0 un simple choix esth\u00e9tique d&rsquo;affichage. Au sein de SAS, l&rsquo;omission d&rsquo;une valeur num\u00e9rique d\u00e9clenche des comportements algorithmiques pr\u00e9d\u00e9termin\u00e9s qui, s&rsquo;ils ne sont pas convenablement anticip\u00e9s et ma\u00eetris\u00e9s, peuvent conduire \u00e0 l&rsquo;\u00e9viction massive d&rsquo;observations lors des r\u00e9gressions multivari\u00e9es, \u00e0 la propagation silencieuse de valeurs ind\u00e9finies dans les cha\u00eenes d&rsquo;op\u00e9rations scalaires, ou encore \u00e0 des distorsions conceptuelles majeures lors des agr\u00e9gations sommatoires. Remplacer ces vides par la valeur z\u00e9ro constitue ainsi une pratique extr\u00eamement r\u00e9pandue, l\u00e9gitim\u00e9e par de nombreux cadres d&rsquo;affaires et imp\u00e9ratifs m\u00e9thodologiques. Cette d\u00e9cision implique n\u00e9anmoins une compr\u00e9hension intime des m\u00e9canismes internes du moteur SAS, en particulier du vecteur d&rsquo;observation en m\u00e9moire vive, ainsi qu&rsquo;une conscience aigu\u00eb des retomb\u00e9es statistiques sous-jacentes.<\/p>\n<p>Cet ouvrage d&rsquo;analyse approfondie a pour vocation d&rsquo;explorer l&rsquo;int\u00e9gralit\u00e9 du spectre technique et th\u00e9orique li\u00e9 \u00e0 la substitution des valeurs manquantes par z\u00e9ro dans l&rsquo;\u00e9cosyst\u00e8me SAS. De la syntaxe conditionnelle \u00e9l\u00e9mentaire ex\u00e9cut\u00e9e au sein de l&rsquo;\u00e9tape DATA jusqu&rsquo;aux approches vectoris\u00e9es \u00e0 hautes performances permises par la proc\u00e9dure STDIZE, en passant par la manipulation experte des tableaux de m\u00e9moire temporaire (ARRAY), l&rsquo;usage fonctionnel de COALESCE et les op\u00e9rations relationnelles sous PROC SQL, l&rsquo;ensemble des paradigmes programmatiques sera d\u00e9cortiqu\u00e9. En outre, une attention particuli\u00e8re sera port\u00e9e \u00e0 la s\u00e9mantique singuli\u00e8re des valeurs manquantes sp\u00e9ciales propres \u00e0 SAS, aux consid\u00e9rations relatives \u00e0 la th\u00e9orie de l&rsquo;imputation probabiliste de Donald Rubin, ainsi qu&rsquo;aux protocoles d&rsquo;assurance qualit\u00e9 et d&rsquo;optimisation d&rsquo;entr\u00e9es-sorties sur les tr\u00e8s grands volumes de donn\u00e9es.<\/p>\n<h2>1. Fondements et contexte du remplacement des valeurs manquantes par z\u00e9ro dans SAS<\/h2>\n<h3>1.1 Nature des valeurs manquantes dans les environnements quantitatifs<\/h3>\n<p>Dans toute architecture informationnelle d\u00e9di\u00e9e \u00e0 la mod\u00e9lisation statistique, il convient de distinguer conceptuellement l&rsquo;absence d&rsquo;information de l&rsquo;enregistrement d&rsquo;une grandeur nulle. Une valeur manquante traduit l&rsquo;inaccessibilit\u00e9, l&rsquo;inapplicabilit\u00e9 ou l&rsquo;ind\u00e9termination d&rsquo;une mesure \u00e0 un instant pr\u00e9cis de la collecte. \u00c0 l&rsquo;inverse, le z\u00e9ro repr\u00e9sente un point pr\u00e9cis sur l&rsquo;axe des r\u00e9els, indiquant une magnitude nulle, une absence de survenue d&rsquo;un ph\u00e9nom\u00e8ne mesurable ou un \u00e9quilibre thermodynamique, \u00e9conomique ou biologique parfaitement calibr\u00e9. Confondre l&rsquo;absence de mesure avec une mesure de magnitude nulle expose l&rsquo;analyste \u00e0 des erreurs fondamentales d&rsquo;interpr\u00e9tation. <\/p>\n<p>D&rsquo;un point de vue computationnel, l&rsquo;omission d&rsquo;une donn\u00e9e d\u00e9clenche des cons\u00e9quences p\u00e9nalisantes au sein du moteur arithm\u00e9tique de SAS. Lorsqu&rsquo;une op\u00e9ration d&rsquo;addition ou de multiplication \u00e9l\u00e9mentaire int\u00e8gre une valeur non d\u00e9finie, le r\u00e9sultat retourn\u00e9 par le syst\u00e8me est syst\u00e9matiquement une valeur manquante. Cette propagation stricte d\u00e9coule de l&rsquo;axiome d&rsquo;inconnaissance : si une composante d&rsquo;une somme scalaire est inconnue, la somme globale est rigoureusement ind\u00e9terminable. D\u00e8s lors, dans des contextes financiers ou logistiques o\u00f9 l&rsquo;absence de saisie d&rsquo;un flux de tr\u00e9sorerie ou d&rsquo;un mouvement d&rsquo;inventaire signifie en r\u00e9alit\u00e9 qu&rsquo;aucune transaction n&rsquo;a eu lieu, l&rsquo;absence de conversion vers le z\u00e9ro d\u00e9truit la capacit\u00e9 de calcul du syst\u00e8me sur les cumuls p\u00e9riodiques.<\/p>\n<p>La substitution d\u00e9terministe par z\u00e9ro se justifie sur le plan th\u00e9orique et op\u00e9rationnel d\u00e8s lors que le processus g\u00e9n\u00e9rateur de donn\u00e9es sous-jacent conf\u00e8re \u00e0 l&rsquo;absence la signification objective de l&rsquo;inexistence du ph\u00e9nom\u00e8ne. Dans un registre de sinistres d&rsquo;assurance, par exemple, un assur\u00e9 n&rsquo;ayant d\u00e9clar\u00e9 aucun accident pr\u00e9sentera une ligne vide pour le montant des remboursements. La transformation de cette absence en une valeur mon\u00e9taire \u00e9gale \u00e0 z\u00e9ro n&rsquo;est pas un artifice statistique abusif, mais une restitution fid\u00e8le de l&rsquo;\u00e9tat \u00e9conomique de l&rsquo;assur\u00e9 vis-\u00e0-vis de l&rsquo;assureur. L&rsquo;enjeu technique r\u00e9side dans la capacit\u00e9 \u00e0 impl\u00e9menter cette conversion avec une efficience maximale sans corrompre les m\u00e9tadonn\u00e9es aff\u00e9rentes.<\/p>\n<h3>1.2 Repr\u00e9sentation interne des donn\u00e9es manquantes dans le syst\u00e8me SAS<\/h3>\n<p>Le syst\u00e8me SAS impl\u00e9mente une gestion native hautement sp\u00e9cialis\u00e9e des valeurs manquantes pour les variables de type num\u00e9rique. Contrairement \u00e0 d&rsquo;autres langages qui recourent \u00e0 des valeurs sentinelles arbitraires ou au concept d&rsquo;ind\u00e9termination de type <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/NaN\">NaN (Not a Number)<\/a> d\u00e9fini par la norme IEEE 754, SAS mod\u00e9lise la valeur manquante num\u00e9rique standard par le symbole typographique du point (.). Ce point correspond, sur le plan physique de l&rsquo;architecture binaire en virgule flottante, \u00e0 une configuration sp\u00e9cifique de bits que le processeur d&rsquo;\u00e9valuation SAS identifie imm\u00e9diatement comme une valeur ind\u00e9finie.<\/p>\n<p>Sur le plan comparatif et relationnel, le compilateur SAS adopte une r\u00e8gle critique qui diverge profond\u00e9ment des conventions math\u00e9matiques classiques : la valeur manquante num\u00e9rique (.) est formellement ordonn\u00e9e comme \u00e9tant strictement inf\u00e9rieure \u00e0 n&rsquo;importe quel nombre r\u00e9el concevable, y compris l&rsquo;infini n\u00e9gatif th\u00e9orique. Par cons\u00e9quent, dans le cadre d&rsquo;une \u00e9valuation bool\u00e9enne non typ\u00e9e, l&rsquo;expression conditionnelle \u00e9valuant si une variable est inf\u00e9rieure \u00e0 un seuil positif arbitraire, ou m\u00eame n\u00e9gatif, renvoie la valeur logique vraie si la variable contient un point. Cette particularit\u00e9 interne constitue l&rsquo;un des pi\u00e8ges les plus redoutables pour les d\u00e9veloppeurs SAS non avertis.<\/p>\n<p>Cette hi\u00e9rarchisation a des r\u00e9percussions directes lors des tris de tables (PROC SORT) et de l&rsquo;application de clauses de filtrage (instructions WHERE ou IF). Par d\u00e9faut, une proc\u00e9dure de tri ascendant positionnera syst\u00e9matiquement l&rsquo;ensemble des enregistrements incomplets au tout d\u00e9but du jeu de donn\u00e9es r\u00e9sultant. De m\u00eame, un filtre cherchant \u00e0 isoler des soldes de comptes d\u00e9biteurs inf\u00e9rieurs \u00e0 z\u00e9ro capturera de mani\u00e8re parasite les valeurs manquantes, \u00e0 moins qu&rsquo;une exclusion explicite ne soit articul\u00e9e. L&rsquo;absence d&rsquo;un traitement pr\u00e9alable d&rsquo;uniformisation ou de conversion vers le z\u00e9ro engendre donc des distorsions massives dans la s\u00e9lection des cohortes analytiques.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/missing1.jpg\" alt=\"\" \/><\/figure>\n<h3>1.3 Objectifs analytiques de la conversion syst\u00e9matique vers le z\u00e9ro<\/h3>\n<p>L&rsquo;un des moteurs fondamentaux justifiant la conversion syst\u00e9matique des valeurs manquantes vers le z\u00e9ro r\u00e9side dans la pr\u00e9servation du pouvoir informatif des tables lors des agr\u00e9gations arithm\u00e9tiques. Au sein de l&rsquo;\u00e9tape DATA, l&rsquo;op\u00e9rateur d&rsquo;addition unaire (+) \u00e9choue d\u00e8s qu&rsquo;un point standard est rencontr\u00e9. Si l&rsquo;on recourt \u00e0 la fonction SUM(), celle-ci tol\u00e8re les valeurs manquantes en les ignorant, mais si la totalit\u00e9 des arguments d&rsquo;une ligne est manquante, le r\u00e9sultat demeure une valeur manquante. Remplacer explicitement les donn\u00e9es absentes par z\u00e9ro garantit que la structure matricielle r\u00e9sultante se comporte de fa\u00e7on totalement pr\u00e9visible face aux op\u00e9rateurs math\u00e9matiques, sans interruption ni propagation d&rsquo;ind\u00e9terminations.<\/p>\n<p>Au-del\u00e0 des calculs \u00e9l\u00e9mentaires, la normalisation des matrices de covariance et de corr\u00e9lation repr\u00e9sente un objectif m\u00e9thodologique d\u00e9terminant. Dans des disciplines telles que la psychom\u00e9trie ou l&rsquo;\u00e9conom\u00e9trie, le calcul d&rsquo;une matrice de variance-covariance exige des vecteurs d&rsquo;observations complets. Si un algorithme proc\u00e8de \u00e0 l&rsquo;\u00e9limination des observations incompl\u00e8tes (\u00ab listwise deletion \u00bb), la perte d&rsquo;effectifs peut \u00eatre d\u00e9vastatrice pour la puissance statistique des tests. Dans les contextes o\u00f9 l&rsquo;absence d&rsquo;observation correspond effectivement \u00e0 un score nul sur une \u00e9chelle d&rsquo;\u00e9valuation comportementale, imputer le z\u00e9ro permet de pr\u00e9server la taille d&rsquo;\u00e9chantillon n\u00e9cessaire \u00e0 la convergence des estimateurs.<\/p>\n<p>Enfin, la stabilisation des algorithmes pr\u00e9dictifs contemporains et des mod\u00e8les lin\u00e9aires g\u00e9n\u00e9ralis\u00e9s (GLM) d\u00e9pend largement de l&rsquo;int\u00e9grit\u00e9 matricielle. Les proc\u00e9dures de mod\u00e9lisation pr\u00e9dictive, qu&rsquo;il s&rsquo;agisse de r\u00e9gressions logistiques, de mod\u00e8les de survie ou de techniques d&rsquo;arbres de d\u00e9cision r\u00e9gularis\u00e9s, excluent fr\u00e9quemment les vecteurs contenant des valeurs manquantes \u00e0 moins d&rsquo;avoir configur\u00e9 des sous-routines complexes de substitution. Assigner le z\u00e9ro de mani\u00e8re contr\u00f4l\u00e9e supprime ce ph\u00e9nom\u00e8ne d&rsquo;attrition artificielle des donn\u00e9es, garantissant ainsi que l&rsquo;ensemble du volume d&rsquo;apprentissage participe \u00e0 l&rsquo;estimation des coefficients pr\u00e9dictifs du syst\u00e8me.<\/p>\n<h2>2. La m\u00e9thode \u00e9l\u00e9mentaire : Remplacement conditionnel via l&rsquo;instruction IF-THEN<\/h2>\n<h3>2.1 Syntaxe de base de l&rsquo;instruction IF-THEN au sein de l&rsquo;\u00e9tape DATA<\/h3>\n<p>L&rsquo;\u00e9tape DATA de SAS repose sur une boucle it\u00e9rative implicite qui traite s\u00e9quentiellement chaque enregistrement de la table source. Au c\u0153ur de cette architecture se trouve le vecteur d&rsquo;observation du programme, universellement d\u00e9sign\u00e9 par l&rsquo;acronyme <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/basess\/58133\/HTML\/default\/viewer.htm#a001290590.htm\">Program Data Vector (PDV)<\/a>. Le PDV agit comme une zone tampon en m\u00e9moire vive o\u00f9 les colonnes sont allou\u00e9es, aliment\u00e9es, transform\u00e9es puis \u00e9crites vers le jeu de donn\u00e9es de sortie. L&rsquo;instruction logique IF-THEN constitue le moyen le plus direct et fondamental d&rsquo;interagir avec les valeurs r\u00e9sidant dans ce vecteur.<\/p>\n<p>La structure formelle de la d\u00e9claration conditionnelle d\u00e9di\u00e9e au remplacement s&rsquo;articule traditionnellement autour du pr\u00e9dicat v\u00e9rifiant la pr\u00e9sence du point standard : <code>if variable = . then variable = 0;<\/code>. Lors de l&rsquo;ex\u00e9cution, le compilateur \u00e9value pour chaque ligne la concordance entre l&rsquo;\u00e9tat binaire du champ dans le PDV et la constante repr\u00e9sentative de la valeur manquante. Si la proposition logique est v\u00e9rifi\u00e9e, l&rsquo;adresse m\u00e9moire associ\u00e9e \u00e0 la variable est imm\u00e9diatement r\u00e9affect\u00e9e avec la repr\u00e9sentation binaire du z\u00e9ro en virgule flottante double pr\u00e9cision.<\/p>\n<p>Il est primordial d&rsquo;optimiser l&rsquo;\u00e9criture de ces instructions pour pr\u00e9server les cycles d&rsquo;horloge du processeur. Bien que l&rsquo;instruction simple suffise, sur des tables contenant des dizaines de millions d&rsquo;enregistrements, la r\u00e9assignation ne doit s&rsquo;op\u00e9rer qu&rsquo;en cas d&rsquo;absolue n\u00e9cessit\u00e9. L&rsquo;absence de branche conditionnelle alternative (clause ELSE) est ici appropri\u00e9e, car lorsque la condition n&rsquo;est pas remplie, la valeur valide d\u00e9j\u00e0 pr\u00e9sente dans le PDV doit demeurer strictement inchang\u00e9e. L&rsquo;instruction conditionnelle \u00e9vite ainsi toute alt\u00e9ration parasite des valeurs l\u00e9gitimes non nulles.<\/p>\n<h3>2.2 Application \u00e0 une variable num\u00e9rique isol\u00e9e<\/h3>\n<p>L&rsquo;impl\u00e9mentation de cette logique sur une variable unitaire constitue l&rsquo;arch\u00e9type de la manipulation de nettoyage de donn\u00e9es. Pour illustrer la cin\u00e9tique op\u00e9rationnelle, consid\u00e9rons un sc\u00e9nario d&rsquo;analyse de r\u00e9tention client o\u00f9 la variable mesurant le nombre de r\u00e9clamations d\u00e9pos\u00e9es au cours du dernier trimestre comporte des absences de donn\u00e9es. Ces absences proviennent du fait que les op\u00e9rateurs de saisie n&rsquo;enregistrent aucun formulaire pour les clients sans incident. La table source, d\u00e9sign\u00e9e conventionnellement sous le nom d&rsquo;activit\u00e9, n\u00e9cessite une normalisation avant son exploitation par les algorithmes de segmentation.<\/p>\n<p>Le bloc programmatique fondamental se d\u00e9ploie comme suit au sein de l&rsquo;\u00e9diteur de code SAS :<\/p>\n<p><code>data travail.activite_nettoyee;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.activite;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if reclamations = . then reclamations = 0;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;inspection de la table transform\u00e9e par le truchement de la proc\u00e9dure PROC PRINT r\u00e9v\u00e8le la modification imm\u00e9diate : les enregistrements qui affichaient pr\u00e9alablement le point d&rsquo;ind\u00e9termination arborent d\u00e9sormais le z\u00e9ro num\u00e9rique. Il convient de souligner que cette op\u00e9ration pr\u00e9serve scrupuleusement l&rsquo;ensemble des m\u00e9tadonn\u00e9es originelles de la variable. Le format d&rsquo;affichage, le label informatif et la longueur de stockage en octets d\u00e9finis pr\u00e9alablement dans l&rsquo;en-t\u00eate de la table SAS demeurent rigoureusement intacts au sein du PDV, garantissant une continuit\u00e9 absolue dans le dictionnaire des variables.<\/p>\n<h3>2.3 Remplacement s\u00e9quentiel sur plusieurs colonnes cibl\u00e9es<\/h3>\n<p>Lorsque la probl\u00e9matique de donn\u00e9es lacunaires s&rsquo;\u00e9tend \u00e0 plusieurs variables quantitatives distinctes au sein du m\u00eame jeu de donn\u00e9es, la r\u00e9ponse intuitive consiste \u00e0 multiplier les instructions conditionnelles ind\u00e9pendantes les unes apr\u00e8s les autres. Dans une base de donn\u00e9es de facturation m\u00e9dicale comportant des colonnes d\u00e9di\u00e9es aux montants de pharmacie, de radiologie et d&rsquo;hospitalisation, l&rsquo;analyste peut choisir de juxtaposer les blocs logiques de fa\u00e7on lin\u00e9aire au fil de l&rsquo;\u00e9tape DATA.<\/p>\n<p><code>data travail.facturation_complete;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.facturation;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if montant_pharmacie = . then montant_pharmacie = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if montant_radiologie = . then montant_radiologie = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if montant_hospitalisation = . then montant_hospitalisation = 0;<br \/>\nrun;<\/code><\/p>\n<p>Si cette approche s\u00e9quentielle offre une lisibilit\u00e9 directe pour un nombre tr\u00e8s restreint de colonnes, elle atteint tr\u00e8s rapidement des limites m\u00e9thodologiques s\u00e9v\u00e8res. D\u00e8s lors que le traitement concerne dix, vingt ou cinquante colonnes, la prolif\u00e9ration des lignes d&rsquo;instructions expose le code \u00e0 un risque \u00e9lev\u00e9 d&rsquo;erreurs typographiques, d&rsquo;omissions involontaires de variables et d&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9s de traitement. La maintenance applicative devient complexe et la lisibilit\u00e9 globale s&rsquo;en trouve lourdement d\u00e9grad\u00e9e.<\/p>\n<p>Sur le plan computationnel, l&rsquo;\u00e9valuation successive de multiples blocs conditionnels IF non vectoris\u00e9s force le moteur d&rsquo;ex\u00e9cution \u00e0 \u00e9valuer s\u00e9quentiellement chaque condition logique pour chaque ligne du jeu de donn\u00e9es. M\u00eame si l&rsquo;impact sur une table modeste de quelques milliers de lignes est n\u00e9gligeable, la p\u00e9nalit\u00e9 de performance devient sensible sur des volumes massifs de donn\u00e9es transactionnelles. Cette limite a conduit les concepteurs de SAS \u00e0 d\u00e9velopper des m\u00e9canismes d&rsquo;abstraction plus performants et \u00e9l\u00e9gants pour le traitement it\u00e9ratif de collections de variables.<\/p>\n<h2>3. Automatisation globale : Utilisation des tableaux ARRAY et de la variable _NUMERIC_<\/h2>\n<h3>3.1 Principes fondamentaux de la structure ARRAY dans SAS<\/h3>\n<p>Pour s&rsquo;affranchir de la r\u00e9p\u00e9tition fastidieuse des instructions conditionnelles univari\u00e9es, le langage SAS met \u00e0 la disposition des d\u00e9veloppeurs la structure de tableau d\u00e9sign\u00e9e par l&rsquo;instruction <strong>ARRAY<\/strong>. Contrairement aux tableaux matriciels que l&rsquo;on rencontre dans des langages compil\u00e9s tels que C++ ou Fortran, un ARRAY en SAS ne constitue pas une nouvelle structure de stockage physique de donn\u00e9es en m\u00e9moire ni un objet ind\u00e9pendant. Il s&rsquo;agit fondamentalement d&rsquo;un m\u00e9canisme de r\u00e9f\u00e9rencement symbolique temporaire qui cr\u00e9e un alias mn\u00e9monique pointant vers un ensemble de variables pr\u00e9existantes dans le vecteur d&rsquo;observation (PDV).<\/p>\n<p>L&rsquo;instanciation d&rsquo;un tableau SAS \u00e9tablit une table de correspondance interne permettant d&rsquo;adresser s\u00e9quentiellement des colonnes via un indice positionnel. La d\u00e9claration s&rsquo;effectue exclusivement \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;\u00e9tape DATA et son existence s&rsquo;\u00e9teint d\u00e8s la finalisation de la compilation de cette derni\u00e8re. La syntaxe g\u00e9n\u00e9rale repose sur le mot-cl\u00e9 <code>ARRAY<\/code>, suivi du nom arbitraire attribu\u00e9 \u00e0 la r\u00e9f\u00e9rence, de la dimension du tableau entre parenth\u00e8ses, crochets ou accolades, et de la liste ordonn\u00e9e des variables associ\u00e9es.<\/p>\n<p>L&rsquo;int\u00e9r\u00eat conceptuel majeur de cette abstraction r\u00e9side dans l&rsquo;unification des op\u00e9rations : toute modification appliqu\u00e9e \u00e0 un \u00e9l\u00e9ment indic\u00e9 du tableau s&rsquo;applique imm\u00e9diatement et directement \u00e0 la variable physique correspondante dans le PDV. Cette liaison dynamique offre un cadre id\u00e9al pour la construction de boucles de traitement syst\u00e9matiques, r\u00e9duisant des centaines de lignes potentielles de code conditionnel \u00e0 une structure algorithmique condens\u00e9e, \u00e9l\u00e9gante et parfaitement p\u00e9renne.<\/p>\n<h3>3.2 Exploitation du mot-cl\u00e9 sp\u00e9cial _NUMERIC_ pour un balayage exhaustif<\/h3>\n<p>Dans les architectures de bases de donn\u00e9es hautement d\u00e9normalis\u00e9es ou les tables d&rsquo;analyse multidimensionnelle, identifier nomm\u00e9ment chaque colonne num\u00e9rique susceptible de contenir une valeur manquante repr\u00e9sente une t\u00e2che fastidieuse et vuln\u00e9rable aux \u00e9volutions de structure. Pour pallier cette contrainte, SAS int\u00e8gre des variables de raccourci sp\u00e9ciales pilot\u00e9es par le compilateur, parmi lesquelles le mot-cl\u00e9 universel <code>_NUMERIC_<\/code> joue un r\u00f4le pr\u00e9pond\u00e9rant.<\/p>\n<p>L&rsquo;association de l&rsquo;instruction ARRAY avec le raccourci <code>_NUMERIC_<\/code> instruit le compilateur de parcourir le dictionnaire de la table d&rsquo;entr\u00e9e et d&rsquo;agr\u00e9ger automatiquement sous une m\u00eame ombrelle indic\u00e9e la totalit\u00e9 des colonnes dont le type interne est num\u00e9rique. La d\u00e9claration s&rsquo;effectue typiquement sous la forme suivante :<\/p>\n<p><code>array ensemble_num {*} _NUMERIC_;<\/code><\/p>\n<p>L&rsquo;ast\u00e9risque positionn\u00e9 entre les accolades signifie au syst\u00e8me que la dimension du tableau n&rsquo;a pas besoin d&rsquo;\u00eatre calcul\u00e9e manuellement par le programmeur ; SAS d\u00e9termine lui-m\u00eame le cardinal exact du groupe en comptant les variables num\u00e9riques identifi\u00e9es lors de la phase de compilation du PDV.<\/p>\n<p>Cette technique conf\u00e8re une robustesse exceptionnelle aux programmes d&rsquo;int\u00e9gration. Si le dictionnaire de donn\u00e9es en amont s&rsquo;enrichit de nouvelles m\u00e9triques num\u00e9riques lors d&rsquo;un cycle de mise \u00e0 jour mensuel, le code SAS demeure totalement invariant tout en int\u00e9grant nativement ces nouveaux champs dans le p\u00e9rim\u00e8tre de nettoyage. Par ailleurs, cette construction offre une protection absolue contre les erreurs de typage : les variables de type caract\u00e8re pr\u00e9sentes dans la table sont intrins\u00e8quement et silencieusement ignor\u00e9es par ce mot-cl\u00e9, \u00e9liminant tout risque de conflit de conversion logique.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/missing2.jpg\" alt=\"\" \/><\/figure>\n<h3>3.3 Impl\u00e9mentation de la boucle DO OVER pour la modification it\u00e9rative<\/h3>\n<p>Pour proc\u00e9der \u00e0 la substitution it\u00e9rative sans devoir d\u00e9clarer formellement une variable d&rsquo;incr\u00e9mentation de boucle, SAS propose la structure syntaxique historique <code>DO OVER<\/code>. Cette instruction s&#8217;emploie conjointement avec un tableau \u00e0 dimension implicite ou d\u00e9fini par ast\u00e9risque. Elle instruit l&rsquo;interpr\u00e9teur de parcourir de mani\u00e8re transparente chaque composante du tableau, du premier au dernier \u00e9l\u00e9ment, en positionnant automatiquement le pointeur interne sur la variable active.<\/p>\n<p>L&rsquo;architecture compl\u00e8te du script de traitement global par DO OVER se structure de la mani\u00e8re suivante :<\/p>\n<p><code>data travail.donnees_imputees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.donnees_brutes;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;array tab_num {*} _NUMERIC_;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;do over tab_num;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if tab_num = . then tab_num = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;end;<br \/>\nrun;<\/code><\/p>\n<p>Lors de l&rsquo;ex\u00e9cution, pour chaque ligne du jeu de donn\u00e9es, SAS initialise la boucle et \u00e9value successivement la condition d&rsquo;absence sur chacune des colonnes num\u00e9riques r\u00e9f\u00e9renc\u00e9es par <code>tab_num<\/code>. D\u00e8s qu&rsquo;un point standard est intercept\u00e9, la valeur 0 est inject\u00e9e dans la m\u00e9moire vive de l&rsquo;\u00e9l\u00e9ment correspondant. L&rsquo;analyse du journal d&rsquo;ex\u00e9cution (SAS Log) confirme la fluidit\u00e9 de cette op\u00e9ration : aucune variable auxiliaire n&rsquo;est cr\u00e9\u00e9e dans la table finale et la consommation de m\u00e9moire centrale demeure restreinte \u00e0 la seule gestion des pointeurs du PDV.<\/p>\n<h2>4. Ciblage s\u00e9quentiel et contr\u00f4l\u00e9 : Tableaux explicites avec boucles it\u00e9ratives DO<\/h2>\n<h3>4.1 D\u00e9claration explicite de tableaux avec indexation num\u00e9rique<\/h3>\n<p>Bien que le balayage exhaustif via <code>_NUMERIC_<\/code> s\u00e9duise par sa concision, la pratique professionnelle impose fr\u00e9quemment de circonscrire l&rsquo;imputation par z\u00e9ro \u00e0 un sous-ensemble rigoureusement d\u00e9limit\u00e9 de variables. Dans de nombreuses applications m\u00e9dicales ou industrielles, certaines variables num\u00e9riques mod\u00e9lisent des constantes physiques ou des rapports de toxicit\u00e9 pour lesquels la substitution par z\u00e9ro constituerait une aberration scientifique majeure. Il devient alors indispensable de recourir \u00e0 une d\u00e9claration explicite d\u00e9signant nominativement les variables cibles.<\/p>\n<p>La syntaxe d&rsquo;instanciation d&rsquo;un tableau explicite s&rsquo;articule comme suit :<\/p>\n<p><code>array metriques_cibles {*} score_satisfaction temps_reponse solde_impaye;<\/code><\/p>\n<p>Cette \u00e9criture lie de mani\u00e8re d\u00e9terministe le tableau <code>metriques_cibles<\/code> aux trois variables \u00e9num\u00e9r\u00e9es. L&rsquo;utilisation de l&rsquo;ast\u00e9risque pr\u00e9serve la flexibilit\u00e9 dimensionnelle, permettant \u00e0 l&rsquo;analyste d&rsquo;ajouter ou de retirer ult\u00e9rieurement des variables de la liste sans avoir \u00e0 recalculer manuellement la borne sup\u00e9rieure du tableau. Les variables ainsi regroup\u00e9es doivent obligatoirement partager la m\u00eame nature de type \u00e9l\u00e9mentaire, ce qui est strictement respect\u00e9 d\u00e8s lors que l&rsquo;on traite de grandeurs quantitatives destin\u00e9es \u00e0 l&rsquo;arithm\u00e9tique.<\/p>\n<p>Cette m\u00e9thodologie garantit une \u00e9tanch\u00e9it\u00e9 absolue : seules les variables express\u00e9ment nomm\u00e9es dans la clause de tableau subissent la logique d&rsquo;imputation. Les autres colonnes num\u00e9riques de la table source traversent le vecteur d&rsquo;observation sans subir la moindre alt\u00e9ration, conservant intactes leurs valeurs manquantes originelles pour les traitements ult\u00e9rieurs appropri\u00e9s.<\/p>\n<h3>4.2 Construction de la boucle it\u00e9rative indic\u00e9e standard<\/h3>\n<p>Pour parcourir un tableau explicite avec un niveau de rigueur optimal, l&#8217;emploi de la boucle indic\u00e9e classique gouvern\u00e9e par la fonction <code>DIM()<\/code> repr\u00e9sente le standard absolu de programmation SAS. Contrairement \u00e0 la boucle implicite, l&rsquo;approche indic\u00e9e fait intervenir une variable scalaire qui sert de compteur d&rsquo;it\u00e9ration num\u00e9rique, variant de l&rsquo;unit\u00e9 jusqu&rsquo;\u00e0 la dimension totale du tableau \u00e9valu\u00e9e dynamiquement.<\/p>\n<p>Le canevas programmatique d&rsquo;une telle impl\u00e9mentation s&rsquo;\u00e9tablit ainsi :<\/p>\n<p><code>data travail.cohortes_traitees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.cohortes;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;array tab_cible {*} score_satisfaction temps_reponse solde_impaye;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;do i = 1 to dim(tab_cible);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if tab_cible{i} = . then tab_cible{i} = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;end;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;drop i;<br \/>\nrun;<\/code><\/p>\n<p>La fonction <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/p0j9iixwom55lcn1s030v8r13f64.htm\"><code>DIM()<\/code><\/a> interroge les m\u00e9tadonn\u00e9es internes du tableau <code>tab_cible<\/code> et renvoie instantan\u00e9ment un entier \u00e9gal \u00e0 3 dans ce cas pr\u00e9cis. Au sein de la boucle, l&rsquo;acc\u00e8s \u00e0 la composante s&rsquo;effectue via l&rsquo;op\u00e9rateur d&rsquo;indexation <code>tab_cible{i}<\/code>. Une vigilance rigoureuse doit \u00eatre accord\u00e9e \u00e0 la gestion de la variable indicatrice <code>i<\/code>. \u00c9tant cr\u00e9\u00e9e au sein de l&rsquo;\u00e9tape DATA, elle int\u00e8gre par d\u00e9faut le vecteur d&rsquo;observation et se retrouverait sauvegard\u00e9e dans la table finale sur disque si l&rsquo;instruction <code>DROP i;<\/code> n&rsquo;\u00e9tait pas appliqu\u00e9e pour la purger avant l&rsquo;\u00e9criture d\u00e9finitive.<\/p>\n<h3>4.3 Comparaison fonctionnelle entre DO OVER et boucle indic\u00e9e explicite<\/h3>\n<p>L&rsquo;arbitrage entre l&#8217;emploi de la directive historique <code>DO OVER<\/code> et l&rsquo;usage de la boucle indic\u00e9e <code>DO i = 1 TO DIM()<\/code> rel\u00e8ve \u00e0 la fois de consid\u00e9rations de p\u00e9rennit\u00e9 du code et de flexibilit\u00e9 fonctionnelle. Bien que <code>DO OVER<\/code> offre une \u00e9conomie d&rsquo;\u00e9criture appr\u00e9ciable en \u00e9liminant la d\u00e9claration et l&rsquo;\u00e9limination explicite du compteur d&rsquo;it\u00e9ration, elle est consid\u00e9r\u00e9e par SAS Institute comme une syntaxe h\u00e9rit\u00e9e de versions anciennes. Dans certains environnements stricts de production r\u00e9gul\u00e9s par les autorit\u00e9s sanitaires (FDA) ou financi\u00e8res, l&rsquo;usage de syntaxes formellement indic\u00e9es est souvent impos\u00e9 par les normes de codage internes en raison de leur non-ambigu\u00eft\u00e9 absolue.<\/p>\n<p>Sur le plan fonctionnel, la boucle indic\u00e9e offre un contr\u00f4le granulaire infiniment sup\u00e9rieur. L&rsquo;acc\u00e8s explicite \u00e0 l&rsquo;indice <code>i<\/code> permet d&rsquo;ex\u00e9cuter des op\u00e9rations conditionnelles asym\u00e9triques au sein du m\u00eame tableau. Il devient par exemple ais\u00e9 d&rsquo;appliquer une substitution par z\u00e9ro sur les premiers \u00e9l\u00e9ments du tableau, tout en appliquant une logique d&rsquo;imputation diff\u00e9rente ou un calcul de prorata sur les \u00e9l\u00e9ments de rang sup\u00e9rieur. Cette modularit\u00e9 est difficilement envisageable avec <code>DO OVER<\/code>, qui impose un traitement rigoureusement uniforme et opaque \u00e0 chaque \u00e9l\u00e9ment balay\u00e9.<\/p>\n<p>Pour le travail collaboratif \u00e0 grande \u00e9chelle, la structure indic\u00e9e explicite documente avec une clart\u00e9 limpide la dynamique d&rsquo;ex\u00e9cution algorithmique. Tout programmeur externe relisant le script appr\u00e9hende instantan\u00e9ment les limites dimensionnelles du vecteur, la variable de boucle manipul\u00e9e et le champ exact des colonnes impact\u00e9es, assurant une maintenabilit\u00e9 logicielle p\u00e9renne dans les organisations de recherche clinique ou d&rsquo;actuariat.<\/p>\n<h2>5. Approche fonctionnelle : Exploitation de la fonction COALESCE<\/h2>\n<h3>5.1 M\u00e9canisme op\u00e9rationnel de la fonction COALESCE<\/h3>\n<p>Le langage SAS int\u00e8gre dans sa biblioth\u00e8que native un ensemble \u00e9tendu de fonctions scalaires hautement optimis\u00e9es en langage bas niveau (C), con\u00e7ues pour simplifier les op\u00e9rations r\u00e9currentes de manipulation de donn\u00e9es. Parmi celles-ci, la fonction <strong>COALESCE<\/strong> occupe une place centrale dans le traitement des valeurs ind\u00e9finies. Inspir\u00e9e des standards de l&rsquo;alg\u00e8bre relationnelle et du langage SQL, la fonction COALESCE prend en arguments une liste ind\u00e9termin\u00e9e d&rsquo;expressions num\u00e9riques et renvoie invariablement la premi\u00e8re valeur non manquante rencontr\u00e9e lors de l&rsquo;\u00e9valuation s\u00e9quentielle de gauche \u00e0 droite de ses param\u00e8tres.<\/p>\n<p>La substitution d\u00e9terministe d&rsquo;une valeur manquante par z\u00e9ro trouve dans cette fonction une concr\u00e9tisation syntaxique d&rsquo;une puret\u00e9 remarquable. L&rsquo;expression se formalise par l&rsquo;affectation scalaire directe :<\/p>\n<p><code>solde_ajuste = coalesce(solde_original, 0);<\/code><\/p>\n<p>Dans cette construction, le moteur d&rsquo;ex\u00e9cution examine la variable <code>solde_original<\/code>. Si celle-ci h\u00e9berge une valeur num\u00e9rique valide, positive ou n\u00e9gative, COALESCE la restitue imm\u00e9diatement, interrompant le parcours des arguments. Si, en revanche, <code>solde_original<\/code> contient un point d&rsquo;ind\u00e9termination standard ou une valeur manquante sp\u00e9ciale, la fonction \u00e9value l&rsquo;argument subs\u00e9quent, \u00e0 savoir la constante num\u00e9rique 0, et renvoie cette derni\u00e8re comme r\u00e9sultat d&rsquo;assignation. Cette approche \u00e9limine totalement le recours aux structures de branchement conditionnel explicites IF-THEN, rendant le code compact, lisible et exempt de risques de ruptures logiques.<\/p>\n<h3>5.2 Cr\u00e9ation de nouvelles variables versus remplacement sur place<\/h3>\n<p>L&rsquo;exploitation de la fonction COALESCE soul\u00e8ve un arbitrage fondamental en mati\u00e8re d&rsquo;architecture de donn\u00e9es : la distinction entre la g\u00e9n\u00e9ration d&rsquo;une nouvelle variable d&rsquo;analyse et l&rsquo;\u00e9crasement en place de la colonne pr\u00e9existante dans le vecteur d&rsquo;observation (PDV).<\/p>\n<p>La cr\u00e9ation d&rsquo;un nouvel identifiant, illustr\u00e9e par l&rsquo;expression <code>revenu_impute = coalesce(revenu_declare, 0);<\/code>, r\u00e9pond \u00e0 une exigence majeure de gouvernance des donn\u00e9es : l&rsquo;auditabilit\u00e9 et la non-destructivit\u00e9 de l&rsquo;information source. Dans les protocoles de recherche biom\u00e9dicale ou les contextes de mod\u00e9lisation du risque de cr\u00e9dit, il est imp\u00e9ratif de pouvoir tracer l&rsquo;\u00e9tat originel des donn\u00e9es brutes en vis-\u00e0-vis des valeurs imput\u00e9es pour des besoins d&rsquo;audit ou de recalibrage m\u00e9thodologique. Toutefois, cette approche engendre un d\u00e9doublement de l&rsquo;espace de stockage m\u00e9moire pour la variable consid\u00e9r\u00e9e, augmentant l&#8217;empreinte disque de la table SAS finale.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, le remplacement en place via l&rsquo;instruction r\u00e9assign\u00e9e <code>revenu_declare = coalesce(revenu_declare, 0);<\/code> conserve l&rsquo;\u00e9conomie spatiale du jeu de donn\u00e9es en modifiant directement le contenu binaire de la variable d&rsquo;origine au sein du PDV. Cette technique est vivement recommand\u00e9e lors du traitement d&rsquo;immenses entrep\u00f4ts de donn\u00e9es o\u00f9 chaque octet suppl\u00e9mentaire d\u00e9multipli\u00e9 par des centaines de millions d&rsquo;enregistrements s&rsquo;av\u00e8re co\u00fbteux en temps d&rsquo;entr\u00e9es-sorties (I\/O). En outre, l&rsquo;\u00e9crasement en place conserve automatiquement les m\u00e9tadonn\u00e9es pr\u00e9existantes attach\u00e9es \u00e0 la colonne originelle, notamment son \u00e9tiquette descriptive (LABEL) et ses attributs de formatage (FORMAT), qui risqueraient d&rsquo;\u00eatre alt\u00e9r\u00e9s ou perdus lors de la d\u00e9claration d&rsquo;une nouvelle variable non format\u00e9e.<\/p>\n<h3>5.3 Combinaison de COALESCE avec les boucles ARRAY<\/h3>\n<p>La concision fonctionnelle de COALESCE prend toute sa dimension lorsqu&rsquo;elle est conjugu\u00e9e avec la puissance vectorielle des tableaux ARRAY. Cette synth\u00e8se programmatique permet d&rsquo;\u00e9liminer totalement la clause conditionnelle IF au c\u0153ur de l&rsquo;it\u00e9ration, compressant le corps de la boucle en une ligne unique d&rsquo;instruction math\u00e9matique d&rsquo;une clart\u00e9 exemplaire.<\/p>\n<p>Le mod\u00e8le algorithmique combin\u00e9 s&rsquo;articule comme suit :<\/p>\n<p><code>data travail.mesures_consolidees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.mesures_laboratoire;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;array tab_analyses {*} concentration_a concentration_b concentration_c;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;do i = 1 to dim(tab_analyses);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tab_analyses{i} = coalesce(tab_analyses{i}, 0);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;end;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;drop i;<br \/>\nrun;<\/code><\/p>\n<p>Sur le plan des performances informatiques, la substitution du test logique <code>IF ... THEN<\/code> par un appel direct \u00e0 la fonction COALESCE au sein de la boucle produit des r\u00e9sultats tr\u00e8s comp\u00e9titifs. En exploitant les optimisations vectorielles sous-jacentes du compilateur SAS, le processeur \u00e9vite la p\u00e9nalit\u00e9 de saut de branchement conditionnel (branch misprediction) susceptible d&rsquo;appara\u00eetre sur des architectures mat\u00e9rielles modernes lorsque la survenue de donn\u00e9es manquantes est hautement stochastique. L&rsquo;op\u00e9ration devient purement computationnelle et pr\u00e9visible pour les registres d&rsquo;ex\u00e9cution de la machine.<\/p>\n<h2>6. Traitement vectoriel par proc\u00e9dure d\u00e9di\u00e9e : Utilisation de PROC STDIZE<\/h2>\n<h3>6.1 Architecture et fonctionnalit\u00e9s sp\u00e9cifiques de PROC STDIZE<\/h3>\n<p>Bien que la majorit\u00e9 des transformations de donn\u00e9es au sein de l&rsquo;environnement SAS soient traditionnellement d\u00e9volues \u00e0 l&rsquo;\u00e9tape DATA, l&rsquo;utilisation de proc\u00e9dures sp\u00e9cialis\u00e9es hautement optimis\u00e9es permet d&rsquo;atteindre des niveaux d&rsquo;efficience op\u00e9rationnelle remarquables. La proc\u00e9dure <strong>PROC STDIZE<\/strong> rel\u00e8ve originellement du module SAS\/STAT ou de la couche analytique de base, sa mission premi\u00e8re \u00e9tant le centrage et la r\u00e9duction des distributions statistiques par soustraction de param\u00e8tres de position (moyenne, m\u00e9diane) et division par des mesures d&rsquo;\u00e9chelle (\u00e9cart-type, \u00e9cart interquartile).<\/p>\n<p>Toutefois, les concepteurs de SAS ont int\u00e9gr\u00e9 dans l&rsquo;architecture algorithmique de cette proc\u00e9dure une fonctionnalit\u00e9 d&rsquo;imputation d\u00e9terministe d\u00e9di\u00e9e, pilot\u00e9e par l&rsquo;option strat\u00e9gique <code>REPONLY<\/code> (Replace Only). Lorsqu&rsquo;elle est adjointe \u00e0 l&rsquo;instruction d&rsquo;invocation, cette option ordonne \u00e0 la proc\u00e9dure d&rsquo;inhiber int\u00e9gralement ses modules de calcul statistique de standardisation. Le moteur n&rsquo;applique aucune d\u00e9viation d&rsquo;\u00e9chelle ni aucun centrage ; il consacre l&rsquo;int\u00e9gralit\u00e9 de sa bande passante computationnelle \u00e0 la seule substitution des valeurs manquantes selon la constante math\u00e9matique assign\u00e9e par le param\u00e8tre d&rsquo;imputation.<\/p>\n<p>Cette d\u00e9viation fonctionnelle de PROC STDIZE transforme une proc\u00e9dure d&rsquo;analyse multivari\u00e9e en un utilitaire d&rsquo;imputation de donn\u00e9es ultra-rapide. Elle pr\u00e9sente l&rsquo;avantage majeur de s&rsquo;ex\u00e9cuter sans n\u00e9cessiter la compilation d&rsquo;une \u00e9tape DATA explicite, \u00e9liminant ainsi la phase d&rsquo;\u00e9criture manuelle des boucles, la gestion des pointeurs de m\u00e9moire PDV et les d\u00e9clarations d&rsquo;instructions DROP ou ARRAY.<\/p>\n<h3>6.2 Configuration des param\u00e8tres de remplacement par z\u00e9ro<\/h3>\n<p>La mise en \u0153uvre pratique de cette proc\u00e9dure pour la remise \u00e0 z\u00e9ro des donn\u00e9es manquantes repose sur une syntaxe remarquablement compacte et standardis\u00e9e. La configuration optimale pour un traitement exhaustif s&rsquo;illustre par l&rsquo;appel suivant :<\/p>\n<p><code>proc stdize data=source.transactions out=travail.transactions_zero reponly missing=0;<br \/>\nrun;<\/code><\/p>\n<p>Dans ce bloc op\u00e9ratoire, l&rsquo;option <code>reponly<\/code> verrouille les grandeurs observ\u00e9es non manquantes dans leur \u00e9tat strictly original. L&rsquo;instruction <code>missing=0<\/code> pr\u00e9cise sans \u00e9quivoque la constante de substitution \u00e0 appliquer en lieu et place des points d&rsquo;ind\u00e9termination. En l&rsquo;absence de clause de restriction, PROC STDIZE s\u00e9lectionne par introspection dynamique la totalit\u00e9 des variables de type num\u00e9rique pr\u00e9sentes dans la table source, r\u00e9alisant une couverture int\u00e9grale comparable au mot-cl\u00e9 <code>_NUMERIC_<\/code> de l&rsquo;\u00e9tape DATA.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/missing1.jpg\" alt=\"\" \/><\/figure>\n<p>Si l&rsquo;analyste souhaite restreindre l&rsquo;action d&rsquo;imputation \u00e0 un sous-ensemble d\u00e9termin\u00e9 de m\u00e9triques sans alt\u00e9rer les autres colonnes num\u00e9riques du fichier, il suffit d&rsquo;adjoindre l&rsquo;instruction d\u00e9clarative <code>VAR<\/code> :<\/p>\n<p><code>proc stdize data=source.transactions out=travail.transactions_zero reponly missing=0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;var montant_remise volume_ventes penalite_retard;<br \/>\nrun;<\/code><\/p>\n<p>La table r\u00e9sultante, export\u00e9e dans la biblioth\u00e8que de travail sous l&rsquo;\u00e9tiquette <code>transactions_zero<\/code>, int\u00e8gre l&rsquo;ensemble des colonnes originelles, seules les variables list\u00e9es dans l&rsquo;instruction VAR ayant subi la transformation vers le z\u00e9ro.<\/p>\n<h3>6.3 \u00c9valuation des performances sur les m\u00e9gadonn\u00e9es (Big Data)<\/h3>\n<p>L&rsquo;int\u00e9r\u00eat fondamental du recours \u00e0 PROC STDIZE r\u00e9side dans son comportement computationnel sur des volumes de donn\u00e9es gigantiques, typiques des entrep\u00f4ts de donn\u00e9es d&rsquo;entreprises bancaires ou de t\u00e9l\u00e9communications. Le code sous-jacent \u00e0 PROC STDIZE a \u00e9t\u00e9 compil\u00e9 en C natif avec des directives d&rsquo;optimisation pouss\u00e9es pour le traitement s\u00e9quentiel en m\u00e9moire de flux massifs d&rsquo;octets. Par cons\u00e9quent, son ex\u00e9cution surpasse tr\u00e8s fr\u00e9quemment celle d&rsquo;une \u00e9tape DATA standard contenant des structures it\u00e9ratives complexes.<\/p>\n<p>Dans une \u00e9tape DATA utilisant des tableaux ARRAY, la machine virtuelle SAS doit g\u00e9rer l&rsquo;interpr\u00e9teur de code, contr\u00f4ler la progression des indices et g\u00e9rer l&rsquo;allocation s\u00e9quentielle de chaque \u00e9l\u00e9ment du PDV. En revanche, PROC STDIZE ex\u00e9cute des lectures de blocs binaires continues directement depuis le sous-syst\u00e8me de stockage, applique le filtre de remplacement au niveau le plus bas du pipeline processeur, et r\u00e9\u00e9crit les pages de donn\u00e9es avec un minimum d&rsquo;interruptions d&rsquo;horloge. Cette m\u00e9canique se traduit par une r\u00e9duction substantielle du temps CPU global consomm\u00e9.<\/p>\n<p>N\u00e9anmoins, cette v\u00e9locit\u00e9 brute s&rsquo;accompagne d&rsquo;une rigidit\u00e9 algorithmique incontournable. PROC STDIZE est un outil d\u00e9terministe d&rsquo;application uniforme : il est totalement incapable d&rsquo;\u00e9valuer des r\u00e8gles logiques crois\u00e9es (business rules), telles que le remplacement d&rsquo;une valeur manquante par z\u00e9ro sous r\u00e9serve qu&rsquo;une autre variable de la m\u00eame ligne v\u00e9rifie un statut contractuel sp\u00e9cifique. D\u00e8s lors qu&rsquo;une logique d&rsquo;imputation conditionnelle non lin\u00e9aire est exig\u00e9e par le cahier des charges analytique, l&rsquo;\u00e9tape DATA ou la proc\u00e9dure relationnelle SQL redeviennent imp\u00e9ratives.<\/p>\n<h2>7. L&rsquo;approche relationnelle : Remplacement par z\u00e9ro via PROC SQL<\/h2>\n<h3>7.1 Impl\u00e9mentation de l&rsquo;instruction standard COALESCE en SQL SAS<\/h3>\n<p>L&rsquo;int\u00e9gration \u00e9troite du moteur relationnel au sein de la plateforme SAS via la proc\u00e9dure <strong>PROC SQL<\/strong> permet aux analystes et ing\u00e9nieurs de concevoir des flux de pr\u00e9paration de donn\u00e9es conformes aux standards internationaux ANSI\/ISO SQL. Cette approche s&rsquo;av\u00e8re particuli\u00e8rement naturelle pour les \u00e9quipes \u00e9voluant dans des environnements technologiques mixtes, conjuguant des entrep\u00f4ts de donn\u00e9es relationnels (Oracle, PostgreSQL, Teradata, Snowflake) et des serveurs de calcul SAS.<\/p>\n<p>Au sein de l&rsquo;interpr\u00e9teur PROC SQL, la fonction <code>COALESCE<\/code> s&#8217;emploie selon une s\u00e9mantique rigoureusement identique aux standards de l&rsquo;industrie des bases de donn\u00e9es. L&rsquo;op\u00e9ration de projection s&rsquo;exprime dans une clause de s\u00e9lection unitaire cr\u00e9ant une nouvelle vue ou mat\u00e9rialisant une nouvelle table :<\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;create table travail.ventes_consolidees as<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;select id_client, code_region, coalesce(montant_achat, 0) as montant_achat<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;from source.ventes;<br \/>\nquit;<\/code><\/p>\n<p>Cette construction garantit une int\u00e9gration fluide dans les cha\u00eenes de traitement ETL complexes. En r\u00e9solvant l&rsquo;imputation directement lors des phases d&rsquo;interrogation, de jointure ou d&rsquo;agr\u00e9gation group\u00e9e (clause GROUP BY), le d\u00e9veloppeur s&rsquo;affranchit de la n\u00e9cessit\u00e9 d&rsquo;intercaler une \u00e9tape DATA interm\u00e9diaire de nettoyage. Le flux de travail gagne en concision architecturale et en clart\u00e9 d\u00e9clarative.<\/p>\n<h3>7.2 Utilisation de la structure CASE WHEN pour un contr\u00f4le affin\u00e9<\/h3>\n<p>Lorsque l&rsquo;imputation par z\u00e9ro n\u00e9cessite d&rsquo;\u00eatre adoss\u00e9e \u00e0 une expression logique plus explicite ou enrichie de clauses alternatives, la structure conditionnelle d\u00e9clarative standard <code>CASE WHEN<\/code> offre une lisibilit\u00e9 syntaxique incomparable. Au sein du processeur PROC SQL, la d\u00e9tection d&rsquo;une valeur absente peut s&rsquo;op\u00e9rer aussi bien via le pr\u00e9dicat SQL conventionnel <code>IS MISSING<\/code> que par l&rsquo;idiome relationnel universel <code>IS NULL<\/code>, l&rsquo;interpr\u00e9teur SAS assurant une parfaite passerelle s\u00e9mantique entre ces notions.<\/p>\n<p>L&rsquo;expression d&rsquo;une logique de normalisation s&rsquo;\u00e9tablit de la fa\u00e7on suivante :<\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;create table travail.actifs_valides as<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;select id_compte,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when solde_courant is missing then 0<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else solde_courant<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end as solde_courant<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;from source.actifs;<br \/>\nquit;<\/code><\/p>\n<p>L&rsquo;atout pr\u00e9pond\u00e9rant de l&rsquo;op\u00e9rateur <code>CASE WHEN<\/code> r\u00e9side dans sa capacit\u00e9 intrins\u00e8que \u00e0 combiner des pr\u00e9dicats logiques multivari\u00e9s au sein du m\u00eame bloc d\u00e9cisionnel. L&rsquo;analyste peut ais\u00e9ment subordonner la substitution par z\u00e9ro \u00e0 l&rsquo;\u00e9valuation simultan\u00e9e d&rsquo;autres attributs, comme l&rsquo;\u00e9tat de validation d&rsquo;un contrat ou la nature d&rsquo;un segment d\u00e9mographique, offrant un niveau de personnalisation fonctionnelle inaccessible \u00e0 un simple appel unilat\u00e9ral de COALESCE.<\/p>\n<h3>7.3 Mise \u00e0 jour en place via l&rsquo;instruction UPDATE de PROC SQL<\/h3>\n<p>L&rsquo;un des diff\u00e9rentiateurs fonctionnels majeurs de la proc\u00e9dure SQL r\u00e9side dans sa capacit\u00e9 \u00e0 r\u00e9aliser des modifications physiques directes au sein d&rsquo;une table sans g\u00e9n\u00e9rer une copie int\u00e9grale de la structure de donn\u00e9es. Alors que l&rsquo;\u00e9tape DATA classique lit une table d&rsquo;entr\u00e9e pour en \u00e9crire une nouvelle sur disque (m\u00eame lorsqu&rsquo;elle \u00e9crase le nom de la table source), l&rsquo;instruction <strong>UPDATE<\/strong> de PROC SQL modifie les enregistrements cibl\u00e9s au niveau des blocs physiques existants.<\/p>\n<p>Cette op\u00e9ration de mise \u00e0 jour s&rsquo;ex\u00e9cute selon le sch\u00e9ma suivant :<\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;update travail.grands_comptes<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set montant_impaye = 0<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;where montant_impaye is missing;<br \/>\nquit;<\/code><\/p>\n<p>Cette m\u00e9thodologie s&rsquo;av\u00e8re particuli\u00e8rement efficiente lorsque seule une proportion infinit\u00e9simale de lignes pr\u00e9sente des valeurs lacunaires au sein d&rsquo;une table d&rsquo;un volume volum\u00e9trique colossal. Le moteur SQL SAS localise les blocs d&rsquo;octets sp\u00e9cifiques et substitue les points d&rsquo;ind\u00e9termination par la signature binaire du z\u00e9ro sans avoir \u00e0 dupliquer des millions de lignes valides. <\/p>\n<p>Toutefois, cette pratique exige des mesures d&rsquo;assurance qualit\u00e9 draconiennes. L&rsquo;instruction UPDATE modifiant de fa\u00e7on irr\u00e9versible la table physique sous-jacente, toute erreur de ciblage dans la clause WHERE entra\u00eene la destruction d\u00e9finitive de l&rsquo;information pr\u00e9alable sans possibilit\u00e9 d&rsquo;annulation (rollback) si des m\u00e9canismes stricts de sauvegarde n&rsquo;ont pas \u00e9t\u00e9 configur\u00e9s au niveau du syst\u00e8me de fichiers ou du moteur SAS\/SHARE.<\/p>\n<h2>8. Prise en compte des valeurs manquantes sp\u00e9ciales (.A \u00e0 .Z et ._)<\/h2>\n<h3>8.1 Typologie et finalit\u00e9 s\u00e9miotique des valeurs manquantes sp\u00e9ciales<\/h3>\n<p>L&rsquo;une des fonctionnalit\u00e9s les plus avanc\u00e9es et m\u00e9connues de l&rsquo;architecture num\u00e9rique du syst\u00e8me SAS r\u00e9side dans sa prise en charge des valeurs manquantes sp\u00e9ciales (special missing values). Conscient que l&rsquo;absence d&rsquo;une information quantitative peut proc\u00e9der de causes ontologiques radicalement diff\u00e9rentes, SAS enrichit la valeur manquante standard (.) de 27 repr\u00e9sentations alternatives identifi\u00e9es par les lettres majuscules pr\u00e9c\u00e9d\u00e9es d&rsquo;un point : <code>.A<\/code>, <code>.B<\/code>, &#8230;, <code>.Z<\/code>, ainsi que le caract\u00e8re de soulignement <code>._<\/code>.<\/p>\n<p>Cette typologie permet aux m\u00e9thodologues et concepteurs d&rsquo;\u00e9tudes d&rsquo;encoder la s\u00e9mantique de l&rsquo;absence directement dans le champ num\u00e9rique, sans requ\u00e9rir de colonnes textuelles additionnelles. \u00c0 titre d&rsquo;illustration dans les protocoles d&rsquo;enqu\u00eates \u00e9pid\u00e9miologiques ou sociologiques :<\/p>\n<ul>\n<li><code>.A<\/code> est fr\u00e9quemment allou\u00e9 pour sp\u00e9cifier le refus d\u00e9lib\u00e9r\u00e9 de r\u00e9pondre d&rsquo;un sujet (Refusal).<\/li>\n<li><code>.B<\/code> documente l&rsquo;inapplicabilit\u00e9 intrins\u00e8que de la question li\u00e9e au profil du r\u00e9pondant (Not Applicable).<\/li>\n<li><code>.D<\/code> signale une rupture technique de l&rsquo;instrumentation de mesure (Device Failure).<\/li>\n<li><code>.N<\/code> mat\u00e9rialise l&rsquo;omission involontaire ou la perte d&rsquo;un \u00e9chantillon biologique.<\/li>\n<\/ul>\n<p>Sur le plan strictement arithm\u00e9tique, ces valeurs sp\u00e9ciales se comportent de mani\u00e8re totalement comparable au point standard : toute tentative d&rsquo;\u00e9valuation computationnelle scalaire ordinaire propage une valeur manquante. Cependant, leur pr\u00e9sence dans le jeu de donn\u00e9es requiert une rigueur programmatique absolue lors des phases d&rsquo;imputation, sous peine d&rsquo;alt\u00e9rer gravement la coh\u00e9rence logique du traitement.<\/p>\n<h3>8.2 Pi\u00e8ges logiques lors de la d\u00e9tection par simple \u00e9galit\u00e9<\/h3>\n<p>L&rsquo;erreur la plus insidieuse commise par les d\u00e9veloppeurs SAS confront\u00e9s \u00e0 des valeurs manquantes sp\u00e9ciales consiste \u00e0 maintenir l&rsquo;usage du test logique d&rsquo;\u00e9galit\u00e9 unitaire : <code>if variable = . then variable = 0;<\/code>. <\/p>\n<p>Sur le plan de la logique interne du compilateur SAS, le point standard (.) et les points sp\u00e9ciaux (.A \u00e0 .Z, ._) repr\u00e9sentent des entit\u00e9s binaires distinctes qui disposent chacune d&rsquo;un rang propre dans l&rsquo;ordre de tri machine. SAS positionne la valeur <code>._<\/code> comme \u00e9tant la plus petite valeur concevable, suivie imm\u00e9diatement par le point standard (.), puis par les lettres <code>.A<\/code> jusqu&rsquo;\u00e0 <code>.Z<\/code>, lesquelles demeurent toutes strictement inf\u00e9rieures au premier nombre r\u00e9el n\u00e9gatif. Par cons\u00e9quent, l&rsquo;\u00e9galit\u00e9 logique stricte <code>variable = .<\/code> ne sera \u00e9valu\u00e9e \u00e0 \u00ab vrai \u00bb <em>que si et seulement si<\/em> la variable contient rigoureusement le point standard.<\/p>\n<p>Si une variable h\u00e9berge le code <code>.A<\/code> (d\u00e9notant un refus de r\u00e9ponse) ou <code>.B<\/code> (non applicable), l&rsquo;instruction <code>if variable = . then variable = 0;<\/code> \u00e9valuera la condition \u00e0 \u00ab faux \u00bb. La ligne traversera l&rsquo;\u00e9tape DATA sans \u00eatre modifi\u00e9e, laissant subsister la valeur manquante sp\u00e9ciale dans la table finale. Ce ph\u00e9nom\u00e8ne engendre une sous-estimation syst\u00e9matique et silencieuse du volume r\u00e9el de donn\u00e9es lacunaires \u00e0 imputer, faussant l&rsquo;int\u00e9gralit\u00e9 des analyses quantitatives subs\u00e9quentes sans g\u00e9n\u00e9rer le moindre avertissement d&rsquo;erreur dans le journal d&rsquo;ex\u00e9cution (log).<\/p>\n<h3>8.3 Strat\u00e9gie de substitution par z\u00e9ro adapt\u00e9e aux valeurs sp\u00e9ciales<\/h3>\n<p>Pour capturer avec une infaillibilit\u00e9 absolue la totalit\u00e9 des configurations de donn\u00e9es manquantes, qu&rsquo;elles soient repr\u00e9sent\u00e9es par le point standard ou par l&rsquo;un des 27 codes sp\u00e9ciaux, il est imp\u00e9ratif d&rsquo;abandonner l&rsquo;op\u00e9rateur d&rsquo;\u00e9galit\u00e9 simple au profit de la fonction intrins\u00e8que <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/doc\/en\/pgmsascdc\/9.4_3.5\/lefunctionsref\/n15h6i9y38w9b9n115xwh49tjhq2.htm\"><code>MISSING()<\/code><\/a>.<\/p>\n<p>L&rsquo;impl\u00e9mentation universelle d&rsquo;une remise \u00e0 z\u00e9ro s&rsquo;\u00e9tablit selon la syntaxe suivante :<\/p>\n<p><code>if missing(variable) then variable = 0;<\/code><\/p>\n<p>La fonction <code>MISSING()<\/code> \u00e9value l&rsquo;argument num\u00e9rique qui lui est soumis et retourne syst\u00e9matiquement la valeur bool\u00e9enne 1 (vrai) d\u00e8s lors que le champ correspond \u00e0 un point standard ou \u00e0 n&rsquo;importe quelle valeur manquante sp\u00e9ciale comprise entre <code>._<\/code> et <code>.Z<\/code>. Elle \u00e9limine instantan\u00e9ment le risque d&rsquo;omission d&rsquo;une cat\u00e9gorie particuli\u00e8re d&rsquo;absence.<\/p>\n<p>Toutefois, dans un cadre m\u00e9thodologique raffin\u00e9, l&rsquo;analyste peut souhaiter op\u00e9rer une imputation s\u00e9lective. Supposons une \u00e9tude o\u00f9 l&rsquo;absence non motiv\u00e9e (point standard) doive \u00eatre assimil\u00e9e \u00e0 une consommation nulle (0), tandis que l&rsquo;inapplicabilit\u00e9 structurelle (code <code>.B<\/code>) doive \u00eatre imp\u00e9rativement pr\u00e9serv\u00e9e pour exclure ult\u00e9rieurement le patient du d\u00e9nominateur d&rsquo;un taux d&rsquo;incidence. Le code SAS tirera alors profit de la distinction interne :<\/p>\n<p><code>if variable = . then variable = 0;<br \/>\n\/* Le code .B est volontairement pr\u00e9serv\u00e9 sans \u00eatre converti en z\u00e9ro *\/<\/code><\/p>\n<p>Inversement, si l&rsquo;on souhaite exclure une plage pr\u00e9cise de codes sp\u00e9ciaux de la conversion, la syntaxe compar\u00e9e de SAS permet des expressions d&rsquo;une grande finesse :<\/p>\n<p><code>if missing(variable) and variable ne .B then variable = 0;<\/code><\/p>\n<p>Ce haut niveau de discernement souligne la n\u00e9cessit\u00e9 imp\u00e9rieuse de documenter rigoureusement dans le cahier d&rsquo;observation statistique (SAP &#8211; Statistical Analysis Plan) le destin assign\u00e9 \u00e0 chaque d\u00e9clinaison s\u00e9mantique des donn\u00e9es manquantes.<\/p>\n<h2>9. Remplacement contextuel et conditionnel bas\u00e9 sur des r\u00e8gles m\u00e9tier<\/h2>\n<h3>9.1 Imputation conditionn\u00e9e par l&rsquo;\u00e9tat d&rsquo;une variable tierce<\/h3>\n<p>Dans les architectures d&rsquo;entreprise r\u00e9elles, la remise \u00e0 z\u00e9ro d&rsquo;une donn\u00e9e manquante ne saurait s&rsquo;op\u00e9rer de mani\u00e8re isol\u00e9e sans interroger le contexte syst\u00e9mique de l&rsquo;observation. La valeur prise par une colonne est intrins\u00e8quement tributaire des caract\u00e9ristiques port\u00e9es par d&rsquo;autres attributs de la m\u00eame entit\u00e9 d&rsquo;analyse. Ce principe de coh\u00e9rence contextuelle impose la mise en \u0153uvre d&rsquo;imputations conditionn\u00e9es par l&rsquo;\u00e9tat logique d&rsquo;une ou plusieurs variables tierces.<\/p>\n<p>Consid\u00e9rons le secteur de l&rsquo;enseignement sup\u00e9rieur o\u00f9 une table centralise les r\u00e9sultats acad\u00e9miques d&rsquo;\u00e9tudiants. Une variable quantitative enregistre la note obtenue \u00e0 un examen optionnel d&rsquo;informatique avanc\u00e9e. Pour les \u00e9tudiants inscrits dans la fili\u00e8re litt\u00e9raire pour lesquels cette option n&rsquo;existe pas au programme, l&rsquo;absence de note repr\u00e9sente une inapplicabilit\u00e9 fondamentale qui doit imp\u00e9rativement demeurer manquante. En revanche, pour les \u00e9tudiants de la fili\u00e8re scientifique inscrits d&rsquo;office \u00e0 l&rsquo;\u00e9preuve, l&rsquo;absence d&rsquo;enregistrement d&rsquo;une note traduit l&rsquo;absence injustifi\u00e9e \u00e0 l&rsquo;\u00e9valuation, justifiant l&rsquo;application r\u00e9glementaire de la note z\u00e9ro.<\/p>\n<p>L&rsquo;impl\u00e9mentation de cette r\u00e8gle m\u00e9tier s&rsquo;op\u00e8re par la combinaison de connecteurs bool\u00e9ens au sein de l&rsquo;\u00e9tape DATA :<\/p>\n<p><code>data travail.academique_normalise;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.academique;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if filiere = 'Sciences' and missing(note_informatique) then note_informatique = 0;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;usage conjoint de l&rsquo;op\u00e9rateur relationnel et de la fonction <code>MISSING()<\/code> garantit que la variable <code>note_informatique<\/code> ne sera convertie vers le z\u00e9ro que si et seulement si l&rsquo;\u00e9tudiant appartient au segment cibl\u00e9. La valeur manquante des \u00e9tudiants de la fili\u00e8re litt\u00e9raire est ainsi sanctuaris\u00e9e, pr\u00e9servant la repr\u00e9sentativit\u00e9 statistique des distributions d&rsquo;\u00e9chantillonnage pour chaque cohorte acad\u00e9mique.<\/p>\n<h3>9.2 Traitement diff\u00e9rentiel selon des seuils ou des groupes d&rsquo;observations<\/h3>\n<p>La mod\u00e9lisation de donn\u00e9es longitudinales ou de panels de suivi temporel requiert fr\u00e9quemment d&rsquo;articuler l&rsquo;imputation par z\u00e9ro autour de rep\u00e8res \u00e9v\u00e9nementiels sp\u00e9cifiques. Dans de telles configurations, une mesure ne doit adopter la valeur z\u00e9ro qu&rsquo;\u00e0 partir du moment exact o\u00f9 une \u00e9tape charni\u00e8re est franchie dans l&rsquo;histoire de l&rsquo;individu ou du syst\u00e8me suivi, toute mesure ant\u00e9rieure devant conserver son statut ind\u00e9fini pour refl\u00e9ter l&rsquo;\u00e9tat de pr\u00e9-inclusion.<\/p>\n<p>Pour orchestrer ce traitement s\u00e9quentiel hautement contr\u00f4l\u00e9, le recours aux variables automatiques <strong>FIRST.<\/strong> et <strong>LAST.<\/strong> g\u00e9n\u00e9r\u00e9es par l&rsquo;instruction <code>BY<\/code> de SAS constitue l&rsquo;outil par excellence. Consid\u00e9rons une cohorte de patients suivis mensuellement pour le dosage d&rsquo;un biomarqueur apr\u00e8s l&rsquo;administration d&rsquo;une th\u00e9rapie exp\u00e9rimentale :<\/p>\n<p><code>proc sort data=source.suivi_patients out=travail.suivi_ordonne;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by id_patient date_suivi;<br \/>\nrun;<\/p>\n<p>data travail.suivi_impute;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set travail.suivi_ordonne;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;by id_patient date_suivi;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;retain traitement_debute 0;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;if first.id_patient then traitement_debute = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if indicateur_administration = 1 then traitement_debute = 1;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;if traitement_debute = 1 and missing(dosage_biomarqueur) then dosage_biomarqueur = 0;<br \/>\nrun;<\/code><\/p>\n<p>Dans cette logique \u00e9labor\u00e9e, l&rsquo;instruction <code>RETAIN<\/code> maintient l&rsquo;\u00e9tat de l&rsquo;indicateur binaire d&rsquo;une ligne \u00e0 l&rsquo;autre au sein du m\u00eame sujet. Avant l&rsquo;administration du traitement, les \u00e9ventuelles valeurs manquantes demeurent intouch\u00e9es. D\u00e8s l&rsquo;instant o\u00f9 l&rsquo;administration est valid\u00e9e, l&rsquo;indicateur bascule et active la r\u00e8gle d&rsquo;imputation par z\u00e9ro pour tous les points de mesure ult\u00e9rieurs du patient. Cette m\u00e9thodologie garantit une fid\u00e9lit\u00e9 chronologique irr\u00e9prochable et pr\u00e9vient l&rsquo;introduction d&rsquo;art\u00e9facts de mesure dans les analyses de survie ou les mod\u00e8les mixtes longitudinaux.<\/p>\n<h3>9.3 Gestion des interactions entre types de variables num\u00e9riques et caract\u00e8res<\/h3>\n<p>Dans de nombreuses architectures de capture de donn\u00e9es mal normalis\u00e9es, des grandeurs fondamentalement quantitatives se trouvent malencontreusement int\u00e9gr\u00e9es sous forme de variables alphanum\u00e9riques (type caract\u00e8re). Ce cas de figure survient fr\u00e9quemment lors de l&rsquo;ingestion de fichiers plats d\u00e9limit\u00e9s (fichiers CSV) o\u00f9 des champs vides cohabitent avec des mentions textuelles h\u00e9t\u00e9rog\u00e8nes (telles que \u00ab\u00a0N\/A\u00a0\u00bb, \u00ab\u00a0NULL\u00a0\u00bb, ou des espaces multiples) pour exprimer l&rsquo;absence de mesure.<\/p>\n<p>Tenter d&rsquo;appliquer une substitution num\u00e9rique par z\u00e9ro directement sur une variable textuelle sans conversion pr\u00e9alable expose le programmeur \u00e0 des dysfonctionnements critiques. Si le d\u00e9veloppeur \u00e9crit <code>char_var = 0;<\/code>, le compilateur SAS ex\u00e9cute une conversion implicite automatique qui surcharge inutilement le processeur et pollue le journal d&rsquo;ex\u00e9cution d&rsquo;avertissements explicites (\u00ab NOTE: Character values have been converted to numeric values \u00bb). Pire encore, une variable alphanum\u00e9rique affect\u00e9e avec la cha\u00eene \u00ab\u00a00\u00a0\u00bb ne se comportera jamais comme un z\u00e9ro math\u00e9matique lors des proc\u00e9dures analytiques futures.<\/p>\n<p>La r\u00e9solution \u00e9l\u00e9gante et robuste de ce d\u00e9fi exige une conversion explicite structur\u00e9e en deux phases via les fonctions <strong>INPUT<\/strong> et <strong>PUT<\/strong>. Le patron de conception standard pour transmuter une colonne texte lacunaire en une variable num\u00e9rique nettoy\u00e9e et remise \u00e0 z\u00e9ro s&rsquo;\u00e9tablit de la mani\u00e8re suivante :<\/p>\n<p><code>data travail.donnees_assainies(drop=montant_str);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.donnees_sources(rename=(montant=montant_str));<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;montant_num = input(montant_str, ?? comma12.2);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if missing(montant_num) then montant = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;else montant = montant_num;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;drop montant_num;<br \/>\nrun;<\/code><\/p>\n<p>L&#8217;emploi du modificateur de suppression d&rsquo;erreurs <code>??<\/code> adjoint \u00e0 la fonction <code>INPUT<\/code> instruit le moteur SAS d&rsquo;inhiber la g\u00e9n\u00e9ration d&rsquo;alertes dans le journal lorsqu&rsquo;il rencontre des cha\u00eenes textuelles non convertibles en nombres (telles que \u00ab\u00a0INDETERMINE\u00a0\u00bb ou \u00ab\u00a0REFUS\u00a0\u00bb). Ces configurations sont instantan\u00e9ment converties en points manquants standards (.), lesquels sont ensuite captur\u00e9s en toute s\u00e9curit\u00e9 par la fonction <code>MISSING()<\/code> pour \u00eatre r\u00e9assign\u00e9s \u00e0 la valeur z\u00e9ro au sein de la nouvelle variable num\u00e9rique <code>montant<\/code>. L&rsquo;utilisation conjointe des clauses RENAME et DROP assure une parfaite substitution d&rsquo;en-t\u00eate sans d\u00e9stabiliser les programmes aval.<\/p>\n<h2>10. Implications m\u00e9thodologiques, statistiques et psychom\u00e9triques de l&rsquo;imputation par z\u00e9ro<\/h2>\n<h3>10.1 Distorsion des param\u00e8tres de tendance centrale et de dispersion<\/h3>\n<p>L&rsquo;imputation d\u00e9terministe d&rsquo;une valeur constante au sein d&rsquo;une distribution statistique, en particulier lorsqu&rsquo;il s&rsquo;agit du z\u00e9ro, n&rsquo;est jamais un acte neutre sur le plan fondamental. Sur le plan descriptif, le remplacement de valeurs manquantes par z\u00e9ro engendre une baisse m\u00e9canique et syst\u00e9matique de la moyenne arithm\u00e9tique de la variable \u00e9tudi\u00e9e, sous r\u00e9serve que la moyenne des valeurs originellement observ\u00e9es soit positive. En augmentant arbitrairement le d\u00e9nominateur de la somme sans modifier le num\u00e9rateur (puisque l&rsquo;ajout de z\u00e9ros n&rsquo;incr\u00e9mente pas la masse globale), la position de l&rsquo;estimateur de tendance centrale est inexorablement tir\u00e9e vers le bas.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/missing3.jpg\" alt=\"\" \/><\/figure>\n<p>Concernant les param\u00e8tres de dispersion, l&rsquo;impact est doublement paradoxal. D&rsquo;une part, l&rsquo;introduction artificielle d&rsquo;une masse de probabilit\u00e9 ponctuelle au point z\u00e9ro tend \u00e0 comprimer la variance si les donn\u00e9es observ\u00e9es gravitent d\u00e9j\u00e0 naturellement autour de z\u00e9ro. D&rsquo;autre part, si la distribution des valeurs valides se situe sur un registre d&rsquo;\u00e9chelle \u00e9lev\u00e9 (par exemple, des salaires annuels compris entre 40 000 et 120 000 euros), l&rsquo;adjonction d&rsquo;enregistrements \u00e0 z\u00e9ro gonfle artificiellement l&rsquo;\u00e9cart-type de mani\u00e8re vertigineuse en cr\u00e9ant des distances d&rsquo;\u00e9cart quadratique consid\u00e9rables par rapport \u00e0 la moyenne recalcul\u00e9e.<\/p>\n<p>En outre, les moments d&rsquo;ordre sup\u00e9rieur de la distribution subissent des distorsions structurelles massives. L&rsquo;asym\u00e9trie (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Skewness\">skewness<\/a>) est fortement alt\u00e9r\u00e9e vers la droite en pr\u00e9sence d&rsquo;une masse artificielle au z\u00e9ro, conf\u00e9rant \u00e0 la courbe empirique une longue tra\u00eene positive. Simultan\u00e9ment, le coefficient d&rsquo;aplatissement (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Kurtosis\">kurtosis<\/a>) subit une pouss\u00e9e leptokurtique extr\u00eame, caract\u00e9ris\u00e9e par une pointe centrale hyper-concentr\u00e9e au point d&rsquo;imputation qui viole formellement l&rsquo;hypoth\u00e8se de normalit\u00e9 univari\u00e9e sous-jacente \u00e0 la vaste majorit\u00e9 des m\u00e9thodes param\u00e9triques classiques.<\/p>\n<h3>10.2 Alt\u00e9ration des coefficients d&rsquo;association et d&rsquo;inf\u00e9rence<\/h3>\n<p>Sur le plan des statistiques bivari\u00e9es et multivari\u00e9es, l&rsquo;imputation non contr\u00f4l\u00e9e par z\u00e9ro produit des effets d\u00e9l\u00e9t\u00e8res sur l&rsquo;estimation des coefficients de corr\u00e9lation lin\u00e9aire de Pearson ainsi que sur les rangs de Spearman. En cr\u00e9ant un groupe artificiel d&rsquo;observations partageant exactement la m\u00eame coordonn\u00e9e sur l&rsquo;axe des abscisses, l&rsquo;analyste induit un ph\u00e9nom\u00e8ne de troncation artificielle ou d&rsquo;att\u00e9nuation des covariances r\u00e9elles. Si la variable conjointe pr\u00e9sente des valeurs dispers\u00e9es face \u00e0 cette concentration de z\u00e9ros, le coefficient d&rsquo;association lin\u00e9aire tend m\u00e9caniquement vers z\u00e9ro, occultant des relations fonctionnelles sous-jacentes pourtant fortes.<\/p>\n<p>Dans le contexte des mod\u00e8les de r\u00e9gression lin\u00e9aire multiple estim\u00e9s par la m\u00e9thode des moindres carr\u00e9s ordinaires (MCO), l&rsquo;int\u00e9gration de pr\u00e9dicteurs imput\u00e9s d\u00e9terministement par z\u00e9ro biaise de mani\u00e8re irr\u00e9versible les coefficients de r\u00e9gression partiels (<span class=\"arabpsy-math-inline\" data-latex=\"\\beta\">$\\beta$<\/span>). L&rsquo;estimateur perd sa propri\u00e9t\u00e9 fondamentale de non-biais \u00e0 variance minimale (propri\u00e9t\u00e9 BLUE issue du th\u00e9or\u00e8me de Gauss-Markov). Les erreurs types des coefficients se trouvent artificiellement sous-estim\u00e9es du fait de l&rsquo;inflation non repr\u00e9sentative de la taille apparente de l&rsquo;\u00e9chantillon (<span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span>), conduisant \u00e0 une multiplication dramatique des erreurs de type I : l&rsquo;analyste conclut \u00e0 la significativit\u00e9 statistique de pr\u00e9dicteurs qui, en r\u00e9alit\u00e9, ne le sont pas.<\/p>\n<p>Dans les domaines de la psychom\u00e9trie et de la recherche comportementale faisant appel \u00e0 l&rsquo;analyse factorielle confirmatoire (CFA) ou aux mod\u00e8les d&rsquo;\u00e9quations structurelles (SEM), la remise \u00e0 z\u00e9ro anarchique des items de questionnaires d\u00e9truit la matrice de corr\u00e9lation polychorique ou de covariance. Les algorithmes d&rsquo;optimisation num\u00e9rique (tels que le maximum de vraisemblance) rencontrent de graves difficult\u00e9s de convergence en raison de l&rsquo;apparition de matrices quasi-singuli\u00e8res ou non d\u00e9finies positives, conduisant \u00e0 des solutions aberrantes de Heywood (variances d&rsquo;erreur n\u00e9gatives) et invalidant l&rsquo;ajustement global des mod\u00e8les th\u00e9oriques test\u00e9s.<\/p>\n<h3>10.3 Typologie de Rubin : MCAR, MAR et MNAR face au z\u00e9ro d\u00e9terministe<\/h3>\n<p>Pour appr\u00e9hender avec rigueur la validit\u00e9 scientifique d&rsquo;une substitution par z\u00e9ro, il convient d&rsquo;analyser le probl\u00e8me \u00e0 travers le prisme de la taxonomie fondamentale des m\u00e9canismes d&rsquo;absence \u00e9tablie par le statisticien Donald Rubin. Cette typologie classe les donn\u00e9es manquantes en trois r\u00e9gimes distincts :<\/p>\n<ul>\n<li><strong>MCAR (Missing Completely at Random)<\/strong> : L&rsquo;absence est rigoureusement ind\u00e9pendante de toute variable observ\u00e9e ou inobserv\u00e9e de l&rsquo;\u00e9tude.<\/li>\n<li><strong>MAR (Missing at Random)<\/strong> : La probabilit\u00e9 d&rsquo;absence d\u00e9pend syst\u00e9matiquement d&rsquo;autres variables observ\u00e9es dans le syst\u00e8me, mais demeure ind\u00e9pendante de la valeur sous-jacente de la variable manquante elle-m\u00eame.<\/li>\n<li><strong>MNAR (Missing Not at Random)<\/strong> : La probabilit\u00e9 qu&rsquo;une valeur soit manquante est directement corr\u00e9l\u00e9e \u00e0 la magnitude de cette valeur.<\/li>\n<\/ul>\n<p>L&rsquo;application d&rsquo;un z\u00e9ro d\u00e9terministe sous un r\u00e9gime MCAR constitue une d\u00e9gradation artificielle de donn\u00e9es valides. Si des donn\u00e9es de tension art\u00e9rielle sont manquantes en raison d&rsquo;une panne stochastique d&rsquo;imprimante thermique \u00e0 l&rsquo;h\u00f4pital, leur imputer la valeur z\u00e9ro introduit une fausset\u00e9 biologique absurde au sein de l&rsquo;\u00e9chantillon. En r\u00e9gime MAR, l&rsquo;imputation par z\u00e9ro est tout aussi pr\u00e9judiciable \u00e0 moins d&rsquo;int\u00e9grer formellement les covariables conditionnantes dans une mod\u00e9lisation stochastique ou une proc\u00e9dure d&rsquo;imputation multiple par \u00e9quations cha\u00een\u00e9es (MICE), facilement accessible via la proc\u00e9dure native <code>PROC MI<\/code> de SAS.<\/p>\n<p>Le seul cas o\u00f9 le remplacement d\u00e9terministe par z\u00e9ro se justifie pleinement sur le plan \u00e9pist\u00e9mologique r\u00e9side dans certaines configurations sp\u00e9cifiques relevant formellement de la cat\u00e9gorie MNAR, o\u00f9 le processus physique de g\u00e9n\u00e9ration fait co\u00efncider l&rsquo;absence avec la valeur nulle. C&rsquo;est le cas embl\u00e9matique des \u00ab z\u00e9ros comportementaux \u00bb : dans un sondage sur la consommation hebdomadaire de tabac, un non-fumeur laisse fr\u00e9quemment la case du nombre de cigarettes fum\u00e9es en blanc. La probabilit\u00e9 d&rsquo;absence est ici intrins\u00e8quement li\u00e9e au fait que la consommation est rigoureusement \u00e9gale \u00e0 z\u00e9ro. Dans ce cadre pr\u00e9cis, l&rsquo;imputation par z\u00e9ro n&rsquo;est pas un biais d&rsquo;estimation, mais l&rsquo;assignation exacte du statut r\u00e9el du ph\u00e9nom\u00e8ne mod\u00e9lis\u00e9.<\/p>\n<h2>11. Validation empirique, contr\u00f4le qualit\u00e9 et tra\u00e7abilit\u00e9 apr\u00e8s imputation<\/h2>\n<h3>11.1 V\u00e9rification exhaustive de l&rsquo;\u00e9limination des valeurs manquantes<\/h3>\n<p>La rigueur de la programmation scientifique en environnement SAS exige que toute phase de manipulation de donn\u00e9es soit imm\u00e9diatement suivie d&rsquo;une phase de validation empirique document\u00e9e. Il est exclu de postuler la parfaite r\u00e9ussite d&rsquo;un script d&rsquo;imputation sans en administrer la preuve analytique formelle. Le moyen le plus direct et complet d&rsquo;attester de la disparition totale des points standard et sp\u00e9ciaux consiste \u00e0 mobiliser la proc\u00e9dure <strong>PROC MEANS<\/strong> avec l&rsquo;option statistique sp\u00e9cialis\u00e9e <code>NMISS<\/code>.<\/p>\n<p>L&rsquo;audit de validation se d\u00e9ploie selon le canevas suivant :<\/p>\n<p><code>proc means data=travail.donnees_imputees n nmiss min mean max;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;var _NUMERIC_;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;examen attentif du rapport g\u00e9n\u00e9r\u00e9 dans l&rsquo;interface de sortie SAS Results doit confirmer de mani\u00e8re irr\u00e9futable que la colonne <code>Nmiss<\/code> affiche la valeur z\u00e9ro pour l&rsquo;ensemble des variables soumises au protocole. Parall\u00e8lement, l&rsquo;inspection de la statistique <code>Min<\/code> permet de s&rsquo;assurer qu&rsquo;aucune valeur n\u00e9gative aberrante n&rsquo;a \u00e9t\u00e9 introduite involontairement et que le z\u00e9ro constitue d\u00e9sormais, le cas \u00e9ch\u00e9ant, le nouveau plancher de la distribution.<\/p>\n<p>Pour des variables discr\u00e8tes ou cat\u00e9gorielles encod\u00e9es num\u00e9riquement ayant subi une remise \u00e0 z\u00e9ro, la proc\u00e9dure <strong>PROC FREQ<\/strong> assortie de l&rsquo;option <code>\/ MISSING<\/code> fournit un contr\u00f4le d&rsquo;une granularit\u00e9 sup\u00e9rieure :<\/p>\n<p><code>proc freq data=travail.donnees_imputees;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;tables variable_cible \/ missing;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;option <code>\/ MISSING<\/code> ordonne \u00e0 PROC FREQ de comptabiliser les valeurs manquantes comme des cat\u00e9gories d&rsquo;affichage \u00e0 part enti\u00e8re. Le rapport d&rsquo;ex\u00e9cution final doit obligatoirement attester d&rsquo;un effectif strictement \u00e9gal \u00e0 z\u00e9ro pour les cat\u00e9gories ind\u00e9finies, tout en affichant l&rsquo;accroissement exact de l&rsquo;effectif associ\u00e9 \u00e0 la modalit\u00e9 0, confirmant l&rsquo;int\u00e9grit\u00e9 de la bascule de population.<\/p>\n<h3>11.2 Cr\u00e9ation d&rsquo;indicateurs de tra\u00e7abilit\u00e9 (variables sentinelles \/ Shadow Variables)<\/h3>\n<p>Dans le contexte des Bonnes Pratiques Cliniques (BPC) et des exigences de tra\u00e7abilit\u00e9 des autorit\u00e9s d&rsquo;inspection r\u00e9glementaire (FDA, EMA), \u00e9craser irr\u00e9vocablement une valeur manquante par une constante sans conserver la m\u00e9moire de l&rsquo;\u00e9tat originel constitue une non-conformit\u00e9 majeure de gouvernance. Il est vivement prescrit d&rsquo;impl\u00e9menter des indicateurs binaires de tra\u00e7abilit\u00e9, couramment qualifi\u00e9s de variables sentinelles ou \u00ab variables d&rsquo;ombre \u00bb (shadow variables).<\/p>\n<p>Ces variables sentinelles agissent comme des drapeaux bool\u00e9ens (flags 0\/1) signalant si la valeur finale a \u00e9t\u00e9 mesur\u00e9e de fa\u00e7on empirique ou si elle d\u00e9coule d&rsquo;un algorithme de substitution d\u00e9terministe. Leur g\u00e9n\u00e9ration doit obligatoirement pr\u00e9c\u00e9der l&rsquo;op\u00e9ration d&rsquo;imputation au sein de l&rsquo;\u00e9tape DATA :<\/p>\n<p><code>data travail.analyse_tracable;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;set source.analyse_brute;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;\/* Instanciation de la variable sentinelle *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;flag_imput_dose = missing(dose_administree);<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;\/* Application de la substitution par z\u00e9ro *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;if flag_imput_dose = 1 then dose_administree = 0;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;\u00e9valuation logique directe de l&rsquo;expression <code>missing(dose_administree)<\/code> affecte la valeur 1 \u00e0 <code>flag_imput_dose<\/code> si la mesure \u00e9tait originellement absente, et 0 dans le cas contraire. L&rsquo;existence de ce marqueur offre des avantages consid\u00e9rables pour la suite du cycle d&rsquo;analyse : elle permet aux biostatisticiens de mener des analyses de sensibilit\u00e9 pouss\u00e9es (tipping-point analyses) en comparant les param\u00e8tres du mod\u00e8le selon que les enregistrements imput\u00e9s sont maintenus ou exclus de l&rsquo;\u00e9chantillon d&rsquo;inf\u00e9rence, conf\u00e9rant \u00e0 la recherche une transparence m\u00e9thodologique absolue.<\/p>\n<h3>11.3 Comparaison avant\/apr\u00e8s par visualisations et r\u00e9sum\u00e9s num\u00e9riques<\/h3>\n<p>L&rsquo;\u00e9valuation de la qualit\u00e9 des donn\u00e9es assainies passe obligatoirement par une confrontation synth\u00e9tique des profils de distribution avant et apr\u00e8s l&rsquo;intervention logicielle. L&#8217;emploi de la proc\u00e9dure <strong>PROC UNIVARIATE<\/strong> offre une plateforme id\u00e9ale pour quantifier l&rsquo;effet de ce traitement sur la morphologie des s\u00e9ries statistiques.<\/p>\n<p>L&rsquo;interrogation comparative s&rsquo;articule par l&rsquo;ex\u00e9cution s\u00e9quentielle sur les tables d&rsquo;amont et d&rsquo;aval :<\/p>\n<p><code>proc univariate data=source.analyse_brute noprint;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;histogram score_clinique \/ normal;<br \/>\nrun;<\/p>\n<p>proc univariate data=travail.analyse_tracable noprint;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;histogram score_clinique \/ normal;<br \/>\nrun;<\/code><\/p>\n<p>La confrontation des repr\u00e9sentations graphiques met imm\u00e9diatement en exergue le ph\u00e9nom\u00e8ne structural d&rsquo;\u00ab inflation de z\u00e9ros \u00bb (zero-inflation). Alors que l&rsquo;histogramme initial pr\u00e9sentait une densit\u00e9 continue et tronqu\u00e9e, la distribution finale exhibe une barre hyper-fr\u00e9quente positionn\u00e9e rigoureusement \u00e0 l&rsquo;origine, illustrant la m\u00e9tamorphose de la loi de probabilit\u00e9 vers une distribution mixte discr\u00e8te-continue.<\/p>\n<p>La consignation de ces r\u00e9sum\u00e9s num\u00e9riques (moyenne, m\u00e9diane, \u00e9cart interquartile, coefficient d&rsquo;asym\u00e9trie) au sein des carnets de laboratoire \u00e9lectronique ou des rapports de validation de pipelines de donn\u00e9es constitue un jalon fondamental du contr\u00f4le qualit\u00e9. Cette documentation permet aux comit\u00e9s de relecture et aux auditeurs externes d&rsquo;appr\u00e9hender sans ambigu\u00eft\u00e9 l&rsquo;impact m\u00e9canique de la manipulation informatique sur les degr\u00e9s de libert\u00e9 et les propri\u00e9t\u00e9s de variance du jeu de donn\u00e9es final.<\/p>\n<h2>12. Optimisation des performances et recommandations pour les tables massives<\/h2>\n<h3>12.1 Minimisation des acc\u00e8s disque (I\/O) et compression de table<\/h3>\n<p>Lors du d\u00e9ploiement de scripts de nettoyage sur des infrastructures d&rsquo;entreprise manipulant des volumes de l&rsquo;ordre de plusieurs t\u00e9raoctets, le principal goulet d&rsquo;\u00e9tranglement informatique n&rsquo;est presque jamais le cycle processeur (CPU), mais la bande passante du sous-syst\u00e8me de disques (Entr\u00e9es\/Sorties &#8211; I\/O). Dans ce contexte d&rsquo;\u00e9chelle massive, la strat\u00e9gie conventionnelle consistant \u00e0 lire une table volumineuse pour en r\u00e9\u00e9crire une version compl\u00e8te modifi\u00e9e dans une \u00e9tape DATA g\u00e9n\u00e8re des temps de latence et des transferts r\u00e9seau prohibitifs.<\/p>\n<p>Pour juguler cette contrainte mat\u00e9rielle, il est hautement pertinent d&rsquo;utiliser l&rsquo;\u00e9tape DATA combin\u00e9e avec l&rsquo;instruction de modification directe <strong>MODIFY<\/strong> au lieu de l&rsquo;instruction SET. L&#8217;emploi de MODIFY permet de mettre \u00e0 jour les enregistrements in situ, sans duplication physique du jeu de donn\u00e9es et sans n\u00e9cessiter le doublement de l&rsquo;espace de stockage allou\u00e9 au sein du syst\u00e8me de stockage de la biblioth\u00e8que SAS :<\/p>\n<p><code>data travail.table_massive;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;modify travail.table_massive;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;array tab_num {*} _NUMERIC_;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;do i = 1 to dim(tab_num);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if tab_num{i} = . then tab_num{i} = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;end;<br \/>\nrun;<\/code><\/p>\n<p>Par ailleurs, l&rsquo;introduction d\u00e9lib\u00e9r\u00e9e d&rsquo;une grande quantit\u00e9 de z\u00e9ros transforme souvent une table dense en une matrice partiellement creuse. Cette caract\u00e9ristique morphologique doit imp\u00e9rativement \u00eatre exploit\u00e9e par l&rsquo;activation de l&rsquo;option de compression de blocs <code>COMPRESS=YES<\/code> ou <code>COMPRESS=BINARY<\/code>. En compressant les s\u00e9ries successives de z\u00e9ros binaires sur le disque physique, le volume global du fichier est consid\u00e9rablement r\u00e9duit, ce qui diminue proportionnellement le nombre de pages physiques que le moteur SAS doit transf\u00e9rer du stockage vers la m\u00e9moire vive lors des lectures ult\u00e9rieures.<\/p>\n<p>Enfin, le calibrage fin des param\u00e8tres d&rsquo;ex\u00e9cution syst\u00e8me relatifs aux tampons de m\u00e9moire vive via les options <code>BUFSIZE<\/code> (taille des pages de lecture) et <code>BUFNO<\/code> (nombre de tampons allou\u00e9s simultan\u00e9ment par le processeur) permet de maximiser le d\u00e9bit de traitement s\u00e9quentiel en m\u00e9moire, \u00e9liminant les micro-temps d&rsquo;attente d&rsquo;acc\u00e8s au stockage.<\/p>\n<h3>12.2 Cr\u00e9ation de macros r\u00e9utilisables pour automatiser le traitement<\/h3>\n<p>Afin d&rsquo;industrialiser les processus de pr\u00e9paration des donn\u00e9es et d&rsquo;asseoir une uniformit\u00e9 op\u00e9rationnelle au sein des \u00e9quipes de d\u00e9veloppement, la factorisation de la logique de remplacement par z\u00e9ro sous la forme d&rsquo;une macro SAS robuste et param\u00e9tr\u00e9e repr\u00e9sente une d\u00e9marche d&rsquo;ing\u00e9nierie logicielle indispensable. Une macro d&rsquo;entreprise moderne ne doit pas se borner \u00e0 r\u00e9pliquer un code fixe ; elle doit interroger dynamiquement les m\u00e9tadonn\u00e9es de la table pour op\u00e9rer avec une adaptabilit\u00e9 totale.<\/p>\n<p>L&rsquo;exploitation des vues du dictionnaire de m\u00e9tadonn\u00e9es du syst\u00e8me SAS, notamment la table <strong>SASHELP.VCOLUMN<\/strong>, permet de d\u00e9tecter automatiquement les variables num\u00e9riques cibles avant d&rsquo;injecter leur liste dans l&rsquo;\u00e9tape d&rsquo;ex\u00e9cution :<\/p>\n<p><code>%macro ImputerZero(table_in=, table_out=);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;\/* Extraction dynamique des colonnes de type num\u00e9rique *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;proc sql noprint;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select name into :liste_vars separated by ' '<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from sashelp.vcolumn<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where libname = upcase(scan(\"&amp;table_in\", 1, '.'))<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and memname = upcase(scan(\"&amp;table_in\", 2, '.'))<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and type = 'num';<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;quit;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;\/* Ex\u00e9cution optimis\u00e9e par PROC STDIZE *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%if &amp;sqlobs &gt; 0 %then %do;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc stdize data=&amp;table_in out=&amp;table_out reponly missing=0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var &amp;liste_vars;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%put NOTE: Imputation par z\u00e9ro achev\u00e9e avec succ\u00e8s pour la table &amp;table_in.;<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;%put AVERTISSEMENT: Aucune variable num\u00e9rique d\u00e9tect\u00e9e dans &amp;table_in.;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;%end;<br \/>\n%mend ImputerZero;<\/code><\/p>\n<p>Cette macro encapsule la rigueur du dictionnaire de donn\u00e9es et tire profit de l&rsquo;efficacit\u00e9 de calcul de PROC STDIZE. Elle immunise le pipeline contre toute erreur humaine d&rsquo;inventaire de variables et assure une standardisation irr\u00e9prochable des proc\u00e9dures d&rsquo;assurance qualit\u00e9 au travers des diff\u00e9rents services d&rsquo;un organisme de recherche clinique, d&rsquo;une direction des risques ou d&rsquo;un institut national de statistiques.<\/p>\n<h3>12.3 Synth\u00e8se comparative des diff\u00e9rentes m\u00e9thodes abord\u00e9es<\/h3>\n<p>Le choix de l&rsquo;approche algorithmique pour substituer les donn\u00e9es manquantes par z\u00e9ro dans l&rsquo;\u00e9cosyst\u00e8me SAS d\u00e9pend d&rsquo;un faisceau complexe de contraintes associant la volum\u00e9trie des tables, la complexit\u00e9 des r\u00e8gles de gestion, l&rsquo;architecture globale du pipeline d&rsquo;ingestion et les objectifs d&rsquo;auditabilit\u00e9. Le tableau synth\u00e9tique ci-dessous r\u00e9capitule les caract\u00e9ristiques d\u00e9terminantes des cinq m\u00e9thodologies examin\u00e9es tout au long de cette monographie :<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse;width: 100%;margin-top: 20px;margin-bottom: 20px\">\n<thead>\n<tr style=\"background-color: #f2f2f2;text-align: left\">\n<th>M\u00e9thode<\/th>\n<th>Flexibilit\u00e9 Logique<\/th>\n<th>Performance Computationnelle<\/th>\n<th>Empreinte M\u00e9moire \/ Disque<\/th>\n<th>Cas d&rsquo;Usage Recommand\u00e9<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>IF-THEN Simple<\/strong><\/td>\n<td>Tr\u00e8s \u00e9lev\u00e9e (conditions univari\u00e9es arbitraires)<\/td>\n<td>Mod\u00e9r\u00e9e (d\u00e9gradation si multiplication des blocs IF)<\/td>\n<td>Standard (r\u00e9assignation en place dans le PDV)<\/td>\n<td>Traitements ad-hoc sur un nombre tr\u00e8s restreint de colonnes (1 \u00e0 3).<\/td>\n<\/tr>\n<tr>\n<td><strong>ARRAY avec DO Indic\u00e9e<\/strong><\/td>\n<td>\u00c9lev\u00e9e (acc\u00e8s s\u00e9quentiel contr\u00f4l\u00e9 par indice)<\/td>\n<td>Excellente (boucle vectorielle unifi\u00e9e)<\/td>\n<td>Optimis\u00e9e (structure de m\u00e9moire temporaire)<\/td>\n<td>Standard de production pour sous-ensembles sp\u00e9cifiques de variables.<\/td>\n<\/tr>\n<tr>\n<td><strong>Fonction COALESCE<\/strong><\/td>\n<td>Faible \u00e0 moyenne (op\u00e9rateur d&rsquo;\u00e9valuation scalaire)<\/td>\n<td>Excellente (compilation C optimis\u00e9e sans sauts)<\/td>\n<td>Flexible (in-place ou cr\u00e9ation de variable de suivi)<\/td>\n<td>Assignations directes, simplifications de code au sein d&rsquo;ARRAY.<\/td>\n<\/tr>\n<tr>\n<td><strong>PROC STDIZE (REPONLY)<\/strong><\/td>\n<td>Nulle (substitution globale et uniforme)<\/td>\n<td>Maximale (moteur C optimis\u00e9 pour Big Data)<\/td>\n<td>Excellente (lecture et \u00e9criture par blocs binaires)<\/td>\n<td>Tables massives exigeant une remise \u00e0 z\u00e9ro exhaustive de toutes les colonnes.<\/td>\n<\/tr>\n<tr>\n<td><strong>PROC SQL (UPDATE \/ COALESCE)<\/strong><\/td>\n<td>Moyenne \u00e0 \u00e9lev\u00e9e (alg\u00e8bre relationnelle et CASE WHEN)<\/td>\n<td>Variable (tr\u00e8s rapide sur UPDATE cibl\u00e9, plus lente sur vue)<\/td>\n<td>Minimale avec UPDATE (modification in situ sans copie)<\/td>\n<td>Pipelines de transformation ETL int\u00e9gr\u00e9s et entrep\u00f4ts de donn\u00e9es relationnels.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>En conclusion, la manipulation des donn\u00e9es lacunaires dans l&rsquo;environnement SAS illustre avec force la dualit\u00e9 fondamentale de l&rsquo;ing\u00e9nierie quantitative : la pure ma\u00eetrise syntaxique de l&rsquo;outil informatique doit obligatoirement s&rsquo;adosser \u00e0 une conscience aigu\u00eb des postulats m\u00e9thodologiques et statistiques sous-jacents. <\/p>\n<p>Si le remplacement syst\u00e9matique d&rsquo;une valeur manquante par z\u00e9ro appara\u00eet superficiellement comme une formalit\u00e9 de nettoyage \u00e9l\u00e9mentaire, l&rsquo;analyse approfondie men\u00e9e dans cet ouvrage d\u00e9montre qu&rsquo;elle touche aux fondations m\u00eames de l&rsquo;architecture du syst\u00e8me (vecteur d&rsquo;observation, gestion des types en virgule flottante, codes manquants sp\u00e9ciaux) tout en impactant profond\u00e9ment la validit\u00e9 des inf\u00e9rences statistiques futures. En adaptant rigoureusement le choix de leurs patrons de conception logicielle aux caract\u00e9ristiques de leurs donn\u00e9es, les professionnels de l&rsquo;\u00e9cosyst\u00e8me SAS garantissent la construction de socles analytiques p\u00e9rennes, performants et scientifiquement irr\u00e9prochables.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Allison, P. D. (2001). <em>Missing Data<\/em>. SAGE Publications. https:\/\/doi.org\/10.4135\/9781412985079<\/li>\n<li>Cody, R. (2018). <em>Cody&rsquo;s Data Cleaning Techniques Using SAS<\/em> (3e \u00e9d.). SAS Institute.<\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6e \u00e9d.). SAS Institute.<\/li>\n<li>Little, R. J. A., &amp; Rubin, D. B. (2019). <em>Statistical Analysis with Missing Data<\/em> (3e \u00e9d.). 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. https:\/\/documentation.sas.com<\/li>\n<li>SAS Institute Inc. (2021). <em>SAS\/STAT(R) 15.2 User&rsquo;s Guide: The STDIZE Procedure<\/em>. SAS Institute. https:\/\/documentation.sas.com<\/li>\n<li>Schafer, J. L. (1997). <em>Analysis of Incomplete Multivariate Data<\/em>. Chapman &amp; Hall\/CRC. https:\/\/doi.org\/10.1201\/9781439821862<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide complet sur le remplacement des valeurs manquantes par z\u00e9ro dans SAS : syntaxe IF-THEN, tableaux ARRAY, PROC STDIZE, PROC SQL et implications statistiques.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[4016,9499],"tags":[11188,11187,10067,235,3065],"class_list":["post-9773","psych_stat","type-psych_stat","status-publish","hentry","category-nettoyage-de-donnees","category-programmation-sas","tag-array-sas","tag-imputation-zero","tag-proc-stdize","tag-sas","tag-valeurs-manquantes"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9773","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=9773"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9773\/revisions"}],"predecessor-version":[{"id":9779,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9773\/revisions\/9779"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9773"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9773"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9773"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}