{"id":10011,"date":"2026-10-14T18:02:35","date_gmt":"2026-10-14T18:02:35","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-supprimer-des-lignes-dans-sas-3-exemples\/"},"modified":"2026-10-14T18:02:35","modified_gmt":"2026-10-14T18:02:35","slug":"comment-supprimer-des-lignes-dans-sas-3-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-supprimer-des-lignes-dans-sas-3-exemples","title":{"rendered":"Comment supprimer des lignes dans SAS (3 exemples)"},"content":{"rendered":"<p>Dans l&rsquo;\u00e9cosyst\u00e8me du traitement analytique des donn\u00e9es et de l&rsquo;informatique d\u00e9cisionnelle, le progiciel <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.sas.com\">SAS (Statistical Analysis System)<\/a> s&rsquo;est impos\u00e9 depuis plusieurs d\u00e9cennies comme un standard de r\u00e9f\u00e9rence au sein des industries pharmaceutiques, financi\u00e8res, assurantielles et de la recherche publique. La manipulation pr\u00e9cise et rigoureuse des structures de donn\u00e9es matricielles constitue le socle op\u00e9rationnel sur lequel repose toute inf\u00e9rence statistique ou mod\u00e9lisation pr\u00e9dictive subs\u00e9quente. Au sein de cet \u00e9difice m\u00e9thodologique, la capacit\u00e9 \u00e0 segmenter, filtrer et expurger les observations non pertinentes repr\u00e9sente une comp\u00e9tence \u00e9l\u00e9mentaire mais cruciale pour tout analyste, statisticien ou ing\u00e9nieur de donn\u00e9es.<\/p>\n<p>La gestion du cycle de vie des enregistrements au cours de l&rsquo;ex\u00e9cution d&rsquo;un programme SAS mobilise des concepts d&rsquo;architecture interne sophistiqu\u00e9s, notamment le fonctionnement s\u00e9quentiel de l&rsquo;\u00e9tape DATA (<em>Data Step<\/em>) et l&rsquo;interaction dynamique avec la m\u00e9moire vive via le vecteur de donn\u00e9es de programme (<em>Program Data Vector<\/em> ou PDV). Contrairement \u00e0 de simples filtres visuels appliqu\u00e9s dans des tableurs grand public, la suppression de lignes dans SAS r\u00e9pond \u00e0 des r\u00e8gles de compilation et d&rsquo;ex\u00e9cution d\u00e9terministes qui conditionnent directement l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle, les temps de calcul machine et l&rsquo;espace de stockage sur disque.<\/p>\n<p>Cet article propose une exploration m\u00e9thodique, th\u00e9orique et appliqu\u00e9e des m\u00e9canismes pr\u00e9sidant \u00e0 la suppression conditionnelle d&rsquo;observations dans SAS. \u00c0 travers l&rsquo;\u00e9tude approfondie de trois cas d&rsquo;\u00e9cole progressifs \u2014 allant de l&rsquo;\u00e9limination univari\u00e9e simple \u00e0 la disjonction logique complexe \u2014, nous analyserons comment exploiter l&rsquo;instruction <code>DELETE<\/code>, tout en mettant en perspective cette approche avec les paradigmes concurrents ou compl\u00e9mentaires que sont le sous-ensemble conditionnel (<em>Subsetting IF<\/em>), la clause d&rsquo;optimisation <code>WHERE<\/code> et les requ\u00eates relationnelles via la proc\u00e9dure <code>PROC SQL<\/code>.<\/p>\n<h2>1. Introduction aux m\u00e9canismes de filtrage et de suppression de donn\u00e9es dans SAS<\/h2>\n<h3>1.1 Importance de l&rsquo;\u00e9puration des donn\u00e9es dans le pipeline analytique<\/h3>\n<p>Au c\u0153ur de la d\u00e9marche empirique en science des donn\u00e9es, la qualit\u00e9 des r\u00e9sultats statistiques d\u00e9pend intrins\u00e8quement de la puret\u00e9 du mat\u00e9riau informationnel mobilis\u00e9, principe universellement r\u00e9sum\u00e9 par l&rsquo;adage \u00ab <em>garbage in, garbage out<\/em> \u00bb. L&rsquo;\u00e9puration des donn\u00e9es, loin de constituer une simple formalit\u00e9 technique, s&rsquo;inscrit comme une \u00e9tape pivot de la gouvernance des donn\u00e9es. \u00c9liminer des observations aberrantes, exclure des unit\u00e9s d&rsquo;\u00e9chantillonnage ne satisfaisant pas aux crit\u00e8res d&rsquo;inclusion d&rsquo;un protocole clinique, ou purger des doublons administratifs permet de garantir la robustesse des estimateurs statistiques, tels que la moyenne, la variance ou les coefficients de r\u00e9gression.<\/p>\n<p>Sur le plan conceptuel, il est primordial d&rsquo;\u00e9tablir une distinction formelle entre la suppression physique des donn\u00e9es et leur filtrage programmatique temporaire. La suppression physique implique une modification d\u00e9finitive du support de persistance, entra\u00eenant la lib\u00e9ration de blocs d&rsquo;espace disque et la destruction irr\u00e9versible des enregistrements cibl\u00e9s, une op\u00e9ration qui requiert des protocoles stricts de s\u00e9curisation et d&rsquo;audit. \u00c0 l&rsquo;oppos\u00e9, le filtrage programmatique, pr\u00e9dominant dans les \u00e9tapes de transformation SAS, consiste \u00e0 extraire un sous-ensemble d&rsquo;enregistrements d&rsquo;une table source r\u00e9put\u00e9e immuable afin de g\u00e9n\u00e9rer une nouvelle table d\u00e9riv\u00e9e. Cette approche pr\u00e9serve le jeu de donn\u00e9es primaire et garantit la tra\u00e7abilit\u00e9 int\u00e9grale du pipeline analytique.<\/p>\n<p>L&rsquo;optimisation des flux de donn\u00e9es engendre \u00e9galement des r\u00e9percussions directes sur l&rsquo;architecture mat\u00e9rielle sous-jacente. Dans des environnements traitant des volumes massifs (<em>Big Data<\/em>), conserver des lignes superflues au fil de dizaines d&rsquo;\u00e9tapes DATA successives sature inutilement la m\u00e9moire vive (RAM) allou\u00e9e aux tampons de calcul et encombre le sous-syst\u00e8me d&rsquo;entr\u00e9es-sorties (I\/O). En restreignant le volume d&rsquo;observations d\u00e8s les phases initiales de la manipulation, l&rsquo;analyste all\u00e8ge consid\u00e9rablement la charge computationnelle et r\u00e9duit les temps de rotation des traitements par lots (<em>batch processing<\/em>).<\/p>\n<h3>1.2 Pr\u00e9sentation des concepts d&rsquo;observation et de variable dans le syst\u00e8me SAS<\/h3>\n<p>Le syst\u00e8me SAS structure l&rsquo;information sous la forme d&rsquo;une table rectangulaire bidimensionnelle, d\u00e9sign\u00e9e sous le terme technique de table SAS (ou <em>SAS Data Set<\/em>). Cette structure bidirectionnelle s&rsquo;articule rigoureusement autour de deux axes fondamentaux : les colonnes, d\u00e9sign\u00e9es sous l&rsquo;appellation de <strong>variables<\/strong>, et les lignes horizontales, qualifi\u00e9es formellement d&rsquo;<strong>observations<\/strong>. Chaque variable incarne une dimension descriptive ou une caract\u00e9ristique quantitative ou qualitative, d\u00e9finie par un nom, un type strict (num\u00e9rique ou caract\u00e8re), une longueur en octets, ainsi que des attributs optionnels de format d&rsquo;affichage et d&rsquo;\u00e9tiquetage s\u00e9mantique.<\/p>\n<p>D&rsquo;un point de vue fonctionnel, une observation constitue un vecteur d&rsquo;attributs individuels rattach\u00e9s \u00e0 une unit\u00e9 statistique distincte, qu&rsquo;il s&rsquo;agisse d&rsquo;un patient au sein d&rsquo;un essai clinique, d&rsquo;une transaction bancaire ou d&rsquo;une pi\u00e8ce industrielle. Dans l&rsquo;\u00e9cosyst\u00e8me SAS, la manipulation de ces observations ne s&rsquo;op\u00e8re pas globalement comme dans une alg\u00e8bre matricielle pure, mais selon un paradigme it\u00e9ratif et s\u00e9quentiel h\u00e9rit\u00e9 de la conception des syst\u00e8mes d&rsquo;exploitation sur gros syst\u00e8mes (<em>mainframes<\/em>). Le compilateur SAS lit la table d&rsquo;entr\u00e9e enregistrement par enregistrement, applique les r\u00e8gles de gestion formul\u00e9es par le programmeur, puis d\u00e9cide souverainement de l&rsquo;\u00e9criture ou du rejet de chaque ligne.<\/p>\n<p>Cette logique s\u00e9quentielle induit que toute action de suppression n&rsquo;est pas ex\u00e9cut\u00e9e r\u00e9troactivement sur l&rsquo;ensemble de la table, mais s&rsquo;\u00e9value dynamiquement \u00e0 l&rsquo;instant pr\u00e9cis o\u00f9 l&rsquo;observation courante franchit le flux de traitement du compilateur. Comprendre cette granularit\u00e9 individuelle s&rsquo;av\u00e8re indispensable pour appr\u00e9hender pourquoi et comment une condition logique peut intercepter une observation pour emp\u00eacher sa propagation vers la table de sortie.<\/p>\n<h3>1.3 Vue d&rsquo;ensemble des trois paradigmes conditionnels de suppression<\/h3>\n<p>La logique d&rsquo;exclusion des observations s&rsquo;articule g\u00e9n\u00e9ralement autour de trois grands paradigmes conditionnels, dont la complexit\u00e9 formelle cro\u00eet avec le nombre de dimensions \u00e9valu\u00e9es simultan\u00e9ment. Le premier paradigme repose sur une approche <strong>d\u00e9terministe univari\u00e9e<\/strong>. Dans ce sch\u00e9ma, l&rsquo;exclusion d&rsquo;une ligne est subordonn\u00e9e \u00e0 l&rsquo;\u00e9valuation d&rsquo;un pr\u00e9dicat unique appliqu\u00e9 \u00e0 une variable singuli\u00e8re, par exemple l&rsquo;appartenance d&rsquo;un sujet \u00e0 un groupe t\u00e9moin sp\u00e9cifique ou le franchissement d&rsquo;un seuil m\u00e9trique d&rsquo;\u00e2ge. C&rsquo;est le niveau le plus accessible et le plus direct du filtrage de donn\u00e9es.<\/p>\n<p>Le deuxi\u00e8me paradigme met en \u0153uvre une logique <strong>conjonctive cumulative<\/strong>, articul\u00e9e autour de l&rsquo;op\u00e9rateur bool\u00e9en <code>AND<\/code>. L&rsquo;\u00e9limination d&rsquo;une observation ne survient que si cette derni\u00e8re satisfait simultan\u00e9ment une pluralit\u00e9 de conditions restrictives distinctes. Cette strat\u00e9gie d&rsquo;intersection logique permet d&rsquo;isoler des sous-populations tr\u00e8s pr\u00e9cises pr\u00e9sentant une conjonction de crit\u00e8res critiques, tout en maintenant dans le flux d&rsquo;analyse les observations qui n&rsquo;enfreignent qu&rsquo;une partie de ces conditions. Elle exige une rigueur analytique accrue afin de ne pas exclure ind\u00fbment des donn\u00e9es par une accumulation mal calibr\u00e9e de contraintes.<\/p>\n<p>Enfin, le troisi\u00e8me paradigme mobilise une logique <strong>disjonctive alternative<\/strong>, mat\u00e9rialis\u00e9e par l&rsquo;op\u00e9rateur bool\u00e9en <code>OR<\/code>. Ici, la suppression devient hautement s\u00e9lective ou inclusive selon la perspective : d\u00e8s lors qu&rsquo;un seul crit\u00e8re parmi un ensemble de conditions ind\u00e9pendantes est valid\u00e9, l&rsquo;enregistrement est imm\u00e9diatement \u00e9ject\u00e9 du circuit de production. Cette m\u00e9thode s&rsquo;av\u00e8re redoutable pour purger de larges cohortes de donn\u00e9es pollu\u00e9es ou pour appliquer des filtres de s\u00e9curit\u00e9 stricts, mais elle expose \u00e9galement le d\u00e9veloppeur \u00e0 des risques accrus d&rsquo;hyper-filtrage involontaire si les r\u00e8gles d&rsquo;exclusion ne sont pas strictement circonscrites.<\/p>\n<h2>2. Architecture du Data Step : cycle d&rsquo;ex\u00e9cution et traitement s\u00e9quentiel<\/h2>\n<h3>2.1 Le Program Data Vector (PDV) et son r\u00f4le dans la s\u00e9lection<\/h3>\n<p>Pour ma\u00eetriser la suppression de lignes dans SAS, il est n\u00e9cessaire de d\u00e9cortiquer les m\u00e9canismes intimes du <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\">Program Data Vector (PDV)<\/a>. Le PDV est une zone tampon d\u00e9di\u00e9e au sein de la m\u00e9moire vive allou\u00e9e par le syst\u00e8me d&rsquo;ex\u00e9cution lors de la phase de compilation d&rsquo;une \u00e9tape DATA. Sa fonction principale consiste \u00e0 contenir, de mani\u00e8re s\u00e9quentielle et ordonn\u00e9e, l&rsquo;ensemble des valeurs des variables pour une observation unique au cours de son traitement. Le PDV accueille non seulement les variables issues des tables sources d\u00e9clar\u00e9es dans l&rsquo;instruction <code>SET<\/code>, mais \u00e9galement les variables temporaires calcul\u00e9es et les variables automatiques du syst\u00e8me, telles que <code>_N_<\/code> (compteur d&rsquo;it\u00e9rations de la boucle DATA) et <code>_ERROR_<\/code> (drapeau signalant les erreurs d&rsquo;ex\u00e9cution).<\/p>\n<p>Le cycle de vie du PDV ob\u00e9it \u00e0 un algorithme immuable : initialisation de l&rsquo;espace m\u00e9moire, lecture des valeurs depuis la table d&rsquo;entr\u00e9e, ex\u00e9cution s\u00e9quentielle des instructions de manipulation ligne par ligne, \u00e9criture automatique de l&rsquo;\u00e9tat final du vecteur dans la table de destination, puis r\u00e9initialisation des variables non conserv\u00e9es avant l&rsquo;it\u00e9ration suivante. Dans cette dynamique, les instructions conditionnelles jouent le r\u00f4le de sentinelles. Lorsqu&rsquo;une instruction de suppression est rencontr\u00e9e, le compilateur court-circuite le flux d&rsquo;ex\u00e9cution standard avant que l&rsquo;ordre d&rsquo;\u00e9criture sur disque ne soit \u00e9mis.<\/p>\n<p>L&rsquo;\u00e9valuation des pr\u00e9dicats s&rsquo;op\u00e8re donc directement sur les valeurs instanci\u00e9es au sein du PDV \u00e0 un instant <em>t<\/em>. Si les valeurs pr\u00e9sentes dans cette m\u00e9moire tampon satisfont aux crit\u00e8res d&rsquo;exclusion d\u00e9finis par le d\u00e9veloppeur, le destin de l&rsquo;observation courante bascule instantan\u00e9ment, garantissant que les donn\u00e9es non d\u00e9sir\u00e9es ne franchiront jamais la barri\u00e8re de persistance du jeu de donn\u00e9es final.<\/p>\n<h3>2.2 S\u00e9mantique et fonctionnement de l&rsquo;instruction DELETE<\/h3>\n<p>L&rsquo;instruction <code>DELETE<\/code> est l&rsquo;outil programmatique d\u00e9di\u00e9 par excellence \u00e0 l&rsquo;interruption du traitement de l&rsquo;enregistrement en cours au sein de l&rsquo;\u00e9tape DATA. Sa s\u00e9mantique op\u00e9rationnelle est radicale mais \u00e9l\u00e9gante : lorsqu&rsquo;une clause conditionnelle formul\u00e9e sous la structure <code>IF condition THEN DELETE;<\/code> est \u00e9valu\u00e9e \u00e0 vrai (soit une valeur bool\u00e9enne diff\u00e9rente de z\u00e9ro et non manquante en langage SAS), l&rsquo;ex\u00e9cution de l&rsquo;\u00e9tape DATA pour l&rsquo;it\u00e9ration courante s&rsquo;interrompt imm\u00e9diatement.<\/p>\n<p>Cette interruption signifie que toutes les instructions subs\u00e9quentes situ\u00e9es en aval de l&rsquo;instruction <code>DELETE<\/code> dans le corps de l&rsquo;\u00e9tape DATA sont purement et simplement ignor\u00e9es pour cette observation sp\u00e9cifique. Plus fondamentalement encore, l&rsquo;action automatique d&rsquo;\u00e9criture de fin de boucle \u2014 qui transf\u00e8re le contenu du PDV vers le fichier de donn\u00e9es physique sur disque \u2014 est court-circuit\u00e9e. La ligne pr\u00e9sente dans le tampon m\u00e9moire est ainsi \u00e9cart\u00e9e sans laisser de trace dans la table r\u00e9ceptrice.<\/p>\n<p>Simultan\u00e9ment \u00e0 ce rejet, le pointeur d&rsquo;ex\u00e9cution du syst\u00e8me SAS est r\u00e9initialis\u00e9 et renvoy\u00e9 \u00e0 la ligne sup\u00e9rieure de l&rsquo;\u00e9tape DATA pour amorcer l&rsquo;it\u00e9ration suivante (correspondant \u00e0 l&rsquo;incr\u00e9mentation de la variable automatique <code>_N_<\/code>). Le PDV est alors r\u00e9initialis\u00e9 conform\u00e9ment aux attributs des variables, et l&rsquo;enregistrement suivant est extrait de la table source. Il s&rsquo;agit donc d&rsquo;une suppression pr\u00e9ventive de la persistance, agissant comme un r\u00e9gulateur de flux au c\u0153ur du moteur de traitement.<\/p>\n<h3>2.3 Diff\u00e9rences fondamentales entre DELETE, OUTPUT implicite et STOP<\/h3>\n<p>Une confusion fr\u00e9quente chez les programmeurs SAS d\u00e9butants ou interm\u00e9diaires r\u00e9side dans la distinction entre les instructions <code>DELETE<\/code>, <code>OUTPUT<\/code> et <code>STOP<\/code>, qui gouvernent toutes le flux d&rsquo;ex\u00e9cution s\u00e9quentiel mais selon des desseins totalement divergents. Par d\u00e9faut, une \u00e9tape DATA applique un m\u00e9canisme d&rsquo;<strong>OUTPUT implicite<\/strong> : en l&rsquo;absence de commande d&rsquo;\u00e9criture sp\u00e9cifique, le syst\u00e8me ex\u00e9cute une instruction <code>OUTPUT<\/code> invisible juste avant l&rsquo;instruction <code>RUN;<\/code>, garantissant que chaque ligne lue et trait\u00e9e soit transcrite dans la table de sortie. L&rsquo;instruction <code>DELETE<\/code> a pr\u00e9cis\u00e9ment pour fonction d&rsquo;annuler cet <code>OUTPUT<\/code> implicite pour l&rsquo;it\u00e9ration courante.<\/p>\n<p>\u00c0 l&rsquo;inverse, d\u00e8s lors qu&rsquo;un d\u00e9veloppeur ins\u00e8re une instruction <code>OUTPUT<\/code> explicite dans le code, le comportement par d\u00e9faut est d\u00e9sactiv\u00e9. Dans cette configuration, seules les observations explicitement d\u00e9sign\u00e9es par l&rsquo;instruction <code>OUTPUT<\/code> sont \u00e9crites. Par cons\u00e9quent, l&rsquo;utilisation de <code>DELETE<\/code> devient conceptuellement redondante ou contradictoire dans une architecture r\u00e9gie par des <code>OUTPUT<\/code> conditionnels explicites, o\u00f9 la non-ex\u00e9cution de l&rsquo;instruction d&rsquo;\u00e9criture \u00e9quivaut structurellement \u00e0 une suppression.<\/p>\n<p>Enfin, l&rsquo;instruction <code>STOP<\/code> op\u00e8re \u00e0 une \u00e9chelle radicalement diff\u00e9rente. Alors que <code>DELETE<\/code> se contente d&rsquo;\u00e9carter l&rsquo;observation courante pour passer imm\u00e9diatement \u00e0 la suivante, <code>STOP<\/code> ordonne l&rsquo;interruption compl\u00e8te, imm\u00e9diate et d\u00e9finitive de l&rsquo;\u00e9tape DATA globale. L&rsquo;utilisation de <code>STOP<\/code> fige la table de sortie dans son \u00e9tat courant, emp\u00eache la lecture de toutes les observations restantes dans le jeu de donn\u00e9es d&rsquo;entr\u00e9e et force la cl\u00f4ture abrupte du programme. Il s&rsquo;agit d&rsquo;une instruction de contr\u00f4le d&rsquo;urgence ou de terminaison pr\u00e9matur\u00e9e sur condition critique, qui ne saurait \u00eatre substitu\u00e9e \u00e0 une instruction d&rsquo;\u00e9puration s\u00e9lective comme <code>DELETE<\/code>.<\/p>\n<h2>3. Mise en place de l&rsquo;environnement : le jeu de donn\u00e9es de r\u00e9f\u00e9rence<\/h2>\n<h3>3.1 Cr\u00e9ation du jeu de donn\u00e9es synth\u00e9tique original_data<\/h3>\n<p>Afin de fournir une assise empirique indiscutable et directement reproductible \u00e0 nos d\u00e9veloppements m\u00e9thodologiques, nous \u00e9tablissons un environnement exp\u00e9rimental contr\u00f4l\u00e9 reposant sur la cr\u00e9ation d&rsquo;un jeu de donn\u00e9es synth\u00e9tique baptis\u00e9 <code>original_data<\/code>. Ce tableau condense les dimensions classiques rencontr\u00e9es dans des probl\u00e9matiques r\u00e9elles de gestion ou d&rsquo;analyse sportive, tout en conservant une taille matricielle r\u00e9duite autorisant un suivi pas \u00e0 pas des transformations au sein du PDV.<\/p>\n<p>La structure de cette table est initi\u00e9e via l&rsquo;instruction <code>DATA original_data;<\/code>, suivie de la directive d&rsquo;entr\u00e9e <code>INPUT<\/code> qui d\u00e9finit la topologie des colonnes. Nous instancions trois variables aux caract\u00e9ristiques compl\u00e9mentaires :<\/p>\n<ul>\n<li><code>team<\/code> : une variable alphanum\u00e9rique (mat\u00e9rialis\u00e9e par le modificateur de type <code>$<\/code>) repr\u00e9sentant l&rsquo;entit\u00e9 organisationnelle d&rsquo;appartenance d&rsquo;un athl\u00e8te (modalit\u00e9s &lsquo;A&rsquo; ou &lsquo;B&rsquo;).<\/li>\n<li><code>position<\/code> : une variable alphanum\u00e9rique (\u00e9galement typ\u00e9e <code>$<\/code>) d\u00e9signant le r\u00f4le tactique assign\u00e9 sur le terrain (&lsquo;Guard&rsquo;, &lsquo;Forward&rsquo;, ou &lsquo;Center&rsquo;).<\/li>\n<li><code>points<\/code> : une variable quantitative discr\u00e8te, cod\u00e9e sous format num\u00e9rique standard, enregistrant le volume cumul\u00e9 d&rsquo;unit\u00e9s de score valid\u00e9es par le sujet.<\/li>\n<\/ul>\n<p>L&rsquo;int\u00e9gration des donn\u00e9es brutes au sein m\u00eame du script est concr\u00e9tis\u00e9e par le bloc <code>DATALINES;<\/code> (ou <code>CARDS;<\/code> selon les conventions historiques), permettant au compilateur de charger une matrice de huit observations repr\u00e9sentatives directement dans la m\u00e9moire de traitement. Le script de cr\u00e9ation s&rsquo;articule comme suit :<\/p>\n<p><!-- Insertion du bloc de code textuel via paragraphes stylis\u00e9s --><\/p>\n<p><strong>Programme d&rsquo;initialisation du jeu de donn\u00e9es d&rsquo;origine :<\/strong><\/p>\n<p><code>data original_data;<br \/>\n&nbsp;&nbsp;input team $ position $ points;<br \/>\n&nbsp;&nbsp;datalines;<br \/>\nA Guard 14<br \/>\nA Guard 8<br \/>\nA Forward 22<br \/>\nA Forward 30<br \/>\nB Guard 24<br \/>\nB Guard 12<br \/>\nB Forward 18<br \/>\nB Center 10<br \/>\n;<br \/>\nrun;<\/code><\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/delete1.jpg\" alt=\"\" \/><\/figure>\n<h3>3.2 Inspection pr\u00e9liminaire des donn\u00e9es avec PROC PRINT<\/h3>\n<p>L&rsquo;int\u00e9grit\u00e9 de la table synth\u00e9tique doit faire l&rsquo;objet d&rsquo;une validation visuelle et programmatique syst\u00e9matique avant l&rsquo;application de tout filtre destructif ou transformateur. Sous l&rsquo;environnement SAS, la proc\u00e9dure de diagnostic imm\u00e9diat la plus \u00e9l\u00e9mentaire et la plus \u00e9prouv\u00e9e demeure la proc\u00e9dure d&rsquo;affichage <code>PROC PRINT<\/code>. Cette derni\u00e8re permet de transcrire directement vers le gestionnaire de sortie (<em>Output Delivery System<\/em> ou ODS) l&rsquo;int\u00e9gralit\u00e9 du contenu tabulaire du jeu de donn\u00e9es cibl\u00e9.<\/p>\n<p>L&rsquo;ex\u00e9cution de la s\u00e9quence d&rsquo;instructions suivante permet d&rsquo;\u00e9diter la structure primaire :<\/p>\n<p><code>proc print data=original_data;<br \/>\nrun;<\/code><\/p>\n<p>Cette instruction g\u00e9n\u00e8re un compte rendu standardis\u00e9 comportant neuf colonnes d&rsquo;affichage, dont la colonne technique implicite <code>Obs<\/code> servant d&rsquo;identifiant ordinal d&rsquo;affichage (num\u00e9rotation s\u00e9quentielle de 1 \u00e0 8). L&rsquo;inspection de cette \u00e9dition confirme que l&rsquo;\u00e9quipe &lsquo;A&rsquo; rassemble quatre athl\u00e8tes : deux au poste de &lsquo;Guard&rsquo; (affichant respectivement 14 et 8 points) et deux au poste de &lsquo;Forward&rsquo; (enregistrant des scores notables de 22 et 30 points). Parall\u00e8lement, l&rsquo;\u00e9quipe &lsquo;B&rsquo; pr\u00e9sente un effectif \u00e9quivalent de quatre individus distribu\u00e9s sur trois r\u00f4les tactiques distincts : deux &lsquo;Guard&rsquo; (24 et 12 points), un &lsquo;Forward&rsquo; (18 points) et un &lsquo;Center&rsquo; (10 points).<\/p>\n<p>Cette distribution bimodale parfaitement \u00e9quilibr\u00e9e entre les \u00e9quipes, coupl\u00e9e \u00e0 une dispersion contr\u00f4l\u00e9e des scores continus, offre un terrain d&rsquo;investigation id\u00e9al pour \u00e9valuer la pr\u00e9cision chirurgicale de nos r\u00e8gles d&rsquo;\u00e9limination ult\u00e9rieures.<\/p>\n<h3>3.3 Objectifs p\u00e9dagogiques des cas d&rsquo;usage illustratifs<\/h3>\n<p>La s\u00e9lection rigoureuse de ces huit enregistrements n&rsquo;est pas fortuite ; elle ob\u00e9it \u00e0 une architecture p\u00e9dagogique pens\u00e9e pour d\u00e9montrer sans ambigu\u00eft\u00e9 les trois comportements cardinaux de l&rsquo;instruction <code>DELETE<\/code>. Chaque cas d&rsquo;usage mobilisera un prisme logique particulier visant \u00e0 sculpter la table d&rsquo;origine afin d&rsquo;isoler des sous-populations sp\u00e9cifiques.<\/p>\n<p>L&rsquo;objectif sous-jacent consiste \u00e0 fournir une d\u00e9monstration empirique de la r\u00e9duction de dimensionnalit\u00e9 des lignes, tout en sensibilisant le lecteur aux invariants structurels : quelles que soient les lignes retranch\u00e9es, l&rsquo;int\u00e9grit\u00e9 typologique et s\u00e9mantique des colonnes (variables <code>team<\/code>, <code>position<\/code>, <code>points<\/code>) demeure inalt\u00e9r\u00e9e. En instaurant une base comparative unifi\u00e9e sur ce jeu de donn\u00e9es commun, les variations de syntaxe permettront de mettre en lumi\u00e8re avec une clart\u00e9 absolue le m\u00e9canisme intime de dissociation entre conditions conjonctives et disjonctives.<\/p>\n<h2>4. M\u00e9thode 1 : Suppression de lignes selon une condition unique<\/h2>\n<h3>4.1 Formulation syntaxique de la condition simple IF-THEN DELETE<\/h3>\n<p>La formulation syntaxique de la suppression conditionnelle simple constitue la brique de base de la manipulation de flux dans l&rsquo;\u00e9tape DATA. Elle s&rsquo;articule autour de la syntaxe \u00e9l\u00e9mentaire :<\/p>\n<p><code>IF variable = valeur THEN DELETE;<\/code><\/p>\n<p>D&rsquo;un point de vue grammatical, cette structure se d\u00e9compose en trois \u00e9l\u00e9ments cl\u00e9s. D&rsquo;abord, le mot-cl\u00e9 <code>IF<\/code>, qui amorce l&rsquo;\u00e9valuation d&rsquo;un pr\u00e9dicat relationnel. Ensuite, l&rsquo;expression de comparaison, qui confronte le contenu de la variable courante charg\u00e9e dans le PDV \u00e0 une constante litt\u00e9rale ou num\u00e9rique via un op\u00e9rateur d&rsquo;\u00e9galit\u00e9 (symbolis\u00e9 par <code>=<\/code> ou par le mn\u00e9monique standard <code>EQ<\/code>). Enfin, la proposition cons\u00e9cutive <code>THEN<\/code>, imm\u00e9diatement subordonn\u00e9e \u00e0 l&rsquo;action d&rsquo;interruption <code>DELETE<\/code>.<\/p>\n<p>Il est fondamental de rappeler la stricte sensibilit\u00e9 \u00e0 la casse (majuscules et minuscules) ainsi que la gestion rigoureuse de la typologie des cha\u00eenes de caract\u00e8res au sein de l&rsquo;interpr\u00e9teur SAS. Si la variable cible est de type caract\u00e8re, la constante comparative doit obligatoirement \u00eatre encapsul\u00e9e entre apostrophes simples ou guillemets doubles. Une incoh\u00e9rence dans le respect de la casse (par exemple tester <code>team = 'a'<\/code> au lieu de <code>team = 'A'<\/code>) se solderait in\u00e9vitablement par un \u00e9chec silencieux : aucune condition n&rsquo;\u00e9tant jamais valid\u00e9e, aucune suppression ne serait op\u00e9r\u00e9e, sans que le compilateur ne g\u00e9n\u00e8re pour autant le moindre message d&rsquo;erreur syntaxique.<\/p>\n<h3>4.2 Exemple 1 : \u00c9limination cibl\u00e9e des observations de l&rsquo;\u00e9quipe A<\/h3>\n<p>Pour illustrer ce premier paradigme, nous formulons une r\u00e8gle d&rsquo;exclusion d\u00e9terministe radicale : nous souhaitons purger int\u00e9gralement l&rsquo;\u00e9chantillon de toute pr\u00e9sence d&rsquo;\u00e9l\u00e9ments affili\u00e9s \u00e0 l&rsquo;\u00e9quipe &lsquo;A&rsquo;. Cette op\u00e9ration revient \u00e0 cr\u00e9er une table d\u00e9riv\u00e9e, baptis\u00e9e conventionnellement <code>new_data<\/code>, qui contiendra exclusivement les lignes appartenant aux structures concurrentes.<\/p>\n<p>Le code SAS permettant d&rsquo;op\u00e9rer cette transformation se d\u00e9ploie selon l&rsquo;encha\u00eenement canonique suivant :<\/p>\n<p><code>data new_data;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;if team = 'A' then delete;<br \/>\nrun;<\/code><\/p>\n<p>Lors de la soumission de ce bloc, le superviseur SAS initialise l&rsquo;\u00e9tape DATA. L&rsquo;instruction <code>set original_data;<\/code> \u00e9tablit le canal d&rsquo;entr\u00e9e en lecture s\u00e9quentielle vers notre table synth\u00e9tique. Pour chacune des huit observations, les variables sont copi\u00e9es dans le PDV. Arriv\u00e9 \u00e0 la ligne 3, le processeur \u00e9value l&rsquo;\u00e9galit\u00e9 logique. Pour les observations 1 \u00e0 4, la variable <code>team<\/code> contenant la cha\u00eene de caract\u00e8res &lsquo;A&rsquo;, l&rsquo;expression bool\u00e9enne renvoie la valeur 1 (vrai). L&rsquo;instruction <code>DELETE<\/code> est alors ex\u00e9cut\u00e9e imm\u00e9diatement. Le reste de l&rsquo;\u00e9tape est ignor\u00e9, aucune \u00e9criture ne survient dans <code>new_data<\/code>, et le syst\u00e8me passe \u00e0 l&rsquo;it\u00e9ration suivante.<\/p>\n<p>L&rsquo;examen minutieux du journal d&rsquo;ex\u00e9cution (<em>SAS Log<\/em>) fournit la confirmation formelle de cette dynamique m\u00e9canique, en affichant des m\u00e9triques d&rsquo;I\/O explicites : le journal atteste formellement que 8 observations ont \u00e9t\u00e9 lues depuis la table <code>ORIGINAL_DATA<\/code>, tandis que la table <code>NEW_DATA<\/code> n&rsquo;en a enregistr\u00e9 que 4 en sortie physique.<\/p>\n<h3>4.3 Analyse empirique et validation du jeu de donn\u00e9es r\u00e9sultant<\/h3>\n<p>L&rsquo;attestation programmatique d\u00e9livr\u00e9e par le journal doit \u00eatre corrobor\u00e9e par une inspection directe du contenu de la table <code>new_data<\/code> au moyen de la proc\u00e9dure <code>PROC PRINT<\/code> :<\/p>\n<p><code>proc print data=new_data;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de cette proc\u00e9dure dresse le tableau r\u00e9capitulatif des donn\u00e9es persistantes. Le r\u00e9sultat affich\u00e9 confirme la conformit\u00e9 totale de la transformation avec les sp\u00e9cifications analytiques requises :<\/p>\n<p>Seules subsistent les quatre lignes rattach\u00e9es originellement \u00e0 l&rsquo;\u00e9quipe &lsquo;B&rsquo; : les deux profils de &lsquo;Guard&rsquo; (comptabilisant 24 et 12 points), le profil de &lsquo;Forward&rsquo; (18 points) ainsi que l&rsquo;unique profil de &lsquo;Center&rsquo; (10 points). La colonne <code>Obs<\/code> du rapport de sortie r\u00e9assigne une num\u00e9rotation continue de 1 \u00e0 4 \u00e0 ces observations conserv\u00e9es, soulignant ainsi la cr\u00e9ation d&rsquo;un index d&rsquo;affichage s\u00e9quentiel propre \u00e0 la nouvelle entit\u00e9 de stockage.<\/p>\n<p>Il est \u00e0 noter que l&rsquo;op\u00e9ration s&rsquo;est d\u00e9roul\u00e9e sans aucune alt\u00e9ration transversale : les colonnes <code>position<\/code> et <code>points<\/code> de chaque enregistrement de l&rsquo;\u00e9quipe &lsquo;B&rsquo; ont conserv\u00e9 leur valeur exacte, d\u00e9montrant l&rsquo;ind\u00e9pendance dimensionnelle du filtrage de lignes par rapport \u00e0 l&rsquo;int\u00e9grit\u00e9 vectorielle des colonnes conserv\u00e9es.<\/p>\n<h2>5. M\u00e9thode 2 : Suppression de lignes selon plusieurs conditions cumulatives<\/h2>\n<h3>5.1 Logique conjonctive et utilisation de l&rsquo;op\u00e9rateur AND<\/h3>\n<p>Dans la pratique analytique avanc\u00e9e, l&rsquo;exclusion d&rsquo;enregistrements requiert fr\u00e9quemment la prise en compte de contextes multidimensionnels. L&rsquo;\u00e9limination m\u00e9canique sur un crit\u00e8re binaire unique s&rsquo;av\u00e8re souvent trop grossi\u00e8re, risquant d&rsquo;\u00e9liminer des donn\u00e9es pr\u00e9cieuses qui ne pr\u00e9senteraient pas de dysfonctionnement global. C&rsquo;est ici qu&rsquo;intervient la logique conjonctive, mat\u00e9rialis\u00e9e dans le langage de programmation SAS par l&rsquo;op\u00e9rateur bool\u00e9en <code>AND<\/code> (ou son \u00e9quivalent symbolique <code>&amp;<\/code>).<\/p>\n<p>Sur le plan formel de l&rsquo;alg\u00e8bre bool\u00e9enne, l&rsquo;op\u00e9rateur <code>AND<\/code> formalise une intersection logique stricte entre deux ou plusieurs propositions propositionnelles. La table de v\u00e9rit\u00e9 associ\u00e9e stipule que l&rsquo;expression globale <code>(Proposition_1 AND Proposition_2)<\/code> ne peut \u00eatre \u00e9valu\u00e9e \u00e0 l&rsquo;\u00e9tat vrai que si et seulement si <strong>chacune<\/strong> des sous-propositions \u00e9l\u00e9mentaires est elle-m\u00eame rigoureusement vraie. D\u00e8s lors que l&rsquo;un quelconque des pr\u00e9dicats s&rsquo;av\u00e8re faux, l&rsquo;expression enti\u00e8re bascule \u00e0 l&rsquo;\u00e9tat faux (0 dans l&rsquo;arithm\u00e9tique logique de SAS).<\/p>\n<p>Dans le cadre de l&rsquo;instruction <code>IF condition_1 AND condition_2 THEN DELETE;<\/code>, l&rsquo;action d&rsquo;\u00e9limination de la ligne courante est donc soumise \u00e0 une contrainte de d\u00e9clenchement particuli\u00e8rement restrictive. Une observation \u00e9chappera \u00e0 la suppression d\u00e8s lors qu&rsquo;elle manquera de satisfaire ne serait-ce qu&rsquo;un seul des crit\u00e8res formul\u00e9s dans la cha\u00eene conjonctive. Par ailleurs, il convient de souligner que SAS applique les r\u00e8gles standards de pr\u00e9s\u00e9ance des op\u00e9rateurs logiques et arithm\u00e9tiques, les op\u00e9rateurs de comparaison relationnelle (tels que <code>=<\/code>, <code>&lt;<\/code>, <code>&gt;=<\/code>) poss\u00e9dant une priorit\u00e9 d&rsquo;\u00e9valuation sup\u00e9rieure \u00e0 celle des op\u00e9rateurs bool\u00e9ens de liaison.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/delete2.jpg\" alt=\"\" \/><\/figure>\n<h3>5.2 Exemple 2 : Suppression bas\u00e9e sur l&rsquo;appartenance \u00e0 l&rsquo;\u00e9quipe et un seuil m\u00e9trique<\/h3>\n<p>Consid\u00e9rons \u00e0 pr\u00e9sent un cas d&rsquo;usage o\u00f9 la r\u00e8gle d&rsquo;\u00e9puration affine consid\u00e9rablement le niveau de s\u00e9lection. Supposons que le protocole de recherche n&rsquo;impose plus d&rsquo;exclure indistinctement tous les membres de l&rsquo;\u00e9quipe &lsquo;A&rsquo;, mais uniquement ceux dont le rendement offensif est jug\u00e9 insuffisant, mat\u00e9rialis\u00e9 par un total de points strictement inf\u00e9rieur au seuil de 20 unit\u00e9s. Les athl\u00e8tes hautement performants de l&rsquo;\u00e9quipe &lsquo;A&rsquo; doivent en revanche imp\u00e9rativement demeurer au sein de la cohorte d&rsquo;analyse, tout comme l&rsquo;int\u00e9gralit\u00e9 du personnel composant l&rsquo;\u00e9quipe &lsquo;B&rsquo;.<\/p>\n<p>Le d\u00e9ploiement de cette r\u00e8gle conjonctive s&rsquo;op\u00e8re par le script d&rsquo;\u00e9tape DATA suivant :<\/p>\n<p><code>data new_data;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;if team = 'A' and points &lt; 20 then delete;<br \/>\nrun;<\/code><\/p>\n<p>Analysons pas \u00e0 pas le d\u00e9roulement algorithmique au sein du PDV lors de la lecture des enregistrements de <code>original_data<\/code> :<\/p>\n<ul>\n<li><strong>Observation 1 (&lsquo;A&rsquo;, &lsquo;Guard&rsquo;, 14) :<\/strong> <code>team = 'A'<\/code> est VRAI ; <code>points &lt; 20<\/code> (14 &lt; 20) est VRAI. VRAI AND VRAI donne VRAI. L&rsquo;instruction <code>DELETE<\/code> est d\u00e9clench\u00e9e. La ligne est \u00e9cart\u00e9e.<\/li>\n<li><strong>Observation 2 (&lsquo;A&rsquo;, &lsquo;Guard&rsquo;, 8) :<\/strong> <code>team = 'A'<\/code> est VRAI ; <code>points &lt; 20<\/code> (8 &lt; 20) est VRAI. D\u00e9clenchement de <code>DELETE<\/code>. La ligne est \u00e9cart\u00e9e.<\/li>\n<li><strong>Observation 3 (&lsquo;A&rsquo;, &lsquo;Forward&rsquo;, 22) :<\/strong> <code>team = 'A'<\/code> est VRAI ; <code>points &lt; 20<\/code> (22 &lt; 20) est FAUX. VRAI AND FAUX donne FAUX. L&rsquo;instruction <code>DELETE<\/code> est court-circuit\u00e9e. L&rsquo;observation poursuit son cycle et fait l&rsquo;objet d&rsquo;un <code>OUTPUT<\/code> implicite vers la table r\u00e9ceptrice.<\/li>\n<li><strong>Observation 4 (&lsquo;A&rsquo;, &lsquo;Forward&rsquo;, 30) :<\/strong> <code>team = 'A'<\/code> est VRAI ; <code>points &lt; 20<\/code> (30 &lt; 20) est FAUX. VRAI AND FAUX donne FAUX. Pr\u00e9servation et \u00e9criture de la ligne.<\/li>\n<li><strong>Observations 5 \u00e0 8 (\u00c9quipe &lsquo;B&rsquo;) :<\/strong> Pour l&rsquo;ensemble de ces enregistrements, le premier pr\u00e9dicat <code>team = 'A'<\/code> est \u00e9valu\u00e9 \u00e0 FAUX. Par cons\u00e9quent, en vertu du principe de court-circuit logique (<em>short-circuit evaluation<\/em>), le compilateur n&rsquo;a m\u00eame pas besoin de valider le niveau de la variable <code>points<\/code> : l&rsquo;expression globale est irr\u00e9m\u00e9diablement FAUSSE. L&rsquo;instruction <code>DELETE<\/code> n&rsquo;est jamais activ\u00e9e, et toutes les observations de l&rsquo;\u00e9quipe &lsquo;B&rsquo; sont int\u00e9gralement transf\u00e9r\u00e9es vers <code>new_data<\/code>.<\/li>\n<\/ul>\n<h3>5.3 V\u00e9rification statistique des exclusions et des r\u00e9tentions<\/h3>\n<p>L&rsquo;application d&rsquo;un contr\u00f4le de conformit\u00e9 via l&rsquo;ex\u00e9cution de la proc\u00e9dure standardis\u00e9e :<\/p>\n<p><code>proc print data=new_data;<br \/>\nrun;<\/code><\/p>\n<p>permet de certifier la justesse de l&rsquo;op\u00e9ration. L&rsquo;\u00e9dition r\u00e9sultante met en \u00e9vidence une table r\u00e9siduelle comportant tr\u00e8s exactement 6 observations sur les 8 pr\u00e9sentes initialement.<\/p>\n<p>Le jeu de donn\u00e9es \u00e9pur\u00e9 consigne en son sein :<\/p>\n<ol>\n<li>L&rsquo;observation num\u00e9ro 3 d&rsquo;origine : l&rsquo;athl\u00e8te &lsquo;Forward&rsquo; de l&rsquo;\u00e9quipe &lsquo;A&rsquo; affichant 22 points.<\/li>\n<li>L&rsquo;observation num\u00e9ro 4 d&rsquo;origine : l&rsquo;athl\u00e8te &lsquo;Forward&rsquo; de l&rsquo;\u00e9quipe &lsquo;A&rsquo; affichant 30 points.<\/li>\n<li>Les quatre observations compl\u00e8tes rattach\u00e9es \u00e0 l&rsquo;\u00e9quipe &lsquo;B&rsquo;, incluant notamment le joueur &lsquo;Guard&rsquo; cumulant seulement 12 points ainsi que le joueur &lsquo;Center&rsquo; cr\u00e9dit\u00e9 de 10 points.<\/li>\n<\/ol>\n<p>Ce r\u00e9sultat d\u00e9montre la robustesse de l&rsquo;op\u00e9rateur <code>AND<\/code> : bien que des membres de l&rsquo;\u00e9quipe &lsquo;B&rsquo; pr\u00e9sentent des volumes de points inf\u00e9rieurs au seuil de 20, leur non-satisfaction de la clause <code>team = 'A'<\/code> les a totalement immunis\u00e9s contre la directive d&rsquo;exclusion. Seul le noyau pr\u00e9cis d&rsquo;individus cumulant les deux handicaps a \u00e9t\u00e9 purg\u00e9 de la structure finale.<\/p>\n<h2>6. M\u00e9thode 3 : Suppression de lignes selon une condition disjonctive<\/h2>\n<h3>6.1 Logique disjonctive et utilisation de l&rsquo;op\u00e9rateur OR<\/h3>\n<p>Le troisi\u00e8me axe m\u00e9thodologique aborde la suppression sous l&rsquo;angle de la r\u00e9union logique, formalis\u00e9e par l&rsquo;op\u00e9rateur disjonctif <code>OR<\/code> (ou son pendant symbolique la barre verticale <code>|<\/code>, voire le point d&rsquo;exclamation selon les tables de caract\u00e8res r\u00e9gionales). La logique disjonctive op\u00e8re un renversement complet du filtre de s\u00e9curit\u00e9 par rapport \u00e0 la logique conjonctive \u00e9tudi\u00e9e pr\u00e9c\u00e9demment.<\/p>\n<p>Dans l&rsquo;univers des propositions bool\u00e9ennes, l&rsquo;\u00e9nonc\u00e9 <code>(Condition_A OR Condition_B)<\/code> est \u00e9valu\u00e9 \u00e0 VRAI d\u00e8s lors qu&rsquo;<strong>au moins une<\/strong> des conditions constituantes est satisfaite. La seule et unique configuration menant \u00e0 un r\u00e9sultat global faux requiert l&rsquo;invalidation simultan\u00e9e et absolue de toutes les conditions test\u00e9es. Appliqu\u00e9 \u00e0 une instruction <code>DELETE<\/code>, l&rsquo;op\u00e9rateur <code>OR<\/code> d\u00e9ploie une puissance de suppression maximale : il suffit qu&rsquo;une ligne pr\u00e9sente une anomalie isol\u00e9e ou r\u00e9ponde \u00e0 un seul crit\u00e8re de non-conformit\u00e9 pour \u00eatre imm\u00e9diatement \u00e9ject\u00e9e du traitement.<\/p>\n<p>Cette grande permissivit\u00e9 dans le d\u00e9clenchement de la suppression expose toutefois l&rsquo;ing\u00e9nieur \u00e0 des d\u00e9rives m\u00e9thodologiques s\u00e9v\u00e8res d\u00e9sign\u00e9es sous le terme d&rsquo;<strong>hyper-filtrage<\/strong>. Si la formulation d&rsquo;un filtre disjonctif manque de discernement, de vastes pans de donn\u00e9es parfaitement exploitables peuvent \u00eatre d\u00e9truits accidentellement. Il est donc recommand\u00e9 d&rsquo;exercer une vigilance extr\u00eame lors de l&rsquo;assemblage de multiples clauses <code>OR<\/code> au sein d&rsquo;une m\u00eame \u00e9tape DATA.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/delete3.jpg\" alt=\"\" \/><\/figure>\n<h3>6.2 Exemple 3 : \u00c9limination par modalit\u00e9 cat\u00e9gorielle ou seuil num\u00e9rique<\/h3>\n<p>Afin de mettre en exergue les effets radicaux d&rsquo;une clause disjonctive, nous formulons la r\u00e8gle de gestion suivante : nous ordonnons la suppression de toute observation qui appartient soit \u00e0 l&rsquo;\u00e9quipe &lsquo;A&rsquo; (ind\u00e9pendamment de son volume de points), SOIT qui pr\u00e9sente un total de points strictement inf\u00e9rieur \u00e0 15 (quelle que soit son affiliation d&rsquo;\u00e9quipe).<\/p>\n<p>Le code d&rsquo;impl\u00e9mentation de cette \u00e9tape DATA se formalise comme suit :<\/p>\n<p><code>data new_data;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;if team = 'A' or points &lt; 15 then delete;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de ce script soumet chaque ligne du jeu de donn\u00e9es <code>original_data<\/code> \u00e0 une double grille de lecture implacable :<\/p>\n<ul>\n<li><strong>Secteur de l&rsquo;\u00e9quipe &lsquo;A&rsquo; (Observations 1 \u00e0 4) :<\/strong> Pour ces quatre lignes, le premier terme de la disjonction (<code>team = 'A'<\/code>) est irr\u00e9vocablement VRAI. En cons\u00e9quence, l&rsquo;instruction <code>DELETE<\/code> s&rsquo;ex\u00e9cute de fa\u00e7on inconditionnelle sans m\u00eame solliciter l&rsquo;examen de la valeur de la variable <code>points<\/code>. Ainsi, les joueurs &lsquo;Forward&rsquo; cr\u00e9dit\u00e9s de 22 et 30 points, qui avaient \u00e9t\u00e9 pr\u00e9serv\u00e9s lors de l&rsquo;application de la m\u00e9thode 2, sont ici impitoyablement exclus du jeu de sortie.<\/li>\n<li><strong>Secteur de l&rsquo;\u00e9quipe &lsquo;B&rsquo; (Observations 5 \u00e0 8) :<\/strong> Pour ces lignes, le pr\u00e9dicat cat\u00e9goriel <code>team = 'A'<\/code> renvoie la valeur FAUX. L&rsquo;\u00e9valuation se poursuit donc n\u00e9cessairement sur le second membre de la disjonction : le pr\u00e9dicat m\u00e9trique <code>points &lt; 15<\/code>.\n<ul>\n<li>L&rsquo;observation 5 (Guard, 24 points) pr\u00e9sente <code>points &lt; 15<\/code> FAUX. FAUX OR FAUX aboutit \u00e0 FAUX. L&rsquo;observation survit et est inscrite dans la table finale.<\/li>\n<li>L&rsquo;observation 6 (Guard, 12 points) pr\u00e9sente <code>points &lt; 15<\/code> VRAI. FAUX OR VRAI aboutit \u00e0 VRAI. L&rsquo;instruction <code>DELETE<\/code> est appel\u00e9e : la ligne est supprim\u00e9e.<\/li>\n<li>L&rsquo;observation 7 (Forward, 18 points) pr\u00e9sente <code>points &lt; 15<\/code> FAUX. FAUX OR FAUX aboutit \u00e0 FAUX. L&rsquo;observation est conserv\u00e9e.<\/li>\n<li>L&rsquo;observation 8 (Center, 10 points) pr\u00e9sente <code>points &lt; 15<\/code> VRAI. FAUX OR VRAI aboutit \u00e0 VRAI. D\u00e9clenchement de <code>DELETE<\/code> : la ligne est supprim\u00e9e.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>6.3 \u00c9valuation comparative des r\u00e9sultats d&rsquo;extraction<\/h3>\n<p>L&rsquo;\u00e9dition finale du contenu de la table r\u00e9sultante via <code>PROC PRINT<\/code> r\u00e9v\u00e8le l&rsquo;ampleur de la contraction dimensionnelle op\u00e9r\u00e9e :<\/p>\n<p><code>proc print data=new_data;<br \/>\nrun;<\/code><\/p>\n<p>Le rapport synth\u00e9tique confirme que la table <code>new_data<\/code> est d\u00e9sormais r\u00e9duite \u00e0 seulement <strong>deux observations<\/strong> :<\/p>\n<ol>\n<li>L&rsquo;observation correspondant au joueur &lsquo;Guard&rsquo; de l&rsquo;\u00e9quipe &lsquo;B&rsquo; totalisant 24 points.<\/li>\n<li>L&rsquo;observation relative au joueur &lsquo;Forward&rsquo; de l&rsquo;\u00e9quipe &lsquo;B&rsquo; totalisant 18 points.<\/li>\n<\/ol>\n<p>Cette visualisation met en lumi\u00e8re la cartographie de l&rsquo;espace \u00e9chantillonnal r\u00e9siduel post-filtrage. La clause <code>OR<\/code> a agi comme une double herse : la totalit\u00e9 de l&rsquo;\u00e9quipe &lsquo;A&rsquo; a \u00e9t\u00e9 balay\u00e9e par la premi\u00e8re branche du test, tandis que 50 % de l&rsquo;effectif de l&rsquo;\u00e9quipe &lsquo;B&rsquo; a \u00e9t\u00e9 concomitamment an\u00e9anti par la seconde branche du filtre num\u00e9rique. Cet exemple souligne avec nettet\u00e9 l&rsquo;importance d&rsquo;une mod\u00e9lisation rigoureuse des besoins avant d&rsquo;arr\u00eater le choix syntaxique d&rsquo;une conjonction ou d&rsquo;une disjonction.<\/p>\n<h2>7. Approche duale : L&rsquo;alternative de conservation explicite (Subsetting IF)<\/h2>\n<h3>7.1 Principe du Subsetting IF : Syntaxe et inversion logique<\/h3>\n<p>En programmation SAS, la r\u00e9solution d&rsquo;un probl\u00e8me algorithmique emprunte rarement une voie exclusive. Aux c\u00f4t\u00e9s du paradigme n\u00e9gatif consistant \u00e0 d\u00e9signer explicitement les observations \u00e0 d\u00e9truire (<code>IF condition THEN DELETE;<\/code>), il existe une approche duale rigoureusement sym\u00e9trique reposant sur le paradigme positif de conservation : le <strong>Subsetting IF<\/strong> (ou instruction <code>IF<\/code> de sous-ensemblement).<\/p>\n<p>La syntaxe canonique du Subsetting IF se distingue par sa concision extr\u00eame :<\/p>\n<p><code>IF expression_logique;<\/code><\/p>\n<p>Remarquons l&rsquo;absence totale des mots-cl\u00e9s <code>THEN<\/code> et <code>DELETE<\/code>. L&rsquo;instruction s&rsquo;ach\u00e8ve imm\u00e9diatement par un point-virgule apr\u00e8s la d\u00e9claration de la condition. Sa s\u00e9mantique se d\u00e9finit comme suit : si l&rsquo;expression logique est \u00e9valu\u00e9e \u00e0 VRAI, le traitement de l&rsquo;\u00e9tape DATA se poursuit normalement jusqu&rsquo;\u00e0 l&rsquo;\u00e9criture finale de l&rsquo;observation ; en revanche, si l&rsquo;expression est \u00e9valu\u00e9e \u00e0 FAUX, le traitement de la ligne s&rsquo;arr\u00eate instantan\u00e9ment et l&rsquo;enregistrement est ignor\u00e9, ce qui correspond fonctionnellement \u00e0 l&rsquo;ex\u00e9cution sous-jacente d&rsquo;un <code>DELETE<\/code>.<\/p>\n<p>Ce basculement conceptuel mobilise directement les fondements de la logique formelle, et plus particuli\u00e8rement le <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/fr.wikipedia.org\/wiki\/Lois_de_De_Morgan\">th\u00e9or\u00e8me de De Morgan<\/a>. Selon ce principe fondamental, la n\u00e9gation d&rsquo;une conjonction \u00e9quivaut \u00e0 la disjonction des n\u00e9gations, et r\u00e9ciproquement. D\u00e8s lors, pour transcrire fid\u00e8lement une suppression conditionnelle en r\u00e8gle de conservation, le d\u00e9veloppeur doit op\u00e9rer une inversion compl\u00e8te des op\u00e9rateurs relationnels et une transposition minutieuse des connecteurs bool\u00e9ens <code>AND<\/code> et <code>OR<\/code>.<\/p>\n<h3>7.2 Traduction rigoureuse des trois exemples en logique de conservation<\/h3>\n<p>Afin de mat\u00e9rialiser cette \u00e9quivalence formelle, transposons rigoureusement les trois cas d&rsquo;usage pr\u00e9c\u00e9demment explor\u00e9s via l&rsquo;instruction <code>DELETE<\/code> dans la syntaxe duale du <em>Subsetting IF<\/em> :<\/p>\n<p><strong>Transposition de l&rsquo;Exemple 1 (Suppression univari\u00e9e simple) :<\/strong><br \/>\nLe code initial <code>if team = 'A' then delete;<\/code> vise \u00e0 \u00e9carter l&rsquo;\u00e9quipe &lsquo;A&rsquo;. Sa formulation duale positive consiste \u00e0 ordonner la conservation stricte des \u00e9quipes non \u00e9gales \u00e0 &lsquo;A&rsquo; (ou directement \u00e9gales \u00e0 &lsquo;B&rsquo;) :<\/p>\n<p><code>data new_data_subset1;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;if team ^= 'A'; \/* Syntaxe \u00e9quivalente : if team = 'B'; *\/<br \/>\nrun;<\/code><\/p>\n<p><strong>Transposition de l&rsquo;Exemple 2 (Suppression conjonctive) :<\/strong><br \/>\nLe code initial d\u00e9clarait : <code>if team = 'A' and points &lt; 20 then delete;<\/code>. En vertu de la premi\u00e8re loi de De Morgan, la n\u00e9gation de <em>(A et B)<\/em> est <em>(non A ou non B)<\/em>. Pour conserver les observations valides, nous devons formuler que nous pr\u00e9servons toute ligne qui N&rsquo;appartient PAS \u00e0 l&rsquo;\u00e9quipe &lsquo;A&rsquo; OU qui affiche des points SUP\u00c9RIEURS OU \u00c9GAUX \u00e0 20 :<\/p>\n<p><code>data new_data_subset2;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;if team ^= 'A' or points &gt;= 20;<br \/>\nrun;<\/code><\/p>\n<p><strong>Transposition de l&rsquo;Exemple 3 (Suppression disjonctive) :<\/strong><br \/>\nLe script d&rsquo;origine statuait : <code>if team = 'A' or points &lt; 15 then delete;<\/code>. En vertu de la seconde loi de De Morgan, la n\u00e9gation de <em>(A ou B)<\/em> devient <em>(non A et non B)<\/em>. Ainsi, nous devons exiger simultan\u00e9ment que l&rsquo;\u00e9quipe soit DIFF\u00c9RENTE de &lsquo;A&rsquo; ET que le total de points soit SUP\u00c9RIEUR OU \u00c9GAL \u00e0 15 :<\/p>\n<p><code>data new_data_subset3;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;if team ^= 'A' and points &gt;= 15;<br \/>\nrun;<\/code><\/p>\n<p>Les trois tables g\u00e9n\u00e9r\u00e9es par ces instructions s&rsquo;av\u00e8rent strictement identiques bit \u00e0 bit \u00e0 celles issues des scripts exploitant l&rsquo;instruction <code>DELETE<\/code>, attestant de la sym\u00e9trie math\u00e9matique absolue des deux paradigmes.<\/p>\n<h3>7.3 Performance compar\u00e9e : Subsetting IF versus DELETE<\/h3>\n<p>Sur le plan purement informatique, de nombreux praticiens s&rsquo;interrogent sur les \u00e9carts potentiels d&rsquo;efficacit\u00e9 d&rsquo;ex\u00e9cution entre le <em>Subsetting IF<\/em> et le bin\u00f4me <em>IF-THEN DELETE<\/em>. Des analyses de profilage bas niveau conduites sur le compilateur SAS indiquent que ces deux constructions g\u00e9n\u00e8rent des instructions machine interm\u00e9diaires quasiment indistinguables.<\/p>\n<p>En effet, lors de la phase de compilation du Data Step, l&rsquo;expression <code>if condition;<\/code> est traduite en interne par une directive de saut conditionnel \u00e9quivalente \u00e0 <code>if NOT(condition) goto skip_output;<\/code>, ce qui constitue tr\u00e8s exactement l&rsquo;architecture d&rsquo;ex\u00e9cution mat\u00e9rialis\u00e9e par <code>if condition then delete;<\/code>. D\u00e8s lors, les \u00e9carts en termes de temps processeur (CPU) consomm\u00e9 ou d&rsquo;occupation de la m\u00e9moire tampon demeurent infinit\u00e9simaux et statistiquement non significatifs, m\u00eame sur des volum\u00e9tries massives de plusieurs dizaines de millions d&rsquo;enregistrements.<\/p>\n<p>L&rsquo;arbitrage entre ces deux approches rel\u00e8ve par cons\u00e9quent d&rsquo;un choix stylistique et ergonomique. En milieu institutionnel et dans la recherche biostatistique, le <em>Subsetting IF<\/em> est largement pl\u00e9biscit\u00e9 en raison de son \u00e9l\u00e9gance laconique et de sa clart\u00e9 positive : il documente explicitement au lecteur du code ce qui est <em>gard\u00e9<\/em> dans la table finale. \u00c0 l&rsquo;oppos\u00e9, l&rsquo;instruction <code>DELETE<\/code> se montre plus intuitive pour formaliser des protocoles d&rsquo;exclusion stricts r\u00e9dig\u00e9s sous la forme d&rsquo;arbres d\u00e9cisionnels d&rsquo;invalidation s\u00e9quentielle.<\/p>\n<h2>8. Comparaison computationnelle : Instruction WHERE vs Instruction IF<\/h2>\n<h3>8.1 Niveau d&rsquo;intervention : Moteur d&rsquo;entr\u00e9e (Engine) vs Data Step<\/h3>\n<p>L&rsquo;un des chapitres les plus critiques de l&rsquo;optimisation sous SAS r\u00e9side dans la distinction fondamentale entre le filtrage op\u00e9r\u00e9 par l&rsquo;instruction <code>IF<\/code> (incluant <code>DELETE<\/code>) et celui assur\u00e9 par la clause <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/?docsetId=lrcon&#038;docsetTarget=p09r8h68d90i2tn1b8y6zsgt5906.htm&#038;docsetVersion=9.4\">WHERE<\/a>. Si les deux commandes aboutissent en apparence \u00e0 des tables de sortie identiques, leurs m\u00e9canismes d&rsquo;intervention sous le capot reposent sur des couches logicielles diam\u00e9tralement diff\u00e9rentes.<\/p>\n<p>L&rsquo;instruction <code>IF<\/code> \/ <code>DELETE<\/code> op\u00e8re exclusivement au sein de l&rsquo;\u00e9tape DATA, pendant la phase d&rsquo;ex\u00e9cution du compilateur. Cela signifie obligatoirement que l&rsquo;enregistrement doit \u00eatre extrait physiquement du disque de stockage par le sous-syst\u00e8me d&rsquo;E\/S (moteur d&rsquo;acc\u00e8s ou <em>engine<\/em>), transf\u00e9r\u00e9 \u00e0 travers les tampons du syst\u00e8me, puis instanci\u00e9 dans le PDV avant de pouvoir \u00eatre \u00e9valu\u00e9 et \u00e9ventuellement d\u00e9truit. Le co\u00fbt computationnel de lecture physique et d&rsquo;alimentation m\u00e9moire est donc int\u00e9gralement consomm\u00e9 pour chaque ligne, m\u00eame si cette derni\u00e8re est \u00e9limin\u00e9e un milli\u00e8me de seconde plus tard.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;instruction <code>WHERE<\/code> intervient en amont, au niveau m\u00eame du moteur d&rsquo;acc\u00e8s \u00e0 la table (<em>Engine Layer<\/em>). Le moteur de donn\u00e9es SAS \u00e9value la clause <code>WHERE<\/code> directement lors de la lecture des blocs d&rsquo;enregistrements sur le disque ou dans la couche d&rsquo;indexation. Si une ligne ne valide pas les crit\u00e8res formul\u00e9s dans le <code>WHERE<\/code>, elle n&rsquo;est <strong>jamais charg\u00e9e dans le PDV<\/strong>. Ce m\u00e9canisme pr\u00e9vient toute instanciation superflue et \u00e9conomise de pr\u00e9cieuses ressources de calcul processeur et de bande passante bus m\u00e9moire.<\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/delete4.jpg\" alt=\"\" \/><\/figure>\n<h3>8.2 Suppression indirecte via la clause WHERE dans une \u00e9tape DATA<\/h3>\n<p>L&rsquo;exploitation de la clause <code>WHERE<\/code> dans une \u00e9tape DATA s&rsquo;apparente \u00e0 une suppression pr\u00e9ventive ou indirecte : au lieu d&rsquo;\u00e9liminer une observation pr\u00e9alablement charg\u00e9e, on refuse tout simplement de lui ouvrir la porte d&rsquo;entr\u00e9e de la m\u00e9moire active. La transposition de notre exemple univari\u00e9 prend alors la forme suivante :<\/p>\n<p><code>data new_data;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;where team ^= 'A';<br \/>\nrun;<\/code><\/p>\n<p>Outre ses gains monumentaux en mati\u00e8re de performance sur de grands volumes, l&rsquo;instruction <code>WHERE<\/code> met \u00e0 disposition du d\u00e9veloppeur une collection d&rsquo;op\u00e9rateurs relationnels hautement expressifs indisponibles ou plus lourds \u00e0 impl\u00e9menter dans une syntaxe <code>IF<\/code> standard, parmi lesquels :<\/p>\n<ul>\n<li>L&rsquo;op\u00e9rateur <code>IN<\/code> optimis\u00e9 pour les listes de valeurs discr\u00e8tes : <code>where team in ('B', 'C', 'D');<\/code>.<\/li>\n<li>L&rsquo;op\u00e9rateur de borne continue <code>BETWEEN ... AND<\/code> : <code>where points between 15 and 30;<\/code>.<\/li>\n<li>L&rsquo;op\u00e9rateur d&rsquo;\u00e9valuation de cha\u00eenes partielles <code>CONTAINS<\/code> (ou l&rsquo;op\u00e9rateur point d&rsquo;interrogation <code>?<\/code>) permettant des analyses de sous-cha\u00eenes directes sans recourir \u00e0 la fonction <code>INDEX<\/code>.<\/li>\n<li>L&rsquo;op\u00e9rateur de recherche phon\u00e9tique ou d&rsquo;\u00e9valuation de masques via le mot-cl\u00e9 <code>LIKE<\/code>.<\/li>\n<\/ul>\n<h3>8.3 Arbre d\u00e9cisionnel : Choisir entre DELETE conditionnel et clause WHERE<\/h3>\n<p>Le tableau d\u00e9cisionnel suivant explicite les conditions d&rsquo;arbitrage m\u00e9thodologique entre l&#8217;emploi du bin\u00f4me <code>IF condition THEN DELETE;<\/code> et le recours \u00e0 la clause <code>WHERE<\/code> :<\/p>\n<p>Le choix de l&rsquo;instruction <code>WHERE<\/code> s&rsquo;impose de fa\u00e7on incontournable lorsque :<\/p>\n<ol>\n<li>Toutes les variables cibl\u00e9es par la condition de filtrage pr\u00e9existent d\u00e9j\u00e0 dans la ou les tables sources lues par l&rsquo;instruction <code>SET<\/code>, <code>MERGE<\/code> ou <code>MODIFY<\/code>.<\/li>\n<li>Le jeu de donn\u00e9es source poss\u00e8de un volume substantiel et dispose potentiellement d&rsquo;un index simple ou compos\u00e9 sur les variables discriminantes.<\/li>\n<li>Le filtrage doit \u00eatre appliqu\u00e9 directement au sein d&rsquo;une proc\u00e9dure statistique (ex. <code>PROC MEANS<\/code>, <code>PROC REG<\/code>) sans n\u00e9cessiter la cr\u00e9ation interm\u00e9diaire d&rsquo;une \u00e9tape DATA d&rsquo;extraction sur disque.<\/li>\n<\/ol>\n<p>\u00c0 l&rsquo;oppos\u00e9, le recours imp\u00e9ratif au <code>IF condition THEN DELETE;<\/code> (ou au <em>Subsetting IF<\/em>) devient strictement obligatoire lorsque :<\/p>\n<ol>\n<li>La r\u00e8gle de suppression d\u00e9pend d&rsquo;une variable dynamique cr\u00e9\u00e9e, modifi\u00e9e ou calcul\u00e9e au sein m\u00eame de l&rsquo;\u00e9tape DATA courante (le moteur d&rsquo;acc\u00e8s sous-jacent <code>WHERE<\/code> ne pouvant pas conna\u00eetre l&rsquo;existence de variables qui ne r\u00e9sident pas encore physiquement sur disque).<\/li>\n<li>Le filtre met en \u0153uvre des variables syst\u00e8me automatiques SAS telles que le num\u00e9ro d&rsquo;observation <code>_N_<\/code> ou des variables indicatrices de premi\u00e8re\/derni\u00e8re modalit\u00e9 g\u00e9n\u00e9r\u00e9es par l&rsquo;instruction <code>BY<\/code> (ex. <code>first.variable<\/code> ou <code>last.variable<\/code>).<\/li>\n<li>Le pr\u00e9dicat conditionnel implique des fonctions complexes non support\u00e9es par la couche du moteur <code>WHERE<\/code> ou d\u00e9pend de l&rsquo;\u00e9tat s\u00e9quentiel accumul\u00e9 au fil des enregistrements ant\u00e9rieurs via l&rsquo;instruction <code>RETAIN<\/code>.<\/li>\n<\/ol>\n<h2>9. Gestion des valeurs manquantes et pi\u00e8ges logiques associ\u00e9s<\/h2>\n<h3>9.1 Le comportement des valeurs manquantes num\u00e9riques dans les comparaisons<\/h3>\n<p>L&rsquo;un des pi\u00e8ges les plus d\u00e9vastateurs et fr\u00e9quents en langage SAS r\u00e9side dans la m\u00e9canique interne de valorisation des <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/?docsetId=lrcon&#038;docsetTarget=p1234976a4s3b7n18h8z3z0zpt99.htm&#038;docsetVersion=9.4\">donn\u00e9es manquantes num\u00e9riques<\/a> (repr\u00e9sent\u00e9es visuellement par un point <code>.<\/code>). Dans la hi\u00e9rarchie ordinale interne de SAS, la valeur manquante standard est mod\u00e9lis\u00e9e par le syst\u00e8me comme la valeur num\u00e9rique la plus basse qui puisse exister dans l&rsquo;univers de calcul (inf\u00e9rieure \u00e0 n&rsquo;importe quel nombre n\u00e9gatif, soit l&rsquo;\u00e9quivalent de moins l&rsquo;infini).<\/p>\n<p>Consid\u00e9rons l&rsquo;impact catastrophique de cette convention sur une r\u00e8gle de suppression en apparence anodine : supposons qu&rsquo;un analyste souhaite supprimer tous les joueurs dont le score est strictement inf\u00e9rieur \u00e0 10 points en codant :<\/p>\n<p><code>if points &lt; 10 then delete;<\/code><\/p>\n<p>Si la variable <code>points<\/code> contient une valeur manquante pour un individu (par exemple en raison d&rsquo;un forfait m\u00e9dical n&rsquo;ayant pas permis d&rsquo;enregistrer de performance), l&rsquo;in\u00e9galit\u00e9 <code>. &lt; 10<\/code> sera \u00e9valu\u00e9e \u00e0 VRAI par le compilateur. En cons\u00e9quence, l&rsquo;observation sera d\u00e9truite sans sommation. Si la volont\u00e9 du statisticien \u00e9tait d&rsquo;isoler les faibles scores tout en maintenant imp\u00e9rativement les observations non renseign\u00e9es pour une analyse ult\u00e9rieure de donn\u00e9es imput\u00e9es, le r\u00e9sultat se trouve irr\u00e9m\u00e9diablement fauss\u00e9.<\/p>\n<p>Pour neutraliser ce comportement pervers, il est imp\u00e9ratif d&rsquo;adopter une strat\u00e9gie de programmation d\u00e9fensive en encapsulant le test dans une double contrainte positive ou en utilisant la fonction s\u00e9curis\u00e9e <code>MISSING()<\/code> :<\/p>\n<p><code>if not missing(points) and points &lt; 10 then delete;<br \/>\n\/* Ou formulation alternative par encadrement ordinal : *\/<br \/>\nif . &lt; points &lt; 10 then delete;<\/code><\/p>\n<h3>9.2 Traitement des cha\u00eenes de caract\u00e8res vides ou manquantes<\/h3>\n<p>Pour les variables de type caract\u00e8re, la modalit\u00e9 manquante se traduit dans l&rsquo;environnement SAS par une cha\u00eene constitu\u00e9e exclusivement d&rsquo;un ou plusieurs espaces blancs (<em>blank characters<\/em>). Sur le plan syntaxique, cette valeur s&rsquo;exprime conventionnellement par deux apostrophes accol\u00e9es <code>''<\/code> ou par un espace simple prot\u00e9g\u00e9 <code>' '<\/code>.<\/p>\n<p>Lorsqu&rsquo;un test conditionnel d&rsquo;\u00e9galit\u00e9 est formalis\u00e9 sous la tournure <code>if team = '' then delete;<\/code>, le compilateur SAS compare la cha\u00eene stock\u00e9e dans le PDV \u00e0 une cha\u00eene vide. Toutefois, il convient d&rsquo;observer que l&rsquo;op\u00e9rateur d&rsquo;\u00e9galit\u00e9 standard sous SAS compl\u00e8te automatiquement la cha\u00eene la plus courte avec des espaces blancs pour atteindre la longueur physique de la variable d\u00e9clar\u00e9e. D\u00e8s lors, si une variable <code>team<\/code> d\u00e9finie d&rsquo;une longueur de 8 octets ne contient que des espaces, le test <code>team = ''<\/code> sera rigoureusement \u00e9valu\u00e9 \u00e0 VRAI, d\u00e9clenchant l&rsquo;ex\u00e9cution de la suppression.<\/p>\n<p>Pour garantir l&rsquo;herm\u00e9tisme et la lisibilit\u00e9 du code applicatif, l&#8217;emploi de la fonction native <code>MISSING()<\/code> doit \u00eatre syst\u00e9matiquement \u00e9rig\u00e9 en bonne pratique. Cette fonction universelle accepte indiff\u00e9remment des arguments typ\u00e9s num\u00e9riques ou caract\u00e8res, renvoyant la valeur bool\u00e9enne 1 d\u00e8s lors que le champ est non renseign\u00e9, exemptant ainsi le programmeur des subtilit\u00e9s d&rsquo;alignement d&rsquo;espaces.<\/p>\n<h3>9.3 Bonnes pratiques pour fiabiliser les filtres complexes<\/h3>\n<p>D\u00e8s lors que les r\u00e8gles de gestion d&rsquo;une organisation exigent la juxtaposition de conditions logiques mixtes entrem\u00ealant des conjonctions <code>AND<\/code>, des disjonctions <code>OR<\/code> et des \u00e9valuations de valeurs manquantes, la lisibilit\u00e9 et l&rsquo;int\u00e9grit\u00e9 du code SAS sont menac\u00e9es par les r\u00e8gles implicites d&rsquo;associativit\u00e9 et de pr\u00e9s\u00e9ance des op\u00e9rateurs.<\/p>\n<p>La r\u00e8gle d&rsquo;or consiste \u00e0 bannir toute ambigu\u00eft\u00e9 en appliquant un <strong>parenth\u00e9sage explicite et syst\u00e9matique<\/strong> de chaque bloc logique unitaire. L&rsquo;\u00e9criture :<\/p>\n<p><code>if (team = 'A' and points &lt; 20) or (team = 'B' and points &lt; 10) then delete;<\/code><\/p>\n<p>offre une clart\u00e9 absolue quant \u00e0 l&rsquo;ordre d&rsquo;\u00e9valuation math\u00e9matique souhait\u00e9, isolant herm\u00e9tiquement les sous-ensembles d\u00e9cisionnels, l\u00e0 o\u00f9 l&rsquo;omission des parenth\u00e8ses forcerait le compilateur \u00e0 appliquer ses r\u00e8gles internes de pr\u00e9c\u00e9dence, induisant un risque majeur d&rsquo;erreur de logique invisible lors de la relecture par les pairs.<\/p>\n<p>Enfin, sur le plan des manipulations de cha\u00eenes, l&rsquo;adjonction de fonctions d&rsquo;assainissement textuel telles que <code>STRIP()<\/code> (qui \u00e9limine simultan\u00e9ment les espaces de t\u00eate et de queue) ou <code>UPCASE()<\/code> (qui convertit uniform\u00e9ment en majuscules pour neutraliser les disparit\u00e9s de saisie) conf\u00e8re une r\u00e9silience absolue aux pr\u00e9dicats de suppression conditionnelle :<\/p>\n<p><code>if upcase(strip(team)) = 'A' and points &lt; 20 then delete;<\/code><\/p>\n<h2>10. Suppression de lignes via la proc\u00e9dure PROC SQL<\/h2>\n<h3>10.1 La commande DELETE FROM sous le paradigme relationnel<\/h3>\n<p>L&rsquo;\u00e9cosyst\u00e8me SAS int\u00e8gre de fa\u00e7on totalement native les normes du langage de requ\u00eate structur\u00e9 au travers de la proc\u00e9dure <code>PROC SQL<\/code>. Cette composante permet aux ing\u00e9nieurs et analystes issus du monde des bases de donn\u00e9es relationnelles (SGBDR) d&rsquo;interagir avec les tables SAS selon une syntaxe conforme aux standards <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/webstore.ansi.org\">ANSI SQL<\/a>. Dans ce paradigme, la destruction de lignes ne s&rsquo;op\u00e8re plus par un filtrage s\u00e9quentiel dans un PDV avec \u00e9criture dans une table tierce, mais par une action de suppression directe <em>in situ<\/em> au sein de la table cibl\u00e9e via la commande <code>DELETE FROM<\/code>.<\/p>\n<p>La grammaire g\u00e9n\u00e9rale de cette directive relationnelle s&rsquo;\u00e9nonce comme suit :<\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;delete from nom_table<br \/>\n&nbsp;&nbsp;where condition_de_suppression;<br \/>\nquit;<\/code><\/p>\n<p>Ce changement de paradigme entra\u00eene une cons\u00e9quence structurelle majeure : la commande <code>DELETE FROM<\/code> ne cr\u00e9e pas de nouveau jeu de donn\u00e9es. Elle modifie directement la table physique originelle sur disque, retirant de mani\u00e8re d\u00e9finitive les observations r\u00e9pondant aux crit\u00e8res du pr\u00e9dicat <code>WHERE<\/code>.<\/p>\n<h3>10.2 Impl\u00e9mentation des trois exemples \u00e0 travers la syntaxe SQL<\/h3>\n<p>Afin de mettre en exergue la translation syntaxique entre l&rsquo;\u00e9tape DATA et l&rsquo;environnement relationnel, examinons la mise en \u0153uvre de nos trois r\u00e8gles d&rsquo;\u00e9puration via <code>PROC SQL<\/code>. Notons qu&rsquo;au pr\u00e9alable, une copie de s\u00e9curit\u00e9 de <code>original_data<\/code> devra \u00eatre op\u00e9r\u00e9e sous peine de perdre irr\u00e9m\u00e9diablement le jeu d&rsquo;essai initial.<\/p>\n<p><strong>Ex\u00e9cution relationnelle de l&rsquo;Exemple 1 (Condition univari\u00e9e) :<\/strong><\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;delete from work.table_sql1<br \/>\n&nbsp;&nbsp;where team = 'A';<br \/>\nquit;<\/code><\/p>\n<p><strong>Ex\u00e9cution relationnelle de l&rsquo;Exemple 2 (Condition conjonctive) :<\/strong><\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;delete from work.table_sql2<br \/>\n&nbsp;&nbsp;where team = 'A' and points &lt; 20;<br \/>\nquit;<\/code><\/p>\n<p><strong>Ex\u00e9cution relationnelle de l&rsquo;Exemple 3 (Condition disjonctive) :<\/strong><\/p>\n<p><code>proc sql;<br \/>\n&nbsp;&nbsp;delete from work.table_sql3<br \/>\n&nbsp;&nbsp;where team = 'A' or points &lt; 15;<br \/>\nquit;<\/code><\/p>\n<p>Le journal SAS associ\u00e9 \u00e0 <code>PROC SQL<\/code> documente l&rsquo;op\u00e9ration avec une formulation caract\u00e9ristique du vocabulaire relationnel, sp\u00e9cifiant textuellement par exemple : <code>NOTE: 4 rows were deleted from WORK.TABLE_SQL1.<\/code><\/p>\n<h3>10.3 Consid\u00e9rations relatives \u00e0 l&rsquo;int\u00e9grit\u00e9 et au verrouillage des tables<\/h3>\n<p>L&rsquo;utilisation de la proc\u00e9dure <code>PROC SQL<\/code> pour supprimer des enregistrements impose une analyse rigoureuse des risques en mati\u00e8re de concurrence d&rsquo;acc\u00e8s et d&rsquo;int\u00e9grit\u00e9 logicielle. \u00c9tant donn\u00e9 que la commande <code>DELETE FROM<\/code> alt\u00e8re directement le fichier physique <code>.sas7bdat<\/code> sur le syst\u00e8me de fichiers, le gestionnaire de stockage SAS place un <strong>verrouillage exclusif<\/strong> (<em>exclusive lock<\/em>) sur la table durant toute la dur\u00e9e de la transaction.<\/p>\n<p>Ce verrou emp\u00eache tout autre utilisateur ou processus parall\u00e8le de lire ou d&rsquo;\u00e9crire dans la table jusqu&rsquo;\u00e0 la lib\u00e9ration act\u00e9e par l&rsquo;instruction <code>QUIT;<\/code>. Si le programme s&rsquo;interrompt brutalement au milieu de l&rsquo;op\u00e9ration (panne de serveur, interruption utilisateur ou saturation de l&rsquo;espace disque temporaire), la table peut se retrouver dans un \u00e9tat instable ou partiellement purg\u00e9e, sans m\u00e9canisme natif de <em>rollback<\/em> transactionnel complet, \u00e0 moins d&rsquo;avoir pr\u00e9alablement configur\u00e9 des fonctionnalit\u00e9s de journalisation avanc\u00e9es (<em>SAS Audit Trails<\/em>).<\/p>\n<p>D\u00e8s lors, dans le cadre de pipelines de production automatis\u00e9s, l&rsquo;approche s\u00e9quentielle de l&rsquo;\u00e9tape DATA classique (qui lit depuis une table A immuable pour \u00e9crire proprement dans une nouvelle table B) est g\u00e9n\u00e9ralement privil\u00e9gi\u00e9e pour sa s\u00e9curit\u00e9 op\u00e9rationnelle, rel\u00e9guant la directive <code>PROC SQL DELETE<\/code> \u00e0 des phases de maintenance de tables ma\u00eetresses ou de bases de donn\u00e9es transactionnelles h\u00e9berg\u00e9es sur des moteurs distants via <em>SAS\/ACCESS<\/em>.<\/p>\n<h2>11. Optimisation des performances et scalabilit\u00e9 sur donn\u00e9es massives<\/h2>\n<h3>11.1 Optimisation des entr\u00e9es-sorties et allocation de m\u00e9moire<\/h3>\n<p>Lorsque le volume de donn\u00e9es franchit le seuil des gigaoctets ou des t\u00e9raoctets, l&rsquo;impact computationnel des d\u00e9cisions de programmation devient pr\u00e9dominant. L&rsquo;optimisation des flux d&rsquo;\u00e9limination de lignes doit imp\u00e9rativement s&rsquo;accompagner d&rsquo;une rationalisation de la dimensionnalit\u00e9 des colonnes. Il est contre-productif de charger dans le PDV des dizaines de variables inutiles pour ensuite supprimer des lignes sur la base d&rsquo;un crit\u00e8re unique.<\/p>\n<p>L&rsquo;utilisation concert\u00e9e de l&rsquo;option de table <code>DROP=<\/code> ou <code>KEEP=<\/code> directement sur l&rsquo;instruction de lecture <code>SET<\/code> permet d&rsquo;all\u00e9ger drastiquement la largeur vectorielle du PDV. En combinant cette r\u00e9duction horizontale avec un filtrage vertical imm\u00e9diat, le syst\u00e8me minimise drastiquement les transferts de pages m\u00e9moire depuis le disque physique.<\/p>\n<p>Parall\u00e8lement, la configuration fine des param\u00e8tres syst\u00e8me r\u00e9gissant les tampons d&rsquo;E\/S s&rsquo;av\u00e8re d\u00e9terminante. L&rsquo;ajustement des options syst\u00e8me <code>BUFSIZE=<\/code> (qui r\u00e9git la taille physique des blocs de transfert de donn\u00e9es en octets) et <code>BUFNO=<\/code> (qui d\u00e9finit le nombre de tampons allou\u00e9s en m\u00e9moire vive pour anticiper les lectures et \u00e9critures) permet d&rsquo;optimiser l&rsquo;efficience de l&rsquo;\u00e9tape DATA lors du traitement de volum\u00e9tries extr\u00eames, \u00e9vitant que le processeur ne passe l&rsquo;essentiel de son temps en attente d&rsquo;acc\u00e8s aux disques de stockage.<\/p>\n<h3>11.2 Exploitation des index SAS pour acc\u00e9l\u00e9rer les op\u00e9rations conditionnelles<\/h3>\n<p>L&rsquo;utilisation d&rsquo;un <strong>index SAS<\/strong> simple ou composite constitue un vecteur d&rsquo;acc\u00e9l\u00e9ration majeur lorsqu&rsquo;il est coupl\u00e9 \u00e0 une clause de filtrage <code>WHERE<\/code> (bien qu&rsquo;il demeure inop\u00e9rant pour acc\u00e9l\u00e9rer directement une instruction <code>IF THEN DELETE;<\/code> s\u00e9quentielle dans un Data Step classique). Un index est un fichier technique annexe (extension <code>.sas7bndx<\/code>) qui maintient une cartographie arborescente (de type B-Tree) reliant les valeurs des variables cl\u00e9s aux num\u00e9ros physiques exacts des observations correspondantes dans la table de donn\u00e9es.<\/p>\n<p>Lorsque le compilateur SAS \u00e9value une clause <code>WHERE<\/code> adoss\u00e9e \u00e0 une variable index\u00e9e, il sollicite son optimiseur interne. Si ce dernier d\u00e9termine que la s\u00e9lectivit\u00e9 de la requ\u00eate est suffisante (c&rsquo;est-\u00e0-dire que la condition n&rsquo;isole ou n&rsquo;exclut qu&rsquo;une faible proportion du volume global de la table, classiquement moins de 15 \u00e0 20 %), le moteur d&rsquo;acc\u00e8s contourne int\u00e9gralement la lecture s\u00e9quentielle de la table. Il saute directement, d&rsquo;adresse physique en adresse physique, vers les enregistrements \u00e9ligibles.<\/p>\n<p>Il importe toutefois de souligner le co\u00fbt cach\u00e9 inh\u00e9rent aux index : la cr\u00e9ation et la maintenance dynamique d&rsquo;un index consomment des ressources processeur notables lors des \u00e9critures, et un index d\u00e9grad\u00e9 par de multiples suppressions partielles n\u00e9cessite des op\u00e9rations p\u00e9riodiques de r\u00e9indexation via la proc\u00e9dure <code>PROC DATASETS<\/code> pour conserver son avantage comp\u00e9titif.<\/p>\n<h3>11.3 Gestion des tables volumineuses avec les tables de compression et les vues<\/h3>\n<p>Dans les infrastructures modernes de traitement de donn\u00e9es, la persistance physique syst\u00e9matique d&rsquo;une nouvelle table d\u00e9riv\u00e9e apr\u00e8s chaque op\u00e9ration de suppression conditionnelle g\u00e9n\u00e8re une explosion des co\u00fbts d&rsquo;infrastructure de stockage. Deux fonctionnalit\u00e9s natives du syst\u00e8me SAS permettent d&rsquo;att\u00e9nuer drastiquement ce gouffre mat\u00e9riel : la compression binaire et les vues de donn\u00e9es.<\/p>\n<p>L&rsquo;activation de l&rsquo;option de table <code>(COMPRESS=YES)<\/code> ou <code>(COMPRESS=BINARY)<\/code> lors de la g\u00e9n\u00e9ration de la table de sortie permet de condenser substantiellement l&rsquo;espace occup\u00e9 sur disque gr\u00e2ce \u00e0 des algorithmes de compression de type Run-Length Encoding (RLE) ou Huffman. Lorsqu&rsquo;une \u00e9tape DATA filtre une table compress\u00e9e, le gain de bande passante li\u00e9 au transfert d&rsquo;un fichier r\u00e9duit compense tr\u00e8s largement la l\u00e9g\u00e8re surcharge de temps processeur d\u00e9volue \u00e0 la d\u00e9compression \u00e0 la vol\u00e9e des blocs d&rsquo;observations.<\/p>\n<p>D&rsquo;autre part, la cr\u00e9ation d&rsquo;une <strong>vue de donn\u00e9es SAS<\/strong> (<em>SAS DATA View<\/em>) via la directive syntaxique <code>DATA nom_vue \/ VIEW=nom_vue;<\/code> offre une alternative d&rsquo;une \u00e9l\u00e9gance supr\u00eame :<\/p>\n<p><code>data view_epuree \/ view=view_epuree;<br \/>\n&nbsp;&nbsp;set original_data;<br \/>\n&nbsp;&nbsp;if team = 'A' and points &lt; 20 then delete;<br \/>\nrun;<\/code><\/p>\n<p>Dans ce sc\u00e9nario, aucun fichier de donn\u00e9es physique n&rsquo;est mat\u00e9rialis\u00e9 sur disque. La vue stocke uniquement la logique compil\u00e9e de l&rsquo;algorithme de suppression. D\u00e8s lors qu&rsquo;une proc\u00e9dure analytique ult\u00e9rieure (telle qu&rsquo;une r\u00e9gression <code>PROC LOGISTIC<\/code>) sollicite la vue <code>view_epuree<\/code>, le moteur d&rsquo;ex\u00e9cution d\u00e9clenche l&rsquo;\u00e9tape DATA \u00e0 la vol\u00e9e, alimentant directement le pipeline de calcul de la proc\u00e9dure en flux continu sans consommer le moindre m\u00e9gaoctet d&rsquo;espace de persistance permanent.<\/p>\n<h2>12. Validation, audit et assurance qualit\u00e9 des tables \u00e9pur\u00e9es<\/h2>\n<h3>12.1 Diagnostic approfondi par l&rsquo;inspection du journal SAS (SAS Log)<\/h3>\n<p>Dans toute m\u00e9thodologie analytique rigoureuse, la soumission d&rsquo;un script ne s&rsquo;ach\u00e8ve jamais \u00e0 la simple visualisation du r\u00e9sultat tabulaire : l&rsquo;inspection exhaustive du journal d&rsquo;ex\u00e9cution (<em>SAS Log<\/em>) constitue une exigence d\u00e9ontologique et technique fondamentale. Le journal est la bo\u00eete noire attestant de la validit\u00e9 math\u00e9matique et syst\u00e9mique des op\u00e9rations de filtrage.<\/p>\n<p>L&rsquo;analyste doit v\u00e9rifier m\u00e9thodiquement les lignes informatives standardis\u00e9es \u00e9mises par le moteur :<\/p>\n<ul>\n<li><code>NOTE: There were X observations read from the data set LIB.ORIGINAL_DATA.<\/code> : Permet de certifier que la source n&rsquo;a subi aucune troncature inattendue et que l&rsquo;effectif d&rsquo;entr\u00e9e correspond scrupuleusement aux registres initiaux.<\/li>\n<li><code>NOTE: The data set WORK.NEW_DATA has Y observations and Z variables.<\/code> : La confrontation arithm\u00e9tique entre l&rsquo;effectif d&rsquo;entr\u00e9e <em>X<\/em> et l&rsquo;effectif de sortie <em>Y<\/em> doit concorder pr\u00e9cis\u00e9ment avec la volum\u00e9trie attendue r\u00e9sultant des calculs d&rsquo;exclusion th\u00e9oriques (<em>X &#8211; Rejets = Y<\/em>).<\/li>\n<li>Absence imp\u00e9rative de messages signal\u00e9s par les pr\u00e9fixes <code>WARNING:<\/code> ou <code>NOTE: Mathematical operations could not be performed<\/code>, qui d\u00e9masquent souvent des conversions implicites sauvages de caract\u00e8res en variables num\u00e9riques lors de l&rsquo;\u00e9valuation des pr\u00e9dicats relationnels.<\/li>\n<\/ul>\n<h3>12.2 V\u00e9rification automatis\u00e9e de conformit\u00e9 avec PROC COMPARE<\/h3>\n<p>Pour auditer de mani\u00e8re indiscutable l&rsquo;impact d&rsquo;une suppression conditionnelle, le recours \u00e0 la proc\u00e9dure de contr\u00f4le crois\u00e9 <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/?docsetId=proc&#038;docsetTarget=p0j3l4a1v5890fn176pmsjffgq8h.htm&#038;docsetVersion=9.4\">PROC COMPARE<\/a> constitue le standard de r\u00e9f\u00e9rence dans les protocoles d&rsquo;assurance qualit\u00e9 industrielle (particuli\u00e8rement sous r\u00e9glementation <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\">FDA<\/a> pour les essais cliniques pharmaceutiques).<\/p>\n<p>Cette proc\u00e9dure permet de confronter directement le jeu de donn\u00e9es d&rsquo;origine avec le jeu r\u00e9sultant post-suppression, ou de comparer deux jeux de donn\u00e9es \u00e9pur\u00e9s issus de syntaxes alternatives (par exemple valider empiriquement qu&rsquo;un script utilisant <code>DELETE<\/code> g\u00e9n\u00e8re une structure rigoureusement identique bit \u00e0 bit \u00e0 un script utilisant le <em>Subsetting IF<\/em>) :<\/p>\n<p><code>proc compare base=new_data compare=new_data_subset2 listall;<br \/>\nrun;<\/code><\/p>\n<p>L&rsquo;\u00e9dition g\u00e9n\u00e9r\u00e9e d\u00e9livre une certification automatis\u00e9e : elle analyse la concordance globale des m\u00e9tadonn\u00e9es, v\u00e9rifie l&rsquo;absence de d\u00e9rive sur les formats ou labels des variables, et confirme que l&rsquo;ensemble des enregistrements r\u00e9siduels partagent des valeurs vectorielles strictement indiff\u00e9renciables, fournissant une preuve auditable de non-r\u00e9gression analytique.<\/p>\n<h3>12.3 Protocole de documentation et de tra\u00e7abilit\u00e9 dans la recherche acad\u00e9mique<\/h3>\n<p>La reproductibilit\u00e9 computationnelle repr\u00e9sente l&rsquo;un des piliers contemporains de la cr\u00e9dibilit\u00e9 de la recherche scientifique. Lorsque des lignes sont soustraites d&rsquo;un ensemble de donn\u00e9es dans le cadre d&rsquo;\u00e9tudes \u00e9pid\u00e9miologiques, macro\u00e9conomiques ou sociologiques, la documentation exhaustive de ces exclusions ne saurait \u00eatre laiss\u00e9e au hasard de commentaires parcellaires.<\/p>\n<p>Il convient d&rsquo;adopter un protocole de programmation structur\u00e9 int\u00e9grant :<\/p>\n<ol>\n<li>Un bloc d&rsquo;en-t\u00eate standardis\u00e9 au sommet du script DATA consignant l&rsquo;identit\u00e9 de l&rsquo;auteur, la date d&rsquo;ex\u00e9cution, la r\u00e9f\u00e9rence institutionnelle du protocole et la justification scientifique explicite des crit\u00e8res d&rsquo;exclusion retenus.<\/li>\n<li>Le respect scrupuleux du principe d&rsquo;immutabilit\u00e9 du jeu de donn\u00e9es brut d&rsquo;origine : les instructions directes de suppression physique in-situ de type <code>PROC SQL; DELETE FROM original_data;<\/code> doivent \u00eatre formellement proscrites des protocoles acad\u00e9miques au profit d&rsquo;\u00e9tapes de g\u00e9n\u00e9ration d\u00e9riv\u00e9e permettant de remonter \u00e0 tout moment \u00e0 la source primaire.<\/li>\n<li>La g\u00e9n\u00e9ration syst\u00e9matique de diagrammes de flux d&rsquo;inclusion\/exclusion (conformes aux standards <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.equator-network.org\/reporting-guidelines\/consort\/\">CONSORT<\/a> dans les essais biom\u00e9dicaux), documentant avec exactitude \u00e0 chaque \u00e9tape de filtrage le nombre d&rsquo;observations \u00e9cart\u00e9es et le motif logique sp\u00e9cifique de leur \u00e9limination.<\/li>\n<\/ol>\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.<\/li>\n<li>Delwiche, L. D., &amp; Slaughter, S. J. (2019). <em>The Little SAS Book: A Primer<\/em> (6th ed.). SAS Institute Inc.<\/li>\n<li>Food and Drug Administration. (2020). <em>Data Standards for Study Data: Statistical Considerations and Formatting Guidelines<\/em>. U.S. Department of Health and Human Services. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\">https:\/\/www.fda.gov<\/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>SAS Institute Inc. (2023). <em>Base SAS\u00ae Procedures Guide: Statistical Procedures<\/em>. SAS Institute Inc.<\/li>\n<li>Schulz, K. F., Altman, D. G., &amp; Moher, D. (2010). CONSORT 2010 Statement: updated guidelines for reporting parallel group randomised trials. <em>BMJ<\/em>, 340, c332. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1136\/bmj.c332\">https:\/\/doi.org\/10.1136\/bmj.c332<\/a><\/li>\n<li>Stoltzfus, J. C. (2011). Logistic Regression: A Brief Primer. <em>Academic Emergency Medicine<\/em>, 18(10), 1099\u20131104. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1111\/j.1553-2712.2011.01185.x\">https:\/\/doi.org\/10.1111\/j.1553-2712.2011.01185.x<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour ma\u00eetriser la suppression de lignes dans SAS \u00e0 travers l&rsquo;instruction DELETE, avec trois exemples pratiques et d\u00e9taill\u00e9s.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[9499,10494],"tags":[10221,11442,6133,11443,235],"class_list":["post-10011","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-sas","category-traitement-de-donnees","tag-data-step","tag-delete","tag-filtrage","tag-programmation","tag-sas"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/10011","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=10011"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/10011\/revisions"}],"predecessor-version":[{"id":10016,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/10011\/revisions\/10016"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}