{"id":9907,"date":"2026-10-14T18:02:35","date_gmt":"2026-10-14T18:02:35","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-creer-nouvelles-variables-sas-exemples\/"},"modified":"2026-10-14T18:02:35","modified_gmt":"2026-10-14T18:02:35","slug":"comment-creer-nouvelles-variables-sas-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-creer-nouvelles-variables-sas-exemples","title":{"rendered":"Comment cr\u00e9er de nouvelles variables dans SAS (avec exemples)"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;analyse statistique avanc\u00e9e, du traitement de donn\u00e9es cliniques et de l&rsquo;\u00e9conom\u00e9trie, le logiciel <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/www.sas.com\/\">SAS (Statistical Analysis System)<\/a> demeure une r\u00e9f\u00e9rence incontournable pour les m\u00e9thodologistes et les biostatisticiens. La manipulation rigoureuse des donn\u00e9es au sein de l&rsquo;environnement SAS repose sur une architecture d&rsquo;ex\u00e9cution sp\u00e9cifique qui distingue fondamentalement la phase de compilation de la phase d&rsquo;ex\u00e9cution. Au c\u0153ur de ce processus se trouve la cr\u00e9ation de nouvelles variables, op\u00e9ration \u00e9l\u00e9mentaire mais strat\u00e9gique, conditionnant la validit\u00e9 des mod\u00e8les pr\u00e9dictifs, la pr\u00e9cision des analyses psychom\u00e9triques et la robustesse des inf\u00e9rences quantitatives. Qu&rsquo;il s&rsquo;agisse de d\u00e9river des scores standardis\u00e9s, de segmenter des populations selon des crit\u00e8res nosologiques stricts ou de restructurer des m\u00e9tadonn\u00e9es longitudinales, la ma\u00eetrise de l&rsquo;\u00e9tape DATA constitue le socle technique indispensable \u00e0 toute d\u00e9marche d&rsquo;ing\u00e9nierie des donn\u00e9es empiriques.<\/p>\n<p>Le traitement des donn\u00e9es brutes en sciences sociales, \u00e9pid\u00e9miologie ou recherche translationnelle requiert une transformation m\u00e9thodique afin d&rsquo;isoler le signal informationnel du bruit stochastique. L&rsquo;enrichissement d&rsquo;une table relationnelle par l&rsquo;adjonction de variables construites ne rel\u00e8ve pas d&rsquo;une simple commodit\u00e9 syntaxique, mais d&rsquo;une exigence \u00e9pist\u00e9mologique visant \u00e0 op\u00e9rationnaliser des concepts th\u00e9oriques abstraits en entit\u00e9s math\u00e9matiques exploitables. L&rsquo;\u00e9laboration de m\u00e9triques composites, la correction de biais d&rsquo;asym\u00e9trie par transformations logarithmiques et l&rsquo;encodage logique de trajectoires individuelles imposent une compr\u00e9hension exhaustive des m\u00e9canismes internes de SAS, notamment le fonctionnement de la m\u00e9moire vive et la s\u00e9quence d&rsquo;\u00e9valuation des instructions.<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;exposer de mani\u00e8re syst\u00e9matique l&rsquo;ensemble des approches, fonctions et structures algorithmiques permettant de concevoir, transformer et valider de nouvelles variables dans SAS. En parcourant les aspects fondamentaux du vecteur de donn\u00e9es du programme, les op\u00e9rations arithm\u00e9tiques, le traitement conditionnel complexe, les manipulations de cha\u00eenes, l&rsquo;arithm\u00e9tique temporelle, la vectorisation par tableaux et le contr\u00f4le qualit\u00e9 statistique, cet article offre aux chercheurs, analystes et data scientists les cl\u00e9s m\u00e9thodologiques n\u00e9cessaires pour b\u00e2tir des tables de donn\u00e9es analytiques d&rsquo;une int\u00e9grit\u00e9 irr\u00e9prochable.<\/p>\n<h2>1. Introduction aux principes fondamentaux de la cr\u00e9ation de variables dans SAS<\/h2>\n<h3>1.1 Le r\u00f4le du vecteur de donn\u00e9es du programme (PDV) et de l&rsquo;\u00e9tape DATA<\/h3>\n<p>L&rsquo;ex\u00e9cution de toute \u00e9tape DATA dans le compilateur SAS repose sur une structure m\u00e9morielle transitoire hautement optimis\u00e9e, d\u00e9sign\u00e9e sous l&rsquo;acronyme PDV pour <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/basess\/58133\/HTML\/default\/viewer.htm#a001290590.htm\">Program Data Vector<\/a> (Vecteur de Donn\u00e9es du Programme). Le PDV constitue la zone de m\u00e9moire tampon o\u00f9 les variables de la table de sortie sont mat\u00e9rialis\u00e9es, dimensionn\u00e9es et modifi\u00e9es s\u00e9quentiellement avant leur \u00e9criture effective sur le support de stockage physique. Comprendre la dynamique du PDV est une condition pr\u00e9alable absolue pour appr\u00e9hender comment et quand une nouvelle variable acquiert sa valeur au fil du traitement it\u00e9ratif.<\/p>\n<p>Le cycle de vie de l&rsquo;\u00e9tape DATA s&rsquo;articule en deux phases distinctes et cons\u00e9cutives : la phase de compilation et la phase d&rsquo;ex\u00e9cution. Durant la compilation, SAS analyse syntaxiquement le script, alloue l&rsquo;espace m\u00e9moire n\u00e9cessaire au sein du PDV pour chaque variable mentionn\u00e9e et construit la table des descripteurs, qui contient l&rsquo;ensemble des m\u00e9tadonn\u00e9es structurelles (noms, types, longueurs, libell\u00e9s et formats). Lors de la phase d&rsquo;ex\u00e9cution, SAS initie une boucle implicite. Pour chaque observation lue depuis une source externe ou une table existante, les variables nouvellement calcul\u00e9es sont initialis\u00e9es par d\u00e9faut \u00e0 la valeur manquante, \u00e0 moins qu&rsquo;une instruction sp\u00e9cifique ne vienne modifier cette r\u00e9initialisation.<\/p>\n<p>Cette boucle d&rsquo;ex\u00e9cution implicite suit une chronologie rigoureuse : lecture de l&rsquo;enregistrement entrant, ex\u00e9cution ligne par ligne des instructions de transformation arithm\u00e9tique ou logique, transfert des donn\u00e9es du PDV vers le bloc de m\u00e9moire tampon de sortie, et enfin \u00e9criture physique de l&rsquo;observation sur le disque. Toute assignation d&rsquo;une nouvelle variable au sein du script modifie instantan\u00e9ment l&#8217;emplacement m\u00e9moire correspondant dans le PDV. Ainsi, l&rsquo;ordre d&rsquo;apparition des instructions dans le code conditionne la disponibilit\u00e9 et la valeur de la nouvelle variable pour les calculs subs\u00e9quents, illustrant la nature proc\u00e9durale et d\u00e9terministe de l&rsquo;environnement SAS.<\/p>\n<h3>1.2 Typologie des variables SAS : formats num\u00e9riques et cha\u00eenes de caract\u00e8res<\/h3>\n<p>Contrairement \u00e0 des environnements de programmation modernes supportant une grande diversit\u00e9 de types primitifs complexes (tels que les bool\u00e9ens purs, les entiers sign\u00e9s ou non sign\u00e9s, ou les structures \u00e9num\u00e9ratives), SAS simplifie son architecture sous-jacente en ne reconnaissant fondamentalement que deux types de donn\u00e9es : le type num\u00e9rique et le type caract\u00e8re. Cette dichotomie \u00e9l\u00e9mentaire r\u00e9git l&rsquo;ensemble de l&rsquo;allocation m\u00e9moire et d\u00e9termine la nature des op\u00e9rations analytiques admissibles pour chaque colonne d&rsquo;une table de donn\u00e9es.<\/p>\n<p>Par d\u00e9faut, toute variable d\u00e9clar\u00e9e ou assign\u00e9e sans sp\u00e9cification explicite est consid\u00e9r\u00e9e par le compilateur comme num\u00e9rique. Les variables num\u00e9riques sont stock\u00e9es sous la forme de nombres \u00e0 virgule flottante en double pr\u00e9cision, conformes \u00e0 la norme IEEE 754, occupant par d\u00e9faut 8 octets en m\u00e9moire vive. Cette allocation conf\u00e8re une pr\u00e9cision d&rsquo;environ 16 \u00e0 17 chiffres significatifs, permettant de repr\u00e9senter aussi bien des valeurs enti\u00e8res que des approximations d\u00e9cimales infinit\u00e9simales. Il est crucial de noter que dans le paradigme SAS, les dates, les heures et les valeurs bool\u00e9ennes ne constituent pas des types distincts : elles sont encod\u00e9es sous forme num\u00e9rique, leur s\u00e9mantique \u00e9tant gouvern\u00e9e par des formats d&rsquo;affichage ou des conventions logiques internes.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, les variables de type caract\u00e8re, d\u00e9sign\u00e9es par l&rsquo;adjonction explicite du suffixe dollar ($) lors de leur instanciation dans les instructions de lecture ou de dimensionnement, stockent des cha\u00eenes de caract\u00e8res alphanum\u00e9riques. Chaque caract\u00e8re occupant un octet selon l&rsquo;encodage de la session (souvent UTF-8 ou ASCII \u00e9tendu), la longueur d&rsquo;une variable caract\u00e8re doit \u00eatre rigoureusement anticip\u00e9e pour pr\u00e9venir toute perte d&rsquo;information par troncation. Le typage structurel d&rsquo;une variable est immuable une fois l&rsquo;\u00e9tape de compilation achev\u00e9e : une variable num\u00e9rique ne peut accepter de cha\u00eenes textuelles sans d\u00e9clencher une conversion implicite potentiellement corruptrice, et inversement, une variable caract\u00e8re ne peut \u00eatre directement soumise \u00e0 des op\u00e9rateurs arithm\u00e9tiques.<\/p>\n<h3>1.3 Pertinence m\u00e9thodologique dans la gestion des donn\u00e9es exp\u00e9rimentales<\/h3>\n<p>Dans le contexte des sciences empiriques et de la recherche clinique standardis\u00e9e, la d\u00e9rivation et l&rsquo;adjonction de nouvelles variables au sein des tables d&rsquo;analyse ob\u00e9issent \u00e0 des normes strictes de gouvernance des donn\u00e9es. Les jeux de donn\u00e9es issus des syst\u00e8mes de saisie \u00e9lectronique ou de protocoles exp\u00e9rimentaux renferment fr\u00e9quemment des mesures brutes disparates, caract\u00e9ris\u00e9es par des \u00e9chelles h\u00e9t\u00e9rog\u00e8nes, des art\u00e9facts de mesure ou des formulations directes n\u00e9cessitant un renversement psychom\u00e9trique. La cr\u00e9ation de variables d\u00e9riv\u00e9es constitue l&rsquo;\u00e9tape pivot transformant ces intrants d\u00e9sordonn\u00e9s en variables latentes ou composites exploitables.<\/p>\n<p>L&rsquo;application rigoureuse du principe d&rsquo;immutabilit\u00e9 des tables sources est ici primordiale. En programmation SAS professionnelle, on ne modifie jamais directement la table brute d&rsquo;origine. On proc\u00e8de syst\u00e9matiquement \u00e0 la g\u00e9n\u00e9ration d&rsquo;une nouvelle table d\u00e9riv\u00e9e dans une biblioth\u00e8que de travail ou d&rsquo;archivage interm\u00e9diaire. Cette strat\u00e9gie pr\u00e9serve l&rsquo;int\u00e9grit\u00e9 de la piste d&rsquo;audit (audit trail), un imp\u00e9ratif m\u00e9thodologique incontournable prescrit par les organismes de r\u00e9glementation tels que la <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/www.fda.gov\/\">Food and Drug Administration (FDA)<\/a> ou l&rsquo;Agence Europ\u00e9enne des M\u00e9dicaments (EMA), notamment sous les standards <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/www.cdisc.org\/\">CDISC (Clinical Data Interchange Standards Consortium)<\/a>.<\/p>\n<p>Enfin, la cr\u00e9ation programm\u00e9e de variables via des scripts textuels reproductibles garantit une transparence m\u00e9thodologique totale, contrairement aux modifications manuelles op\u00e9r\u00e9es au sein d&rsquo;interfaces graphiques ou de tableurs bureautiques. Chaque \u00e9tape de transformation, d&rsquo;imputation ou de recodage cat\u00e9goriel est consign\u00e9e dans un code source document\u00e9, assurant la p\u00e9rennit\u00e9 institutionnelle des analyses et permettant la r\u00e9plication exacte des estimations statistiques par des \u00e9quipes d&rsquo;audit ind\u00e9pendantes.<\/p>\n<h2>2. Cr\u00e9ation de variables ex nihilo : la m\u00e9thode par saisie directe<\/h2>\n<h3>2.1 Syntaxe de base de l&rsquo;instruction INPUT<\/h3>\n<p>L&rsquo;instruction INPUT constitue la pierre angulaire de l&rsquo;acquisition de donn\u00e9es brutes non structur\u00e9es au sein de l&rsquo;environnement SAS. Elle indique au compilateur comment lire les flux de donn\u00e9es textuelles s\u00e9quentielles et comment mapper chaque jeton d&rsquo;information vers un emplacement m\u00e9moire d\u00e9di\u00e9 dans le PDV. L&rsquo;ordre d&rsquo;\u00e9nonciation des variables au sein de l&rsquo;instruction INPUT d\u00e9termine pr\u00e9cis\u00e9ment la s\u00e9quence de peuplement des colonnes dans la table finale en cours de construction.<\/p>\n<p>La syntaxe de base requiert la sp\u00e9cification du nom de chaque variable, imm\u00e9diatement suivi, le cas \u00e9ch\u00e9ant, de modificateurs de type et de lecture. Si le nom n&rsquo;est suivi d&rsquo;aucun symbole particulier, SAS pr\u00e9sume une nature num\u00e9rique. En revanche, la pr\u00e9sence du symbole dollar ($) informe le compilateur que le champ entrant doit \u00eatre interpr\u00e9t\u00e9 comme une cha\u00eene de caract\u00e8res. Trois modes fondamentaux de lecture r\u00e9gissent l&rsquo;instruction INPUT : le mode libre (list input), le mode par colonnes (column input) et le mode format\u00e9 (formatted input). Le mode libre, le plus accessible, suppose que les valeurs successives soient d\u00e9limit\u00e9es par au moins un espace blanc et ne comportent pas d&rsquo;espaces internes.<\/p>\n<p>Dans des configurations exp\u00e9rimentales plus rigides, le mode par colonnes ou format\u00e9 permet de lire des variables contigu\u00ebs d\u00e9pourvues de s\u00e9parateurs explicites en indiquant les positions physiques de d\u00e9but et de fin de chaque segment de donn\u00e9es (par exemple, INPUT ID 1-4 Age 5-6 Groupe $ 7). Des contr\u00f4leurs de pointeurs avanc\u00e9s, tels que l&rsquo;arobase simple (@) pour la retenue de ligne ou le double arobase (@@) pour le maintien du pointeur de lecture sur le m\u00eame enregistrement \u00e0 travers plusieurs it\u00e9rations du PDV, conf\u00e8rent \u00e0 l&rsquo;instruction INPUT une flexibilit\u00e9 syntaxique exceptionnelle pour transformer n&rsquo;importe quel flux brut en variables parfaitement typ\u00e9es.<\/p>\n<h3>2.2 Insertion de donn\u00e9es brutes via l&rsquo;instruction DATALINES<\/h3>\n<p>Lorsque des donn\u00e9es d&rsquo;\u00e9talonnage, des constantes d&rsquo;ajustement ou des \u00e9chantillons restreints doivent \u00eatre int\u00e9gr\u00e9s de mani\u00e8re autonome au sein d&rsquo;un script d&rsquo;analyse SAS sans recourir \u00e0 un fichier externe (texte, CSV ou base de donn\u00e9es relationnelle), l&rsquo;instruction DATALINES (ou son \u00e9quivalent historique CARDS) est sollicit\u00e9e. Cette instruction indique au compilateur la cl\u00f4ture de la section des ordres proc\u00e9duraux de l&rsquo;\u00e9tape DATA et l&rsquo;ouverture imm\u00e9diate d&rsquo;un bloc de donn\u00e9es brutes textuelles int\u00e9gr\u00e9es au flux du programme.<\/p>\n<p>L&rsquo;insertion des donn\u00e9es via DATALINES ob\u00e9it \u00e0 des conventions typographiques strictes dict\u00e9es par le mode de lecture pr\u00e9alablement d\u00e9fini dans l&rsquo;instruction INPUT. Chaque ligne de texte tap\u00e9e sous DATALINES repr\u00e9sente, dans le cas g\u00e9n\u00e9ral d&rsquo;une lecture par liste standard, une observation unique qui sera aspir\u00e9e s\u00e9quentiellement par le PDV. Les espaces jouent un r\u00f4le critique de d\u00e9limiteurs de champs : un double espace ou une tabulation mal interpr\u00e9t\u00e9e peut d\u00e9caler la distribution des valeurs le long du PDV, entra\u00eenant des erreurs d&rsquo;incompatibilit\u00e9 de type ou des valeurs manquantes inattendues dans les colonnes subs\u00e9quentes.<\/p>\n<p>La cl\u00f4ture du bloc de donn\u00e9es DATALINES requiert une rigueur absolue. L&rsquo;interpr\u00e9teur SAS lit les donn\u00e9es ligne par ligne jusqu&rsquo;\u00e0 ce qu&rsquo;il rencontre un terminateur explicite, constitu\u00e9 d&rsquo;un point-virgule isol\u00e9 plac\u00e9 sur une nouvelle ligne imm\u00e9diatement sous la derni\u00e8re observation. L&rsquo;omission de ce point-virgule d&rsquo;ex\u00e9cution ou la pr\u00e9sence d&rsquo;un point-virgule pr\u00e9matur\u00e9 au sein m\u00eame du texte brut interrompt brutalement l&rsquo;analyse du flux de donn\u00e9es ou contamine la phase de compilation des \u00e9tapes syntaxiques ult\u00e9rieures.<\/p>\n<h3>2.3 Exemple pratique : Encodage d&rsquo;un \u00e9chantillon exp\u00e9rimental de participants<\/h3>\n<p>Afin de concr\u00e9tiser les principes \u00e9nonc\u00e9s pr\u00e9c\u00e9demment, consid\u00e9rons la formalisation d&rsquo;un protocole exp\u00e9rimental \u00e9valuant une intervention cognitive sur une cohorte pr\u00e9liminaire de participants. Dans cette situation, nous devons instancier simultan\u00e9ment quatre variables fondamentales : un identifiant unique (ParticipantID), une variable textuelle cat\u00e9gorisant le bras de randomisation (Groupe), l&rsquo;\u00e2ge chronologique des sujets (Age) et un score psychom\u00e9trique initial mesur\u00e9 sur une \u00e9chelle psychologique continue (ScoreInitial).<\/p>\n<p>Le script suivant illustre l&rsquo;encodage complet et autonome de ce jeu de donn\u00e9es au moyen des instructions DATA, INPUT et DATALINES, suivi de l&rsquo;inspection des m\u00e9tadonn\u00e9es et des valeurs par la proc\u00e9dure PROC PRINT :<\/p>\n<p>DATA CohorteExperimentale;<br \/>\n&nbsp;&nbsp;INPUT ParticipantID $ Groupe $ Age ScoreInitial;<br \/>\nDATALINES;<br \/>\nSUBJ001 ACTIF 24 78.5<br \/>\nSUBJ002 PLACEBO 29 62.0<br \/>\nSUBJ003 ACTIF 31 84.2<br \/>\nSUBJ004 PLACEBO 22 55.8<br \/>\nSUBJ005 ACTIF 27 91.3<br \/>\n;<br \/>\nRUN;<\/p>\n<p>PROC PRINT DATA=CohorteExperimentale NOOBS;<br \/>\nRUN;<\/p>\n<p>\u00c0 l&rsquo;ex\u00e9cution de ce bloc de code, SAS lit successivement les cinq lignes de donn\u00e9es. Pour chaque ligne, le compilateur remplit les quatre cases r\u00e9serv\u00e9es dans le PDV, puis \u00e9crit l&rsquo;observation consolid\u00e9e dans la table de travail temporaire WORK.CohorteExperimentale. L&rsquo;appel de la proc\u00e9dure PROC PRINT sans l&rsquo;option d&rsquo;observation par d\u00e9faut (NOOBS) g\u00e9n\u00e8re un rapport tabulaire propre confirmant la cr\u00e9ation ad\u00e9quate des quatre variables, avec leurs assignations typologiques respectives (deux caract\u00e8res, deux num\u00e9riques), exemptes de toute distorsion de lecture.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/create1.jpg\" alt=\"\" \/><\/figure>\n<h2>3. D\u00e9rivation de nouvelles variables \u00e0 partir de variables existantes<\/h2>\n<h3>3.1 L&rsquo;instruction SET et la lecture de jeux de donn\u00e9es pr\u00e9existants<\/h3>\n<p>Dans la grande majorit\u00e9 des flux d&rsquo;ing\u00e9nierie statistique, les variables ne sont pas saisies manuellement mais d\u00e9riv\u00e9es \u00e0 partir de structures tabulaires volumineuses d\u00e9j\u00e0 entrepos\u00e9es dans des biblioth\u00e8ques SAS temporaires ou permanentes. L&rsquo;instruction SET repr\u00e9sente le m\u00e9canisme fondamental par lequel SAS lit s\u00e9quentiellement les observations d&rsquo;un jeu de donn\u00e9es source pour les transf\u00e9rer dans le PDV, permettant ainsi d&rsquo;effectuer des calculs et de g\u00e9n\u00e9rer de nouveaux attributs analytiques dans une table cible distincte.<\/p>\n<p>Lors de la phase de compilation d&rsquo;une \u00e9tape DATA comportant une instruction SET, SAS examine la table d&rsquo;entr\u00e9e et copie l&rsquo;int\u00e9gralit\u00e9 de sa structure de descripteurs dans le PDV de la nouvelle table. Cela implique une persistance int\u00e9grale des m\u00e9tadonn\u00e9es originelles : les variables h\u00e9ritent automatiquement de leur type, de leur longueur m\u00e9moire, de leurs \u00e9tiquettes explicatives (LABEL) et de leurs r\u00e8gles d&rsquo;affichage personnalis\u00e9es (FORMAT). Ce comportement automatis\u00e9 assure une continuit\u00e9 parfaite de la tra\u00e7abilit\u00e9 des donn\u00e9es d&rsquo;une \u00e9tape analytique \u00e0 la suivante.<\/p>\n<p>N\u00e9anmoins, une vigilance architecturale s&rsquo;impose concernant l&rsquo;\u00e9crasement potentiel de tables. \u00c9crire une \u00e9tape sous la forme DATA Echantillon; SET Echantillon; est syntaxiquement valide mais m\u00e9thodologiquement p\u00e9rilleux : une erreur d&rsquo;encodage dans le code interm\u00e9diaire d\u00e9truirait irr\u00e9versiblement la table initiale en cas d&rsquo;interruption du processus d&rsquo;ex\u00e9cution. Il convient d&rsquo;adopter syst\u00e9matiquement une strat\u00e9gie d&rsquo;adressage distincte en nommant une table cible explicite (par exemple, DATA Echantillon_Derive; SET Echantillon;), garantissant ainsi la reproductibilit\u00e9 ascendante des op\u00e9rations.<\/p>\n<h3>3.2 Application des op\u00e9rateurs arithm\u00e9tiques conventionnels<\/h3>\n<p>La d\u00e9rivation directe de nouvelles variables num\u00e9riques s&rsquo;effectue au moyen d&rsquo;instructions d&rsquo;affectation faisant intervenir les op\u00e9rateurs arithm\u00e9tiques conventionnels. SAS prend en charge les op\u00e9rations standard d&rsquo;addition (+), de soustraction (-), de multiplication (*) et de division (\/), ainsi que l&rsquo;op\u00e9rateur d&rsquo;exponentiation symbolis\u00e9 par le double ast\u00e9risque (**). L&rsquo;\u00e9valuation de ces expressions suit les axiomes math\u00e9matiques classiques de pr\u00e9c\u00e9dence op\u00e9ratoire, o\u00f9 la puissance prime sur la multiplication et la division, qui pr\u00e9valent \u00e0 leur tour sur l&rsquo;addition et la soustraction.<\/p>\n<p>L&rsquo;utilisation de parenth\u00e8ses imbriqu\u00e9es s&rsquo;av\u00e8re hautement recommand\u00e9e dans la construction d&rsquo;expressions arithm\u00e9tiques complexes. Au-del\u00e0 de lever toute \u00e9quivoque quant \u00e0 l&rsquo;ordre d&rsquo;\u00e9valuation ex\u00e9cut\u00e9 par le compilateur, les parenth\u00e8ses am\u00e9liorent substantiellement la lisibilit\u00e9 du code pour les pairs auditeurs. Par exemple, le calcul d&rsquo;un taux de variation relative s&rsquo;\u00e9crira syst\u00e9matiquement sous la forme TauxVariation = (ScorePost &#8211; ScorePre) \/ ScorePre; afin d&#8217;emp\u00eacher une division pr\u00e9matur\u00e9e de ScorePre par lui-m\u00eame.<\/p>\n<p>Il est fondamental de noter que les op\u00e9rateurs arithm\u00e9tiques de base poss\u00e8dent une caract\u00e9ristique structurelle critique : la propagation universelle des valeurs manquantes. Si l&rsquo;un quelconque des termes participant \u00e0 une op\u00e9ration binaire ou unaire est manquant (repr\u00e9sent\u00e9 par un point en SAS), le r\u00e9sultat de l&rsquo;affectation sera irr\u00e9vocablement \u00e9valu\u00e9 \u00e0 la valeur manquante num\u00e9rique, et une note d&rsquo;avertissement sera consign\u00e9e dans le journal d&rsquo;ex\u00e9cution (SAS Log) pour signaler l&rsquo;occurrence d&rsquo;op\u00e9rations sur des op\u00e9randes non initialis\u00e9s ou nuls.<\/p>\n<h3>3.3 Exemple appliqu\u00e9 : Calcul d&rsquo;indices composites et de scores agr\u00e9g\u00e9s<\/h3>\n<p>Consid\u00e9rons une situation d&rsquo;\u00e9valuation neuropsychologique o\u00f9 des cliniciens mesurent simultan\u00e9ment l&rsquo;efficience ex\u00e9cutive d&rsquo;un individu \u00e0 travers deux m\u00e9triques continues distinctes : le temps de r\u00e9ponse brut (en millisecondes) et le nombre d&rsquo;erreurs d&rsquo;inattention commises lors d&rsquo;une t\u00e2che d&rsquo;attention soutenue. Pour synth\u00e9tiser ces deux flux en une mesure clinique unifi\u00e9e, nous souhaitons d\u00e9river un indice de performance globale pond\u00e9r\u00e9, ainsi qu&rsquo;un ratio d&rsquo;efficience cognitive comparant la pr\u00e9cision brute \u00e0 la vitesse de traitement.<\/p>\n<p>Le code SAS ci-apr\u00e8s illustre comment exploiter l&rsquo;instruction SET sur une table source pour cr\u00e9er simultan\u00e9ment ces deux nouvelles variables d\u00e9riv\u00e9es :<\/p>\n<p>DATA AnalyseNeuro_Derivee;<br \/>\n&nbsp;&nbsp;SET AnalyseNeuro_Source;<br \/>\n&nbsp;&nbsp;\/* Calcul d&rsquo;un indice composite p\u00e9nalisant les erreurs et les temps lents *\/<br \/>\n&nbsp;&nbsp;IndiceComposite = (TempsReponse * 0.4) + (NombreErreurs * 12.5);<br \/>\n&nbsp;&nbsp;\/* D\u00e9rivation d&rsquo;un ratio de pr\u00e9cision : invers\u00e9 par rapport au temps *\/<br \/>\n&nbsp;&nbsp;RatioEfficience = (100 &#8211; NombreErreurs) \/ (TempsReponse \/ 1000);<br \/>\n&nbsp;&nbsp;\/* Application d&rsquo;une transformation quadratique *\/<br \/>\n&nbsp;&nbsp;ScorePenalise = IndiceComposite ** 1.5;<br \/>\nRUN;<\/p>\n<p>Dans cet exemple, pour chaque ligne lue dans AnalyseNeuro_Source, SAS \u00e9value les trois expressions arithm\u00e9tiques s\u00e9quentiellement. Les variables IndiceComposite, RatioEfficience et ScorePenalise sont instantan\u00e9ment mat\u00e9rialis\u00e9es dans le PDV et inject\u00e9es dans la table cible AnalyseNeuro_Derivee. L&rsquo;ind\u00e9pendance de ces op\u00e9rations permet d&rsquo;utiliser imm\u00e9diatement la variable IndiceComposite fra\u00eechement calcul\u00e9e pour d\u00e9river le ScorePenalise au cours de la m\u00eame it\u00e9ration du PDV, \u00e9liminant ainsi toute redondance de calcul computationnel.<\/p>\n<h2>4. Cr\u00e9ation de variables conditionnelles avec les structures IF-THEN \/ ELSE<\/h2>\n<h3>4.1 Fondements de la logique bool\u00e9enne dans l&rsquo;\u00e9tape DATA<\/h3>\n<p>L&rsquo;attribution de valeurs conditionnelles constitue le socle algorithmique de la recodification cat\u00e9gorielle et de la prise de d\u00e9cision automatis\u00e9e dans SAS. Les instructions conditionnelles reposent sur l&rsquo;\u00e9valuation bool\u00e9enne d&rsquo;expressions logiques liant une ou plusieurs variables \u00e0 des seuils d\u00e9termin\u00e9s. Dans l&rsquo;\u00e9cosyst\u00e8me SAS, une expression logique retourne invariablement une valeur num\u00e9rique : la valeur 1 repr\u00e9sente la condition vraie (True), tandis que la valeur 0 traduit la fausset\u00e9 de la proposition (False). Toute valeur num\u00e9rique non nulle et non manquante est \u00e9galement interpr\u00e9t\u00e9e comme vraie par le compilateur.<\/p>\n<p>Pour formaliser ces assertions, SAS met \u00e0 disposition des op\u00e9rateurs de comparaison relationnels d\u00e9clinables sous deux formes \u00e9quivalentes : mn\u00e9monique ou symbolique. On retrouve ainsi l&rsquo;\u00e9galit\u00e9 (EQ ou =), la non-\u00e9galit\u00e9 (NE ou ^=), la sup\u00e9riorit\u00e9 stricte (GT ou &gt;), l&rsquo;inf\u00e9riorit\u00e9 stricte (LT ou &lt;), la sup\u00e9riorit\u00e9 ou \u00e9galit\u00e9 (GE ou &gt;=) et l&rsquo;inf\u00e9riorit\u00e9 ou \u00e9galit\u00e9 (LE ou &lt;=). Ces propositions atomiques peuvent \u00eatre articul\u00e9es en constructions logiques complexes gr\u00e2ce aux op\u00e9rateurs conjonctifs AND (&amp;), disjonctifs OR (|) et n\u00e9gatifs NOT (~).<\/p>\n<p>L&rsquo;\u00e9valuation bool\u00e9enne au sein de l&rsquo;instruction IF-THEN commande l&rsquo;ex\u00e9cution exclusive de l&rsquo;instruction subordonn\u00e9e situ\u00e9e apr\u00e8s le mot-cl\u00e9 THEN. Si l&rsquo;expression logique est \u00e9valu\u00e9e comme vraie, l&rsquo;assignation de la nouvelle variable est act\u00e9e dans le PDV. Si elle est fausse, le pointeur d&rsquo;ex\u00e9cution ignore le bloc d&rsquo;assignation et bascule imm\u00e9diatement vers la ligne de code subs\u00e9quente, maintenant la variable dans son \u00e9tat ant\u00e9rieur ou ind\u00e9termin\u00e9.<\/p>\n<h3>4.2 Imbrication d&rsquo;instructions IF-THEN\/ELSE pour segmentations mutuellement exclusives<\/h3>\n<p>Lorsque la d\u00e9rivation d&rsquo;une variable exige de r\u00e9partir les observations au sein d&rsquo;un continuum de classes ordonn\u00e9es ou nominales \u00e9tanches, l&rsquo;encha\u00eenement s\u00e9quentiel d&rsquo;instructions IF-THEN isol\u00e9es s&rsquo;av\u00e8re computationnellement inefficace et m\u00e9thodologiquement risqu\u00e9. L&rsquo;adjonction de la clause conditionnelle alternative ELSE permet de structurer une hi\u00e9rarchie d\u00e9cisionnelle mutuellement exclusive, optimisant le temps de calcul tout en assurant l&rsquo;int\u00e9grit\u00e9 logique du mod\u00e8le de partitionnement.<\/p>\n<p>L&rsquo;avantage fondamental de la structure IF-THEN \/ ELSE r\u00e9side dans son m\u00e9canisme d&rsquo;\u00e9valuation court-circuit\u00e9e. D\u00e8s lors qu&rsquo;une condition logique pr\u00e9liminaire est valid\u00e9e pour une observation donn\u00e9e, SAS ex\u00e9cute l&rsquo;assignation associ\u00e9e et contourne l&rsquo;ensemble des branches ELSE subordonn\u00e9es pour cette ligne du PDV. Ce comportement \u00e9vite l&rsquo;\u00e9valuation inutile de multiples tests redondants, r\u00e9duisant significativement la charge CPU sur des tables contenant plusieurs millions d&rsquo;enregistrements. En outre, ce cha\u00eenage pr\u00e9vient les \u00e9crasements accidentels de variables caus\u00e9s par des intervalles mal d\u00e9limit\u00e9s dans des blocs IF ind\u00e9pendants.<\/p>\n<p>La clause finale ELSE, d\u00e9pourvue de condition logique restrictive, agit comme un filet de s\u00e9curit\u00e9 statistique indispensable. Elle capture l&rsquo;int\u00e9gralit\u00e9 des observations r\u00e9siduelles qui n&rsquo;ont satisfait \u00e0 aucun des crit\u00e8res discriminants ant\u00e9rieurs. Dans la pratique du nettoyage de donn\u00e9es scientifiques, ce bloc terminal est couramment exploit\u00e9 pour isoler les valeurs aberrantes impr\u00e9vues, consigner des codes d&rsquo;erreur explicites ou affecter formellement des valeurs manquantes \u00e0 des profils empiriquement non r\u00e9pertori\u00e9s.<\/p>\n<h3>4.3 Cas clinique pratique : Stratification de la s\u00e9v\u00e9rit\u00e9 d&rsquo;un trouble<\/h3>\n<p>Illustrons la puissance op\u00e9rationnelle de l&rsquo;imbrication IF-THEN\/ELSE \u00e0 travers la stratification nosologique d&rsquo;une cohorte clinique en psychiatrie. Les participants sont \u00e9valu\u00e9s au moyen d&rsquo;un score d&rsquo;anxi\u00e9t\u00e9 continu issu de l&rsquo;\u00e9chelle standardis\u00e9e de Hamilton (HAM-A), oscillant th\u00e9oriquement entre 0 et 56 points. Les seuils consensuels d\u00e9finissent quatre strates diagnostiques : absence d&rsquo;anxi\u00e9t\u00e9 significative (0-17), anxi\u00e9t\u00e9 l\u00e9g\u00e8re \u00e0 mod\u00e9r\u00e9e (18-24), anxi\u00e9t\u00e9 mod\u00e9r\u00e9e \u00e0 s\u00e9v\u00e8re (25-30) et anxi\u00e9t\u00e9 tr\u00e8s s\u00e9v\u00e8re (sup\u00e9rieure \u00e0 30).<\/p>\n<p>Le programme ci-dessous r\u00e9alise ce recodage clinique avec rigueur, en int\u00e9grant en amont une v\u00e9rification syst\u00e9matique de l&rsquo;absence de valeurs manquantes afin d&rsquo;\u00e9viter tout artefact de classification :<\/p>\n<p>DATA CohortePsychiatrique_Classifiee;<br \/>\n&nbsp;&nbsp;SET CohortePsychiatrique;<br \/>\n&nbsp;&nbsp;\/* D\u00e9claration explicite de la longueur de la variable textuelle *\/<br \/>\n&nbsp;&nbsp;LENGTH CategorieSeverite $ 20;<\/p>\n<p>&nbsp;&nbsp;IF MISSING(ScoreHAMA) THEN CategorieSeverite = &lsquo;Ind\u00e9termin\u00e9&rsquo;;<br \/>\n&nbsp;&nbsp;ELSE IF ScoreHAMA &lt; 18 THEN CategorieSeverite = &lsquo;Absente\/Minime&rsquo;;<br \/>\n&nbsp;&nbsp;ELSE IF ScoreHAMA &lt;= 24 THEN CategorieSeverite = &lsquo;L\u00e9g\u00e8re\/Mod\u00e9r\u00e9e&rsquo;;<br \/>\n&nbsp;&nbsp;ELSE IF ScoreHAMA &lt;= 30 THEN CategorieSeverite = &lsquo;Mod\u00e9r\u00e9e\/S\u00e9v\u00e8re&rsquo;;<br \/>\n&nbsp;&nbsp;ELSE IF ScoreHAMA &gt; 30 THEN CategorieSeverite = &lsquo;Tr\u00e8s S\u00e9v\u00e8re&rsquo;;<br \/>\n&nbsp;&nbsp;ELSE CategorieSeverite = &lsquo;Hors Limites&rsquo;;<br \/>\nRUN;<\/p>\n<p>L&rsquo;inspection du code d\u00e9montre que l&rsquo;ordre des conditions suit rigoureusement la progression de l&rsquo;\u00e9chelle d&rsquo;\u00e9valuation. L&rsquo;exclusion pr\u00e9alable des valeurs manquantes via la fonction MISSING() est ici imp\u00e9rative, car dans le mod\u00e8le interne de SAS, une valeur num\u00e9rique manquante (.) est consid\u00e9r\u00e9e comme infiniment petite, c&rsquo;est-\u00e0-dire inf\u00e9rieure \u00e0 n&rsquo;importe quel nombre r\u00e9el n\u00e9gatif ou positif. Sans cette garde-fou initiale, un score manquant aurait \u00e9t\u00e9 class\u00e9 \u00e0 tort comme &lsquo;Absente\/Minime&rsquo; par la condition ScoreHAMA &lt; 18.<\/p>\n<h2>5. Utilisation de l&rsquo;instruction SELECT-WHEN pour des affectations multiples<\/h2>\n<h3>5.1 Structure compar\u00e9e entre blocs SELECT et encha\u00eenements IF-ELSE<\/h3>\n<p>Lorsque la logique de d\u00e9rivation d&rsquo;une nouvelle variable d\u00e9pend d&rsquo;un ensemble \u00e9tendu de modalit\u00e9s qualitatives ou de valeurs enti\u00e8res discr\u00e8tes, l&rsquo;accumulation de clauses IF-THEN \/ ELSE peut rapidement d\u00e9grader la lisibilit\u00e9 structurelle du script et accro\u00eetre la complexit\u00e9 cognitive requise pour auditer le code. L&rsquo;architecture de contr\u00f4le SELECT-WHEN offre une alternative syntaxique \u00e9l\u00e9gante, claire et hautement standardis\u00e9e, particuli\u00e8rement adapt\u00e9e aux recodages multimodaux.<\/p>\n<p>L&rsquo;instruction SELECT existe sous deux formes distinctes dans l&rsquo;\u00e9tape DATA : la forme avec argument et la forme sans argument. La forme avec argument, formul\u00e9e sous la syntaxe SELECT (variable_source); suivie de multiples clauses WHEN (valeur_cible) instruction;, compare l&rsquo;expression source \u00e0 des valeurs pr\u00e9cises. La forme sans argument, structur\u00e9e sous la forme SELECT; WHEN (condition_booleenne) instruction;, op\u00e8re comme un s\u00e9lecteur conditionnel universel fonctionnellement comparable \u00e0 une s\u00e9rie d&rsquo;instructions IF-THEN, mais avec un niveau d&rsquo;imbrication visuelle beaucoup plus lisible.<\/p>\n<p>Sur le plan de l&rsquo;optimisation syst\u00e8me, le compilateur SAS peut optimiser l&rsquo;arborescence des blocs SELECT en g\u00e9n\u00e9rant une table de sauts (jump table) lorsque l&rsquo;expression cible est une variable discr\u00e8te finie. Cette optimisation interne acc\u00e9l\u00e8re l&rsquo;\u00e9valuation par rapport \u00e0 un d\u00e9filement s\u00e9quentiel de conditions IF non hi\u00e9rarchis\u00e9es, tout en offrant aux d\u00e9veloppeurs une structure rigide encadr\u00e9e imp\u00e9rativement par une instruction de cl\u00f4ture END.<\/p>\n<h3>5.2 Gestion des cas non r\u00e9pertori\u00e9s avec la clause OTHERWISE<\/h3>\n<p>L&rsquo;un des traits distinctifs les plus critiques du bloc SELECT-WHEN r\u00e9side dans son exigence d&rsquo;exhaustivit\u00e9 logique vis-\u00e0-vis des donn\u00e9es entrantes. Contrairement \u00e0 l&rsquo;instruction IF-THEN qui ignore silencieusement les observations ne satisfaisant aucune condition, un bloc SELECT dont aucune clause WHEN n&rsquo;est v\u00e9rifi\u00e9e cherchera imp\u00e9rativement une directive de secours incarn\u00e9e par l&rsquo;instruction OTHERWISE.<\/p>\n<p>Si une observation soumise \u00e0 l&rsquo;\u00e9valuation d&rsquo;un bloc SELECT ne remplit aucune des conditions WHEN stipul\u00e9es et qu&rsquo;aucune clause OTHERWISE n&rsquo;est d\u00e9finie dans le bloc, SAS interrompt brutalement l&rsquo;ex\u00e9cution de l&rsquo;\u00e9tape DATA en levant une erreur fatale dans le journal (ERROR: No WHEN condition was true and no OTHERWISE was specified). Cette interruption critique bloque la cr\u00e9ation de la table de sortie, signalant une anomalie majeure dans la couverture des modalit\u00e9s pr\u00e9vues par le programmeur.<\/p>\n<p>L&rsquo;int\u00e9gration syst\u00e9matique d&rsquo;une clause OTHERWISE constitue donc une bonne pratique de programmation d\u00e9fensive absolue. Elle permet de capturer les valeurs inattendues, les erreurs typographiques issues des saisies manuelles ou les cat\u00e9gories \u00e9mergentes non document\u00e9es dans le protocole. En affectant une valeur de contr\u00f4le ou en \u00e9mettant une notification explicite dans le journal syst\u00e8me via l&rsquo;instruction PUT, l&rsquo;analyste pr\u00e9serve l&rsquo;int\u00e9grit\u00e9 de son flux de traitement tout en isolant les anomalies de terrain.<\/p>\n<h3>5.3 Exemple concret : Affectation de profils de r\u00e9ponse neuropsychologique<\/h3>\n<p>Imaginons un paradigme exp\u00e9rimental en neurosciences cognitives dans lequel des sujets sont soumis \u00e0 des t\u00e2ches informatis\u00e9es renvoyant des codes de compl\u00e9tion alphanum\u00e9riques standardis\u00e9s (COMP_OK, PART_ERR, TIMEOUT, ABORT_SUBJ, TECH_FAIL). L&rsquo;objectif m\u00e9thodologique consiste \u00e0 d\u00e9river une nouvelle variable de statut exp\u00e9rimental (StatutProtocole) encodant l&rsquo;\u00e9ligibilit\u00e9 de la session pour l&rsquo;analyse statistique finale.<\/p>\n<p>Le bloc de code ci-dessous mat\u00e9rialise cette cat\u00e9gorisation au moyen d&rsquo;un bloc SELECT avec argument, exploitant des listes de valeurs dans les clauses WHEN et s\u00e9curisant le processus avec OTHERWISE :<\/p>\n<p>DATA AnalyseSessions_Derivees;<br \/>\n&nbsp;&nbsp;SET AnalyseSessions_Brutes;<br \/>\n&nbsp;&nbsp;LENGTH StatutProtocole $ 15 DescriptionAction $ 40;<\/p>\n<p>&nbsp;&nbsp;SELECT (CodeReponse);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;WHEN (&lsquo;COMP_OK&rsquo;) DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatutProtocole = &lsquo;Valide&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DescriptionAction = &lsquo;Inclusion analyse principale&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;WHEN (&lsquo;PART_ERR&rsquo;, &lsquo;TIMEOUT&rsquo;) DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatutProtocole = &lsquo;D\u00e9grad\u00e9&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DescriptionAction = &lsquo;Analyse de sensibilit\u00e9 secondaire&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;WHEN (&lsquo;ABORT_SUBJ&rsquo;) DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatutProtocole = &lsquo;Exclu&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DescriptionAction = &lsquo;Retrait volontaire du participant&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;WHEN (&lsquo;TECH_FAIL&rsquo;) DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatutProtocole = &lsquo;Non-\u00c9valuable&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DescriptionAction = &lsquo;Panne mat\u00e9rielle ou r\u00e9seau&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;OTHERWISE DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatutProtocole = &lsquo;Anomalie&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DescriptionAction = &lsquo;Code non r\u00e9pertori\u00e9 \u00e0 auditer&rsquo;;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PUT &lsquo;ATTENTION: Code de session inconnu d\u00e9tect\u00e9 : &lsquo; CodeReponse= &lsquo;pour ID=&rsquo; ParticipantID=;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;END;<br \/>\nRUN;<\/p>\n<p>L&rsquo;utilisation conjointe des blocs DO&#8230;END \u00e0 l&rsquo;int\u00e9rieur des clauses WHEN permet d&rsquo;ex\u00e9cuter simultan\u00e9ment plusieurs assignations pour une modalit\u00e9 unique, consolidant deux nouvelles variables (StatutProtocole et DescriptionAction). En outre, l&rsquo;instruction PUT log\u00e9e dans la clause OTHERWISE trace instantan\u00e9ment dans le journal toute anomalie empirique, offrant un retour en temps r\u00e9el sur la qualit\u00e9 des saisies sans stopper le traitement des donn\u00e9es valides.<\/p>\n<h2>6. Fonctions math\u00e9matiques et statistiques int\u00e9gr\u00e9es pour nouvelles variables<\/h2>\n<h3>6.1 Agr\u00e9gation horizontale au niveau de chaque observation<\/h3>\n<p>L&rsquo;\u00e9tape DATA requiert couramment la synth\u00e8se de multiples colonnes au sein d&rsquo;une seule et m\u00eame ligne d&rsquo;observation. Cette op\u00e9ration d&rsquo;agr\u00e9gation horizontale diff\u00e8re conceptuellement des agr\u00e9gations verticales r\u00e9alis\u00e9es via la proc\u00e9dure PROC MEANS ou le langage SQL. Pour agr\u00e9ger des vecteurs de scores transversaux, SAS met \u00e0 disposition une batterie de fonctions statistiques hautement optimis\u00e9es, telles que SUM, MEAN, MIN, MAX, STD, VAR ou MEDIAN.<\/p>\n<p>La puissance syntaxique de ces fonctions r\u00e9side notamment dans leur capacit\u00e9 \u00e0 ing\u00e9rer des listes abr\u00e9g\u00e9es de variables gr\u00e2ce au mot-cl\u00e9 OF. Au lieu d&rsquo;\u00e9num\u00e9rer fastidieusement chaque colonne dans les arguments de la fonction, l&rsquo;analyste peut sp\u00e9cifier des plages ordonn\u00e9es ou des motifs nominaux, tels que MEAN(OF Item1-Item20) pour calculer la moyenne de vingt items cons\u00e9cutifs, ou SUM(OF Score_:) pour additionner l&rsquo;ensemble des variables d\u00e9butant par le pr\u00e9fixe &lsquo;Score_&rsquo;.<\/p>\n<p>Il importe de distinguer rigoureusement la moyenne calcul\u00e9e \u00e0 partir d&rsquo;un ensemble de m\u00e9triques du score brut total cumul\u00e9. Les fonctions statistiques internes de SAS ajustent automatiquement les d\u00e9nominateurs computationnels en fonction des dimensions r\u00e9elles des arguments fournis, garantissant des estimations math\u00e9matiques exactes et exemptes de distorsions d&rsquo;\u00e9chelles, ce qui est capital lors du traitement de questionnaires psychom\u00e9triques complexes.<\/p>\n<h3>6.2 Op\u00e9rateurs arithm\u00e9tiques versus fonctions SAS face aux donn\u00e9es manquantes<\/h3>\n<p>L&rsquo;un des pi\u00e8ges m\u00e9thodologiques les plus fr\u00e9quents et d\u00e9vastateurs rencontr\u00e9s lors de la cr\u00e9ation de nouvelles variables dans SAS concerne la divergence comportementale majeure entre l&rsquo;usage d&rsquo;op\u00e9rateurs arithm\u00e9tiques conventionnels (+, -) et l&rsquo;appel aux fonctions statistiques int\u00e9gr\u00e9es (SUM, MEAN) en pr\u00e9sence de valeurs manquantes (missing data).<\/p>\n<p>Consid\u00e9rons trois variables num\u00e9riques : A, B et C. Si un analyste programme l&rsquo;instruction d&rsquo;assignation Total = A + B + C;, la pr\u00e9sence d&rsquo;une seule valeur manquante parmi les trois variables entra\u00eenera in\u00e9vitablement la conversion de Total en valeur manquante (.), an\u00e9antissant l&rsquo;information v\u00e9hicul\u00e9e par les deux autres mesures valides. \u00c0 l&rsquo;inverse, si l&rsquo;analyste emploie la fonction Total_Fonction = SUM(A, B, C);, SAS ignore la valeur manquante et calcule la somme arithm\u00e9tique exclusive des valeurs num\u00e9riques observ\u00e9es, renvoyant un r\u00e9sultat num\u00e9rique valide.<\/p>\n<p>Cependant, cette tol\u00e9rance intrins\u00e8que de la fonction SUM introduit un p\u00e9ril m\u00e9thodologique insidieux : l&rsquo;\u00e9quivalence artificielle entre un score complet et un score calcul\u00e9 sur des donn\u00e9es tronqu\u00e9es. Si le participant a r\u00e9pondu uniquement \u00e0 l&rsquo;item A (valeur 10) et a omis les items B et C, SUM(A, B, C) renverra 10, tout comme un individu ayant r\u00e9pondu 3, 3 et 4 \u00e0 l&rsquo;ensemble du protocole. Il est donc imp\u00e9ratif de conditionner l&rsquo;usage de ces fonctions statistiques \u00e0 des seuils minimaux de compl\u00e9tude d&rsquo;items au moyen de la fonction NMISS (nombre de valeurs manquantes) ou de la fonction N (nombre de valeurs valides pr\u00e9sent\u00e9es).<\/p>\n<h3>6.3 Exemple de transformation : Normalisation et calcul de scores Z<\/h3>\n<p>Dans les \u00e9tudes quantitatives impliquant des donn\u00e9es distribu\u00e9es selon des lois asym\u00e9triques ou mesur\u00e9es sur des m\u00e9triques incomparables, la standardisation et la normalisation non lin\u00e9aire constituent des \u00e9tapes obligatoires. Les scores Z permettent de repositionner chaque observation sur une \u00e9chelle standardis\u00e9e centr\u00e9e sur z\u00e9ro avec un \u00e9cart-type unitaire, tandis que les transformations logarithmiques (LOG) ou de racine carr\u00e9e (SQRT) corrigent les asym\u00e9tries positives marqu\u00e9es.<\/p>\n<p>Le bloc de code ci-dessous d\u00e9montre la cr\u00e9ation conjointe d&rsquo;une variable log-transform\u00e9e pour corriger l&rsquo;asym\u00e9trie d&rsquo;un biomarqueur d&rsquo;inflammation (CRP), suivie du calcul d&rsquo;un score Z standardis\u00e9 bas\u00e9 sur des param\u00e8tres normatifs de population pr\u00e9alablement \u00e9tablis (Moyenne = 2.5 mg\/L, \u00c9cart-type = 0.8 mg\/L) :<\/p>\n<p>DATA Biomarqueurs_Normalises;<br \/>\n&nbsp;&nbsp;SET DonneesBiologiques;<br \/>\n&nbsp;&nbsp;\/* Transformation logarithmique naturelle pour r\u00e9duire l&rsquo;asym\u00e9trie positive *\/<br \/>\n&nbsp;&nbsp;IF CRP_Brute &gt; 0 THEN Log_CRP = LOG(CRP_Brute);<br \/>\n&nbsp;&nbsp;ELSE IF CRP_Brute = 0 THEN Log_CRP = LOG(CRP_Brute + 0.001); \/* Constante de translation *\/<br \/>\n&nbsp;&nbsp;ELSE Log_CRP = .;<\/p>\n<p>&nbsp;&nbsp;\/* Standardisation sous forme de score Z normatif *\/<br \/>\n&nbsp;&nbsp;IF NOT MISSING(CRP_Brute) THEN DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;Z_Score_CRP = (CRP_Brute &#8211; 2.5) \/ 0.8;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;\/* Arrondi m\u00e9trologique \u00e0 trois d\u00e9cimales significatives *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;Z_Score_Arrondi = ROUND(Z_Score_CRP, 0.001);<br \/>\n&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;ELSE DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;Z_Score_CRP = .;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;Z_Score_Arrondi = .;<br \/>\n&nbsp;&nbsp;END;<br \/>\nRUN;<\/p>\n<p>L&rsquo;utilisation de la fonction ROUND avec un argument de pr\u00e9cision explicite (0.001) permet de contr\u00f4ler finement la repr\u00e9sentation d\u00e9cimale de la nouvelle variable, \u00e9liminant les art\u00e9facts infinit\u00e9simaux inh\u00e9rents \u00e0 l&rsquo;arithm\u00e9tique binaire \u00e0 virgule flottante. Par ailleurs, la gestion prudente de la borne z\u00e9ro via une constante d&rsquo;ajustement pr\u00e9vient toute lev\u00e9e d&rsquo;erreur math\u00e9matique lors de l&rsquo;application de la fonction LOG sur des valeurs nulles ou n\u00e9gatives.<\/p>\n<h2>7. Manipulation et g\u00e9n\u00e9ration de variables de type caract\u00e8re<\/h2>\n<h3>7.1 Gestion cruciale de la longueur avec l&rsquo;instruction LENGTH<\/h3>\n<p>L&rsquo;une des particularit\u00e9s les plus critiques du moteur de donn\u00e9es SAS concerne la d\u00e9termination statique de la longueur m\u00e9moire des variables de type caract\u00e8re lors de la phase de compilation de l&rsquo;\u00e9tape DATA. Contrairement aux environnements \u00e0 typage dynamique allouant la m\u00e9moire \u00e9lastiquement en fonction du contenu textuel instantan\u00e9, SAS fixe irr\u00e9vocablement la longueur d&rsquo;une variable caract\u00e8re d\u00e8s sa premi\u00e8re mention dans le flux s\u00e9quentiel du script.<\/p>\n<p>Cette particularit\u00e9 architecturale induit le ph\u00e9nom\u00e8ne notoire de \u00ab troncature silencieuse \u00bb. Si une nouvelle variable textuelle est instanci\u00e9e pour la premi\u00e8re fois au sein d&rsquo;une instruction conditionnelle courte telle que IF Sexe = &lsquo;M&rsquo; THEN GroupeLabel = &lsquo;Homme&rsquo;;, SAS analyse la cha\u00eene &lsquo;Homme&rsquo; lors de la compilation et alloue d\u00e9finitivement une longueur de 5 octets \u00e0 GroupeLabel dans le PDV. Lorsque le programme \u00e9value l&rsquo;observation suivante et ex\u00e9cute ELSE GroupeLabel = &lsquo;Femme_Enceinte&rsquo;;, la cha\u00eene sera impitoyablement tronqu\u00e9e \u00e0 cinq caract\u00e8res, produisant la valeur corrompue &lsquo;Femme&rsquo; sans qu&rsquo;aucun avertissement explicite d&rsquo;erreur fatale ne soit n\u00e9cessairement mis en exergue dans le journal.<\/p>\n<p>Pour immuniser le traitement contre ce p\u00e9ril, la d\u00e9claration pr\u00e9alable de la taille maximale au moyen de l&rsquo;instruction LENGTH est obligatoire. Positionn\u00e9e strat\u00e9giquement tout en haut de l&rsquo;\u00e9tape DATA, avant m\u00eame l&rsquo;instruction SET ou les blocs conditionnels, l&rsquo;instruction LENGTH d\u00e9finit l&rsquo;enveloppe m\u00e9morielle maximale requise (par exemple, LENGTH GroupeLabel $ 25;), garantissant que toute cha\u00eene de caract\u00e8res ult\u00e9rieurement assign\u00e9e disposera d&rsquo;un espace suffisant pour pr\u00e9server son int\u00e9grit\u00e9 textuelle int\u00e9grale.<\/p>\n<h3>7.2 Fonctions fondamentales de traitement des cha\u00eenes de caract\u00e8res<\/h3>\n<p>La g\u00e9n\u00e9ration de nouvelles variables textuelles requiert fr\u00e9quemment le d\u00e9coupage, le nettoyage typographique et la concat\u00e9nation de segments d&rsquo;information h\u00e9t\u00e9rog\u00e8nes. SAS offre une suite compl\u00e8te de fonctions de manipulation de cha\u00eenes hautement performantes, au premier rang desquelles figurent SUBSTR, SCAN, STRIP, UPCASE, LOWCASE et la famille des fonctions CAT.<\/p>\n<p>La fonction SUBSTR extrait une sous-cha\u00eene \u00e0 partir d&rsquo;une position indicielle de d\u00e9part et d&rsquo;une longueur sp\u00e9cifi\u00e9e, s&rsquo;av\u00e9rant id\u00e9ale pour parser des structures \u00e0 colonnage fixe. Pour l&rsquo;extraction s\u00e9mantique bas\u00e9e sur des s\u00e9parateurs arbitraires (virgules, barres obliques, espaces), la fonction SCAN surpasse largement SUBSTR : elle isole directement le n-i\u00e8me mot d&rsquo;une cha\u00eene sans n\u00e9cessiter le calcul manuel des d\u00e9calages d&rsquo;octets. Parall\u00e8lement, les fonctions UPCASE et LOWCASE standardisent la casse des caract\u00e8res, \u00e9liminant les disparit\u00e9s d&rsquo;encodage (&lsquo;Positif&rsquo;, &lsquo;POSITIF&rsquo;, &lsquo;positif&rsquo;) pr\u00e9alablement aux jointures ou aux classifications.<\/p>\n<p>Pour agr\u00e9ger plusieurs composantes textuelles en une seule variable, les fonctions de la famille CAT doivent syst\u00e9matiquement supplanter l&rsquo;op\u00e9rateur traditionnel de concat\u00e9nation double barre (||). L&rsquo;op\u00e9rateur brut ne supprime pas les espaces de remplissage r\u00e9siduels situ\u00e9s \u00e0 droite des variables caract\u00e8res, produisant des cha\u00eenes disjointes peu ergonomiques. La fonction CATS \u00e9limine automatiquement tous les espaces de t\u00eate et de fin avant d&rsquo;unir les \u00e9l\u00e9ments, tandis que la fonction CATX ins\u00e8re en outre un s\u00e9parateur personnalis\u00e9 entre chaque segment concat\u00e9n\u00e9, rationalisant consid\u00e9rablement le code de mise en forme.<\/p>\n<h3>7.3 Exemple empirique : Cr\u00e9ation d&rsquo;identifiants uniques de participants<\/h3>\n<p>Dans les essais cliniques multicentriques, l&rsquo;anonymisation et la constitution d&rsquo;identifiants uniques universels constituent un imp\u00e9ratif m\u00e9thodologique de premier ordre. Il est fr\u00e9quent que les donn\u00e9es sources poss\u00e8dent des informations distribu\u00e9es dans trois colonnes distinctes : le code du centre hospitalier (CentreNum), le libell\u00e9 du protocole (ProtocoleID) et le num\u00e9ro d&rsquo;ordre s\u00e9quentiel du patient (PatientIndex). Pour harmoniser le suivi longitudinal, nous devons d\u00e9river une variable textuelle standardis\u00e9e unique au format &lsquo;PROT-CENTRE-PATIENT&rsquo;.<\/p>\n<p>Le bloc de code ci-dessous met en \u0153uvre l&rsquo;instruction LENGTH conjointe aux fonctions CATX, STRIP et PUT pour g\u00e9n\u00e9rer cette cl\u00e9 primaire sans espaces parasites :<\/p>\n<p>DATA SujetsInclus_Identifies;<br \/>\n&nbsp;&nbsp;SET Recrutement_Brut;<br \/>\n&nbsp;&nbsp;\/* Allocation s\u00e9curis\u00e9e de la m\u00e9moire textuelle *\/<br \/>\n&nbsp;&nbsp;LENGTH CodePatientUnique $ 25 CodePatientStandard $ 25;<\/p>\n<p>&nbsp;&nbsp;\/* Nettoyage et extraction des composantes *\/<br \/>\n&nbsp;&nbsp;Centre_Nettoye = STRIP(CentreNum);<br \/>\n&nbsp;&nbsp;Protocole_Maj = UPCASE(STRIP(ProtocoleID));<\/p>\n<p>&nbsp;&nbsp;\/* Formatage du num\u00e9ro s\u00e9quentiel num\u00e9rique en cha\u00eene avec z\u00e9ros non significatifs *\/<br \/>\n&nbsp;&nbsp;Patient_Formate = PUT(PatientIndex, Z4.);<\/p>\n<p>&nbsp;&nbsp;\/* Concat\u00e9nation s\u00e9curis\u00e9e avec d\u00e9limiteur tiret *\/<br \/>\n&nbsp;&nbsp;CodePatientUnique = CATX(&lsquo;-&lsquo;, Protocole_Maj, Centre_Nettoye, Patient_Formate);<\/p>\n<p>&nbsp;&nbsp;\/* Alternative utilisant CATS sans s\u00e9parateur fixe *\/<br \/>\n&nbsp;&nbsp;CodePatientStandard = CATS(Protocole_Maj, &lsquo;_&rsquo;, Centre_Nettoye, &lsquo;_&rsquo;, Patient_Formate);<br \/>\nRUN;<\/p>\n<p>L&rsquo;utilisation de la fonction PUT(PatientIndex, Z4.) transforme \u00e9l\u00e9gamment l&rsquo;entier num\u00e9rique en une cha\u00eene de quatre caract\u00e8res padd\u00e9e de z\u00e9ros \u00e0 gauche (par exemple, 7 devient &lsquo;0007&rsquo;). La fonction CATX assemble ensuite ces trois fragments avec le d\u00e9limiteur &lsquo;-&lsquo;, produisant une m\u00e9trique finale rigoureusement standardis\u00e9e (ex: &lsquo;ONCO01-CTR12-0007&rsquo;), garantissant l&rsquo;unicit\u00e9 stricte de l&rsquo;identifiant pour toutes les \u00e9tapes ult\u00e9rieures de fusion relationnelle et d&rsquo;analyses longitudinales.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/create2.jpg\" alt=\"\" \/><\/figure>\n<h2>8. Cr\u00e9ation de variables temporelles et de dates dans SAS<\/h2>\n<h3>8.1 Architecture interne du syst\u00e8me de dates SAS<\/h3>\n<p>La temporalit\u00e9 constitue un axe central de l&rsquo;analyse statistique, particuli\u00e8rement en \u00e9pid\u00e9miologie, en \u00e9conom\u00e9trie et dans les mod\u00e8les de survie. Cependant, appr\u00e9hender le traitement des dates dans SAS requiert de s&rsquo;affranchir de leur apparence visuelle textuelle pour comprendre leur architecture num\u00e9rique sous-jacente. SAS ne dispose pas d&rsquo;un type m\u00e9moriel distinct pour les dates : toute variable de date est stock\u00e9e sous la forme d&rsquo;un nombre entier relatif repr\u00e9sentant le nombre de jours \u00e9coul\u00e9s depuis une origine arbitraire fix\u00e9e au 1er janvier 1960.<\/p>\n<p>Sous cette convention, le 1er janvier 1960 correspond \u00e0 la valeur enti\u00e8re 0. Les dates post\u00e9rieures \u00e0 ce point z\u00e9ro sont repr\u00e9sent\u00e9es par des entiers positifs (par exemple, le 1er janvier 2024 \u00e9quivaut \u00e0 23 376), tandis que les dates ant\u00e9rieures sont encod\u00e9es par des entiers n\u00e9gatifs (le 1er janvier 1950 correspond \u00e0 -3 652). De mani\u00e8re analogue, les variables de temps (Time) mesurent le nombre de secondes \u00e9coul\u00e9es depuis minuit, et les variables d&rsquo;horodatage combin\u00e9 (Datetime) quantifient le nombre de secondes \u00e9coul\u00e9es depuis le 1er janvier 1960 \u00e0 00:00:00.<\/p>\n<p>Cette repr\u00e9sentation sous forme scalaire conf\u00e8re une puissance analytique remarquable : la diff\u00e9rence math\u00e9matique brute entre deux variables de date SAS (DateFin &#8211; DateDebut) fournit instantan\u00e9ment la dur\u00e9e exacte en jours calendaires s\u00e9parant les deux \u00e9v\u00e9nements, sans requ\u00e9rir d&rsquo;algorithmes de conversion complexes. N\u00e9anmoins, pour qu&rsquo;un entier comme 23376 devienne lisible pour un auditeur humain, l&rsquo;association d&rsquo;un format d&rsquo;affichage (tel que DATE9., DDMMYY10. ou YYMMDD10.) via l&rsquo;instruction FORMAT est formellement requise.<\/p>\n<h3>8.2 Fonctions de construction et de manipulation temporelle<\/h3>\n<p>L&rsquo;\u00e9laboration de nouvelles variables de date au sein de l&rsquo;\u00e9tape DATA fait appel \u00e0 un ensemble de fonctions d\u00e9di\u00e9es capables de composer, d\u00e9composer ou \u00e9chantillonner le temps. La fonction MDY (Month, Day, Year) constitue l&rsquo;outil princeps pour assembler une date SAS valide \u00e0 partir de trois grandeurs num\u00e9riques ind\u00e9pendantes figurant dans les donn\u00e9es brutes, \u00e9vitant ainsi les erreurs d&rsquo;interpr\u00e9tation li\u00e9es aux formats textuels r\u00e9gionaux.<\/p>\n<p>\u00c0 l&rsquo;inverse, si l&rsquo;on dispose d&rsquo;une variable de date unifi\u00e9e, les fonctions d&rsquo;extraction YEAR, MONTH, DAY, QTR (trimestre) et WEEKDAY (jour de la semaine) isolent instantan\u00e9ment les composantes chronologiques souhait\u00e9es, facilitant la cr\u00e9ation de covariables saisonni\u00e8res ou de cohortes de naissance. Pour ancrer le traitement des donn\u00e9es dans la temporalit\u00e9 dynamique du syst\u00e8me informatique au moment pr\u00e9cis de l&rsquo;ex\u00e9cution, les fonctions sans argument TODAY() ou DATE() retournent la date syst\u00e8me courante sous forme de valeur de date SAS.<\/p>\n<p>Enfin, pour manipuler les incr\u00e9ments temporels sans encourir les pi\u00e8ges des ann\u00e9es bissextiles ou des variations de dur\u00e9e des mois calendaires, les fonctions INTCK et INTNX s&rsquo;av\u00e8rent indispensables. INTCK compte le nombre d&rsquo;intervalles franchis (semaines, mois, ann\u00e9es) entre deux bornes temporelles, tandis qu&rsquo;INTNX d\u00e9cale une date initiale d&rsquo;un nombre d\u00e9termin\u00e9 d&rsquo;intervalles en g\u00e9rant rigoureusement l&rsquo;alignement temporel au d\u00e9but, au milieu ou \u00e0 la fin de la p\u00e9riode consid\u00e9r\u00e9e.<\/p>\n<h3>8.3 Exemple d&rsquo;application clinique : Calcul pr\u00e9cis de l&rsquo;\u00e2ge chronologique<\/h3>\n<p>Dans les registres \u00e9pid\u00e9miologiques et les essais cliniques pharmacologiques, le calcul rigoureux de l&rsquo;\u00e2ge chronologique des patients au moment de la visite de randomisation (VisiteDate) \u00e0 partir de leur date de naissance exacte (DateNaissance) constitue une exigence fondamentale. L&rsquo;application d&rsquo;une approximation arithm\u00e9tique simpliste consistant \u00e0 diviser la diff\u00e9rence brute de jours par 365.25 introduit des erreurs de troncature chez les individus n\u00e9s lors d&rsquo;ann\u00e9es bissextiles.<\/p>\n<p>Le script SAS suivant illustre la cr\u00e9ation m\u00e9thodologiquement exacte de la variable AgeChronologique au moyen de la fonction biom\u00e9dicale sp\u00e9cialis\u00e9e YRDIF, ainsi que le calcul de la dur\u00e9e d&rsquo;exposition au traitement avec application de formats de restitution :<\/p>\n<p>DATA AnalyseClinique_Dates;<br \/>\n&nbsp;&nbsp;SET DossiersPatients_Source;<br \/>\n&nbsp;&nbsp;\/* Construction d&rsquo;une date SAS \u00e0 partir de champs s\u00e9par\u00e9s *\/<br \/>\n&nbsp;&nbsp;DateConsentement = MDY(MoisConsentement, JourConsentement, AnneeConsentement);<\/p>\n<p>&nbsp;&nbsp;\/* Calcul de l&rsquo;\u00e2ge exact en ann\u00e9es r\u00e9volues selon la convention ACT\/ACT *\/<br \/>\n&nbsp;&nbsp;IF NOT MISSING(DateNaissance) AND NOT MISSING(DateConsentement) THEN DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;AgeExact = YRDIF(DateNaissance, DateConsentement, &lsquo;ACT\/ACT&rsquo;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;AgeRevolu = FLOOR(AgeExact);<br \/>\n&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;ELSE DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;AgeExact = .;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;AgeRevolu = .;<br \/>\n&nbsp;&nbsp;END;<\/p>\n<p>&nbsp;&nbsp;\/* Calcul de la dur\u00e9e de suivi th\u00e9rapeutique en semaines calendaires *\/<br \/>\n&nbsp;&nbsp;DureeSuiviSemaines = INTCK(&lsquo;WEEK&rsquo;, DateConsentement, DateFinTraitement);<\/p>\n<p>&nbsp;&nbsp;\/* Attribution de formats pour garantir une restitution visuelle intelligible *\/<br \/>\n&nbsp;&nbsp;FORMAT DateConsentement DateFinTraitement DATE9. AgeExact 6.2;<br \/>\nRUN;<\/p>\n<p>L&rsquo;utilisation de la fonction YRDIF avec le standard &lsquo;ACT\/ACT&rsquo; (Actual\/Actual) calcule le ratio temporel exact en tenant compte de la longueur r\u00e9elle de chaque ann\u00e9e calendaire travers\u00e9e. L&rsquo;application subordonn\u00e9e de la fonction FLOOR permet de d\u00e9river l&rsquo;\u00e2ge r\u00e9volu l\u00e9gal, \u00e9liminant tout arrondi pr\u00e9matur\u00e9 vers le haut. La sp\u00e9cification finale du format DATE9. garantit que la variable DateConsentement appara\u00eetra dans les rapports sous une forme normalis\u00e9e sans ambigu\u00eft\u00e9 internationale (ex: 15JAN2024), tout en demeurant un entier manipulable math\u00e9matiquement dans le PDV.<\/p>\n<h2>9. Automatisation de la cr\u00e9ation de variables via les tableaux (ARRAY)<\/h2>\n<h3>9.1 D\u00e9finition et structure des tableaux temporaires de variables<\/h3>\n<p>Lorsque la structure exp\u00e9rimentale d&rsquo;une \u00e9tude requiert d&rsquo;appliquer une transformation uniforme sur un ensemble \u00e9tendu de variables de m\u00eame type (par exemple, recoder cinquante items d&rsquo;une \u00e9chelle psychom\u00e9trique, centrer cinquante variables biochimiques ou convertir des dizaines de m\u00e9triques d&rsquo;unit\u00e9s imp\u00e9riales en unit\u00e9s m\u00e9triques), la programmation s\u00e9quentielle ligne par ligne devient r\u00e9p\u00e9titive, sujette aux erreurs de saisie et prohibitive en maintenance logicielle. SAS r\u00e9sout cette probl\u00e9matique par l&rsquo;interm\u00e9diaire de la structure de tableau, d\u00e9sign\u00e9e par l&rsquo;instruction ARRAY.<\/p>\n<p>Un ARRAY dans l&rsquo;\u00e9tape DATA ne constitue pas une structure de donn\u00e9es physique additionnelle stock\u00e9e dans la table r\u00e9sultante. Il s&rsquo;agit exclusivement d&rsquo;un artifice syntaxique de compilation, une grille de r\u00e9f\u00e9rence temporaire qui regroupe logiquement un sous-ensemble de variables d\u00e9j\u00e0 existantes ou devant \u00eatre cr\u00e9\u00e9es au sein du PDV. La syntaxe canonique d&rsquo;instanciation s&rsquo;\u00e9nonce sous la forme ARRAY NomTableau {dimension} $ variable_1 &#8230; variable_n;. L&rsquo;omission du dollar indique un tableau de variables num\u00e9riques.<\/p>\n<p>L&rsquo;acc\u00e8s \u00e0 chaque \u00e9l\u00e9ment individuel du tableau s&rsquo;effectue au moyen d&rsquo;une indexation num\u00e9rique enti\u00e8re entour\u00e9e d&rsquo;accolades ou de parenth\u00e8ses (par exemple, NomTableau{1} renvoie \u00e0 la premi\u00e8re variable r\u00e9f\u00e9renc\u00e9e). L&rsquo;analyste peut ainsi manipuler un groupe entier de colonnes au sein d&rsquo;une abstraction vectorielle unifi\u00e9e, ouvrant la voie \u00e0 des automatisations puissantes et condens\u00e9es lors de l&rsquo;ex\u00e9cution s\u00e9quentielle du PDV.<\/p>\n<h3>9.2 It\u00e9ration et boucles DO pour transformations massives<\/h3>\n<p>La pleine puissance op\u00e9rationnelle des instructions ARRAY se manifeste lorsqu&rsquo;elles sont conjugu\u00e9es aux boucles it\u00e9ratives DO&#8230;TO&#8230;END. Cette conjonction algorithmique permet d&rsquo;ex\u00e9cuter un bloc de transformations math\u00e9matiques ou logiques sur l&rsquo;ensemble des \u00e9l\u00e9ments r\u00e9f\u00e9renc\u00e9s dans le tableau, en quelques lignes de code seulement, pour chaque observation transitant par le PDV.<\/p>\n<p>Dans ce mod\u00e8le it\u00e9ratif, l&rsquo;indice de la boucle DO sert de pointeur d&rsquo;index pour parcourir s\u00e9quentiellement les cases du tableau. L&rsquo;utilisation de la fonction dynamique DIM(NomTableau) comme borne sup\u00e9rieure de l&rsquo;indice de boucle constitue une pratique exemplaire : elle calcule automatiquement le nombre exact d&rsquo;\u00e9l\u00e9ments contenus dans le tableau, immunisant l&rsquo;algorithme contre tout risque de d\u00e9passement de limite de tableau (OutOfBounds) si des variables devaient \u00eatre ult\u00e9rieurement ajout\u00e9es ou retir\u00e9es de la liste source.<\/p>\n<p>Ce traitement vectoriel r\u00e9duit la taille du script source de mani\u00e8re drastique, substituant des centaines d&rsquo;instructions conditionnelles ou arithm\u00e9tiques redondantes par une boucle compacte. La compacit\u00e9 syntaxique ainsi obtenue minimise le risque de disparit\u00e9s de traitement entre variables s\u0153urs et simplifie l&rsquo;audit du code par des organismes certificateurs ind\u00e9pendants, tout en optimisant le chemin d&rsquo;ex\u00e9cution au niveau du microprocesseur.<\/p>\n<h3>9.3 Exemple psychom\u00e9trique : Recodage simultan\u00e9 d&rsquo;items invers\u00e9s<\/h3>\n<p>Dans les enqu\u00eates psychologiques ou manag\u00e9riales utilisant des \u00e9chelles d&rsquo;attitude de type Likert en 5 points (de 1 = &lsquo;Pas du tout d&rsquo;accord&rsquo; \u00e0 5 = &lsquo;Totalement d&rsquo;accord&rsquo;), il est d&rsquo;usage d&rsquo;inverser la polarit\u00e9 s\u00e9mantique de certains items afin de neutraliser les biais d&rsquo;acquiescement passif. Pour les items invers\u00e9s, un score initial de 1 doit devenir 5, un score de 2 doit devenir 4, et ainsi de suite. L&rsquo;\u00e9quation de transformation lin\u00e9aire th\u00e9orique s&rsquo;\u00e9crit formellement : NouveauScore = (ValeurMax + ValeurMin) &#8211; AncienScore, soit 6 &#8211; AncienScore.<\/p>\n<p>Le bloc de code ci-dessous illustre comment instancier simultan\u00e9ment dix nouvelles variables recod\u00e9es (ItemRev1 \u00e0 ItemRev10) \u00e0 partir de dix items bruts (Item1 \u00e0 Item10) gr\u00e2ce \u00e0 la d\u00e9finition de deux tableaux synchronis\u00e9s au sein d&rsquo;une boucle it\u00e9rative :<\/p>\n<p>DATA Psychometrie_Recodee;<br \/>\n&nbsp;&nbsp;SET Enquete_Brute;<br \/>\n&nbsp;&nbsp;\/* D\u00e9claration du tableau r\u00e9f\u00e9ren\u00e7ant les variables d&rsquo;origine *\/<br \/>\n&nbsp;&nbsp;ARRAY ItemsOrig {10} Item1 &#8211; Item10;<br \/>\n&nbsp;&nbsp;\/* D\u00e9claration du tableau mat\u00e9rialisant dix NOUVELLES variables *\/<br \/>\n&nbsp;&nbsp;ARRAY ItemsInverses {10} ItemRev1 &#8211; ItemRev10;<\/p>\n<p>&nbsp;&nbsp;\/* Boucle it\u00e9rative de recodage vectoriel *\/<br \/>\n&nbsp;&nbsp;DO i = 1 TO DIM(ItemsOrig);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;IF NOT MISSING(ItemsOrig{i}) THEN DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/* Transformation arithm\u00e9tique d&rsquo;inversion *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemsInverses{i} = 6 &#8211; ItemsOrig{i};<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;ELSE DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemsInverses{i} = .;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;END;<\/p>\n<p>&nbsp;&nbsp;\/* Suppression de la variable indicielle de boucle du jeu de donn\u00e9es final *\/<br \/>\n&nbsp;&nbsp;DROP i;<br \/>\nRUN;<\/p>\n<p>Lors de la compilation, l&rsquo;instruction ARRAY ItemsInverses {10} ItemRev1 &#8211; ItemRev10; commande \u00e0 SAS de cr\u00e9er dix nouveaux emplacements de variables num\u00e9riques dans le PDV. Lors de l&rsquo;ex\u00e9cution de la boucle DO pour chaque participant, le compilateur affecte instantan\u00e9ment \u00e0 chaque case de ItemsInverses la valeur invers\u00e9e de l&rsquo;item d&rsquo;origine correspondant. L&rsquo;instruction finale DROP i; garantit que le compteur de boucle, rendu inutile une fois les it\u00e9rations achev\u00e9es, ne viendra pas encombrer inutilement la table analytique finale.<\/p>\n<h2>10. Cr\u00e9ation de variables cumulatives et r\u00e9tention d&rsquo;\u00e9tat avec l&rsquo;instruction RETAIN<\/h2>\n<h3>10.1 M\u00e9canisme de r\u00e9initialisation automatique du PDV et n\u00e9cessit\u00e9 du RETAIN<\/h3>\n<p>L&rsquo;un des axiomes directeurs de l&rsquo;\u00e9tape DATA r\u00e9side dans l&rsquo;amn\u00e9sie d\u00e9lib\u00e9r\u00e9e du PDV d&rsquo;une observation \u00e0 la suivante. Par d\u00e9faut, \u00e0 chaque d\u00e9but d&rsquo;it\u00e9ration de la boucle d&rsquo;ex\u00e9cution (c&rsquo;est-\u00e0-dire lors de la lecture d&rsquo;une nouvelle ligne de donn\u00e9es), SAS r\u00e9initialise \u00e0 la valeur manquante (. ou espace) toutes les variables cr\u00e9\u00e9es ou calcul\u00e9es directement au sein de l&rsquo;\u00e9tape DATA, \u00e0 l&rsquo;exception notable de celles lues depuis une table source via l&rsquo;instruction SET ou cr\u00e9\u00e9es par une instruction de somme implicite.<\/p>\n<p>Cette r\u00e9initialisation syst\u00e9matique vise \u00e0 emp\u00eacher qu&rsquo;une valeur calcul\u00e9e pour l&rsquo;observation pr\u00e9c\u00e9dente ne contamine accidentellement l&rsquo;observation en cours si cette derni\u00e8re ne r\u00e9pondait pas aux conditions logiques d&rsquo;affectation. Cependant, cette amn\u00e9sie m\u00e9morielle interdit par d\u00e9faut tout calcul inter-observations, tel que le calcul de totaux cumul\u00e9s au fil du temps, la conservation d&rsquo;une valeur de r\u00e9f\u00e9rence baseline ou l&rsquo;incr\u00e9mentation d&rsquo;un compteur s\u00e9quentiel d&rsquo;\u00e9v\u00e9nements.<\/p>\n<p>L&rsquo;instruction RETAIN intervient pr\u00e9cis\u00e9ment pour d\u00e9sactiver cette purge automatique du PDV. En sp\u00e9cifiant RETAIN VariableNom [valeur_initiale];, l&rsquo;analyste ordonne formellement au compilateur SAS de pr\u00e9server la valeur r\u00e9sidente de cette variable en m\u00e9moire vive \u00e0 travers toutes les it\u00e9rations successives de l&rsquo;\u00e9tape DATA, jusqu&rsquo;\u00e0 ce qu&rsquo;une instruction de r\u00e9assignation explicite vienne \u00e9craser son contenu. Cette r\u00e9tention d&rsquo;\u00e9tat permet d&rsquo;\u00e9tablir une continuit\u00e9 temporelle au sein de jeux de donn\u00e9es strictement s\u00e9quentiels.<\/p>\n<h3>10.2 Calcul de sommes cumul\u00e9es et d&rsquo;indicateurs de trajectoire<\/h3>\n<p>La cr\u00e9ation de variables de sommation progressive au fil des enregistrements repr\u00e9sente l&rsquo;une des applications les plus courantes de la m\u00e9moire persistante. SAS offre deux approches pour impl\u00e9menter une sommation cumulative : l&rsquo;instruction RETAIN coupl\u00e9e \u00e0 un op\u00e9rateur d&rsquo;addition standard, ou l&rsquo;utilisation plus compacte de l&rsquo;instruction d&rsquo;addition implicite, couramment appel\u00e9e \u00ab instruction de somme \u00bb (Sum Statement).<\/p>\n<p>L&rsquo;instruction d&rsquo;addition implicite s&rsquo;articule selon la syntaxe VariableCumulative + Increment;. Cette \u00e9criture poss\u00e8de deux particularit\u00e9s majeures : d&rsquo;une part, elle implique automatiquement l&rsquo;effet de r\u00e9tention RETAIN sur la variable situ\u00e9e \u00e0 gauche de l&rsquo;op\u00e9rateur plus (+), l&rsquo;initialisant implicitement \u00e0 z\u00e9ro avant la premi\u00e8re it\u00e9ration ; d&rsquo;autre part, elle g\u00e8re intrins\u00e8quement les valeurs manquantes en les traitant comme des z\u00e9ros neutres, emp\u00eachant la propagation destructive de la valeur manquante sur le cumul progressif de la trajectoire.<\/p>\n<p>Cette m\u00e9thodologie est fondamentale pour cr\u00e9er des indicateurs d&rsquo;exposition cumulative \u00e0 des toxiques ou \u00e0 des traitements m\u00e9dicamenteux. Elle permet \u00e9galement de construire des compteurs dynamiques d&rsquo;\u00e9v\u00e9nements ind\u00e9sirables, documentant pour chaque observation le rang s\u00e9quentiel exact de l&rsquo;occurrence clinique au sein de l&rsquo;historique m\u00e9dical individuel d&rsquo;un patient.<\/p>\n<h3>10.3 Exemple longitudinal : Traitement par groupes avec l&rsquo;instruction BY<\/h3>\n<p>Dans les cohortes \u00e9pid\u00e9miologiques longitudinales comportant des mesures r\u00e9p\u00e9t\u00e9es par patient, les calculs cumulatifs ne doivent g\u00e9n\u00e9ralement pas s&rsquo;\u00e9tendre sur l&rsquo;ensemble de la table enti\u00e8re, mais \u00eatre r\u00e9initialis\u00e9s \u00e0 z\u00e9ro d\u00e8s que l&rsquo;\u00e9tape DATA entame le traitement des observations d&rsquo;un nouveau participant. Cette partition logique exige l&rsquo;utilisation conjointe du tri pr\u00e9alable via la proc\u00e9dure PROC SORT, de l&rsquo;instruction BY et des variables automatiques FIRST. et LAST.<\/p>\n<p>Le programme ci-dessous illustre la cr\u00e9ation d&rsquo;une variable d&rsquo;exposition m\u00e9dicamenteuse cumulative (DoseCumulee) et d&rsquo;un compteur s\u00e9quentiel de visites (NumeroVisite), tous deux r\u00e9initialis\u00e9s au d\u00e9but de chaque sous-groupe de patient identifi\u00e9 par PatientID :<\/p>\n<p>\/* \u00c9tape pr\u00e9alable obligatoire : tri de la table par patient et par date *\/<br \/>\nPROC SORT DATA=VisitesCliniques_Source OUT=Visites_Triees;<br \/>\n&nbsp;&nbsp;BY PatientID DateVisite;<br \/>\nRUN;<\/p>\n<p>DATA TrajectoireClinique_Derivee;<br \/>\n&nbsp;&nbsp;SET Visites_Triees;<br \/>\n&nbsp;&nbsp;BY PatientID DateVisite;<\/p>\n<p>&nbsp;&nbsp;\/* D\u00e9claration de persistance d&rsquo;\u00e9tat et initialisation *\/<br \/>\n&nbsp;&nbsp;RETAIN DoseCumulee 0 NumeroVisite 0;<\/p>\n<p>&nbsp;&nbsp;\/* R\u00e9initialisation imp\u00e9rative lors de la premi\u00e8re observation de chaque sujet *\/<br \/>\n&nbsp;&nbsp;IF FIRST.PatientID THEN DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;DoseCumulee = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;NumeroVisite = 0;<br \/>\n&nbsp;&nbsp;END;<\/p>\n<p>&nbsp;&nbsp;\/* Incr\u00e9mentation s\u00e9quentielle *\/<br \/>\n&nbsp;&nbsp;NumeroVisite = NumeroVisite + 1;<br \/>\n&nbsp;&nbsp;IF NOT MISSING(DoseJournaliereAdmin) THEN DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;DoseCumulee = DoseCumulee + DoseJournaliereAdmin;<br \/>\n&nbsp;&nbsp;END;<\/p>\n<p>&nbsp;&nbsp;\/* Variable drapeau indiquant la fin du suivi d&rsquo;un sujet *\/<br \/>\n&nbsp;&nbsp;DerniereVisiteFlag = LAST.PatientID;<br \/>\nRUN;<\/p>\n<p>Dans cette architecture, SAS g\u00e9n\u00e8re automatiquement en m\u00e9moire les variables temporaires FIRST.PatientID et LAST.PatientID. D\u00e8s qu&rsquo;un nouveau patient est rencontr\u00e9 dans le flux de donn\u00e9es, FIRST.PatientID prend la valeur 1, ce qui d\u00e9clenche la remise \u00e0 z\u00e9ro des accumulateurs. Les variables DoseCumulee et NumeroVisite sont ensuite actualis\u00e9es et conserv\u00e9es pour les enregistrements suivants de ce m\u00eame patient gr\u00e2ce \u00e0 RETAIN. Enfin, la variable bool\u00e9enne DerniereVisiteFlag capture l&rsquo;ach\u00e8vement du suivi, offrant une variable filtre pr\u00e9cieuse pour les futures analyses de survie ou de fin de protocole.<\/p>\n<h2>11. Gestion rigoureuse des valeurs manquantes lors de la cr\u00e9ation de variables<\/h2>\n<h3>11.1 Typologie et repr\u00e9sentation des valeurs manquantes dans SAS<\/h3>\n<p>La pr\u00e9sence de valeurs manquantes (donn\u00e9es non collect\u00e9es, refus de r\u00e9ponse, abandons ou \u00e9chantillons biologiques insuffisants) constitue une constante in\u00e9vitable de l&rsquo;analyse quantitative. Pour \u00e9viter des biais d&rsquo;estimation ou des classifications erron\u00e9es, la cr\u00e9ation de nouvelles variables doit s&rsquo;appuyer sur une compr\u00e9hension exacte de la repr\u00e9sentation interne des valeurs manquantes dans l&rsquo;environnement SAS.<\/p>\n<p>Pour les variables de type caract\u00e8re, la valeur manquante est uniform\u00e9ment mat\u00e9rialis\u00e9e par une cha\u00eene vide, repr\u00e9sent\u00e9e dans le code par une apostrophe double ou simple sans contenu (&lsquo; &lsquo; ou \u00ab\u00a0\u00a0\u00bb), correspondant \u00e0 un remplissage d&rsquo;espaces blancs occupant l&rsquo;int\u00e9gralit\u00e9 de la longueur d\u00e9clar\u00e9e dans le PDV. Pour les variables num\u00e9riques, la valeur manquante standard est repr\u00e9sent\u00e9e par un point unique (.).<\/p>\n<p>Toutefois, SAS pousse la granularit\u00e9 m\u00e9thodologique plus loin en offrant 27 valeurs manquantes sp\u00e9ciales suppl\u00e9mentaires pour les variables num\u00e9riques : le point suivi d&rsquo;une lettre (.A \u00e0 .Z) ainsi que le point soulign\u00e9 (._). Cette fonctionnalit\u00e9 exclusive permet d&rsquo;encoder la cause s\u00e9miologique de la non-r\u00e9ponse directement au sein du scalaire manquant (par exemple, .A pour &lsquo;Absence justifi\u00e9e&rsquo;, .R pour &lsquo;Refus de consentir&rsquo;, .P pour &lsquo;Panne technique&rsquo;). Sur le plan math\u00e9matique, toutes ces valeurs manquantes num\u00e9riques sont trait\u00e9es par le compilateur comme des grandeurs infiniment n\u00e9gatives, une particularit\u00e9 aux r\u00e9percussions majeures lors des tests conditionnels d&rsquo;inf\u00e9riorit\u00e9.<\/p>\n<h3>11.2 Fonctions de d\u00e9tection et pr\u00e9servation de la validit\u00e9 statistique<\/h3>\n<p>Face \u00e0 la complexit\u00e9 de l&rsquo;ordonnancement m\u00e9moriel des valeurs manquantes, la formulation empirique de tests conditionnels directs tels que IF Variable = . THEN&#8230; s&rsquo;av\u00e8re insuffisante, car elle ne d\u00e9tecte pas les valeurs manquantes sp\u00e9ciales (.A \u00e0 .Z) et \u00e9choue sur les variables de type caract\u00e8re. Pour garantir une d\u00e9tection universelle et robuste, SAS fournit la fonction syst\u00e8me MISSING().<\/p>\n<p>La fonction MISSING() prend en param\u00e8tre une variable quelconque (qu&rsquo;elle soit num\u00e9rique, caract\u00e8re ou une valeur manquante sp\u00e9ciale) et renvoie la valeur bool\u00e9enne 1 si l&rsquo;argument est manquant, et 0 s&rsquo;il est rigoureusement valide et document\u00e9. L&rsquo;adoption de la fonction MISSING() au sein des filtres pr\u00e9alables de l&rsquo;\u00e9tape DATA constitue le standard de programmation d\u00e9fensive le plus fiable pour pr\u00e9munir les calculs de d\u00e9rivation contre l&rsquo;injection inopin\u00e9e de donn\u00e9es absentes.<\/p>\n<p>Parall\u00e8lement, les fonctions matricielles transversales NMISS (pour les listes de variables num\u00e9riques) et CMISS (op\u00e9rant indiff\u00e9remment sur des arguments num\u00e9riques et textuels) permettent d&rsquo;\u00e9valuer d&rsquo;un bloc le volume de donn\u00e9es incompl\u00e8tes au sein d&rsquo;une ligne d&rsquo;observation. L&rsquo;\u00e9valuation pr\u00e9ventive de ces compteurs de compl\u00e9tude \u00e9vite de g\u00e9n\u00e9rer des scores composites non repr\u00e9sentatifs, garantissant ainsi le respect strict des hypoth\u00e8ses statistiques sous-tendant les inf\u00e9rences ult\u00e9rieures.<\/p>\n<h3>11.3 Exemple m\u00e9thodologique : Cr\u00e9ation d&rsquo;indicateurs d&rsquo;attrition et de non-r\u00e9ponse<\/h3>\n<p>Dans les enqu\u00eates \u00e9pid\u00e9miologiques transversales ou les batteries d&rsquo;\u00e9valuations cognitives, il est indispensable de cr\u00e9er une nouvelle variable m\u00e9thodologique attestant de l&rsquo;exhaustivit\u00e9 de la participation du sujet. Une r\u00e8gle psychom\u00e9trique conventionnelle stipule qu&rsquo;un score global ne doit \u00eatre calcul\u00e9 que si le participant a compl\u00e9t\u00e9 au moins 80 % des items de la batterie, le protocole \u00e9tant jug\u00e9 non \u00e9valuable en de\u00e7\u00e0 de ce seuil de repr\u00e9sentativit\u00e9.<\/p>\n<p>Le bloc de code ci-dessous mat\u00e9rialise la cr\u00e9ation d&rsquo;un ensemble d&rsquo;indicateurs d&rsquo;attrition et de qualit\u00e9 de remplissage pour une batterie psychologique comportant cinq dimensions obligatoires (Item1 \u00e0 Item5) :<\/p>\n<p>DATA EvaluationQualite_Donnees;<br \/>\n&nbsp;&nbsp;SET Questionnaire_Source;<br \/>\n&nbsp;&nbsp;\/* Calcul du nombre de r\u00e9ponses manquantes sur la ligne *\/<br \/>\n&nbsp;&nbsp;Nb_Items_Manquants = NMISS(Item1, Item2, Item3, Item4, Item5);<br \/>\n&nbsp;&nbsp;\/* Calcul du nombre de r\u00e9ponses valides document\u00e9es *\/<br \/>\n&nbsp;&nbsp;Nb_Items_Valides = N(Item1, Item2, Item3, Item4, Item5);<\/p>\n<p>&nbsp;&nbsp;\/* D\u00e9rivation du taux individuel de compl\u00e9tude *\/<br \/>\n&nbsp;&nbsp;TauxCompletude = (Nb_Items_Valides \/ 5) * 100;<\/p>\n<p>&nbsp;&nbsp;\/* Cr\u00e9ation d&rsquo;un indicateur bool\u00e9en d&rsquo;incompl\u00e9tude critique (plus de 20% manquant) *\/<br \/>\n&nbsp;&nbsp;IF TauxCompletude &gt;= 80 THEN DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;ProtocoleValideFlag = 1;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;\/* Calcul autoris\u00e9 du score moyen imput\u00e9 proportionnellement *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;ScoreSynthese = MEAN(OF Item1-Item5);<br \/>\n&nbsp;&nbsp;END;<br \/>\n&nbsp;&nbsp;ELSE DO;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;ProtocoleValideFlag = 0;<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;\/* Neutralisation d\u00e9lib\u00e9r\u00e9e du score pour non-conformit\u00e9 *\/<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;ScoreSynthese = .M; \/* Utilisation de la valeur manquante sp\u00e9ciale .M pour &lsquo;Missing&rsquo; *\/<br \/>\n&nbsp;&nbsp;END;<br \/>\nRUN;<\/p>\n<p>Dans ce sc\u00e9nario, la variable bool\u00e9enne ProtocoleValideFlag partitionne sans ambigu\u00eft\u00e9 les observations \u00e9ligibles des profils non conformes. L&rsquo;assignation de la valeur manquante sp\u00e9ciale .M \u00e0 la variable ScoreSynthese documente explicitement la raison de l&rsquo;absence de score lors des audits statistiques post\u00e9rieurs, distinguant une invalidation m\u00e9thodologique d&rsquo;une omission purement accidentelle de saisie brute dans la base de donn\u00e9es.<\/p>\n<h2>12. Bonnes pratiques, documentation et validation des nouvelles variables<\/h2>\n<h3>12.1 Documentation s\u00e9mantique : instructions LABEL et FORMAT<\/h3>\n<p>La g\u00e9n\u00e9ration technique d&rsquo;une nouvelle variable au sein de l&rsquo;\u00e9tape DATA ne saurait \u00eatre consid\u00e9r\u00e9e comme achev\u00e9e sans une formalisation documentaire rigoureuse inscrite au c\u0153ur m\u00eame de la table des descripteurs. Des noms de variables informatiques courts (tels que SC_TOT_ADJ ou GAD7_CAT) s&rsquo;av\u00e8rent cryptiques pour des auditeurs externes ou des co-investigateurs. L&rsquo;instruction LABEL permet d&rsquo;associer \u00e0 chaque variable une \u00e9tiquette s\u00e9mantique descriptive explicite pouvant atteindre 256 caract\u00e8res.<\/p>\n<p>Conjointement aux \u00e9tiquettes textuelles, l&rsquo;attribution de r\u00e8gles d&rsquo;affichage personnalis\u00e9es via l&rsquo;instruction FORMAT conf\u00e8re une lisibilit\u00e9 imm\u00e9diate aux donn\u00e9es brutes sans alt\u00e9rer leur valeur sous-jacente. Gr\u00e2ce \u00e0 la proc\u00e9dure PROC FORMAT, l&rsquo;analyste peut pr\u00e9alablement cartographier des entiers num\u00e9riques discrets vers des libell\u00e9s verbaux explicites (par exemple, 0 = &lsquo;Non expos\u00e9&rsquo;, 1 = &lsquo;Expos\u00e9 th\u00e9rapeutique&rsquo;), puis lier ce format \u00e0 la nouvelle variable cr\u00e9\u00e9e dans l&rsquo;\u00e9tape DATA.<\/p>\n<p>L&rsquo;int\u00e9gration syst\u00e9matique des instructions LABEL et FORMAT enrichit le dictionnaire de donn\u00e9es interne de la table SAS. Lors de l&rsquo;\u00e9dition automatique des rapports de synth\u00e8se statistique via les proc\u00e9dures PROC FREQ, PROC MEANS ou PROC TABULATE, SAS substitue par d\u00e9faut les noms de codes aust\u00e8res par ces libell\u00e9s document\u00e9s, \u00e9liminant ainsi les risques d&rsquo;incompr\u00e9hension ou de contresens analytique lors de la diffusion des r\u00e9sultats empiriques.<\/p>\n<h3>12.2 Optimisation des tables : instructions KEEP et DROP<\/h3>\n<p>Au fil du d\u00e9roulement d&rsquo;une \u00e9tape DATA complexe, un nombre important de variables secondaires, d&rsquo;accumulateurs temporaires, d&rsquo;indices de boucles it\u00e9ratives et de constantes interm\u00e9diaires sont instanci\u00e9s dans le PDV pour achever les calculs finaux. Si ces variables accessoires sont conserv\u00e9es dans la table finale, elles augmentent inutilement le volume physique du fichier sur disque et ralentissent consid\u00e9rablement les op\u00e9rations d&rsquo;entr\u00e9e\/sortie (I\/O) lors des proc\u00e9dures analytiques ult\u00e9rieures.<\/p>\n<p>Les instructions DROP et KEEP (ainsi que leurs options de table homologues DROP= et KEEP=) permettent d&rsquo;\u00e9laguer s\u00e9lectivement le vecteur de sortie. L&rsquo;instruction DROP \u00e9num\u00e8re l&rsquo;ensemble des colonnes parasites \u00e0 exclure de l&rsquo;\u00e9criture sur disque, tandis que l&rsquo;instruction KEEP sp\u00e9cifie restrictivement les seules variables autoris\u00e9es \u00e0 int\u00e9grer la table finale. Sur le plan de la maintenance, KEEP est g\u00e9n\u00e9ralement pr\u00e9f\u00e9rable dans les tables de livraison analytique finale : elle immunise la structure contre l&rsquo;adjonction inopin\u00e9e de variables parasites non document\u00e9es.<\/p>\n<p>Il est capital de diff\u00e9rencier l&rsquo;instruction autonome DROP\/KEEP plac\u00e9e au corps de l&rsquo;\u00e9tape DATA de l&rsquo;option de table (DROP= \/ KEEP=) accol\u00e9e \u00e0 l&rsquo;instruction DATA ou SET. L&rsquo;option de table SET Echantillon(KEEP= ID Age Score); n&rsquo;extrait du disque dur vers le PDV que les trois colonnes d\u00e9sign\u00e9es, all\u00e9geant instantan\u00e9ment la bande passante m\u00e9moire du syst\u00e8me d\u00e8s la phase de lecture initiale, ce qui repr\u00e9sente un levier d&rsquo;optimisation majeur pour le traitement du Big Data ou des donn\u00e9es g\u00e9nomiques massives.<\/p>\n<h3>12.3 Proc\u00e9dures de contr\u00f4le qualit\u00e9 et audit empirique<\/h3>\n<p>La derni\u00e8re \u00e9tape, indissociable de toute cr\u00e9ation de variable dans un cadre acad\u00e9mique ou industriel r\u00e9glement\u00e9, consiste \u00e0 valider empiriquement le comportement des nouvelles distributions num\u00e9riques et qualitatives g\u00e9n\u00e9r\u00e9es. L&rsquo;analyste ne doit jamais pr\u00e9sumer de l&rsquo;exactitude de ses formules d&rsquo;assignation sans soumettre imm\u00e9diatement la table r\u00e9sultante \u00e0 des proc\u00e9dures de contr\u00f4le qualit\u00e9 automatis\u00e9es.<\/p>\n<p>Pour les variables quantitatives continues nouvellement d\u00e9riv\u00e9es, l&rsquo;ex\u00e9cution conjointe des proc\u00e9dures <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/proc\/61895\/HTML\/default\/viewer.htm#a000146728.htm\">PROC MEANS<\/a> et <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/proc\/61895\/HTML\/default\/viewer.htm#a000067676.htm\">PROC UNIVARIATE<\/a> permet de passer au crible les valeurs extr\u00eames, les minima et maxima th\u00e9oriques, les quartiles ainsi que les indices d&rsquo;asym\u00e9trie et d&rsquo;aplatissement (skewness et kurtosis). Une valeur minimale n\u00e9gative sur un score de dur\u00e9e ou une valeur maximale exc\u00e9dant l&rsquo;intervalle nominal d&rsquo;une \u00e9chelle signale instantan\u00e9ment une anomalie algorithmique sous-jacente dans l&rsquo;\u00e9tape DATA.<\/p>\n<p>Pour les variables qualitatives et les stratifications conditionnelles issues de structures IF-THEN\/ELSE ou SELECT-WHEN, la proc\u00e9dure <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/proc\/61895\/HTML\/default\/viewer.htm#a000146729.htm\">PROC FREQ<\/a> constitue l&rsquo;instrument d&rsquo;audit par excellence. La mise en \u0153uvre de tables de contingence \u00e0 double entr\u00e9e croisant la variable d&rsquo;origine et la nouvelle variable cat\u00e9goris\u00e9e (ex: TABLES VariableOrigine * NouvelleCategorie \/ LIST MISSING;) permet de v\u00e9rifier l&rsquo;\u00e9tanch\u00e9it\u00e9 des intervalles, la distribution exacte des effectifs et l&rsquo;absence totale de donn\u00e9es orphelines \u00e9gar\u00e9es dans des cat\u00e9gories d&rsquo;erreurs, parachevant ainsi la validation scientifique du processus d&rsquo;ing\u00e9nierie des donn\u00e9es.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Cody, R. (2018). <em>Learning SAS by Example: A Programmer&rsquo;s Guide<\/em> (2nd ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/books.html\">https:\/\/support.sas.com\/en\/books.html<\/a><\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6th ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/books.html\">https:\/\/support.sas.com\/en\/books.html<\/a><\/li>\n<li>Institut National de la Statistique et des \u00c9tudes \u00c9conomiques. (2021). <em>Bonnes pratiques de programmation sous SAS pour la statistique publique<\/em>. Insee M\u00e9thodes. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/www.insee.fr\/\">https:\/\/www.insee.fr\/<\/a><\/li>\n<li>SAS Institute Inc. (2020). <em>SAS 9.4 Language Reference: Concepts<\/em> (6th ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/lrcon\/69852\/HTML\/default\/viewer.htm\">https:\/\/support.sas.com\/documentation\/cdl\/en\/lrcon\/69852\/HTML\/default\/viewer.htm<\/a><\/li>\n<li>SAS Institute Inc. (2023). <em>Base SAS 9.4 Procedures Guide: Statistical Procedures<\/em> (5th ed.). SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/support.sas.com\/documentation\/cdl\/en\/procstat\/69629\/HTML\/default\/viewer.htm\">https:\/\/support.sas.com\/documentation\/cdl\/en\/procstat\/69629\/HTML\/default\/viewer.htm<\/a><\/li>\n<li>UCLA: Statistical Consulting Group. (2022). <em>Creating and Recoding Variables in SAS Data Step<\/em>. UCLA Advanced Research Computing. <a target=\"_blank\" rel=\"noopener noopener noreferrer\" href=\"https:\/\/stats.oarc.ucla.edu\/sas\/\">https:\/\/stats.oarc.ucla.edu\/sas\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide complet sur la cr\u00e9ation de variables dans SAS : m\u00e9thode ex nihilo, calculs arithm\u00e9tiques, fonctions conditionnelles et exemples appliqu\u00e9s \u00e0 la recherche.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,9499],"tags":[11327,10195,4702,235,2344],"class_list":["post-9907","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-sas","tag-creation-variables","tag-etape-data","tag-gestion-de-donnees","tag-sas","tag-statistiques"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9907","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=9907"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9907\/revisions"}],"predecessor-version":[{"id":9910,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9907\/revisions\/9910"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}