{"id":9913,"date":"2026-10-14T18:02:35","date_gmt":"2026-10-14T18:02:35","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-sous-ensembler-donnees-sas-exemples\/"},"modified":"2026-10-14T18:02:35","modified_gmt":"2026-10-14T18:02:35","slug":"comment-sous-ensembler-donnees-sas-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-sous-ensembler-donnees-sas-exemples","title":{"rendered":"Comment cr\u00e9er un sous-ensemble de donn\u00e9es dans SAS (3 exemples)"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;ing\u00e9nierie logicielle et du traitement analytique des donn\u00e9es massives, le syst\u00e8me SAS (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\">Statistical Analysis System<\/a>) demeure une r\u00e9f\u00e9rence institutionnelle incontournable au sein des industries bancaires, pharmaceutiques, \u00e9pid\u00e9miologiques et assurantielles. La manipulation efficace des structures tabulaires constitue le socle fondamental sur lequel reposent l&rsquo;int\u00e9grit\u00e9, la robustesse et la rapidit\u00e9 des calculs statistiques. L&rsquo;op\u00e9ration de sous-ensemble, commun\u00e9ment d\u00e9sign\u00e9e par le terme anglophone <em>subsetting<\/em>, repr\u00e9sente l&rsquo;un des m\u00e9canismes les plus critiques de cette cha\u00eene de traitement. Elle consiste \u00e0 extraire de mani\u00e8re d\u00e9terministe une sous-partie congrue d&rsquo;une table ma\u00eetresse, soit en isolant des variables pertinentes, soit en filtrant des observations selon des crit\u00e8res logiques rigoureux.<\/p>\n<p>Une gestion non optimis\u00e9e des sous-ensembles de donn\u00e9es engendre fr\u00e9quemment des goulots d&rsquo;\u00e9tranglement majeurs, caract\u00e9ris\u00e9s par une saturation de la m\u00e9moire vive et une sollicitation excessive des op\u00e9rations d&rsquo;entr\u00e9e-sortie (I\/O) sur disque. Lorsque les jeux de donn\u00e9es atteignent des dizaines de gigaoctets ou des centaines de millions d&rsquo;enregistrements, l&rsquo;incapacit\u00e9 \u00e0 restreindre pr\u00e9cocement le volume d&rsquo;informations trait\u00e9es p\u00e9nalise lourdement les performances globales de l&rsquo;infrastructure informatique. L&rsquo;ing\u00e9nieur d\u00e9cisionnel et le biostatisticien doivent par cons\u00e9quent ma\u00eetriser avec une exactitude chirurgicale les rouages internes de l&rsquo;\u00e9tape DATA de SAS, ainsi que le comportement intime du vecteur de donn\u00e9es du programme (Program Data Vector, ou PDV).<\/p>\n<p>Ce trait\u00e9 technique a pour vocation d&rsquo;exposer de mani\u00e8re exhaustive, m\u00e9thodique et document\u00e9e la th\u00e9orie et la pratique du partitionnement de donn\u00e9es au sein de l&rsquo;\u00e9cosyst\u00e8me SAS. \u00c0 travers l&rsquo;analyse m\u00e9ticuleuse d&rsquo;un jeu de donn\u00e9es de r\u00e9f\u00e9rence normalis\u00e9, nous d\u00e9cortiquerons trois approches canoniques : l&rsquo;extraction de variables par l&rsquo;instruction <code>KEEP<\/code>, l&rsquo;\u00e9viction cibl\u00e9e de colonnes via l&rsquo;instruction <code>DROP<\/code>, et l&rsquo;exclusion conditionnelle d&rsquo;observations fond\u00e9e sur la clause <code>IF-THEN DELETE<\/code>. Nous \u00e9largirons ensuite cette analyse aux instructions <code>WHERE<\/code>, au <em>subsetting IF<\/em>, ainsi qu&rsquo;aux options de tables, tout en int\u00e9grant les imp\u00e9ratifs m\u00e9thodologiques propres \u00e0 la recherche quantitative.<\/p>\n<h2>1. Introduction aux principes du sous-ensemble de donn\u00e9es dans SAS<\/h2>\n<h3>1.1 D\u00e9finition et importance de la r\u00e9duction dimensionnelle des donn\u00e9es<\/h3>\n<p>Dans l&rsquo;architecture de donn\u00e9es relationnelle et tabulaire de SAS, le partitionnement ou sous-ensemble se scinde en deux dimensions g\u00e9om\u00e9triques compl\u00e9mentaires : la r\u00e9duction verticale et la r\u00e9duction horizontale. La r\u00e9duction verticale correspond \u00e0 la s\u00e9lection exclusive des colonnes, attributs ou variables indispensables \u00e0 l&rsquo;\u00e9tude envisag\u00e9e, \u00e9liminant ainsi les dimensions superflues qui alourdissent inutilement la largeur de chaque enregistrement. \u00c0 l&rsquo;inverse, la r\u00e9duction horizontale rel\u00e8ve du filtrage des lignes ou observations, ne conservant que les unit\u00e9s statistiques r\u00e9pondant formellement \u00e0 un faisceau de crit\u00e8res logico-math\u00e9matiques pr\u00e9d\u00e9finis.<\/p>\n<p>L&rsquo;importance de cette double r\u00e9duction s&rsquo;\u00e9value au regard des contraintes physiques des syst\u00e8mes informatiques. Bien que les architectures modernes b\u00e9n\u00e9ficient de capacit\u00e9s d&rsquo;adressage m\u00e9moire \u00e9tendues, l&#8217;empreinte spatiale d&rsquo;une table influe directement sur les cycles CPU n\u00e9cessaires \u00e0 son balayage s\u00e9quentiel et sur la taille des blocs de transfert entre les sous-syst\u00e8mes de stockage et la m\u00e9moire cache. Selon les standards architecturaux d\u00e9finis par l&rsquo;<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.iso.org\">Organisation internationale de normalisation<\/a> en mati\u00e8re d&rsquo;efficacit\u00e9 logicielle, la limitation pr\u00e9coce du p\u00e9rim\u00e8tre des donn\u00e9es constitue le premier levier de fiabilisation d&rsquo;un pipeline analytique.<\/p>\n<p>Dans la perspective de la mod\u00e9lisation statistique avanc\u00e9e (r\u00e9gressions multivari\u00e9es, analyses factorielles, mod\u00e8les \u00e0 \u00e9quations structurelles), la constitution d&rsquo;une matrice \u00e9pur\u00e9e pr\u00e9vient les erreurs d&rsquo;alignement dimensionnel et simplifie consid\u00e9rablement la phase d&rsquo;audit. Une table all\u00e9g\u00e9e r\u00e9duit le risque de redondance d&rsquo;information, limite la pr\u00e9sence de valeurs aberrantes ou manquantes non document\u00e9es, et garantit que seules les covariables valid\u00e9es sur le plan th\u00e9orique participent \u00e0 l&rsquo;ajustement des param\u00e8tres.<\/p>\n<h3>1.2 Structure g\u00e9n\u00e9rale de l&rsquo;\u00e9tape DATA et cycle d&rsquo;ex\u00e9cution<\/h3>\n<p>L&rsquo;\u00e9tape DATA repr\u00e9sente le moteur proc\u00e9dural et transformationnel fondamental du langage SAS. Contrairement aux proc\u00e9dures pr\u00e9-param\u00e9tr\u00e9es (telles que <code>PROC REG<\/code>, <code>PROC MEANS<\/code> ou <code>PROC FREQ<\/code>) dont l&rsquo;ex\u00e9cution repose sur des algorithmes matriciels fig\u00e9s, l&rsquo;\u00e9tape DATA offre un environnement de programmation it\u00e9ratif et s\u00e9quentiel d&rsquo;une grande granularit\u00e9. Sa vocation premi\u00e8re r\u00e9side dans l&rsquo;ingestion, le nettoyage, la restructuration et la persistance de l&rsquo;information sous la forme de nouvelles tables SAS propri\u00e9taires.<\/p>\n<p>Au c\u0153ur de cette \u00e9tape se trouve l&rsquo;instruction <code>SET<\/code>, qui agit comme le connecteur logique vers une ou plusieurs tables SAS pr\u00e9alablement mat\u00e9rialis\u00e9es sur le disque dur ou dans une biblioth\u00e8que temporaire (g\u00e9n\u00e9ralement la biblioth\u00e8que <code>WORK<\/code>). L&rsquo;instruction <code>SET<\/code> prend en charge l&rsquo;ouverture de la table source, la lecture s\u00e9quentielle des descripteurs de m\u00e9tadonn\u00e9es, ainsi que le chargement successif de chaque enregistrement physique dans les zones tampons du compilateur SAS.<\/p>\n<p>Le cycle d&rsquo;ex\u00e9cution de l&rsquo;\u00e9tape DATA ob\u00e9it \u00e0 une boucle implicite strictement r\u00e9gul\u00e9e. \u00c0 chaque it\u00e9ration de la boucle, l&rsquo;environnement SAS ex\u00e9cute de haut en bas l&rsquo;int\u00e9gralit\u00e9 des instructions programm\u00e9es par l&rsquo;utilisateur. D\u00e8s que le pointeur atteint la fin structurelle de l&rsquo;\u00e9tape DATA (marqu\u00e9e par le mot-cl\u00e9 <code>RUN;<\/code>), le syst\u00e8me d\u00e9clenche une \u00e9criture automatique des valeurs courantes dans la table de destination, r\u00e9initialise les zones m\u00e9moires non persistantes, puis incr\u00e9mente son compteur interne avant de charger l&rsquo;observation suivante issue de l&rsquo;instruction <code>SET<\/code>. Ce m\u00e9canisme de boucle implicite perdure jusqu&rsquo;\u00e0 ce que le pointeur d&rsquo;entr\u00e9e atteigne le marqueur de fin de fichier (EOF, <em>End-Of-File<\/em>).<\/p>\n<h3>1.3 Objectifs p\u00e9dagogiques et aper\u00e7u des trois m\u00e9thodes fondamentales<\/h3>\n<p>L&rsquo;objectif de cet expos\u00e9 est de doter le programmeur, le biostatisticien et l&rsquo;analyste de donn\u00e9es d&rsquo;une grille de lecture rigoureuse concernant l&rsquo;impact algorithmique de ses choix de syntaxe. Trop souvent, les instructions de s\u00e9lection sont employ\u00e9es de fa\u00e7on interchangeable sans une compr\u00e9hension claire de leurs r\u00e9percussions sur l&rsquo;architecture m\u00e9moire du syst\u00e8me. Nous nous proposons de d\u00e9composer la logique formelle de trois op\u00e9rations canoniques afin de lever toute ambigu\u00eft\u00e9 op\u00e9rationnelle.<\/p>\n<p>La premi\u00e8re m\u00e9thode analys\u00e9e s&rsquo;articule autour de l&rsquo;instruction <code>KEEP<\/code>. D\u00e9di\u00e9e \u00e0 la s\u00e9lection affirmative des colonnes, cette instruction permet de d\u00e9clarer express\u00e9ment la liste des variables dont la pr\u00e9sence est requise dans la table r\u00e9sultante. Elle incarne le principe de s\u00e9curit\u00e9 par d\u00e9faut : toute variable non mentionn\u00e9e est irr\u00e9vocablement exclue de la sortie d\u00e9finitive, pr\u00e9munissant ainsi le syst\u00e8me contre la persistance involontaire de variables sensibles ou parasites.<\/p>\n<p>La deuxi\u00e8me m\u00e9thode repose sur l&rsquo;usage sym\u00e9trique de l&rsquo;instruction <code>DROP<\/code>. Utilis\u00e9e pour l&rsquo;\u00e9lagage cibl\u00e9, elle sp\u00e9cifie nominativement les variables qui doivent \u00eatre rejet\u00e9es de la table finale, tout en maintenant automatiquement l&rsquo;ensemble des autres colonnes d\u00e9finies dans la table source. Cette approche s&rsquo;av\u00e8re particuli\u00e8rement ergonomique lorsqu&rsquo;une fraction n\u00e9gligeable du dictionnaire de donn\u00e9es doit \u00eatre \u00e9limin\u00e9e.<\/p>\n<p>La troisi\u00e8me m\u00e9thode aborde la r\u00e9duction horizontale \u00e0 travers la construction conditionnelle <code>IF-THEN DELETE<\/code>. Ce paradigme combine l&rsquo;\u00e9valuation d&rsquo;un pr\u00e9dicat bool\u00e9en et le d\u00e9clenchement d&rsquo;une rupture imm\u00e9diate de l&rsquo;it\u00e9ration courante. Lorsqu&rsquo;une observation \u00e9choue au test logique, l&rsquo;instruction <code>DELETE<\/code> ordonne au syst\u00e8me d&rsquo;avorter l&rsquo;\u00e9criture de l&rsquo;enregistrement dans la table cible et de r\u00e9orienter instantan\u00e9ment le pointeur d&rsquo;ex\u00e9cution vers l&rsquo;en-t\u00eate de la boucle de l&rsquo;\u00e9tape DATA pour traiter la ligne suivante.<\/p>\n<h2>2. Architecture interne du Program Data Vector (PDV) et flux de donn\u00e9es<\/h2>\n<h3>2.1 Le r\u00f4le du Program Data Vector lors de la compilation<\/h3>\n<p>L&rsquo;\u00e9tape DATA ne s&rsquo;ex\u00e9cute pas de mani\u00e8re interpr\u00e9t\u00e9e directe ; elle subit pr\u00e9alablement une phase de compilation formelle au cours de laquelle SAS construit une structure m\u00e9moire d\u00e9di\u00e9e appel\u00e9e le Program Data Vector (PDV). Le PDV repr\u00e9sente la zone de travail en m\u00e9moire vive (RAM) o\u00f9 sont mat\u00e9rialis\u00e9es les colonnes de donn\u00e9es lors du traitement de chaque observation. Durant cette phase de compilation, le compilateur lit le code s\u00e9quentiellement afin d&rsquo;identifier l&rsquo;ensemble des variables d\u00e9clar\u00e9es, de d\u00e9terminer leur type (num\u00e9rique ou caract\u00e8re) et d&rsquo;allouer la longueur en octets requise pour chacune d&rsquo;elles.<\/p>\n<p>En sus des variables explicites issues des tables sources ou cr\u00e9\u00e9es par le programmeur, le compilateur SAS injecte syst\u00e9matiquement deux variables automatiques au sein du PDV : <code>_N_<\/code> et <code>_ERROR_<\/code>. La variable <code>_N_<\/code> fonctionne comme un compteur d&rsquo;it\u00e9rations de l&rsquo;\u00e9tape DATA, d\u00e9butant \u00e0 la valeur 1 et s&rsquo;incr\u00e9mentant \u00e0 chaque retour au sommet de la boucle logique. La variable <code>_ERROR_<\/code> agit comme un drapeau d&rsquo;int\u00e9grit\u00e9 binaire, prenant la valeur 0 en r\u00e9gime normal et passant \u00e0 la valeur 1 d\u00e8s lors qu&rsquo;une anomalie intervient en cours d&rsquo;ex\u00e9cution (conversion de type invalide, division par z\u00e9ro, ou d\u00e9bordement math\u00e9matique).<\/p>\n<p>Il est imp\u00e9ratif de souligner que les variables automatiques <code>_N_<\/code> et <code>_ERROR_<\/code> poss\u00e8dent des attributs internes particuliers : elles sont temporaires et ne sont jamais \u00e9crites sur le disque dans la table SAS finale. Le PDV agit ainsi comme une interface de conversion entre les flux d&rsquo;octets bruts persistants et les environnements d&rsquo;\u00e9valuation alg\u00e9brique du processeur.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/subset3.jpg\" alt=\"\" \/><\/figure>\n<h3>2.2 Comportement du PDV durant la phase d&rsquo;ex\u00e9cution<\/h3>\n<p>Une fois la phase de compilation achev\u00e9e avec succ\u00e8s, l&rsquo;\u00e9tape DATA bascule dans sa phase d&rsquo;ex\u00e9cution. Le flux logique s&rsquo;ouvre par l&rsquo;initialisation des variables du PDV. Dans le cas d&rsquo;une lecture via l&rsquo;instruction <code>SET<\/code>, les emplacements m\u00e9moires assign\u00e9s aux variables import\u00e9es sont aliment\u00e9s par la lecture s\u00e9quentielle du bloc de donn\u00e9es source situ\u00e9 sur le disque. Chaque appel \u00e0 <code>SET<\/code> lit un enregistrement physique unique et en copie les valeurs dans les slots correspondants du PDV.<\/p>\n<p>Contrairement aux variables calcul\u00e9es localement (qui sont r\u00e9initialis\u00e9es \u00e0 la valeur manquante \u00e0 chaque d\u00e9but d&rsquo;it\u00e9ration, sauf si elles font l&rsquo;objet d&rsquo;une instruction <code>RETAIN<\/code>), les variables issues d&rsquo;une instruction <code>SET<\/code> b\u00e9n\u00e9ficient d&rsquo;une persistance naturelle tout au long du cycle de vie de l&rsquo;it\u00e9ration courante. Les calculs math\u00e9matiques, transformations textuelles ou r\u00e9assignations logiques s&rsquo;op\u00e8rent alors directement sur les valeurs h\u00e9berg\u00e9es temporairement dans le PDV.<\/p>\n<p>L&rsquo;aboutissement normal du cycle d&rsquo;ex\u00e9cution survient lorsque le compilateur atteint l&rsquo;instruction implicite ou explicite <code>OUTPUT<\/code>. \u00c0 cet instant pr\u00e9cis, le gestionnaire d&rsquo;\u00e9criture prend une photographie des donn\u00e9es contenues dans le PDV et les transf\u00e8re dans la m\u00e9moire tampon de sortie, en vue de leur s\u00e9rialisation d\u00e9finitive sur le support de stockage. D\u00e8s cette \u00e9criture consign\u00e9e, le PDV est r\u00e9initialis\u00e9 selon les r\u00e8gles de gestion de l&rsquo;\u00e9tape DATA, pr\u00e9parant la structure m\u00e9moire pour l&rsquo;it\u00e9ration subs\u00e9quente.<\/p>\n<h3>2.3 Point d&rsquo;intervention des instructions de sous-ensemble<\/h3>\n<p>La compr\u00e9hension du point d&rsquo;intervention temporel des instructions de sous-ensemble au sein du cycle de vie du PDV est indispensable pour pr\u00e9venir toute erreur de logique architecturale. Les instructions <code>KEEP<\/code> et <code>DROP<\/code> n&rsquo;agissent pas sur la pr\u00e9sence des variables \u00e0 l&rsquo;int\u00e9rieur du PDV durant la phase de calcul ; elles fonctionnent comme des masques de filtrage appliqu\u00e9s au moment strict du d\u00e9versement du PDV vers la table cible finale.<\/p>\n<p>Ainsi, lorsqu&rsquo;une instruction <code>DROP points;<\/code> est formul\u00e9e, la variable <code>points<\/code> est bel et bien allou\u00e9e dans le PDV lors de la compilation, et elle est lue depuis la table source durant l&rsquo;ex\u00e9cution. Elle demeure totalement accessible pour effectuer des tests logiques ou des calculs d\u00e9riv\u00e9s au sein de l&rsquo;\u00e9tape DATA. Ce n&rsquo;est qu&rsquo;au moment pr\u00e9cis de l&rsquo;appel \u00e0 l&rsquo;\u00e9criture (<code>OUTPUT<\/code>) que le syst\u00e8me SAS consulte le dictionnaire des m\u00e9tadonn\u00e9es, constate la pr\u00e9sence de la directive d&rsquo;\u00e9viction, et ignore physiquement la colonne lors de la cr\u00e9ation du fichier binaire de sortie.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;instruction <code>DELETE<\/code> (notamment dans la s\u00e9quence <code>IF condition THEN DELETE;<\/code>) intervient activement en amont de l&rsquo;\u00e9criture. Lorsqu&rsquo;elle est d\u00e9clench\u00e9e, elle interrompt imm\u00e9diatement le fil s\u00e9quentiel des instructions restantes pour l&rsquo;it\u00e9ration en cours. L&rsquo;instruction <code>OUTPUT<\/code> implicite situ\u00e9e \u00e0 la fin de l&rsquo;\u00e9tape DATA est tout simplement court-circuit\u00e9e. Le PDV est alors vid\u00e9 de ses valeurs transitoires, la ligne courante est d\u00e9finitivement rejet\u00e9e, et le syst\u00e8me incr\u00e9mente <code>_N_<\/code> pour proc\u00e9der sans d\u00e9lai \u00e0 la lecture de l&rsquo;enregistrement source suivant.<\/p>\n<h2>3. Pr\u00e9sentation et initialisation du jeu de donn\u00e9es de r\u00e9f\u00e9rence<\/h2>\n<h3>3.1 Structure syntaxique de l&rsquo;\u00e9tape DATA d&rsquo;initialisation<\/h3>\n<p>Afin d&rsquo;illustrer rigoureusement les concepts d\u00e9velopp\u00e9s dans ce m\u00e9moire, nous instancions un environnement exp\u00e9rimental contr\u00f4l\u00e9 \u00e0 travers un jeu de donn\u00e9es sportif canonique. Ce jeu de donn\u00e9es synth\u00e9tise les performances offensives et d\u00e9fensives de plusieurs franchises de basket-ball professionnel nord-am\u00e9ricain. Sa cr\u00e9ation repose sur la combinaison conventionnelle d&rsquo;une \u00e9tape DATA d&rsquo;affectation et de l&rsquo;instruction d&rsquo;ingestion directe <code>DATALINES<\/code>.<\/p>\n<p>La formulation syntaxique de ce bloc d&rsquo;instanciation se structure selon le standard suivant :<\/p>\n<p><code>data original_data;<br \/>\ninput team $ points rebounds;<br \/>\ndatalines;<br \/>\nWarriors 28 12<br \/>\nWizards 18 9<br \/>\nRockets 22 10<br \/>\nCeltics 21 8<br \/>\nThunder 31 14<br \/>\nSpurs 27 11<br \/>\nNets 26 7<br \/>\n;<br \/>\nrun;<\/code><\/p>\n<p>Dans ce segment de code, l&rsquo;instruction <code>data original_data;<\/code> ordonne au compilateur d&rsquo;allouer les structures descripteurs d&rsquo;une nouvelle table enregistr\u00e9e dans la biblioth\u00e8que temporaire <code>WORK<\/code>. L&rsquo;instruction <code>input<\/code> d\u00e9finit la grille de lecture du flux textuel brut : le modificateur alphanum\u00e9rique dollar (<code>$<\/code>) informe le compilateur que l&rsquo;attribut <code>team<\/code> doit \u00eatre configur\u00e9 comme une cha\u00eene de caract\u00e8res de longueur standard, tandis que les variables <code>points<\/code> et <code>rebounds<\/code> re\u00e7oivent le type num\u00e9rique flottant par d\u00e9faut (double pr\u00e9cision, standard <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/standards.ieee.org\">IEEE 754<\/a>).<\/p>\n<h3>3.2 D\u00e9tail des variables et m\u00e9tadonn\u00e9es du mod\u00e8le<\/h3>\n<p>Le jeu de donn\u00e9es de r\u00e9f\u00e9rence <code>original_data<\/code> est mod\u00e9lis\u00e9 selon une matrice rectangulaire de dimension sept par trois, totalisant ainsi sept observations ind\u00e9pendantes r\u00e9parties sur trois variables homog\u00e8nes. Chaque dimension repr\u00e9sente un axe d&rsquo;\u00e9valuation quantitatif ou qualitatif univoque :<\/p>\n<ul>\n<li><strong>team<\/strong> : Identifiant nominal de l&rsquo;entit\u00e9 sportive observ\u00e9e. Cette variable cat\u00e9gorielle stocke le nom usuel de la franchise (ex. Warriors, Wizards, Rockets). Sur le plan des m\u00e9tadonn\u00e9es, elle est encod\u00e9e comme une s\u00e9quence de caract\u00e8res d&rsquo;une longueur par d\u00e9faut de 8 octets.<\/li>\n<li><strong>points<\/strong> : Indicateur de performance offensive individuel ou collectif. Cet attribut quantitatif continu enregistre le volume de points marqu\u00e9s au terme de la s\u00e9quence de jeu sous analyse.<\/li>\n<li><strong>rebounds<\/strong> : Indicateur de performance d\u00e9fensive et d&rsquo;occupation spatiale sous le cercle. Cet attribut quantitatif discret mesure le nombre de rebonds capt\u00e9s au cours de la m\u00eame p\u00e9riode.<\/li>\n<\/ul>\n<p>Ce sch\u00e9ma tridimensionnel \u00e9quilibr\u00e9 constitue un laboratoire parfait pour nos exp\u00e9rimentations. Il comporte des variables textuelles et num\u00e9riques, un volume de lignes restreint permettant une tra\u00e7abilit\u00e9 visuelle imm\u00e9diate de chaque enregistrement dans le journal d&rsquo;ex\u00e9cution (<em>SAS Log<\/em>), tout en pr\u00e9sentant une variabilit\u00e9 suffisante pour impl\u00e9menter des pr\u00e9dicats conditionnels sans ambigu\u00eft\u00e9 analytique.<\/p>\n<h3>3.3 Validation de l&rsquo;int\u00e9grit\u00e9 des donn\u00e9es avec PROC PRINT<\/h3>\n<p>La compilation et l&rsquo;ex\u00e9cution du bloc d&rsquo;initialisation requi\u00e8rent une validation formelle d&rsquo;int\u00e9grit\u00e9 avant d&rsquo;entamer la moindre manipulation dimensionnelle. Cette \u00e9tape de contr\u00f4le qualit\u00e9 s&rsquo;effectue via l&rsquo;invocation de la proc\u00e9dure d&rsquo;affichage standardis\u00e9e <code>PROC PRINT<\/code>, param\u00e9tr\u00e9e comme suit :<\/p>\n<p><code>proc print data=original_data;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de cette proc\u00e9dure d\u00e9clenche l&rsquo;affichage d&rsquo;un tableau r\u00e9capitulatif structur\u00e9 dans la fen\u00eatre de sortie standard ou au format HTML via l&rsquo;Output Delivery System (ODS). Le r\u00e9sultat attendu se pr\u00e9sente sous la configuration matricielle suivante :<\/p>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>Obs<\/th>\n<th>team<\/th>\n<th>points<\/th>\n<th>rebounds<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>Warriors<\/td>\n<td>28<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Wizards<\/td>\n<td>18<\/td>\n<td>9<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Rockets<\/td>\n<td>22<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Celtics<\/td>\n<td>21<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>Thunder<\/td>\n<td>31<\/td>\n<td>14<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>Spurs<\/td>\n<td>27<\/td>\n<td>11<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>Nets<\/td>\n<td>26<\/td>\n<td>7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>L&rsquo;inspection du journal d&rsquo;ex\u00e9cution SAS permet de v\u00e9rifier qu&rsquo;aucun message d&rsquo;avertissement (<code>WARNING<\/code>) ni d&rsquo;erreur de syntaxe (<code>ERROR<\/code>) n&rsquo;a \u00e9t\u00e9 \u00e9mis. Le syst\u00e8me confirme formellement que la table <code>WORK.ORIGINAL_DATA<\/code> comprend exactement 7 observations et 3 variables, scellant ainsi la validit\u00e9 structurelle de notre point de d\u00e9part exp\u00e9rimental.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/subset1.jpg\" alt=\"\" \/><\/figure>\n<h2>4. Exemple 1 : S\u00e9lection s\u00e9lective des colonnes avec l&rsquo;instruction KEEP<\/h2>\n<h3>4.1 Syntaxe formelle et logique d&rsquo;impl\u00e9mentation de KEEP<\/h3>\n<p>L&rsquo;instruction <code>KEEP<\/code> est une directive d\u00e9clarative interne \u00e0 l&rsquo;\u00e9tape DATA qui instruit le moteur de stockage de SAS quant aux variables pr\u00e9cises qui doivent \u00eatre inscrites dans la table finale issue du traitement. Contrairement \u00e0 une instruction ex\u00e9cutable (telle qu&rsquo;une affectation arithm\u00e9tique ou une conditionnelle), <code>KEEP<\/code> agit d\u00e8s la phase de compilation pour configurer les drapeaux de sortie du dictionnaire de donn\u00e9es.<\/p>\n<p>Pour extraire exclusivement les variables <code>team<\/code> et <code>points<\/code> de notre table de base <code>original_data<\/code> et g\u00e9n\u00e9rer une nouvelle table d\u00e9riv\u00e9e intitul\u00e9e <code>new_data<\/code>, la mise en \u0153uvre programmatique s&rsquo;\u00e9nonce comme suit :<\/p>\n<p><code>data new_data;<br \/>\nset original_data;<br \/>\nkeep team points;<br \/>\nrun;<\/code><\/p>\n<p>Dans ce sch\u00e9ma op\u00e9ratoire, l&rsquo;instruction <code>set original_data;<\/code> \u00e9tablit un pont de transmission avec la table source. L&rsquo;instruction <code>keep team points;<\/code> dresse une barri\u00e8re s\u00e9lective ne laissant filtrer que les deux colonnes explicitement nomm\u00e9es. Il importe de relever que l&rsquo;ordre des variables sp\u00e9cifi\u00e9es dans l&rsquo;instruction <code>KEEP<\/code> n&rsquo;alt\u00e8re en rien l&rsquo;ordre physique des colonnes dans la table r\u00e9sultante ; l&rsquo;ordonnancement structurel demeure dict\u00e9 par la s\u00e9quence historique d&rsquo;apparition des variables au sein du PDV lors de la lecture du descripteur source.<\/p>\n<h3>4.2 Analyse de la persistance des donn\u00e9es au niveau du PDV<\/h3>\n<p>Pour appr\u00e9hender la m\u00e9canique profonde de l&rsquo;instruction <code>KEEP<\/code>, il est capital de lever un contresens r\u00e9current : l&rsquo;instruction <code>KEEP<\/code> n&#8217;emp\u00eache nullement la lecture des variables omises depuis la table source vers le PDV. Lorsque le bloc <code>set original_data;<\/code> s&rsquo;ex\u00e9cute, SAS lit l&rsquo;int\u00e9gralit\u00e9 du descripteur de la table d&rsquo;entr\u00e9e. En cons\u00e9quence, la variable <code>rebounds<\/code> est bel et bien transf\u00e9r\u00e9e du disque vers l&rsquo;espace m\u00e9moire allou\u00e9 au PDV \u00e0 chaque it\u00e9ration de la boucle.<\/p>\n<p>Cela signifie concr\u00e8tement que si le programmeur avait ins\u00e9r\u00e9 une instruction interm\u00e9diaire telle que <code>total = points + rebounds;<\/code> avant l&rsquo;instruction <code>KEEP<\/code>, l&rsquo;op\u00e9ration math\u00e9matique se serait d\u00e9roul\u00e9e sans la moindre anomalie arithm\u00e9tique. Le PDV conserve la pl\u00e9nitude de ses \u00e9tats op\u00e9rationnels pendant toute la dur\u00e9e d&rsquo;\u00e9valuation des expressions logiques.<\/p>\n<p>Le filtrage intervient exclusivement au point d&rsquo;ancrage de la commande <code>OUTPUT<\/code> implicite. \u00c0 cette \u00e9tape finale, le compilateur applique le masque d\u00e9fini par <code>KEEP<\/code> : seules les cases m\u00e9moire correspondant \u00e0 <code>team<\/code> et <code>points<\/code> sont recopi\u00e9es dans la m\u00e9moire tampon d&rsquo;\u00e9criture (<em>output buffer<\/em>). La case m\u00e9moire associ\u00e9e \u00e0 <code>rebounds<\/code> est simplement ignor\u00e9e lors du flush binaire vers le disque dur, puis \u00e9cras\u00e9e lors de l&rsquo;it\u00e9ration suivante. Cette m\u00e9canique garantit une flexibilit\u00e9 algorithmique absolue tout en atteignant l&rsquo;objectif de r\u00e9duction dimensionnelle cibl\u00e9e.<\/p>\n<h3>4.3 Inspection des r\u00e9sultats et sortie tabulaire<\/h3>\n<p>La validation empirique du sous-ensemble obtenu s&rsquo;op\u00e8re par l&rsquo;invocation de la proc\u00e9dure <code>PROC PRINT<\/code> appliqu\u00e9e \u00e0 la table de sortie <code>new_data<\/code> :<\/p>\n<p><code>proc print data=new_data;<br \/>\nrun;<\/code><\/p>\n<p>Le traitement g\u00e9n\u00e8re l&rsquo;\u00e9tat tabulaire suivant au niveau du rapport d&rsquo;ex\u00e9cution :<\/p>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>Obs<\/th>\n<th>team<\/th>\n<th>points<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>Warriors<\/td>\n<td>28<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Wizards<\/td>\n<td>18<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Rockets<\/td>\n<td>22<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Celtics<\/td>\n<td>21<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>Thunder<\/td>\n<td>31<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>Spurs<\/td>\n<td>27<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>Nets<\/td>\n<td>26<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>L&rsquo;observation attentive de cette sortie confirme le respect scrupuleux des sp\u00e9cifications logiques. La table compte toujours rigoureusement sept observations (aucune r\u00e9duction horizontale n&rsquo;ayant \u00e9t\u00e9 ordonn\u00e9e), mais la dimension colonne a \u00e9t\u00e9 amput\u00e9e de l&rsquo;attribut <code>rebounds<\/code>. Le journal SAS consigne de mani\u00e8re transparente : <em>The data set WORK.NEW_DATA has 7 observations and 2 variables<\/em>, certifiant l&rsquo;amincissement structurel de la table de donn\u00e9es.<\/p>\n<h2>5. Exemple 2 : Exclusion des variables redondantes avec l&rsquo;instruction DROP<\/h2>\n<h3>5.1 Syntaxe formelle et cas d&rsquo;usage de l&rsquo;instruction DROP<\/h3>\n<p>L&rsquo;instruction <code>DROP<\/code> repr\u00e9sente le pendant n\u00e9gatif et compl\u00e9mentaire de l&rsquo;instruction <code>KEEP<\/code>. Au lieu d&rsquo;\u00e9num\u00e9rer de fa\u00e7on limitative les composantes \u00e0 conserver, l&rsquo;ing\u00e9nieur SAS dresse la liste des variables dont l&rsquo;\u00e9limination est express\u00e9ment requise. Cette approche s&rsquo;impose comme la strat\u00e9gie de codage pr\u00e9f\u00e9rentielle lorsqu&rsquo;une table comporte un nombre massif de colonnes (par exemple plusieurs centaines d&rsquo;attributs de mesure) dont seule une fraction r\u00e9siduelle s&rsquo;av\u00e8re inutile pour les phases de mod\u00e9lisation ult\u00e9rieures.<\/p>\n<p>Consid\u00e9rons l&rsquo;hypoth\u00e8se o\u00f9 la variable <code>points<\/code> doit \u00eatre expurg\u00e9e de la table d&rsquo;analyse, tout en pr\u00e9servant l&rsquo;entit\u00e9 nominative de l&rsquo;\u00e9quipe ainsi que ses m\u00e9triques de rebonds. L&rsquo;impl\u00e9mentation syntaxique au sein de l&rsquo;\u00e9tape DATA s&rsquo;\u00e9crit de la fa\u00e7on suivante :<\/p>\n<p><code>data new_data;<br \/>\nset original_data;<br \/>\ndrop points;<br \/>\nrun;<\/code><\/p>\n<p>Par cette \u00e9criture, le compilateur int\u00e8gre la directive de rejet ciblant l&rsquo;attribut <code>points<\/code>. L&rsquo;ensemble des autres variables pr\u00e9sentes dans le PDV \u2014 qu&rsquo;elles proviennent directement de la table source ou qu&rsquo;elles aient \u00e9t\u00e9 calcul\u00e9es au fil du script \u2014 sont automatiquement incluses dans le flux de persistance de la table r\u00e9sultante <code>new_data<\/code>.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/subset2.jpg\" alt=\"\" \/><\/figure>\n<h3>5.2 M\u00e9canique d&rsquo;\u00e9viction lors de l&rsquo;\u00e9criture sur disque<\/h3>\n<p>\u00c0 l&rsquo;instar de l&rsquo;instruction <code>KEEP<\/code>, l&rsquo;instruction <code>DROP<\/code> n&rsquo;exerce aucune action d&rsquo;\u00e9viction pr\u00e9ventive au sein du PDV lors de la lecture des donn\u00e9es. La variable <code>points<\/code> est rigoureusement lue par l&rsquo;instruction <code>SET<\/code> et demeure pleinement r\u00e9sidente en m\u00e9moire vive tout au long de l&rsquo;\u00e9valuation du script pour chaque observation individuelle.<\/p>\n<p>Cette propri\u00e9t\u00e9 architecturale conf\u00e8re une libert\u00e9 totale au programmeur. Il demeure parfaitement valide d&rsquo;utiliser la variable \u00e9cart\u00e9e dans des structures conditionnelles complexes ou des d\u00e9rivations math\u00e9matiques en aval de l&rsquo;instruction <code>DROP<\/code>. Par exemple, la ligne de code <code>if points &gt; 20 then elite_offense = 1;<\/code> s&rsquo;ex\u00e9cutera avec un succ\u00e8s total, quand bien m\u00eame la variable <code>points<\/code> aura \u00e9t\u00e9 marqu\u00e9e du sceau de l&rsquo;\u00e9viction pour la table finale.<\/p>\n<p>L&rsquo;\u00e9viction physique n&rsquo;intervient qu&rsquo;au moment pr\u00e9cis o\u00f9 SAS s&rsquo;appr\u00eate \u00e0 s\u00e9rialiser le contenu du PDV dans le bloc de donn\u00e9es de sortie. Le pointeur d&rsquo;\u00e9criture consulte le vecteur d&rsquo;indicateurs de colonnes, constate la pr\u00e9sence du drapeau de rejet sur la variable <code>points<\/code>, et omet d\u00e9lib\u00e9r\u00e9ment le transfert des octets correspondants. La table <code>new_data<\/code> est ainsi mat\u00e9rialis\u00e9e sur le disque avec un sch\u00e9ma restreint ne contenant que les colonnes <code>team<\/code> et <code>rebounds<\/code>.<\/p>\n<h3>5.3 Validation empirique par inspection du SAS Log<\/h3>\n<p>La confirmation op\u00e9rationnelle de la validit\u00e9 de l&rsquo;op\u00e9ration s&rsquo;effectue syst\u00e9matiquement par un examen crois\u00e9 du journal d&rsquo;ex\u00e9cution (<em>SAS Log<\/em>) et de l&rsquo;affichage produit par la proc\u00e9dure <code>PROC PRINT<\/code> :<\/p>\n<p><code>proc print data=new_data;<br \/>\nrun;<\/code><\/p>\n<p>Le journal SAS renvoie un message sans \u00e9quivoque attestant du bon d\u00e9roulement de l&rsquo;op\u00e9ration :<\/p>\n<p><em>NOTE: There were 7 observations read from the data set WORK.ORIGINAL_DATA.<br \/>\nNOTE: The data set WORK.NEW_DATA has 7 observations and 2 variables.<br \/>\nNOTE: DATA statement used (Total process time): real time 0.01 seconds cpu time 0.00 seconds.<\/em><\/p>\n<p>La sortie tabulaire g\u00e9n\u00e9r\u00e9e illustre parfaitement la persistance de l&rsquo;int\u00e9grit\u00e9 matricielle sur les attributs pr\u00e9serv\u00e9s :<\/p>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>Obs<\/th>\n<th>team<\/th>\n<th>rebounds<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>Warriors<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Wizards<\/td>\n<td>9<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Rockets<\/td>\n<td>10<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Celtics<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>Thunder<\/td>\n<td>14<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>Spurs<\/td>\n<td>11<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>Nets<\/td>\n<td>7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La variable quantitative <code>points<\/code> a \u00e9t\u00e9 totalement \u00e9radiqu\u00e9e de la structure finale, tandis que le volume d&rsquo;enregistrements (N=7) et l&rsquo;alignement des valeurs de la colonne <code>rebounds<\/code> demeurent strictement conformes \u00e0 l&rsquo;\u00e9tat originel de la source.<\/p>\n<h2>6. Analyse comparative : Strat\u00e9gie de choix entre KEEP et DROP<\/h2>\n<h3>6.1 Crit\u00e8res de s\u00e9lection fond\u00e9s sur la volum\u00e9trie des variables<\/h3>\n<p>Le choix technique entre l&rsquo;impl\u00e9mentation d&rsquo;une instruction <code>KEEP<\/code> ou d&rsquo;une instruction <code>DROP<\/code> ne r\u00e9pond pas \u00e0 des crit\u00e8res de go\u00fbt subjectif mais ob\u00e9it \u00e0 des r\u00e8gles d&rsquo;ing\u00e9nierie logicielle gouvern\u00e9es par le principe de concision et la taille relative du dictionnaire de m\u00e9tadonn\u00e9es. L&rsquo;objectif cardinal consiste \u00e0 minimiser la charge cognitive lors de la relecture du code tout en r\u00e9duisant le risque statistique d&rsquo;omission ou d&rsquo;inclusion involontaire.<\/p>\n<p>La r\u00e8gle empirique g\u00e9n\u00e9ralement admise s&rsquo;articule comme suit : si le nombre de variables \u00e0 conserver est strictement inf\u00e9rieur au nombre de variables \u00e0 rejeter, le choix de l&rsquo;instruction <code>KEEP<\/code> est m\u00e9thodologiquement imp\u00e9ratif. \u00c0 titre d&rsquo;illustration, face \u00e0 une table \u00e9pid\u00e9miologique comportant 300 variables d\u00e9mographiques et cliniques dont seules 5 m\u00e9triques biologiques doivent \u00eatre extraites pour une mod\u00e9lisation logistique, sp\u00e9cifier un <code>KEEP<\/code> de 5 \u00e9l\u00e9ments est infiniment plus \u00e9conomique et lisible que de r\u00e9diger une liste exhaustive de 295 variables sous une clause <code>DROP<\/code>.<\/p>\n<p>R\u00e9ciproquement, lorsqu&rsquo;une table nettoy\u00e9e ne n\u00e9cessite que l&rsquo;\u00e9limination marginale d&rsquo;une poign\u00e9e de variables techniques de travail (telles que des cl\u00e9s d&rsquo;indexation temporaires, des compteurs de boucle ou des drapeaux bool\u00e9ens interm\u00e9diaires), l&rsquo;instruction <code>DROP<\/code> s&rsquo;av\u00e8re parfaitement indiqu\u00e9e. Elle \u00e9vite d&rsquo;alourdir inutilement le script par la d\u00e9claration formelle de dizaines de variables p\u00e9rennes qui n&rsquo;ont subi aucune modification.<\/p>\n<h3>6.2 Robustesse et maintenabilit\u00e9 du code SAS en production<\/h3>\n<p>Au-del\u00e0 de la concision brute, la s\u00e9curit\u00e9 applicative dans les environnements de production hautement r\u00e9glement\u00e9s (tels que ceux soumis aux normes de la <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\">Food and Drug Administration<\/a> pour les essais cliniques) exige une analyse pouss\u00e9e de la r\u00e9silience du code face aux \u00e9volutions du sch\u00e9ma amont. Dans ces contextes industriels, l&rsquo;instruction <code>KEEP<\/code> offre une robustesse structurelle nettement sup\u00e9rieure \u00e0 celle de l&rsquo;instruction <code>DROP<\/code>.<\/p>\n<p>Consid\u00e9rons l&rsquo;hypoth\u00e8se o\u00f9 la structure de la table source <code>original_data<\/code> vient \u00e0 \u00eatre modifi\u00e9e en amont par l&rsquo;int\u00e9gration inopin\u00e9e de trois nouvelles colonnes d&rsquo;audit non sollicit\u00e9es. Si l&rsquo;\u00e9tape DATA aval exploite une clause <code>DROP<\/code>, ces trois nouvelles variables vont m\u00e9caniquement traverser le filtre et persister dans la table <code>new_data<\/code>. Cette contamination du sch\u00e9ma peut briser des proc\u00e9dures analytiques ult\u00e9rieures ou violer des protocoles stricts de minimisation des donn\u00e9es (ex. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/gdpr-info.eu\">R\u00e8glement g\u00e9n\u00e9ral sur la protection des donn\u00e9es<\/a>).<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, si le programmeur a s\u00e9curis\u00e9 son pipeline \u00e0 l&rsquo;aide de l&rsquo;instruction <code>KEEP<\/code>, l&rsquo;injection impr\u00e9vue de nouvelles colonnes dans la source demeurera sans le moindre impact sur la structure de sortie. Le descripteur de <code>new_data<\/code> demeurera rigoureusement immuable, garantissant une stabilit\u00e9 contractuelle des interfaces logicielles en production. Dans les environnements critiques, <code>KEEP<\/code> repr\u00e9sente donc une barri\u00e8re de confinement pr\u00e9dictible et audit\u00e9e.<\/p>\n<h3>6.3 Impact comparatif sur l&rsquo;utilisation des ressources syst\u00e8me<\/h3>\n<p>Sur le plan de l&rsquo;allocation brute de la m\u00e9moire vive au sein de l&rsquo;\u00e9tape DATA, les instructions <code>KEEP<\/code> et <code>DROP<\/code> appliqu\u00e9es sous forme d&rsquo;instructions autonomes (instructions globales au sein de l&rsquo;\u00e9tape DATA) g\u00e9n\u00e8rent une empreinte syst\u00e8me rigoureusement identique. Dans les deux cas, le compilateur SAS provisionne l&rsquo;int\u00e9gralit\u00e9 des variables de la table source dans le PDV, impliquant une charge m\u00e9moire proportionnelle \u00e0 la somme des longueurs des variables lues.<\/p>\n<p>Toutefois, la divergence de performance se manifeste avec acuit\u00e9 lors de la phase de s\u00e9rialisation d\u00e9finitive sur le sous-syst\u00e8me d&rsquo;\u00e9criture (I\/O). La taille du fichier binaire <code>.sas7bdat<\/code> g\u00e9n\u00e9r\u00e9 d\u00e9pend strictement du nombre de variables conserv\u00e9es et de leur longueur cumul\u00e9e en octets. Un \u00e9lagage dimensionnel s\u00e9v\u00e8re op\u00e9r\u00e9 par <code>KEEP<\/code> ou <code>DROP<\/code> r\u00e9duit drastiquement la bande passante requise pour enregistrer les donn\u00e9es sur disque, all\u00e8ge l&rsquo;occupation des volumes de stockage partag\u00e9s et acc\u00e9l\u00e8re de mani\u00e8re exponentielle les op\u00e9rations de lecture lors des \u00e9tapes ult\u00e9rieures du workflow analytique.<\/p>\n<p>Il est \u00e0 noter que la taille du bloc descripteur (l&rsquo;en-t\u00eate de la table SAS h\u00e9bergeant les m\u00e9tadonn\u00e9es relatives aux formats, labels et attributs de colonnes) se trouve \u00e9galement contract\u00e9e lorsque le dictionnaire de colonnes est purg\u00e9 de ses \u00e9l\u00e9ments superflus, optimisant ainsi les requ\u00eates d&rsquo;introspection de m\u00e9tadonn\u00e9es pilot\u00e9es par les proc\u00e9dures de catalogage.<\/p>\n<h2>7. Exemple 3 : Filtrage conditionnel des lignes avec IF et DELETE<\/h2>\n<h3>7.1 Syntaxe de l&rsquo;expression conditionnelle IF-THEN DELETE<\/h3>\n<p>L&rsquo;op\u00e9ration de sous-ensemble ne saurait se limiter \u00e0 la simple s\u00e9lection de colonnes ; l&rsquo;\u00e9limination des observations non conformes \u00e0 des crit\u00e8res empiriques repr\u00e9sente la cl\u00e9 de vo\u00fbte de la pr\u00e9paration des donn\u00e9es. L&rsquo;une des constructions algorithmiques les plus explicites pour op\u00e9rer cette purge horizontale repose sur l&rsquo;association de l&rsquo;instruction d&rsquo;\u00e9valuation logique <code>IF-THEN<\/code> et de l&rsquo;ordre imp\u00e9ratif <code>DELETE<\/code>.<\/p>\n<p>Supposons que nous souhaitions restreindre notre jeu de donn\u00e9es exp\u00e9rimental aux seules franchises de basket-ball faisant preuve d&rsquo;une efficacit\u00e9 offensive notable, mat\u00e9rialis\u00e9e par un seuil minimal de 25 points inscrits. Tout enregistrement affichant un score strictement inf\u00e9rieur \u00e0 25 doit \u00eatre proscrit de la table finale <code>new_data<\/code>. Le code SAS formalisant cette exigence s&rsquo;\u00e9nonce comme suit :<\/p>\n<p><code>data new_data;<br \/>\nset original_data;<br \/>\nif points &lt; 25 then delete;<br \/>\nrun;<\/code><\/p>\n<p>La syntaxe se compose de trois \u00e9l\u00e9ments moteurs : l&rsquo;\u00e9valuation du pr\u00e9dicat d&rsquo;in\u00e9galit\u00e9 stricte <code>points &lt; 25<\/code>, l&rsquo;op\u00e9rateur de d\u00e9clenchement <code>THEN<\/code>, et l&rsquo;instruction de contr\u00f4le de flux <code>DELETE<\/code>. Lorsque la condition est valid\u00e9e (\u00e9valuation bool\u00e9enne vraie), l&rsquo;instruction <code>DELETE<\/code> stoppe instantan\u00e9ment l&rsquo;ex\u00e9cution s\u00e9quentielle pour la ligne en cours et retourne imm\u00e9diatement au d\u00e9but de l&rsquo;\u00e9tape DATA pour consommer l&rsquo;enregistrement suivant, pr\u00e9venant toute \u00e9criture sur le support de sortie.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/subset4.jpg\" alt=\"\" \/><\/figure>\n<h3>7.2 Dynamique d&rsquo;\u00e9limination des observations non conformes<\/h3>\n<p>Pour saisir l&rsquo;\u00e9l\u00e9gance de cette dynamique, retra\u00e7ons le comportement pas \u00e0 pas du moteur SAS lors de l&rsquo;ex\u00e9cution s\u00e9quentielle des sept observations de notre table de base <code>original_data<\/code> :<\/p>\n<ul>\n<li><strong>Observation 1 (Warriors)<\/strong> : <code>points = 28<\/code>. L&rsquo;\u00e9valuation <code>28 &lt; 25<\/code> est fausse. L&rsquo;action <code>DELETE<\/code> est ignor\u00e9e. Le flux franchit la ligne, atteint le bas de l&rsquo;\u00e9tape DATA et d\u00e9clenche l&rsquo;\u00e9criture de l&rsquo;enregistrement dans <code>new_data<\/code>.<\/li>\n<li><strong>Observation 2 (Wizards)<\/strong> : <code>points = 18<\/code>. L&rsquo;\u00e9valuation <code>18 &lt; 25<\/code> est vraie. L&rsquo;action <code>DELETE<\/code> est ex\u00e9cut\u00e9e. L&rsquo;it\u00e9ration s&rsquo;interrompt instantan\u00e9ment. Aucune \u00e9criture n&rsquo;a lieu.<\/li>\n<li><strong>Observation 3 (Rockets)<\/strong> : <code>points = 22<\/code>. L&rsquo;\u00e9valuation <code>22 &lt; 25<\/code> est vraie. Interruption imm\u00e9diate et \u00e9limination de l&rsquo;observation.<\/li>\n<li><strong>Observation 4 (Celtics)<\/strong> : <code>points = 21<\/code>. L&rsquo;\u00e9valuation <code>21 &lt; 25<\/code> est vraie. \u00c9limination de l&rsquo;observation.<\/li>\n<li><strong>Observation 5 (Thunder)<\/strong> : <code>points = 31<\/code>. L&rsquo;\u00e9valuation <code>31 &lt; 25<\/code> est fausse. \u00c9criture confirm\u00e9e.<\/li>\n<li><strong>Observation 6 (Spurs)<\/strong> : <code>points = 27<\/code>. L&rsquo;\u00e9valuation <code>27 &lt; 25<\/code> est fausse. \u00c9criture confirm\u00e9e.<\/li>\n<li><strong>Observation 7 (Nets)<\/strong> : <code>points = 26<\/code>. L&rsquo;\u00e9valuation <code>26 &lt; 25<\/code> est fausse. \u00c9criture confirm\u00e9e.<\/li>\n<\/ul>\n<p>Ce traitement s\u00e9quentiel illustre le caract\u00e8re implacable du filtrage par rupture de flux. Les \u00e9quipes des Wizards, des Rockets et des Celtics sont irr\u00e9m\u00e9diablement \u00e9cart\u00e9es du processus de restitution, tandis que les Warriors, le Thunder, les Spurs et les Nets franchissent avec succ\u00e8s le crible de s\u00e9lection.<\/p>\n<h3>7.3 V\u00e9rification des sorties et validation de la conformit\u00e9<\/h3>\n<p>L&rsquo;inspection du r\u00e9sultat tabulaire s&rsquo;effectue par l&rsquo;appel \u00e0 la proc\u00e9dure de visualisation <code>PROC PRINT<\/code> :<\/p>\n<p><code>proc print data=new_data;<br \/>\nrun;<\/code><\/p>\n<p>Le rapport de compilation refl\u00e8te fid\u00e8lement la s\u00e9lection op\u00e9r\u00e9e en ne pr\u00e9sentant que les quatre entit\u00e9s sportives ayant satisfait au seuil de performance :<\/p>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>Obs<\/th>\n<th>team<\/th>\n<th>points<\/th>\n<th>rebounds<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>Warriors<\/td>\n<td>28<\/td>\n<td>12<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Thunder<\/td>\n<td>31<\/td>\n<td>14<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Spurs<\/td>\n<td>27<\/td>\n<td>11<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>Nets<\/td>\n<td>26<\/td>\n<td>7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La confirmation d&rsquo;int\u00e9grit\u00e9 au niveau du journal d&rsquo;ex\u00e9cution affiche d\u00e9sormais : <em>NOTE: There were 7 observations read from the data set WORK.ORIGINAL_DATA. NOTE: The data set WORK.NEW_DATA has 4 observations and 3 variables<\/em>. L&rsquo;int\u00e9grit\u00e9 des trois variables a \u00e9t\u00e9 pr\u00e9serv\u00e9e dans leur totalit\u00e9, tandis que le vecteur des lignes a \u00e9t\u00e9 congruement r\u00e9duit aux unit\u00e9s statistiques d&rsquo;int\u00e9r\u00eat.<\/p>\n<h2>8. L&rsquo;alternative de conservation positive : L&rsquo;instruction IF sous-ensemble<\/h2>\n<h3>8.1 Fonctionnement de l&rsquo;instruction IF sans clause THEN (Subsetting IF)<\/h3>\n<p>Dans l&rsquo;arsenal syntaxique de SAS, il existe une alternative extr\u00eamement puissante et concise \u00e0 la formulation <code>IF-THEN DELETE<\/code> : il s&rsquo;agit de l&rsquo;instruction conditionnelle directe, historiquement formalis\u00e9e sous l&rsquo;appellation de <em>Subsetting IF<\/em> (ou instruction <code>IF<\/code> de sous-ensemble). Cette instruction se singularise par l&rsquo;absence d\u00e9lib\u00e9r\u00e9e de clause d&rsquo;action <code>THEN<\/code>.<\/p>\n<p>La formulation g\u00e9n\u00e9rique du <em>Subsetting IF<\/em> r\u00e9pond au sch\u00e9ma suivant : <code>if condition_booleenne;<\/code>. Sa s\u00e9mantique interne inverse la logique d&rsquo;\u00e9viction pour adopter une approche d&rsquo;inclusion affirmative : si l&rsquo;\u00e9valuation de l&rsquo;expression bool\u00e9enne retourne la valeur vraie (valeur non nulle et non manquante en arithm\u00e9tique SAS), l&rsquo;ex\u00e9cution du programme se poursuit de mani\u00e8re lin\u00e9aire vers l&rsquo;instruction suivante pour la ligne courante. \u00c0 l&rsquo;inverse, si l&rsquo;expression bool\u00e9enne est \u00e9valu\u00e9e comme fausse ou manquante, l&rsquo;ex\u00e9cution s&rsquo;arr\u00eate net, et l&rsquo;enregistrement est imm\u00e9diatement \u00e9cart\u00e9 du flux de sortie.<\/p>\n<p>Cette construction est strictement \u00e9quivalente sur le plan fonctionnel \u00e0 l&rsquo;\u00e9criture <code>if not (condition_booleenne) then delete;<\/code>. N\u00e9anmoins, elle \u00e9limine le bruit syntaxique li\u00e9 \u00e0 l&rsquo;inversion de la condition logique, simplifiant drastiquement l&rsquo;\u00e9criture des pr\u00e9dicats d&rsquo;inclusion complexes.<\/p>\n<h3>8.2 Comparaison syntaxique appliqu\u00e9e \u00e0 notre jeu de donn\u00e9es<\/h3>\n<p>Reprenons l&rsquo;exigence m\u00e9tier de l&rsquo;Exemple 3, consistant \u00e0 ne retenir que les franchises affichant une performance \u00e9gale ou sup\u00e9rieure \u00e0 25 points. L&rsquo;impl\u00e9mentation par le <em>Subsetting IF<\/em> s&rsquo;articule avec une remarquable \u00e9conomie de moyens :<\/p>\n<p><code>data new_data;<br \/>\nset original_data;<br \/>\nif points &gt;= 25;<br \/>\nrun;<\/code><\/p>\n<p>En juxtaposant ce bloc avec la solution pr\u00e9c\u00e9dente (<code>if points &lt; 25 then delete;<\/code>), la sym\u00e9trie conceptuelle appara\u00eet avec \u00e9vidence :<\/p>\n<ul>\n<li>Dans l&rsquo;approche <code>IF-THEN DELETE<\/code>, le programmeur formule la condition de rejet (l&rsquo;\u00e9v\u00e9nement pathologique ou non d\u00e9sir\u00e9 : <code>points &lt; 25<\/code>) pour ordonner la destruction de la ligne.<\/li>\n<li>Dans l&rsquo;approche <em>Subsetting IF<\/em>, le programmeur \u00e9nonce directement la condition d&rsquo;acceptation (l&rsquo;\u00e9v\u00e9nement recherch\u00e9 : <code>points &gt;= 25<\/code>).<\/li>\n<\/ul>\n<p>Les deux codes produisent rigoureusement la m\u00eame table physique sur le disque (m\u00eames observations, m\u00eames variables, m\u00eame ordre). Toutefois, le <em>Subsetting IF<\/em> pr\u00e9sente l&rsquo;avantage stylistique d&rsquo;exprimer positivement l&rsquo;hypoth\u00e8se de travail, ce qui r\u00e9duit consid\u00e9rablement le risque d&rsquo;erreur cognitive lors de la manipulation d&rsquo;op\u00e9rateurs bool\u00e9ens imbriqu\u00e9s.<\/p>\n<h3>8.3 Crit\u00e8res d&rsquo;\u00e9l\u00e9gance algorithmique et d&rsquo;auditabilit\u00e9<\/h3>\n<p>En mati\u00e8re d&rsquo;audit de code et de revue par les pairs au sein des \u00e9quipes de biostatistique, la clart\u00e9 algorithmique repr\u00e9sente un imp\u00e9ratif \u00e9thique et op\u00e9rationnel. Le recours syst\u00e9matique aux conditions affirmatives via le <em>Subsetting IF<\/em> est largement pr\u00e9conis\u00e9 par les guides de style officiels de SAS Institute. En effet, l&rsquo;accumulation de doubles n\u00e9gations induite par l&rsquo;association d&rsquo;op\u00e9rateurs n\u00e9gatifs et de clauses <code>DELETE<\/code> engendre une complexit\u00e9 cyclomatique n\u00e9faste.<\/p>\n<p>Par exemple, tester la pr\u00e9sence d&rsquo;une pathologie tout en \u00e9cartant des crit\u00e8res d&rsquo;exclusion multiples devient vite illisible sous la forme : <code>if not (pathologie=1 and age &gt; 18 and exclusion=0) then delete;<\/code>. La formulation par sous-ensemble direct : <code>if pathologie=1 and age &gt; 18 and exclusion=0;<\/code> restitue imm\u00e9diatement l&rsquo;intention clinique sous une forme transparente et directement tra\u00e7able par rapport au protocole d&rsquo;essai clinique.<\/p>\n<p>En outre, le <em>Subsetting IF<\/em> s&rsquo;int\u00e8gre harmonieusement avec d&rsquo;autres instructions proc\u00e9durales au sein de l&rsquo;\u00e9tape DATA, permettant d&rsquo;encha\u00eener des filtres horizontaux successifs qui agissent comme des tamis progressifs au fur et \u00e0 mesure que les transformations de colonnes sont op\u00e9r\u00e9es.<\/p>\n<h2>9. L&rsquo;instruction WHERE : Filtrage en amont de la construction du PDV<\/h2>\n<h3>9.1 M\u00e9canisme fondamental de l&rsquo;instruction WHERE<\/h3>\n<p>Bien que l&rsquo;instruction conditionnelle <code>IF<\/code> et le <em>Subsetting IF<\/em> remplissent parfaitement leur r\u00f4le de filtrage, ils partagent une caract\u00e9ristique architecturale commune : ils s&rsquo;ex\u00e9cutent au sein de l&rsquo;\u00e9tape DATA, <em>apr\u00e8s<\/em> que l&rsquo;enregistrement a \u00e9t\u00e9 physiquement extrait de la table source et charg\u00e9 dans le Program Data Vector. Pour transcender cette limite m\u00e9canique, le syst\u00e8me SAS propose une instruction hautement optimis\u00e9e : l&rsquo;instruction <code>WHERE<\/code>.<\/p>\n<p>L&rsquo;instruction <code>WHERE<\/code> ne rel\u00e8ve pas de la logique it\u00e9rative du PDV ; elle s&rsquo;adresse directement au moteur d&rsquo;acc\u00e8s aux donn\u00e9es (le moteur de base de donn\u00e9es SAS ou le moteur d&rsquo;ingestion SQL via SAS\/ACCESS). Son r\u00f4le fondamental consiste \u00e0 conditionner la transmission des enregistrements avant m\u00eame qu&rsquo;ils ne soient inject\u00e9s dans le PDV. La syntaxe canonique au sein d&rsquo;une \u00e9tape DATA s&rsquo;\u00e9tablit comme suit :<\/p>\n<p><code>data new_data;<br \/>\nset original_data;<br \/>\nwhere points &gt;= 25;<br \/>\nrun;<\/code><\/p>\n<p>Sous cette configuration, le moteur SAS \u00e9value le pr\u00e9dicat <code>points &gt;= 25<\/code> d\u00e8s la lecture des blocs de stockage physique. Les lignes qui \u00e9chouent au test (Wizards, Rockets, Celtics) ne sont m\u00eame pas achemin\u00e9es vers le PDV. Cette m\u00e9canique d&rsquo;interception pr\u00e9coce engendre une \u00e9conomie substantielle de cycles CPU et de bande passante bus m\u00e9moire, particuli\u00e8rement manifeste lorsque les tables trait\u00e9es h\u00e9bergent des dizaines de millions de lignes.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/subset5.jpg\" alt=\"\" \/><\/figure>\n<h3>9.2 Diff\u00e9rences conceptuelles et op\u00e9ratoires entre WHERE et IF<\/h3>\n<p>L&rsquo;assimilation superficielle entre <code>WHERE<\/code> et <code>IF<\/code> constitue l&rsquo;un des pi\u00e8ges les plus r\u00e9pandus chez les d\u00e9veloppeurs SAS interm\u00e9diaires. Bien que le r\u00e9sultat final puisse sembler indiscernable sur de petits volumes de donn\u00e9es, leurs principes de fonctionnement divergent fondamentalement :<\/p>\n<ul>\n<li><strong>Disponibilit\u00e9 des variables calcul\u00e9es<\/strong> : L&rsquo;instruction <code>WHERE<\/code> ne peut op\u00e9rer que sur des variables pr\u00e9existantes dans la table source mentionn\u00e9e dans l&rsquo;instruction <code>SET<\/code>. Il est rigoureusement impossible d&rsquo;utiliser une clause <code>WHERE<\/code> sur une variable calcul\u00e9e localement au sein de la m\u00eame \u00e9tape DATA. Par exemple, le code <code>ratio = points\/rebounds; where ratio &gt; 2;<\/code> d\u00e9clenchera une erreur fatale de compilation indiquant que la variable <code>ratio<\/code> n&rsquo;existe pas dans le jeu de donn\u00e9es source. Dans une telle situation, seul le <em>Subsetting IF<\/em> est l\u00e9gitime.<\/li>\n<li><strong>Exploitation des index<\/strong> : L&rsquo;instruction <code>WHERE<\/code> est la seule capable de tirer parti des index SAS (simples ou composites) pr\u00e9alablement cr\u00e9\u00e9s sur les tables de donn\u00e9es. Lorsqu&rsquo;un index existe sur la colonne <code>points<\/code>, l&rsquo;instruction <code>WHERE<\/code> permet au moteur d&rsquo;acc\u00e9der directement aux enregistrements cibl\u00e9s par recherche arborescente (B-Tree), sans proc\u00e9der \u00e0 un balayage lin\u00e9aire complet (<em>table scan<\/em>) de la table. L&rsquo;instruction <code>IF<\/code>, quant \u00e0 elle, requiert imp\u00e9rativement la lecture s\u00e9quentielle int\u00e9grale de tous les enregistrements.<\/li>\n<li><strong>Gestion des valeurs manquantes<\/strong> : Dans les expressions comparatives impliquant des op\u00e9rateurs d&rsquo;in\u00e9galit\u00e9, l&rsquo;instruction <code>WHERE<\/code> et l&rsquo;instruction <code>IF<\/code> adoptent des comportements d&rsquo;une grande rigueur mais dont la logique bool\u00e9enne doit \u00eatre surveill\u00e9e, notamment lors de l&rsquo;usage d&rsquo;op\u00e9rateurs sp\u00e9cialis\u00e9s tels que <code>between and<\/code> ou <code>is not missing<\/code>.<\/li>\n<\/ul>\n<h3>9.3 Utilisation de WHERE dans les proc\u00e9dures statistiques directes<\/h3>\n<p>L&rsquo;un des atouts pr\u00e9\u00e9minents de l&rsquo;instruction <code>WHERE<\/code> r\u00e9side dans son universalit\u00e9 d&rsquo;application. Contrairement aux instructions <code>KEEP<\/code>, <code>DROP<\/code> ou <code>IF<\/code> qui sont structurellement inf\u00e9od\u00e9es \u00e0 l&rsquo;\u00e9tape DATA, l&rsquo;instruction <code>WHERE<\/code> peut \u00eatre directement inject\u00e9e au sein de quasiment toutes les proc\u00e9dures SAS (famille <code>PROC<\/code>).<\/p>\n<p>Cette facult\u00e9 permet d&rsquo;ex\u00e9cuter des analyses statistiques descriptives ou inf\u00e9rentielles sur des sous-populations sans n\u00e9cessiter la cr\u00e9ation interm\u00e9diaire d&rsquo;une nouvelle table physique sur le disque. Consid\u00e9rons l&rsquo;exemple o\u00f9 l&rsquo;on d\u00e9sire afficher uniquement les statistiques des \u00e9quipes franchissant le seuil des 25 points sans polluer la biblioth\u00e8que <code>WORK<\/code> par une table d\u00e9riv\u00e9e temporaire :<\/p>\n<p><code>proc print data=original_data;<br \/>\nwhere points &gt;= 25;<br \/>\nrun;<\/code><\/p>\n<p>De m\u00eame, l&rsquo;int\u00e9gration de la clause <code>where points &gt;= 25;<\/code> au sein d&rsquo;une proc\u00e9dure <code>PROC MEANS<\/code> ou <code>PROC FREQ<\/code> permet de calculer instantan\u00e9ment les moyennes, \u00e9carts-types ou tables de contingence du sous-groupe cible. Cette pratique \u00e9limine les \u00e9tapes de mat\u00e9rialisation redondantes, pr\u00e9serve l&rsquo;espace disque sur les serveurs analytiques partag\u00e9s et assure une ex\u00e9cution hautement rationalis\u00e9e.<\/p>\n<h2>10. Options de table de donn\u00e9es : Optimisation via (KEEP=), (DROP=) et (WHERE=)<\/h2>\n<h3>10.1 Options associ\u00e9es \u00e0 l&rsquo;instruction SET (Filtrage en entr\u00e9e)<\/h3>\n<p>Le langage SAS transcende la rigidit\u00e9 des instructions globales gr\u00e2ce au concept extraordinairement flexible des options de table de donn\u00e9es (<em>data set options<\/em>). Ces options s&rsquo;adjoignent directement entre parenth\u00e8ses imm\u00e9diatement apr\u00e8s le nom de la table cibl\u00e9e, aussi bien en lecture (sur l&rsquo;instruction <code>SET<\/code>) qu&rsquo;en \u00e9criture (sur l&rsquo;instruction <code>DATA<\/code>).<\/p>\n<p>L&rsquo;application d&rsquo;options de filtrage sur l&rsquo;instruction <code>SET<\/code> mat\u00e9rialise le concept de filtrage en entr\u00e9e (<em>input filtering<\/em>). Examinons la syntaxe suivante :<\/p>\n<p><code>data new_data;<br \/>\nset original_data(keep=team points where=(points &gt;= 25));<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;impact architectural de cette \u00e9criture est colossal. Gr\u00e2ce \u00e0 l&rsquo;option <code>keep=team points<\/code>, la variable <code>rebounds<\/code> n&rsquo;est m\u00eame pas allou\u00e9e au sein du Program Data Vector lors de la compilation de l&rsquo;\u00e9tape DATA ! Elle est compl\u00e8tement occult\u00e9e d\u00e8s la phase de lecture sur le support de stockage. Simultan\u00e9ment, la clause <code>where=(points &gt;= 25)<\/code> garantit que seules les observations validant la condition franchissent le tampon d&rsquo;ingestion. Le PDV est ainsi configur\u00e9 avec une compacit\u00e9 optimale, n&rsquo;h\u00e9bergeant que les octets rigoureusement indispensables \u00e0 l&rsquo;op\u00e9ration.<\/p>\n<h3>10.2 Options associ\u00e9es \u00e0 l&rsquo;instruction DATA (Filtrage en sortie)<\/h3>\n<p>\u00c0 l&rsquo;autre extr\u00e9mit\u00e9 de la cha\u00eene de transmission, les options appliqu\u00e9es au niveau de l&rsquo;instruction <code>DATA<\/code> r\u00e9gulent le filtrage en sortie (<em>output filtering<\/em>). Cette approche permet de moduler pr\u00e9cis\u00e9ment la structure des tables finales cr\u00e9\u00e9es, notamment lorsqu&rsquo;une \u00e9tape DATA produit simultan\u00e9ment plusieurs jeux de donn\u00e9es divergents \u00e0 partir d&rsquo;une source unique.<\/p>\n<p>Consid\u00e9rons le sc\u00e9nario o\u00f9 une organisation souhaite scinder une table ma\u00eetresse en deux tables distinctes sp\u00e9cialis\u00e9es : une table d\u00e9di\u00e9e aux m\u00e9triques d&rsquo;attaque et une table d\u00e9di\u00e9e aux m\u00e9triques d\u00e9fensives, tout en conservant l&rsquo;identifiant de l&rsquo;\u00e9quipe dans les deux entit\u00e9s :<\/p>\n<p><code>data offense_data(keep=team points) defense_data(keep=team rebounds);<br \/>\nset original_data;<br \/>\nrun;<\/code><\/p>\n<p>Dans cet exemple, toutes les variables sont lues et coexistent harmonieusement dans le PDV au cours de l&rsquo;it\u00e9ration. Lors du d\u00e9versement physique de la m\u00e9moire vers le stockage, le moteur SAS applique les masques de sortie diff\u00e9renci\u00e9s sp\u00e9cifi\u00e9s par chaque option de table. La table <code>offense_data<\/code> ne recevra que les colonnes <code>team<\/code> et <code>points<\/code>, tandis que la table <code>defense_data<\/code> n&rsquo;enregistrera que <code>team<\/code> et <code>rebounds<\/code>. Cette prouesse architecturale s&rsquo;accomplit en une seule passe s\u00e9quentielle sur la table source, maximisant l&rsquo;efficience computationnelle.<\/p>\n<h3>10.3 Combinaison matricielle des options de table pour un contr\u00f4le granulaire<\/h3>\n<p>Le plein potentiel de l&rsquo;ing\u00e9nierie de donn\u00e9es SAS s&rsquo;exprime dans la combinaison matricielle et synergique de ces diff\u00e9rentes options au sein d&rsquo;une \u00e9tape DATA complexe. Il devient envisageable d&rsquo;associer un filtrage d&rsquo;entr\u00e9e agressif pour soulager la m\u00e9moire, d&rsquo;ex\u00e9cuter des transformations analytiques lourdes, puis d&rsquo;appliquer des filtres de sortie sp\u00e9cialis\u00e9s.<\/p>\n<p>Le tableau comparatif suivant synth\u00e9tise les propri\u00e9t\u00e9s respectives des diff\u00e9rentes modalit\u00e9s d&rsquo;intervention pour la s\u00e9lection des colonnes et des lignes :<\/p>\n<table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>M\u00e9canisme<\/th>\n<th>Type de r\u00e9duction<\/th>\n<th>Point d&rsquo;action temporel<\/th>\n<th>Pr\u00e9sence dans le PDV<\/th>\n<th>Usage dans les proc\u00e9dures<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Instruction KEEP\/DROP<\/strong><\/td>\n<td>Verticale (colonnes)<\/td>\n<td>\u00c9criture finale (Output)<\/td>\n<td>Oui (pleinement active)<\/td>\n<td>Non (\u00e9tape DATA uniquement)<\/td>\n<\/tr>\n<tr>\n<td><strong>Option (KEEP=\/DROP=) sur SET<\/strong><\/td>\n<td>Verticale (colonnes)<\/td>\n<td>Lecture initiale (Input)<\/td>\n<td>Non (variable non allou\u00e9e)<\/td>\n<td>Oui<\/td>\n<\/tr>\n<tr>\n<td><strong>Instruction IF \/ Subsetting IF<\/strong><\/td>\n<td>Horizontale (lignes)<\/td>\n<td>Au sein de l&rsquo;\u00e9tape DATA<\/td>\n<td>Oui (charg\u00e9e avant test)<\/td>\n<td>Non (\u00e9tape DATA uniquement)<\/td>\n<\/tr>\n<tr>\n<td><strong>Instruction WHERE<\/strong><\/td>\n<td>Horizontale (lignes)<\/td>\n<td>Avant l&rsquo;entr\u00e9e dans le PDV<\/td>\n<td>Non pour les rejets<\/td>\n<td>Oui (universelle)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>La r\u00e8gle d&rsquo;or pour l&rsquo;ing\u00e9nieur de donn\u00e9es consiste \u00e0 pousser le filtrage au point le plus pr\u00e9coce possible de la cha\u00eene d&rsquo;ex\u00e9cution (<em>fail-early principle<\/em>). Chaque colonne non allou\u00e9e et chaque ligne intercept\u00e9e en amont du PDV se traduit par une \u00e9conomie de ressources syst\u00e8me imm\u00e9diatement mesurable.<\/p>\n<h2>11. Application contextuelle : Pr\u00e9paration de sous-ensembles en recherche quantitative<\/h2>\n<h3>11.1 S\u00e9lection d&rsquo;\u00e9chelles et de sous-dimensions psychom\u00e9triques<\/h3>\n<p>Dans le domaine des sciences du comportement, de la psychom\u00e9trie et de la recherche en sant\u00e9 publique, les protocoles de collecte d\u00e9ploient fr\u00e9quemment des questionnaires standardis\u00e9s comprenant des centaines d&rsquo;items individuels (\u00e9chelles de Likert mesurant la r\u00e9silience, l&rsquo;anxi\u00e9t\u00e9 ou la qualit\u00e9 de vie). La pr\u00e9paration de la matrice d&rsquo;analyse requiert imp\u00e9rativement un sous-ensemble vertical rigoureux avant toute analyse factorielle exploratoire ou confirmatoire.<\/p>\n<p>Gr\u00e2ce aux instructions et options de type <code>KEEP<\/code>, le biostatisticien isole les items sp\u00e9cifiques constitutifs d&rsquo;une sous-dimension valid\u00e9e (par exemple les questions 12 \u00e0 24 associ\u00e9es au construit d&rsquo;anxi\u00e9t\u00e9 cognitive), tout en rejetant formellement via <code>DROP<\/code> les m\u00e9tadonn\u00e9es techniques g\u00e9n\u00e9r\u00e9es par les plateformes de recueil en ligne (horodatages de clics, adresses IP des r\u00e9pondants, drapeaux d&rsquo;interruption temporaire). Cette s\u00e9lection syst\u00e9matique garantit que la matrice de covariance soumise aux algorithmes d&rsquo;estimation matricielle ne souffre d&rsquo;aucune singularit\u00e9 math\u00e9matique imputable \u00e0 des colonnes art\u00e9factuelles.<\/p>\n<p>La formulation explicite des variables retenues assure en outre la parfaite tra\u00e7abilit\u00e9 du dictionnaire de donn\u00e9es dans le rapport de recherche, condition indispensable pour satisfaire aux crit\u00e8res de reproductibilit\u00e9 scientifique exig\u00e9s par la communaut\u00e9 acad\u00e9mique internationale.<\/p>\n<h3>11.2 Filtrage d&rsquo;\u00e9chantillons cliniques selon des crit\u00e8res d&rsquo;inclusion<\/h3>\n<p>Dans la recherche clinique et \u00e9pid\u00e9miologique, la conformit\u00e9 absolue avec le protocole d&rsquo;essai clinique enregistr\u00e9 (ex. sur <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/clinicaltrials.gov\">ClinicalTrials.gov<\/a>) impose la constitution de sous-ensembles de population m\u00e9thodologiquement inattaquables. Les crit\u00e8res d&rsquo;\u00e9ligibilit\u00e9 stipulent fr\u00e9quemment des bornes d&rsquo;\u00e2ge d&rsquo;inclusion, des seuils de biomarqueurs biologiques et l&rsquo;obligation d&rsquo;un consentement \u00e9clair\u00e9 valid\u00e9.<\/p>\n<p>Le filtrage conditionnel via l&rsquo;instruction <code>WHERE<\/code> ou le <em>Subsetting IF<\/em> constitue le levier formel par lequel le statisticien d\u00e9rive la population en intention de traiter (ITT) ou la population per-protocole (PP) \u00e0 partir de la base de recrutement globale. Par exemple, une instruction telle que <code>where age &gt;= 18 and score_inclusion &gt;= 50 and statut_consentement = 'VALIDE';<\/code> mat\u00e9rialise l&rsquo;algorithme d&rsquo;inclusion avec une rigueur math\u00e9matique irr\u00e9futable.<\/p>\n<p>L&rsquo;inspection minutieuse des m\u00e9triques de sortie dans le journal SAS (nombre d&rsquo;enregistrements rejet\u00e9s \u00e0 chaque \u00e9tape du tamisage) fournit la mati\u00e8re brute n\u00e9cessaire \u00e0 l&rsquo;\u00e9laboration du diagramme de flux CONSORT (<em>Consolidated Standards of Reporting Trials<\/em>), documentant pas \u00e0 pas l&rsquo;attrition de la cohorte depuis l&rsquo;enr\u00f4lement initial jusqu&rsquo;\u00e0 la phase d&rsquo;analyse d\u00e9finitive.<\/p>\n<h3>11.3 Nettoyage des valeurs aberrantes et conformit\u00e9 d\u00e9ontologique<\/h3>\n<p>La robustesse des inf\u00e9rences quantitatives repose \u00e9galement sur l&rsquo;assainissement syst\u00e9matique des jeux de donn\u00e9es, notamment par l&rsquo;\u00e9viction contr\u00f4l\u00e9e des valeurs aberrantes (<em>outliers<\/em>) et des observations entach\u00e9es d&rsquo;irr\u00e9gularit\u00e9s chronom\u00e9tr\u00e9es (temps de r\u00e9ponse aberrants sugg\u00e9rant une passation automatis\u00e9e frauduleuse ou un d\u00e9faut d&rsquo;attention du sujet).<\/p>\n<p>L&rsquo;impl\u00e9mentation de filtres conditionnels combin\u00e9s \u00e0 des bornes statistiques d\u00e9riv\u00e9es (par exemple l&rsquo;\u00e9cart interquartile ou des seuils de distance de Mahalanobis calcul\u00e9s pr\u00e9alablement) permet d&rsquo;\u00e9liminer les unit\u00e9s contaminantes \u00e0 l&rsquo;aide de la clause <code>IF condition_aberrante THEN DELETE;<\/code>. Ce filtrage pr\u00e9serve la normalit\u00e9 r\u00e9siduelle des distributions et pr\u00e9vient les distorsions majeures des estimateurs des moindres carr\u00e9s ordinaires.<\/p>\n<p>Sur le plan d\u00e9ontologique et r\u00e9glementaire, le sous-ensemble constitue le premier instrument de mise en conformit\u00e9 avec les r\u00e9glementations relatives \u00e0 la protection de la vie priv\u00e9e. L&rsquo;exclusion cat\u00e9gorique des colonnes d&rsquo;identification directe (nom, pr\u00e9nom, num\u00e9ro de s\u00e9curit\u00e9 sociale) par une instruction <code>DROP<\/code> rigoureuse garantit la cr\u00e9ation d&rsquo;un jeu de donn\u00e9es de travail d\u00fbment pseudonymis\u00e9, assurant qu&rsquo;aucun personnel d&rsquo;analyse non habilit\u00e9 ne puisse \u00eatre expos\u00e9 \u00e0 des donn\u00e9es \u00e0 caract\u00e8re personnel sensibles.<\/p>\n<h2>12. Synth\u00e8se m\u00e9thodologique, pi\u00e8ges courants et recommandations d&rsquo;experts<\/h2>\n<h3>12.1 Erreurs fr\u00e9quentes lors du sous-ensemble et strat\u00e9gies de r\u00e9solution<\/h3>\n<p>L&rsquo;exp\u00e9rience cumul\u00e9e sur les syst\u00e8mes industriels SAS r\u00e9v\u00e8le une r\u00e9currence syst\u00e9matique de certains pi\u00e8ges algorithmiques dont l&rsquo;ing\u00e9nieur de donn\u00e9es doit imp\u00e9rativement se pr\u00e9munir :<\/p>\n<ul>\n<li><strong>La confusion fonctionnelle entre instruction globale et option de table<\/strong> : R\u00e9diger <code>drop team;<\/code> au corps de l&rsquo;\u00e9tape DATA laisse la variable accessible au calcul au sein du PDV. En revanche, \u00e9crire <code>set original_data(drop=team);<\/code> emp\u00eache totalement le chargement de <code>team<\/code> dans le PDV. L&rsquo;utilisation subs\u00e9quente de <code>team<\/code> dans une clause conditionnelle entra\u00eenera la cr\u00e9ation involontaire d&rsquo;une variable vide initialis\u00e9e \u00e0 la valeur manquante, alt\u00e9rant silencieusement la logique du programme.<\/li>\n<li><strong>Le pi\u00e8ge de la valeur manquante dans les comparaisons d&rsquo;in\u00e9galit\u00e9<\/strong> : En syntaxe SAS, la valeur manquante num\u00e9rique (repr\u00e9sent\u00e9e par un point <code>.<\/code>) est conceptuellement assimil\u00e9e \u00e0 l&rsquo;infini n\u00e9gatif (soit la valeur num\u00e9rique la plus petite envisageable). Par voie de cons\u00e9quence, l&rsquo;instruction <code>if points &lt; 25 then delete;<\/code> aura pour effet d&rsquo;\u00e9liminer impitoyablement toutes les observations dont la variable <code>points<\/code> est manquante ! Si la volont\u00e9 m\u00e9tier consiste \u00e0 conserver les valeurs non renseign\u00e9es pour un imputage ult\u00e9rieur, la clause doit \u00eatre r\u00e9\u00e9crite ainsi : <code>if points &lt; 25 and points ne . then delete;<\/code>.<\/li>\n<li><strong>L&rsquo;\u00e9crasement involontaire de la table source<\/strong> : D\u00e9clarer <code>data original_data; set original_data;<\/code> combin\u00e9 avec un filtre erron\u00e9 d\u00e9truit instantan\u00e9ment la table de r\u00e9f\u00e9rence sur le disque. Il est imp\u00e9ratif de toujours s\u00e9rialiser les sous-ensembles dans des tables cibles distinctes (<code>new_data<\/code>) lors de la phase de prototypage.<\/li>\n<\/ul>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/subset6.jpg\" alt=\"\" \/><\/figure>\n<h3>12.2 Diagnostic approfondi \u00e0 l&rsquo;aide des proc\u00e9dures d&rsquo;audit<\/h3>\n<p>La validation d&rsquo;un programme SAS de cr\u00e9ation de sous-ensembles ne s&rsquo;arr\u00eate jamais \u00e0 l&rsquo;absence de message d&rsquo;erreur dans le journal. Elle exige une d\u00e9marche d&rsquo;audit actif mobilisant les proc\u00e9dures d&rsquo;introspection structurelle fournies par le syst\u00e8me.<\/p>\n<p>La proc\u00e9dure reine pour certifier l&rsquo;architecture d&rsquo;un sous-ensemble est <code>PROC CONTENTS<\/code>. Sa formulation m\u00e9thodique :<\/p>\n<p><code>proc contents data=new_data varnum;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;option <code>varnum<\/code> ordonne l&rsquo;impression des variables selon leur ordre logique physique dans la table. Le rapport \u00e9mis d\u00e9taille la liste exhaustive des attributs, leurs types, leurs longueurs, ainsi que le nombre officiel d&rsquo;observations certifi\u00e9es. La confrontation de ce rapport avec le dictionnaire de donn\u00e9es th\u00e9orique permet de valider avec une certitude absolue que seules les colonnes attendues subsistent.<\/p>\n<p>Parall\u00e8lement, pour les sous-ensembles horizontaux, la proc\u00e9dure <code>PROC FREQ<\/code> ou la proc\u00e9dure <code>PROC UNIVARIATE<\/code> appliqu\u00e9e sur les variables de filtrage permet de v\u00e9rifier qu&rsquo;aucune valeur en dehors des bornes sp\u00e9cifi\u00e9es (par exemple des scores inf\u00e9rieurs \u00e0 25) n&rsquo;a subsist\u00e9 clandestinement dans la table d\u00e9riv\u00e9e finale.<\/p>\n<h3>12.3 Guide d\u00e9cisionnel pour l&rsquo;ing\u00e9nieur de donn\u00e9es SAS<\/h3>\n<p>Afin de structurer le processus de d\u00e9cision de l&rsquo;ing\u00e9nieur et de garantir une uniformit\u00e9 m\u00e9thodologique au sein des \u00e9quipes de d\u00e9veloppement, nous formalisons le guide d\u00e9cisionnel suivant sous la forme de r\u00e8gles algorithmiques univoques :<\/p>\n<ul>\n<li><strong>Cas 1 : R\u00e9duction verticale d&rsquo;une minorit\u00e9 de colonnes<\/strong>. Utilisez l&rsquo;instruction d\u00e9clarative <code>DROP<\/code> ou l&rsquo;option de sortie <code>(DROP=)<\/code> si vous pr\u00e9servez plus de 80 % des variables initiales.<\/li>\n<li><strong>Cas 2 : Isolation s\u00e9lective d&rsquo;un c\u0153ur de colonnes restreint<\/strong>. Privil\u00e9giez syst\u00e9matiquement l&rsquo;instruction <code>KEEP<\/code> ou l&rsquo;option d&rsquo;entr\u00e9e <code>(KEEP=)<\/code> pour garantir l&rsquo;\u00e9tanch\u00e9it\u00e9 du sch\u00e9ma final face aux modifications amont impr\u00e9vues.<\/li>\n<li><strong>Cas 3 : Filtrage horizontal fond\u00e9 sur des variables existantes dans la source<\/strong>. Employez l&rsquo;instruction <code>WHERE<\/code> ou l&rsquo;option de table <code>(WHERE=)<\/code> d\u00e8s la lecture via <code>SET<\/code> pour \u00e9conomiser les transferts de m\u00e9moire et solliciter les index mat\u00e9riels disponibles.<\/li>\n<li><strong>Cas 4 : Filtrage horizontal conditionn\u00e9 par des variables cr\u00e9\u00e9es localement<\/strong>. Recourez exclusivement au <em>Subsetting IF<\/em> (<code>if condition;<\/code>) formul\u00e9 de mani\u00e8re positive pour une auditabilit\u00e9 logicielle optimale.<\/li>\n<li><strong>Cas 5 : Production simultan\u00e9e de sous-ensembles h\u00e9t\u00e9rog\u00e8nes<\/strong>. D\u00e9ployez les options de table en sortie (<code>data table1(keep=...) table2(keep=...);<\/code>) dans une unique \u00e9tape DATA afin de rentabiliser le temps d&rsquo;acc\u00e8s au fichier source et minimiser les cycles CPU globaux.<\/li>\n<\/ul>\n<p>En observant scrupuleusement ces standards de d\u00e9veloppement, l&rsquo;analyste de donn\u00e9es \u00e9l\u00e8ve ses programmes SAS au plus haut niveau d&rsquo;efficience, de maintenabilit\u00e9 et de rigueur scientifique, garantissant une exploitation p\u00e9renne et irr\u00e9prochable des patrimoines informationnels d&rsquo;entreprise.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer, Sixth Edition<\/em>. SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/books.html\">https:\/\/support.sas.com\/en\/books.html<\/a><\/li>\n<li>SAS Institute Inc. (2021). <em>SAS\u00ae 9.4 Statements: Reference, Fifth Edition<\/em>. SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\">https:\/\/documentation.sas.com<\/a><\/li>\n<li>Cody, R. (2018). <em>Cody&rsquo;s Data Cleaning Techniques Using SAS, Third Edition<\/em>. SAS Institute Inc. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/support.sas.com\/en\/books.html\">https:\/\/support.sas.com\/en\/books.html<\/a><\/li>\n<li>Horstman, D. W. (2017). <em>Methods of Subsetting Data in SAS: Efficiency and Elegance<\/em>. Proceedings of the SAS Global Forum 2017 Conference. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\/en_us\/events\/sas-global-forum.html\">https:\/\/www.sas.com\/en_us\/events\/sas-global-forum.html<\/a><\/li>\n<li>International Organization for Standardization. (2023). <em>Systems and software engineering \u2014 Systems and software Quality Requirements and Evaluation (SQuaRE) \u2014 System and software quality models<\/em> (ISO\/IEC Standard No. 25010:2023). <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.iso.org\/standard\/78176.html\">https:\/\/www.iso.org\/standard\/78176.html<\/a><\/li>\n<li>Moher, D., Hopewell, S., Schulz, K. F., Montori, V., G\u00f8tzsche, P. C., Devereaux, P. J., Elbourne, D., Egger, M., &amp; Altman, D. G. (2010). <em>CONSORT 2010 explanation and elaboration: updated guidelines for reporting parallel group randomised trials<\/em>. BMJ, 340, c869. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1136\/bmj.c869\">https:\/\/doi.org\/10.1136\/bmj.c869<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour ma\u00eetriser le sous-ensemble de donn\u00e9es dans SAS \u00e0 travers trois exemples concrets : instructions KEEP, DROP et filtrage conditionnel.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[6805,9499],"tags":[9655,11333,235,7084,11334],"class_list":["post-9913","psych_stat","type-psych_stat","status-publish","hentry","category-gestion-de-donnees","category-programmation-sas","tag-drop","tag-keep","tag-sas","tag-sous-ensemble","tag-where"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9913","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=9913"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9913\/revisions"}],"predecessor-version":[{"id":9920,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/9913\/revisions\/9920"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}