{"id":7804,"date":"2026-10-14T18:02:17","date_gmt":"2026-10-14T18:02:17","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-utiliser-complete-cases-dans-r-avec-exemples\/"},"modified":"2026-10-14T18:02:17","modified_gmt":"2026-10-14T18:02:17","slug":"comment-utiliser-complete-cases-dans-r-avec-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-utiliser-complete-cases-dans-r-avec-exemples","title":{"rendered":"Comment utiliser complete.cases dans R (avec exemples)"},"content":{"rendered":"<p>Dans le domaine du traitement analytique des donn\u00e9es et de l&rsquo;\u00e9conom\u00e9trie appliqu\u00e9e, la gestion rigoureuse des donn\u00e9es manquantes constitue une \u00e9tape fondamentale pr\u00e9alable \u00e0 toute mod\u00e9lisation probabiliste ou inf\u00e9rentielle. L&rsquo;environnement de calcul statistique <a rel=\"noopener noreferrer\" href=\"https:\/\/www.r-project.org\/\">R Core Team<\/a> met \u00e0 la disposition des chercheurs et des analystes une pluralit\u00e9 d&rsquo;outils algorithmiques pour sonder, caract\u00e9riser et traiter ces lacunes informationnelles. Parmi ces fonctionnalit\u00e9s fondamentales du syst\u00e8me de base figure la fonction <code>complete.cases()<\/code>, un outil natif dont la simplicit\u00e9 syntaxique dissimule une puissance op\u00e9rationnelle essentielle pour le filtrage logique, le diagnostic psychom\u00e9trique et la pr\u00e9paration de structures matricielles complexes.<\/p>\n<p>Le traitement des valeurs absentes ne rel\u00e8ve pas d&rsquo;une simple contingence technique ou d&rsquo;un simple nettoyage cosm\u00e9tique. En sciences du comportement, en \u00e9pid\u00e9miologie ou en sociologie quantitative, la perte d&rsquo;informations lors du recueil de donn\u00e9es introduit des m\u00e9canismes d&rsquo;alt\u00e9ration qui peuvent compromettre la validit\u00e9 interne d&rsquo;une \u00e9tude, gonfler artificiellement les erreurs de type I ou de type II, et biaiser substantiellement les estimations param\u00e9triques. Comprendre les fondements algorithmiques de la commande <code>complete.cases()<\/code>, ses r\u00e9percussions sur la m\u00e9moire vive, sa compl\u00e9mentarit\u00e9 avec l&rsquo;\u00e9cosyst\u00e8me moderne comme le <a rel=\"noopener noreferrer\" href=\"https:\/\/www.tidyverse.org\/\">Tidyverse<\/a> et ses limites m\u00e9thodologiques face aux postulats d&rsquo;imputation s&rsquo;av\u00e8re indispensable pour quiconque aspire \u00e0 produire des analyses reproductibles et conformes aux plus hauts standards acad\u00e9miques.<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;analyser en profondeur les m\u00e9canismes de <code>complete.cases()<\/code> sous R. \u00c0 travers l&rsquo;exploration de ses fondements th\u00e9oriques, l&rsquo;\u00e9tude pas \u00e0 pas de sa syntaxe sur des vecteurs atomiques, des tableaux de donn\u00e9es (<em>data frames<\/em>) et des matrices, ainsi que l&rsquo;examen critique des cons\u00e9quences m\u00e9thodologiques de la suppression par liste (<em>listwise deletion<\/em>), ce document fournit un cadre d&rsquo;application complet, illustr\u00e9 d&rsquo;\u00e9tudes de cas r\u00e9alistes et de pr\u00e9conisations formalis\u00e9es selon les normes de publication savante.<\/p>\n<h2>1. Fondements th\u00e9oriques et pertinence de la fonction complete.cases()<\/h2>\n<h3>1.1 Le d\u00e9fi des valeurs manquantes dans l&rsquo;analyse de donn\u00e9es psychologiques<\/h3>\n<p>L&rsquo;omnipr\u00e9sence des donn\u00e9es incompl\u00e8tes constitue l&rsquo;une des probl\u00e9matiques les plus critiques de l&rsquo;analyse empirique contemporaine, particuli\u00e8rement dans les disciplines reposant sur des protocoles de mesure d\u00e9claratifs, observationnels ou longitudinaux, \u00e0 l&rsquo;instar de la psychologie et des sciences comportementales. La conceptualisation th\u00e9orique formul\u00e9e initialement par <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1093\/biomet\/63.3.581\">Donald Rubin (1976)<\/a> classifie ces carences selon trois m\u00e9canismes g\u00e9n\u00e9rateurs distincts, dont l&rsquo;identification conditionne la l\u00e9gitimit\u00e9 des choix de traitement analytique :<\/p>\n<ul>\n<li><strong>Les donn\u00e9es manquantes compl\u00e8tement au hasard (<em>Missing Completely At Random<\/em>, MCAR) :<\/strong> La probabilit\u00e9 qu&rsquo;une observation soit absente est ind\u00e9pendante aussi bien des variables observ\u00e9es que des valeurs non observ\u00e9es de la variable cible. Ce cas d&rsquo;\u00e9cole autorise une analyse non biais\u00e9e sur les donn\u00e9es compl\u00e8tes r\u00e9siduelles, bien qu&rsquo;il r\u00e9duise la puissance statistique globale.<\/li>\n<li><strong>Les donn\u00e9es manquantes au hasard (<em>Missing At Random<\/em>, MAR) :<\/strong> La probabilit\u00e9 de non-r\u00e9ponse d\u00e9pend syst\u00e9matiquement des informations recueillies par d&rsquo;autres covariables du protocole exp\u00e9rimental, mais demeure ind\u00e9pendante des valeurs intrins\u00e8ques de la variable omise une fois ces covariables contr\u00f4l\u00e9es.<\/li>\n<li><strong>Les donn\u00e9es manquantes non al\u00e9atoires (<em>Missing Not At Random<\/em>, MNAR) :<\/strong> La d\u00e9faillance de mesure est directement li\u00e9e \u00e0 la valeur m\u00eame de la variable latente ou mesur\u00e9e. Dans cette configuration, les individus pr\u00e9sentant des scores particuli\u00e8rement \u00e9lev\u00e9s sur une \u00e9chelle de d\u00e9pression ou d&rsquo;anxi\u00e9t\u00e9 peuvent, en raison de leur symptomatologie m\u00eame, refuser de renseigner les items critiques.<\/li>\n<\/ul>\n<p>Les cons\u00e9quences de ces m\u00e9canismes sur la validit\u00e9 scientifique sont consid\u00e9rables. L&rsquo;\u00e9limination m\u00e9canique d&rsquo;observations incompl\u00e8tes sans caract\u00e9risation pr\u00e9alable du processus sous-jacent entra\u00eene une r\u00e9duction m\u00e9canique de la taille effective de l&rsquo;\u00e9chantillon, affectant drastiquement la puissance des tests d&rsquo;hypoth\u00e8ses statistiques. De surcro\u00eet, sous l&rsquo;hypoth\u00e8se de m\u00e9canismes MAR ou MNAR, l&rsquo;analyse restreinte aux seuls r\u00e9pondants complets introduit un biais de s\u00e9lection s\u00e9v\u00e8re qui d\u00e9forme la structure de variance-covariance des indicateurs psychom\u00e9triques et compromet l&rsquo;invariance de mesure des mod\u00e8les d&rsquo;\u00e9quations structurelles ou d&rsquo;analyse factorielle confirmatoire.<\/p>\n<h3>1.2 D\u00e9finition et principe fondamental de complete.cases()<\/h3>\n<p>Au sein de l&rsquo;architecture native du langage R, <code>complete.cases()<\/code> se d\u00e9finit comme une fonction primitive de diagnostic logique con\u00e7ue pour \u00e9valuer l&rsquo;\u00e9tat de compl\u00e9tude d&rsquo;entit\u00e9s vectorielles, matricielles ou tabulaires. Contrairement \u00e0 des fonctions d&rsquo;ordre sup\u00e9rieur qui op\u00e8rent simultan\u00e9ment l&rsquo;\u00e9valuation et la mutation structurelle de l&rsquo;objet, <code>complete.cases()<\/code> dissocie rigoureusement la d\u00e9tection bool\u00e9enne de l&rsquo;action de filtrage subs\u00e9quente.<\/p>\n<p>Lorsqu&rsquo;elle est invoqu\u00e9e sur une structure bidimensionnelle, l&rsquo;instruction parcourt l&rsquo;ensemble des enregistrements de mani\u00e8re s\u00e9quentielle et vectoris\u00e9e. Pour chaque ligne soumise \u00e0 l&rsquo;\u00e9valuation, la fonction inspecte les cellules individuelles afin d&rsquo;y d\u00e9celer la pr\u00e9sence \u00e9ventuelle de marqueurs d&rsquo;absence sp\u00e9cifiques reconnus par le compilateur interne de R, \u00e0 savoir <code>NA<\/code> (<em>Not Available<\/em>) ou <code>NaN<\/code> (<em>Not a Number<\/em>). Si une ligne ne comporte rigoureusement aucun \u00e9l\u00e9ment ind\u00e9fini sur l&rsquo;ensemble des colonnes consid\u00e9r\u00e9es, elle se voit attribuer la valeur logique <code>TRUE<\/code>. \u00c0 l&rsquo;inverse, l&rsquo;apparition d&rsquo;un unique marqueur d&rsquo;absence dans n&rsquo;importe quel segment de l&rsquo;enregistrement bascule instantan\u00e9ment l&rsquo;\u00e9valuation globale de cette observation \u00e0 <code>FALSE<\/code>.<\/p>\n<p>Cette distinction entre l&rsquo;\u00e9valuation logique et l&rsquo;extraction structurelle est un pilier de la philosophie computationnelle de R. La fonction n&rsquo;alt\u00e8re en rien l&rsquo;objet qui lui est soumis. Elle g\u00e9n\u00e8re une projection logique unidimensionnelle de m\u00eame cardinalit\u00e9 que le nombre de rang\u00e9es ou d&rsquo;\u00e9l\u00e9ments de la structure source, conf\u00e9rant ainsi au chercheur une flexibilit\u00e9 totale dans l&rsquo;usage conditionnel de ce vecteur bool\u00e9en.<\/p>\n<h3>1.3 Positionnement m\u00e9thodologique dans le workflow de recherche quantitative<\/h3>\n<p>Dans la cha\u00eene de traitement scientifique d&rsquo;un jeu de donn\u00e9es quantitatives, <code>complete.cases()<\/code> intervient de mani\u00e8re privil\u00e9gi\u00e9e au cours de la phase exploratoire de pr\u00e9traitement et d&rsquo;assainissement syst\u00e9matique (<em>data cleaning<\/em>). Son r\u00f4le ne se limite pas \u00e0 purger aveugl\u00e9ment les tableaux d&rsquo;analyse, mais sert de pivot diagnostique pour quantifier l&rsquo;int\u00e9grit\u00e9 de l&rsquo;\u00e9chantillon recueilli et v\u00e9rifier la conformit\u00e9 des protocoles psychom\u00e9triques.<\/p>\n<p>Sur le plan m\u00e9thodologique, le recours \u00e0 <code>complete.cases()<\/code> mat\u00e9rialise l&rsquo;approche classique de suppression par liste (<em>listwise deletion<\/em> ou <em>complete-case analysis<\/em>). Bien que cette approche soit largement document\u00e9e pour sa simplicit\u00e9 et son universalit\u00e9 op\u00e9rationnelle, elle doit \u00eatre continuellement mise en balance avec les paradigmes modernes d&rsquo;inf\u00e9rence, tels que l&rsquo;imputation multiple par \u00e9quations cha\u00een\u00e9es (MICE) ou les estimateurs \u00e0 information compl\u00e8te par maximum de vraisemblance (FIML). L&rsquo;utilisation de <code>complete.cases()<\/code> doit \u00eatre m\u00e9thodologiquement justifi\u00e9e : elle repr\u00e9sente le protocole standard lorsque le m\u00e9canisme MCAR est soutenu empiriquement, ou lorsqu&rsquo;il s&rsquo;agit d&rsquo;isoler un sous-\u00e9chantillon d&rsquo;\u00e9talonnage pour des analyses de sensibilit\u00e9 comparative.<\/p>\n<h2>2. Syntaxe fondamentale et m\u00e9canisme d&rsquo;ex\u00e9cution sous R<\/h2>\n<h3>2.1 Anatomie formelle de la commande et signatures accept\u00e9es<\/h3>\n<p>La signature standard de la fonction, telle que document\u00e9e dans le syst\u00e8me d&rsquo;aide de base de R accessible via la commande <code>?complete.cases<\/code>, se caract\u00e9rise par une flexibilit\u00e9 syntaxique remarquable reposant sur l&rsquo;ellipse d&rsquo;arguments :<\/p>\n<p><code>complete.cases(...)<\/code><\/p>\n<p>L&rsquo;argument <code>...<\/code> autorise le passage d&rsquo;une s\u00e9quence arbitraire d&rsquo;objets atomiques ou structur\u00e9s, incluant des vecteurs, des matrices, des facteurs ou des tableaux de donn\u00e9es (<em>data frames<\/em>). Lorsque de multiples vecteurs de m\u00eame longueur sont pass\u00e9s simultan\u00e9ment en argument, par exemple <code>complete.cases(v1, v2, v3)<\/code>, la fonction effectue une conjonction logique implicite \u00e9l\u00e9ment par \u00e9l\u00e9ment, \u00e9valuant si, pour un indice donn\u00e9 <em>i<\/em>, l&rsquo;ensemble des vecteurs fournis poss\u00e8dent une valeur valide.<\/p>\n<p>Sur le plan des types atomiques, <code>complete.cases()<\/code> op\u00e8re avec une universalit\u00e9 stricte. Elle prend en charge indiff\u00e9remment les vecteurs r\u00e9els (<code>numeric<\/code> ou <code>double<\/code>), les entiers (<code>integer<\/code>), les cha\u00eenes de caract\u00e8res (<code>character<\/code>), les expressions logiques (<code>logical<\/code>), ainsi que les nombres complexes et les structures cat\u00e9gorielles de type <code>factor<\/code>. Il convient de souligner que sous R, la valeur sp\u00e9ciale <code>NaN<\/code> (qui r\u00e9sulte d&rsquo;op\u00e9rations math\u00e9matiques ind\u00e9termin\u00e9es telles que la division de z\u00e9ro par z\u00e9ro) est structurellement interpr\u00e9t\u00e9e par <code>complete.cases()<\/code> comme un cas particulier de valeur manquante, conduisant invariablement au retour de l&rsquo;\u00e9tat logique <code>FALSE<\/code>.<\/p>\n<h3>2.2 G\u00e9n\u00e9ration et analyse du vecteur logique sous-jacent<\/h3>\n<p>Pour appr\u00e9hender intimement le m\u00e9canisme de la fonction, il est instructif d&rsquo;observer directement la nature de l&rsquo;objet produit lors de son ex\u00e9cution. Consid\u00e9rons un vecteur composite comprenant des valeurs num\u00e9riques ordinaires et des marqueurs d&rsquo;absence :<\/p>\n<p><code>observations &lt;- c(12.4, NA, 15.8, NaN, 18.2)<\/code><\/p>\n<p>L&rsquo;invocation directe de l&rsquo;instruction produit le r\u00e9sultat suivant :<\/p>\n<p><code>indicateur_complet &lt;- complete.cases(observations)<\/code><\/p>\n<p>L&rsquo;examen de cet objet via <code>typeof(indicateur_complet)<\/code> et <code>print(indicateur_complet)<\/code> r\u00e9v\u00e8le qu&rsquo;il s&rsquo;agit strictement d&rsquo;un vecteur logique atomique compos\u00e9 de :<\/p>\n<p><code>[1]  TRUE FALSE  TRUE FALSE  TRUE<\/code><\/p>\n<p>La correspondance positionnelle est rigoureuse : chaque \u00e9l\u00e9ment du vecteur logique refl\u00e8te la validit\u00e9 intrins\u00e8que de l&rsquo;\u00e9l\u00e9ment homologue dans la structure d&rsquo;entr\u00e9e. Cette propri\u00e9t\u00e9 autorise l&rsquo;application imm\u00e9diate de calculs alg\u00e9briques bas\u00e9s sur la coercition implicite des bool\u00e9ens en valeurs binaires sous R (o\u00f9 <code>TRUE<\/code> \u00e9quivaut \u00e0 1 et <code>FALSE<\/code> \u00e9quivaut \u00e0 0). D\u00e8s lors, l&rsquo;expression <code>sum(complete.cases(observations))<\/code> renvoie instantan\u00e9ment l&rsquo;effectif absolu d&rsquo;observations valides (ici 3), tandis que <code>mean(complete.cases(observations))<\/code> en d\u00e9termine le ratio relatif (ici 0.60, soit 60 % de compl\u00e9tude).<\/p>\n<h3>2.3 M\u00e9canisme de sous-\u00e9chantillonnage par indexation logique<\/h3>\n<p>L&rsquo;utilit\u00e9 pratique majeure de <code>complete.cases()<\/code> r\u00e9side dans son articulation avec les op\u00e9rateurs fondamentaux d&rsquo;extraction et de sous-\u00e9chantillonnage de R, concr\u00e9tis\u00e9s par les crochets d&rsquo;indexation simple <code>[ ]<\/code>. Le syst\u00e8me d&rsquo;adressage de R exploite les vecteurs bool\u00e9ens pour filtrer les structures : les positions associ\u00e9es \u00e0 <code>TRUE<\/code> sont extraites et conserv\u00e9es dans l&rsquo;objet r\u00e9cepteur, tandis que les occurrences associ\u00e9es \u00e0 <code>FALSE<\/code> sont exclues.<\/p>\n<p>Dans une structure unidimensionnelle, le filtrage s&rsquo;ex\u00e9cute par la simple imbrication <code>vecteur_epure &lt;- observations[complete.cases(observations)]<\/code>. L&rsquo;op\u00e9ration garantit la pr\u00e9servation absolue de l&rsquo;ordre s\u00e9quentiel initial des observations r\u00e9siduelles sans insertion de d\u00e9calage positionnel.<\/p>\n<p>D&rsquo;un point de vue computationnel et gestion de la m\u00e9moire vive, ce processus n&rsquo;op\u00e8re pas une modification sur place (<em>in-place modification<\/em>), mais proc\u00e8de \u00e0 une r\u00e9allocation m\u00e9moire. Le moteur d&rsquo;ex\u00e9cution de R alloue un nouvel espace vectoriel dont la capacit\u00e9 correspond rigoureusement au nombre d&rsquo;\u00e9l\u00e9ments \u00e9valu\u00e9s \u00e0 <code>TRUE<\/code>, y copie les valeurs pertinentes, puis associe ce nouveau conteneur \u00e0 l&rsquo;\u00e9tiquette assign\u00e9e. Pour des volumes massifs de donn\u00e9es, cette duplication impose une surveillance vigilante des cycles de ramasse-miettes (<em>garbage collection<\/em>), bien que la rapidit\u00e9 de l&rsquo;\u00e9valuation interne cod\u00e9e en langage C natif assure une v\u00e9locit\u00e9 optimale du filtrage bool\u00e9en.<\/p>\n<h2>3. Application pratique de complete.cases() aux vecteurs unidimensionnels<\/h2>\n<h3>3.1 Nettoyage \u00e9l\u00e9mentaire d&rsquo;un vecteur num\u00e9rique (Exemple 1 d\u00e9taill\u00e9)<\/h3>\n<p>Pour illustrer de mani\u00e8re tangible l&rsquo;ex\u00e9cution du filtrage sur une s\u00e9rie unidimensionnelle, examinons un sc\u00e9nario de recherche o\u00f9 un \u00e9chantillon de dix participants a \u00e9t\u00e9 soumis \u00e0 une passation psychom\u00e9trique visant \u00e0 \u00e9valuer la r\u00e9activit\u00e9 cognitive. Certaines \u00e9preuves n&rsquo;ont pu \u00eatre men\u00e9es \u00e0 terme en raison d&rsquo;interruptions techniques du capteur d&rsquo;enregistrement. Les scores bruts se formalisent de la fa\u00e7on suivante :<\/p>\n<p><code>temps_reaction &lt;- c(245, 312, NA, 289, 401, NA, 330, 278, NaN, 310)<\/code><\/p>\n<p>L&rsquo;\u00e9valuation s\u00e9quentielle et le nettoyage s&rsquo;op\u00e8rent selon les commandes suivantes :<\/p>\n<p><code>cas_valides &lt;- complete.cases(temps_reaction)<\/code><br \/>\n<code>temps_reaction_nettoye &lt;- temps_reaction[cas_valides]<\/code><\/p>\n<p>L&rsquo;inspection analytique de l&rsquo;objet r\u00e9sultant via les fonctions <code>length()<\/code> et <code>print()<\/code> permet de constater que la longueur originelle de dix observations a \u00e9t\u00e9 r\u00e9duite \u00e0 sept \u00e9l\u00e9ments strictement complets. Les valeurs <code>NA<\/code> situ\u00e9es aux troisi\u00e8me et sixi\u00e8me indices, ainsi que le marqueur <code>NaN<\/code> positionn\u00e9 au neuvi\u00e8me rang, ont \u00e9t\u00e9 \u00e9limin\u00e9s. La structure r\u00e9sultante conserve sa typologie num\u00e9rique originelle (<code>double<\/code>) sans subir la moindre alt\u00e9ration d&rsquo;\u00e9chelle ni aucune d\u00e9gradation de ses propri\u00e9t\u00e9s de distribution continue.<\/p>\n<h3>3.2 Traitement des vecteurs de cha\u00eenes de caract\u00e8res et facteurs<\/h3>\n<p>La manipulation de donn\u00e9es qualitatives impose une attention analytique renforc\u00e9e. Dans le cadre de protocoles reposant sur des questions ouvertes ou des classifications diagnostiques ordinales, les r\u00e9ponses textuelles sont commun\u00e9ment encod\u00e9es sous forme de vecteurs de caract\u00e8res (<code>character<\/code>) ou de variables qualitatives \u00e0 modalit\u00e9s d\u00e9finies (<code>factor<\/code>).<\/p>\n<p>Appliqu\u00e9e \u00e0 un vecteur de cha\u00eenes textuelles, <code>complete.cases()<\/code> neutralise fid\u00e8lement les \u00e9l\u00e9ments d\u00e9clar\u00e9s explicitement comme non disponibles (<code>NA_character_<\/code>). N\u00e9anmoins, un \u00e9cueil fr\u00e9quent r\u00e9side dans la pr\u00e9sence de cha\u00eenes vides (<code>\"\"<\/code>) ou d&rsquo;espaces ins\u00e9cables (<code>\" \"<\/code>). Du point de vue interne de R, une cha\u00eene vide constitue une cha\u00eene valide de longueur z\u00e9ro et non une valeur manquante au sens logique. Par cons\u00e9quent, <code>complete.cases(c(\"Anxi\u00e9t\u00e9\", \"\", NA))<\/code> renvoie <code>TRUE, TRUE, FALSE<\/code>. L&rsquo;assainissement complet d&rsquo;un vecteur qualitatif n\u00e9cessite de convertir au pr\u00e9alable les cha\u00eenes vides en v\u00e9ritables marqueurs d&rsquo;absence via une instruction conditionnelle du type :<\/p>\n<p><code>reponses[reponses == \"\"] &lt;- NA<\/code><\/p>\n<p>Concernant les objets de type <code>factor<\/code>, la suppression des donn\u00e9es incompl\u00e8tes \u00e0 l&rsquo;aide de <code>complete.cases()<\/code> conserve par d\u00e9faut l&rsquo;int\u00e9gralit\u00e9 des niveaux (<em>levels<\/em>) initiaux d\u00e9finis dans les m\u00e9tadonn\u00e9es de la variable, m\u00eame si la modalit\u00e9 en question ne subsiste plus dans l&rsquo;\u00e9chantillon filtr\u00e9. Pour \u00e9viter l&rsquo;existence de modalit\u00e9s orphelines susceptibles de perturber des analyses de variance ult\u00e9rieures, il est imp\u00e9ratif d&rsquo;adjoindre la fonction <code>droplevels()<\/code> sur le vecteur r\u00e9sultant.<\/p>\n<h3>3.3 Comparaison analytique entre complete.cases(x) et !is.na(x)<\/h3>\n<p>Sur le p\u00e9rim\u00e8tre exclusif des vecteurs unidimensionnels atomiques, l&rsquo;expression <code>complete.cases(x)<\/code> et la n\u00e9gation logique de la fonction de test des valeurs manquantes <code>!is.na(x)<\/code> sont formellement \u00e9quivalentes quant \u00e0 la valeur de v\u00e9rit\u00e9 renvoy\u00e9e pour chaque indice. L&rsquo;op\u00e9ration logique renvoie rigoureusement la m\u00eame distribution bool\u00e9enne.<\/p>\n<p>Cependant, une analyse comparative de leurs performances via des micro-\u00e9valuations temporelles (notamment \u00e0 l&rsquo;aide du paquet d&rsquo;\u00e9talonnage <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=microbenchmark\">microbenchmark<\/a>) r\u00e9v\u00e8le de l\u00e9g\u00e8res divergences d&rsquo;ordre computationnel. Pour des vecteurs atomiques de tr\u00e8s grande dimension (plusieurs dizaines de millions d&rsquo;\u00e9l\u00e9ments), <code>!is.na(x)<\/code> affiche fr\u00e9quemment une vitesse d&rsquo;ex\u00e9cution marginalement sup\u00e9rieure. Cet \u00e9cart s&rsquo;explique par le fait que <code>is.na()<\/code> est une fonction primitive hautement sp\u00e9cialis\u00e9e qui inspecte directement les fanions m\u00e9moire au niveau bas, tandis que <code>complete.cases()<\/code> encapsule une logique plus g\u00e9n\u00e9rale con\u00e7ue pour inspecter conjointement des collections arbitraires d&rsquo;objets ou de dimensions matricielles.<\/p>\n<p>Sur le plan de la lisibilit\u00e9 stylistique et de l&rsquo;expressivit\u00e9 conceptuelle du code source, l&#8217;emploi de <code>!is.na(x)<\/code> est couramment pr\u00e9f\u00e9r\u00e9 par les d\u00e9veloppeurs pour les vecteurs simples en raison de sa concision idiomatique. En revanche, l&rsquo;usage de <code>complete.cases()<\/code> offre une coh\u00e9rence s\u00e9mantique remarquable lorsqu&rsquo;un script passe fr\u00e9quemment du filtrage vectoriel \u00e0 l&rsquo;assainissement de tables de donn\u00e9es bidimensionnelles, uniformisant ainsi le vocabulaire technique employ\u00e9 au sein du pipeline d&rsquo;analyse.<\/p>\n<h2>4. Filtrage global des tableaux de donn\u00e9es (Data Frames)<\/h2>\n<h3>4.1 Suppression syst\u00e9matique des lignes incompl\u00e8tes (Exemple 2 d\u00e9taill\u00e9)<\/h3>\n<p>Dans la pratique analytique quotidienne, l&rsquo;application pr\u00e9pond\u00e9rante de <code>complete.cases()<\/code> s&rsquo;effectue sur des structures composites de type <code>data.frame<\/code>. Dans ces tables rectangulaires, chaque rang\u00e9e symbolise une unit\u00e9 observationnelle autonome (un participant, une session exp\u00e9rimentale) et chaque colonne repr\u00e9sente une variable recueillie (d\u00e9mographique, psychom\u00e9trique ou physiologique).<\/p>\n<p>Afin de concr\u00e9tiser le m\u00e9canisme de purge globale, g\u00e9n\u00e9rons un ensemble de donn\u00e9es repr\u00e9sentatif d&rsquo;une cohorte clinique :<\/p>\n<p><code>donnees_cliniques &lt;- data.frame(<br \/>\n&nbsp;&nbsp;identifiant = 101:105,<br \/>\n&nbsp;&nbsp;age = c(23, 45, NA, 34, 29),<br \/>\n&nbsp;&nbsp;score_depression = c(12, 18, 14, NA, 8),<br \/>\n&nbsp;&nbsp;rythme_cardiaque = c(72, NA, 68, 75, 80)<br \/>\n)<\/code><\/p>\n<p>Pour proc\u00e9der \u00e0 la suppression syst\u00e9matique de toute observation pr\u00e9sentant au minimum une valeur d\u00e9faillante sur l&rsquo;une quelconque des colonnes, la syntaxe d&rsquo;indexation bidimensionnelle mobilise l&rsquo;op\u00e9rateur virgule au sein des crochets :<\/p>\n<p><code>donnees_epurees &lt;- donnees_cliniques[complete.cases(donnees_cliniques), ]<\/code><\/p>\n<p>L&rsquo;instruction op\u00e8re un filtrage transversal. L&rsquo;examen critique du tableau nettoy\u00e9 met en lumi\u00e8re que seules les lignes 1 et 5 ont \u00e9t\u00e9 pr\u00e9serv\u00e9es. La ligne 2 a \u00e9t\u00e9 \u00e9cart\u00e9e en raison de l&rsquo;omission sur la mesure cardiovasculaire ; la ligne 3 a \u00e9t\u00e9 \u00e9limin\u00e9e en raison de l&rsquo;absence d&rsquo;\u00e2ge document\u00e9 ; et la ligne 4 a \u00e9t\u00e9 rejet\u00e9e du fait du score de d\u00e9pression non renseign\u00e9. Cette op\u00e9ration illustre la rigueur absolue de la suppression par liste : une seule d\u00e9faillance locale entra\u00eene l&rsquo;amputation de l&rsquo;observation int\u00e9grale.<\/p>\n<h3>4.2 Impact sur l&rsquo;indexation et les identifiants de lignes<\/h3>\n<p>Une caract\u00e9ristique fondamentale du filtrage par crochets dans l&rsquo;environnement R r\u00e9side dans la conservation stricte des \u00e9tiquettes ou identifiants de lignes originaux (<em>row names<\/em>). Dans l&rsquo;exemple pr\u00e9c\u00e9dent, l&rsquo;affichage de l&rsquo;objet <code>donnees_epurees<\/code> ne pr\u00e9sente pas des rang\u00e9es r\u00e9index\u00e9es sous la forme 1 et 2, mais affiche explicitement les \u00e9tiquettes initiales <code>\"1\"<\/code> et <code>\"5\"<\/code>.<\/p>\n<p>Bien que cette propri\u00e9t\u00e9 facilite la tra\u00e7abilit\u00e9 r\u00e9trospective en permettant de remonter \u00e0 l&#8217;emplacement physique d&rsquo;origine au sein de la matrice source, elle comporte des risques substantiels lors de d\u00e9veloppements algorithmiques subs\u00e9quents. Notamment, les structures it\u00e9ratives bas\u00e9es sur des boucles for index\u00e9es s\u00e9quentiellement de 1 \u00e0 <code>nrow(donnees_epurees)<\/code> peuvent \u00e9chouer ou g\u00e9n\u00e9rer des acc\u00e8s hors limites si elles tentent de requ\u00e9rir les enregistrements par leurs \u00e9tiquettes plut\u00f4t que par leur indice positionnel entier.<\/p>\n<p>Pour immuniser le flux de traitement contre ces instabilit\u00e9s structurelles et pr\u00e9venir tout d\u00e9salignement d&rsquo;indices lors de futures jointures relationnelles, il est vivement pr\u00e9conis\u00e9 de proc\u00e9der \u00e0 la r\u00e9initialisation s\u00e9quentielle explicite des identifiants de lignes en assignant la valeur <code>NULL<\/code> aux m\u00e9tadonn\u00e9es correspondantes :<\/p>\n<p><code>rownames(donnees_epurees) &lt;- NULL<\/code><\/p>\n<p>Cette commande r\u00e9initialise imm\u00e9diatement les indices de mani\u00e8re s\u00e9quentielle et ininterrompue de 1 jusqu&rsquo;au nouveau nombre total d&rsquo;observations valides.<\/p>\n<h3>4.3 V\u00e9rification post-filtrage de l&rsquo;absence r\u00e9siduelle de donn\u00e9es manquantes<\/h3>\n<p>La validation de l&rsquo;int\u00e9grit\u00e9 structurelle post-op\u00e9ratoire rel\u00e8ve des exigences fondamentales de l&rsquo;ing\u00e9nierie des donn\u00e9es et de l&rsquo;assurance qualit\u00e9 scientifique. Une fois la s\u00e9lection op\u00e9r\u00e9e, l&rsquo;analyste ne doit pas pr\u00e9sumer de la compl\u00e9tude sans ex\u00e9cuter un test formel de certification.<\/p>\n<p>L&rsquo;outil le plus performant pour op\u00e9rer cette v\u00e9rification binaire est la fonction primitive <code>anyNA()<\/code>, introduite dans les versions modernes de R pour supplanter l&rsquo;\u00e9criture plus verbeuse <code>any(is.na(...))<\/code> :<\/p>\n<p><code>if(anyNA(donnees_epurees)) {<br \/>\n&nbsp;&nbsp;stop(\"Anomalie d\u00e9tect\u00e9e : subsistance de valeurs non renseign\u00e9es.\")<br \/>\n} else {<br \/>\n&nbsp;&nbsp;message(\"Certification \u00e9tablie : jeu de donn\u00e9es exempt de toute valeur manquante.\")<br \/>\n}<\/code><\/p>\n<p>Parall\u00e8lement \u00e0 cette certification binaire, la documentation exhaustive des d\u00e9perditions d&rsquo;\u00e9chantillonnage impose le calcul imm\u00e9diat du volume d&rsquo;exclusions :<\/p>\n<p><code>n_initial &lt;- nrow(donnees_cliniques)<\/code><br \/>\n<code>n_final &lt;- nrow(donnees_epurees)<\/code><br \/>\n<code>perte_absolue &lt;- n_initial - n_final<\/code><br \/>\n<code>taux_attrition &lt;- (perte_absolue \/ n_initial) * 100<\/code><\/p>\n<p>Ces descripteurs quantitatifs constituent les m\u00e9triques obligatoires \u00e0 verser au rapport m\u00e9thodologique pour attester de l&rsquo;ampleur de l&rsquo;attrition subie lors de la phase d&rsquo;\u00e9puration.<\/p>\n<h2>5. Filtrage cibl\u00e9 selon un sous-ensemble de variables critiques<\/h2>\n<h3>5.1 Pr\u00e9servation des observations partiellement compl\u00e8tes<\/h3>\n<p>Dans de nombreuses configurations exp\u00e9rimentales, l&rsquo;application aveugle de <code>complete.cases()<\/code> \u00e0 l&rsquo;ensemble des colonnes d&rsquo;un tableau d&rsquo;investigation constitue un non-sens m\u00e9thodologique qui engendre un gaspillage informationnel injustifi\u00e9. Les protocoles empiriques recueillent fr\u00e9quemment des variables exploratoires secondaires, des questions ouvertes facultatives ou des mesures biologiques compl\u00e9mentaires dont l&rsquo;absence n&rsquo;entrave en rien la mod\u00e9lisation statistique principale.<\/p>\n<p>Consid\u00e9rons le cas d&rsquo;un mod\u00e8le d&rsquo;analyse de r\u00e9gression lin\u00e9aire multiple destin\u00e9 \u00e0 tester la relation entre un score d&rsquo;attention soutenue (variable d\u00e9pendante) et deux pr\u00e9dicteurs fondamentaux : les heures de sommeil pr\u00e9alables et l&rsquo;\u00e2ge du sujet. Si le jeu de donn\u00e9es h\u00e9berge \u00e9galement des variables p\u00e9riph\u00e9riques (telles que le revenu annuel ou une mesure optionnelle du stress ressenti), l&rsquo;exclusion d&rsquo;un participant ayant scrupuleusement renseign\u00e9 l&rsquo;\u00e2ge, le sommeil et l&rsquo;attention sous le seul pr\u00e9texte qu&rsquo;il a omis de d\u00e9clarer son revenu annuel d\u00e9grade inutilement l&rsquo;efficacit\u00e9 de l&rsquo;estimateur.<\/p>\n<p>L&rsquo;optimisation du pouvoir d&rsquo;inf\u00e9rence statistique impose de restreindre le crit\u00e8re de compl\u00e9tude stricte aux seules colonnes intervenant dans l&rsquo;\u00e9quation formelle du mod\u00e8le estim\u00e9, pr\u00e9servant ainsi un volume maximal d&rsquo;observations valides pour l&rsquo;analyse cibl\u00e9e.<\/p>\n<h3>5.2 Syntaxe d&rsquo;extraction bas\u00e9e sur une s\u00e9lection de colonnes<\/h3>\n<p>Pour restreindre l&rsquo;\u00e9valuation de <code>complete.cases()<\/code> \u00e0 un sous-ensemble sp\u00e9cifi\u00e9 de colonnes au sein d&rsquo;un tableau de donn\u00e9es, l&rsquo;environnement R autorise le passage d&rsquo;une structure indic\u00e9e en argument interne de la fonction. La formulation g\u00e9n\u00e9rique s&rsquo;articule comme suit :<\/p>\n<p><code>variables_modele &lt;- c(\"age\", \"sommeil\", \"attention\")<\/code><br \/>\n<code>filtre_cible &lt;- complete.cases(donnees_globales[, variables_modele])<\/code><br \/>\n<code>echantillon_analyse &lt;- donnees_globales[filtre_cible, ]<\/code><\/p>\n<p>Dans ce sch\u00e9ma, <code>donnees_globales[, variables_modele]<\/code> g\u00e9n\u00e8re un sous-ensemble temporaire ou une vue structur\u00e9e restreinte aux trois variables focales. La fonction <code>complete.cases()<\/code> \u00e9value la compl\u00e9tude de cette matrice d&rsquo;entr\u00e9e cibl\u00e9e et renvoie un vecteur bool\u00e9en de longueur rigoureusement identique au nombre total de lignes de la table m\u00e8re <code>donnees_globales<\/code>. Ce vecteur bool\u00e9en est ensuite appliqu\u00e9 comme s\u00e9lecteur de lignes sur la table globale d&rsquo;origine, extrayant l&rsquo;ensemble initial des colonnes pour les seuls participants satisfaisant \u00e0 la contrainte d&rsquo;int\u00e9grit\u00e9 sur les variables mod\u00e8les.<\/p>\n<p>Il importe de veiller \u00e0 l&rsquo;exactitude de l&rsquo;orthographe des colonnes pass\u00e9es sous forme de vecteur de cha\u00eenes de caract\u00e8res. Si l&rsquo;une des \u00e9tiquettes s&rsquo;av\u00e8re inexistante, le compilateur R l\u00e8vera une erreur d&rsquo;indice ind\u00e9fini, prot\u00e9geant ainsi l&rsquo;architecture du script contre les s\u00e9lections erron\u00e9es.<\/p>\n<h3>5.3 Application concr\u00e8te \u00e0 une \u00e9chelle psychom\u00e9trique standardis\u00e9e<\/h3>\n<p>Illustrons cette m\u00e9thodologie par l&rsquo;administration d&rsquo;un questionnaire de personnalit\u00e9 standardis\u00e9 de type Big Five, structur\u00e9 en cinq grands domaines (Ouverture, Conscienciosit\u00e9, Extraversion, Agr\u00e9abilit\u00e9, N\u00e9vrosisme). Un chercheur souhaite investiguer sp\u00e9cifiquement la dimension N\u00e9vrosisme, \u00e9valu\u00e9e par un sous-ensemble de dix items sp\u00e9cifiques not\u00e9s de 1 \u00e0 5 sur une \u00e9chelle de Likert, au sein d&rsquo;un \u00e9chantillon ayant \u00e9galement compl\u00e9t\u00e9 des variables sociod\u00e9mographiques optionnelles.<\/p>\n<p><code>items_nevrosisme &lt;- paste0(\"NEV_\", 1:10)<\/code><br \/>\n<code>donnees_nevrosisme_valides &lt;- base_sujets[complete.cases(base_sujets[, items_nevrosisme]), ]<\/code><\/p>\n<p>Cette approche garantit que l&rsquo;int\u00e9gralit\u00e9 des participants conserv\u00e9s dans <code>donnees_nevrosisme_valides<\/code> disposent d&rsquo;un profil de r\u00e9ponse parfait sur l&rsquo;\u00e9chelle d&rsquo;int\u00e9r\u00eat. Les scores composites (par exemple, le score moyen ou la somme brute de la sous-\u00e9chelle) pourront ainsi \u00eatre calcul\u00e9s avec une pr\u00e9cision absolue, sans n\u00e9cessiter d&rsquo;ajustements arbitraires ou de remplacements de moyennes pour des items individuels manquants. Les r\u00e9pondants ayant n\u00e9glig\u00e9 des rubriques non li\u00e9es (telles que le statut marital ou les items de l&rsquo;\u00e9chelle d&rsquo;Agr\u00e9abilit\u00e9) demeurent int\u00e9gralement dans la cohorte d&rsquo;analyse, pr\u00e9servant la repr\u00e9sentativit\u00e9 globale du mod\u00e8le.<\/p>\n<h2>6. Utilisation de complete.cases() sur les matrices et structures matricielles<\/h2>\n<h3>6.1 Comportement sp\u00e9cifique sur les objets de classe matrix<\/h3>\n<p>Bien que les tableaux de donn\u00e9es (<em>data frames<\/em>) partagent une analogie visuelle avec les matrices par leur morphologie bidimensionnelle, les objets de classe <code>matrix<\/code> sous R r\u00e9pondent \u00e0 des r\u00e8gles de stockage fondamentalement distinctes. Une matrice est structurellement un vecteur atomique dot\u00e9 d&rsquo;un attribut de dimension (<code>dim<\/code>) compos\u00e9 d&rsquo;un nombre de lignes et de colonnes, contraignant l&rsquo;int\u00e9gralit\u00e9 des cellules \u00e0 partager un type de donn\u00e9es strictement homog\u00e8ne (int\u00e9gralement num\u00e9rique, textuel ou logique).<\/p>\n<p>Lorsque la fonction <code>complete.cases()<\/code> est sollicit\u00e9e sur un objet matriciel, son algorithme interne interroge directement la disposition m\u00e9moire de la structure. L&rsquo;\u00e9valuation s&rsquo;ex\u00e9cute avec une grande rapidit\u00e9 computationnelle car elle s&rsquo;abstient des v\u00e9rifications de polymorphisme de colonnes inh\u00e9rentes aux <em>data frames<\/em> :<\/p>\n<p><code>matrice_scores &lt;- matrix(c(1.2, 2.4, NA, 4.1, 5.0, 6.2, 7.1, NA, 9.3), nrow = 3, byrow = TRUE)<\/code><br \/>\n<code>lignes_valides &lt;- complete.cases(matrice_scores)<\/code><br \/>\n<code>matrice_purgee &lt;- matrice_scores[lignes_valides, , drop = FALSE]<\/code><\/p>\n<p>Une pr\u00e9caution imp\u00e9rative lors du sous-\u00e9chantillonnage matriciel sous R consiste en l&rsquo;utilisation explicite du param\u00e8tre <code>drop = FALSE<\/code> au sein des crochets. Par d\u00e9faut, si l&rsquo;op\u00e9ration de filtrage aboutissait \u00e0 l&rsquo;extraction d&rsquo;une seule ligne valide r\u00e9siduelle, R forcerait la coercition de la matrice en un vecteur unidimensionnel simple, d\u00e9truisant ainsi les attributs de dimensionnalit\u00e9 indispensables aux op\u00e9rations ult\u00e9rieures d&rsquo;alg\u00e8bre matricielle.<\/p>\n<h3>6.2 Pr\u00e9paration de matrices pour l&rsquo;alg\u00e8bre lin\u00e9aire et la mod\u00e9lisation<\/h3>\n<p>La pr\u00e9paration rigoureuse de structures matricielles d\u00e9pourvues de toute valeur manquante constitue une exigence technique non n\u00e9gociable pour la mise en \u0153uvre des calculs d&rsquo;alg\u00e8bre lin\u00e9aire. Les op\u00e9rations fondamentales telles que l&rsquo;inversion matricielle, la d\u00e9composition en valeurs singuli\u00e8res (SVD), l&rsquo;extraction des composantes principales (ACP) ou le calcul des valeurs et vecteurs propres (op\u00e9rateur <code>eigen()<\/code>) sont math\u00e9matiquement ind\u00e9finies en pr\u00e9sence du moindre symbole <code>NA<\/code>.<\/p>\n<p>Si une matrice de covariance empirique ou une matrice de corr\u00e9lation de Pearson est calcul\u00e9e \u00e0 partir de donn\u00e9es corrompues par des omissions, l&rsquo;estimation directe par la fonction <code>cov()<\/code> ou <code>cor()<\/code> g\u00e9n\u00e8re une matrice int\u00e9gralement peupl\u00e9e de <code>NA<\/code>, paralysant l&rsquo;ensemble de la cha\u00eene de mod\u00e9lisation math\u00e9matique. Le recours \u00e0 <code>matrice[complete.cases(matrice), ]<\/code> garantit l&rsquo;admissibilit\u00e9 de la matrice de donn\u00e9es r\u00e9siduelle pour l&rsquo;application des \u00e9quations normales de moindres carr\u00e9s :<\/p>\n<p><code># Estimation des coefficients b\u00eata : (X'X)^(-1) X'Y<\/code><br \/>\n<code>X &lt;- matrice_purgee[, -1] # Matrice des pr\u00e9dicteurs<\/code><br \/>\n<code>Y &lt;- matrice_purgee[, 1]  # Vecteur r\u00e9ponse<\/code><br \/>\n<code>beta &lt;- solve(t(X) %*% X) %*% t(X) %*% Y<\/code><\/p>\n<p>Il convient n\u00e9anmoins de surveiller l&rsquo;impact du filtrage sur le rang de la matrice. L&rsquo;amputation d&rsquo;un nombre excessif de lignes peut potentiellement d\u00e9grader le rang de <code>X<\/code> et rendre la matrice de produit crois\u00e9 singuli\u00e8re ou mal conditionn\u00e9e, emp\u00eachant son inversion num\u00e9rique.<\/p>\n<h3>6.3 Filtrage conjoint des colonnes et des lignes matricielles<\/h3>\n<p>Dans certains contextes de recherche en neuro-imagerie, en g\u00e9nomique ou en psychom\u00e9trie computationnelle, les donn\u00e9es se pr\u00e9sentent sous la forme de matrices massives o\u00f9 les omissions touchent simultan\u00e9ment certaines variables (items, biomarqueurs) et certaines unit\u00e9s statistiques (participants). Dans une telle configuration, une suppression par liste unilat\u00e9rale appliqu\u00e9e sur les seules lignes peut d\u00e9truire la quasi-totalit\u00e9 de l&rsquo;\u00e9chantillon si un ou deux items pr\u00e9sentent un taux d&rsquo;omission quasi total.<\/p>\n<p>Une m\u00e9thodologie optimis\u00e9e repose sur une strat\u00e9gie d&rsquo;arbitrage bidirectionnel s\u00e9quentiel exploitant la transposition matricielle <code>t()<\/code> combin\u00e9e \u00e0 <code>complete.cases()<\/code> :<\/p>\n<p><code># \u00c9tape 1 : Identification et \u00e9limination des variables (colonnes) trop d\u00e9faillantes<\/code><br \/>\n<code># complete.cases() sur la matrice transpos\u00e9e \u00e9value la compl\u00e9tude des colonnes de l'originale<\/code><br \/>\n<code>taux_reponse_colonnes &lt;- colMeans(!is.na(matrice_brute))<\/code><br \/>\n<code>matrice_colonnes_filtrees &lt;- matrice_brute[, taux_reponse_colonnes &gt;= 0.80, drop = FALSE]<\/code><\/p>\n<p><code># \u00c9tape 2 : Suppression par liste sur les lignes r\u00e9siduelles<\/code><br \/>\n<code>matrice_finale &lt;- matrice_colonnes_filtrees[complete.cases(matrice_colonnes_filtrees), , drop = FALSE]<\/code><\/p>\n<p>Cette approche conjointe \u00e9vite le sacrifice massif d&rsquo;observations provoqu\u00e9 par la d\u00e9faillance isol\u00e9e d&rsquo;un instrument de mesure, pr\u00e9servant ainsi le volume global d&rsquo;informations exploitables.<\/p>\n<h2>7. Analyse comparative : complete.cases() face \u00e0 na.omit() et na.exclude()<\/h2>\n<h3>7.1 Diff\u00e9rences structurelles et attributs retourn\u00e9s<\/h3>\n<p>Le syst\u00e8me de base de R fournit plusieurs fonctions d\u00e9di\u00e9es \u00e0 l&rsquo;\u00e9viction des donn\u00e9es manquantes. Les plus couramment mobilis\u00e9es conjointement avec <code>complete.cases()<\/code> sont <code>na.omit()<\/code> et <code>na.exclude()<\/code>. Bien qu&rsquo;elles visent une finalit\u00e9 similaire, leurs comportements internes et leurs sorties diff\u00e8rent profond\u00e9ment :<\/p>\n<ul>\n<li><strong><code>complete.cases()<\/code> :<\/strong> N&rsquo;op\u00e8re aucune extraction par elle-m\u00eame ; elle renvoie exclusivement un vecteur logique pur de classe <code>logical<\/code>. Elle ne modifie pas les structures et n&rsquo;attache aucun attribut aux donn\u00e9es.<\/li>\n<li><strong><code>na.omit()<\/code> :<\/strong> Prend un objet (matrice, vecteur, <em>data frame<\/em>) et renvoie directement la structure nettoy\u00e9e de ses lignes incompl\u00e8tes. De surcro\u00eet, elle greffe syst\u00e9matiquement \u00e0 l&rsquo;objet r\u00e9sultant un attribut sp\u00e9cial nomm\u00e9 <code>na.action<\/code> (de classe <code>omit<\/code>), qui contient les indices exacts des rang\u00e9es qui ont \u00e9t\u00e9 \u00e9vinc\u00e9es.<\/li>\n<li><strong><code>na.exclude()<\/code> :<\/strong> Pr\u00e9sente un fonctionnement presque identique \u00e0 <code>na.omit()<\/code>, mais l&rsquo;attribut <code>na.action<\/code> porte la classe <code>exclude<\/code>. Cette nuance est d\u00e9terminante lors de l&rsquo;application de fonctions g\u00e9n\u00e9riques telles que <code>predict()<\/code> ou <code>residuals()<\/code> sur des mod\u00e8les lin\u00e9aires : les pr\u00e9dictions r\u00e9injectent automatiquement des <code>NA<\/code> aux positions initialement exclues afin de maintenir une longueur de sortie align\u00e9e avec le jeu de donn\u00e9es originel.<\/li>\n<\/ul>\n<p>Pour des manipulations matricielles pures ou des pipelines d&rsquo;alg\u00e8bre lin\u00e9aire, la pr\u00e9sence des attributs additionnels impos\u00e9s par <code>na.omit()<\/code> peut parfois introduire des surcharges ou des comportements impr\u00e9vus lors de la s\u00e9rialisation, rendant l&rsquo;utilisation neutre de <code>complete.cases()<\/code> pr\u00e9f\u00e9rable.<\/p>\n<h3>7.2 Efficacit\u00e9 computationnelle et consommation de m\u00e9moire vive<\/h3>\n<p>L&rsquo;\u00e9valuation comparative de l&rsquo;efficacit\u00e9 computationnelle de ces approches met en jeu les m\u00e9canismes d&rsquo;allocation m\u00e9moire du moteur R. Lorsque la fonction <code>na.omit()<\/code> est appel\u00e9e sur un tableau volumineux, elle ex\u00e9cute en interne une s\u00e9rie d&rsquo;op\u00e9rations de dispatch de m\u00e9thodes S3, \u00e9value la pr\u00e9sence de <code>NA<\/code>, extrait les lignes valides, collecte les indices des lignes incompl\u00e8tes, construit le vecteur d&rsquo;attribut <code>na.action<\/code> et classe ce dernier avant de retourner l&rsquo;objet composite.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&#8217;emploi de <code>df[complete.cases(df), ]<\/code> mobilise une fonction primitive hautement optimis\u00e9e en langage C qui parcourt les structures vectorielles sous-jacentes avec un surco\u00fbt m\u00e9thodologique minimal. Dans les sc\u00e9narios impliquant des volumes de donn\u00e9es \u00e9lev\u00e9s (centaines de milliers \u00e0 millions de lignes), l&rsquo;\u00e9conomie r\u00e9alis\u00e9e sur la non-g\u00e9n\u00e9ration d&rsquo;attributs volumineux et l&rsquo;absence de dispatching de m\u00e9thodes g\u00e9n\u00e9riques conf\u00e8rent un avantage de vitesse mesurable \u00e0 <code>complete.cases()<\/code>.<\/p>\n<p>Sur le plan de l&#8217;empreinte m\u00e9moire, <code>complete.cases()<\/code> produit un vecteur bool\u00e9en qui consomme seulement 4 octets par \u00e9l\u00e9ment logique sous R, ce qui permet de stocker et de r\u00e9utiliser ce masque d&rsquo;indexation sans saturer la m\u00e9moire vive, contrairement \u00e0 la duplication d&rsquo;objets complets induite par des fonctions de traitement imm\u00e9diat.<\/p>\n<h3>7.3 Matrice d\u00e9cisionnelle pour le choix de la m\u00e9thode idoine<\/h3>\n<p>Le tableau analytique suivant synth\u00e9tise les crit\u00e8res de d\u00e9cision m\u00e9thodologiques et programmatiques permettant de guider le choix de l&rsquo;analyste entre les diff\u00e9rentes fonctions disponibles sous R :<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr style=\"background-color: #f2f2f2;\">\n<th>Crit\u00e8re d&rsquo;\u00e9valuation<\/th>\n<th>complete.cases()<\/th>\n<th>na.omit()<\/th>\n<th>na.exclude()<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Type d&rsquo;objet produit<\/strong><\/td>\n<td>Vecteur logique (<code>logical<\/code>)<\/td>\n<td>Structure filtr\u00e9e avec attributs<\/td>\n<td>Structure filtr\u00e9e avec attributs<\/td>\n<\/tr>\n<tr>\n<td><strong>Filtrage sur sous-ensemble de colonnes<\/strong><\/td>\n<td>Direct et idiomatique : <code>df[complete.cases(df[, cols]), ]<\/code><\/td>\n<td>Complexe (exige un d\u00e9coupage interm\u00e9diaire)<\/td>\n<td>Complexe (exige un d\u00e9coupage interm\u00e9diaire)<\/td>\n<\/tr>\n<tr>\n<td><strong>Pr\u00e9servation de la dimensionnalit\u00e9 des r\u00e9sidus<\/strong><\/td>\n<td>Non (requiert une r\u00e9indexation manuelle)<\/td>\n<td>Non (taille r\u00e9siduelle = taille nettoy\u00e9e)<\/td>\n<td>Oui (ajoute automatiquement des <code>NA<\/code> dans <code>residuals()<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><strong>Surco\u00fbt li\u00e9 aux m\u00e9tadonn\u00e9es (attributs)<\/strong><\/td>\n<td>Nul (aucune m\u00e9tadonn\u00e9e cr\u00e9\u00e9e)<\/td>\n<td>Mod\u00e9r\u00e9 (attribut <code>na.action<\/code> g\u00e9n\u00e9r\u00e9)<\/td>\n<td>Mod\u00e9r\u00e9 (attribut <code>na.action<\/code> g\u00e9n\u00e9r\u00e9)<\/td>\n<\/tr>\n<tr>\n<td><strong>Contexte pr\u00e9f\u00e9rentiel<\/strong><\/td>\n<td>Pipelines de nettoyage, filtres conditionnels, matrices<\/td>\n<td>Mod\u00e9lisation rapide (formules R standard)<\/td>\n<td>Mod\u00e9lisation pr\u00e9dictive avec alignement strict<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>8. Int\u00e9gration dans l&rsquo;\u00e9cosyst\u00e8me Tidyverse et syntaxe dplyr<\/h2>\n<h3>8.1 Utilisation de complete.cases() au sein de dplyr::filter()<\/h3>\n<p>L&rsquo;\u00e9mergence du paradigme du <a rel=\"noopener noreferrer\" href=\"https:\/\/r4ds.hadley.nz\/\">Tidyverse<\/a> a profond\u00e9ment modifi\u00e9 les conventions de stylistique programmatique en science des donn\u00e9es. Au sein de cet \u00e9cosyst\u00e8me, l&rsquo;orchestration des flux s&rsquo;appuie massivement sur l&rsquo;op\u00e9rateur de cha\u00eenage s\u00e9quentiel (<code>%&gt;%<\/code> ou le tube natif <code>|&gt;<\/code>) et sur les verbes de manipulation alg\u00e9brique du paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/dplyr.tidyverse.org\/\">dplyr<\/a>.<\/p>\n<p>L&rsquo;int\u00e9gration de la fonction native <code>complete.cases()<\/code> au sein du verbe <code>dplyr::filter()<\/code> s&rsquo;op\u00e8re de fa\u00e7on harmonieuse et \u00e9l\u00e9gante. Lorsque l&rsquo;on souhaite \u00e9purer un tibble sans renoncer \u00e0 la lisibilit\u00e9 du pipeline, il est possible d&rsquo;invoquer le marqueur positionnel point <code>.<\/code> repr\u00e9sentant la structure de donn\u00e9es transmise par l&rsquo;\u00e9tape amont du tube :<\/p>\n<p><code>library(dplyr)<\/code><\/p>\n<p><code>donnees_analyse &lt;- table_initiale %&gt;%<br \/>\n&nbsp;&nbsp;mutate(vitesse_normalisee = scale(temps_reponse)) %&gt;%<br \/>\n&nbsp;&nbsp;filter(complete.cases(.)) %&gt;%<br \/>\n&nbsp;&nbsp;arrange(identifiant)<\/code><\/p>\n<p>Dans cette architecture, <code>filter(complete.cases(.))<\/code> transmet le tibble courant \u00e0 la fonction de d\u00e9tection, laquelle retourne le vecteur logique correspondant au verbe de filtrage. Cette approche concilie l&rsquo;optimisation algorithmique interne du code de base avec la fluidit\u00e9 d\u00e9clarative propre aux architectures de traitement par flux.<\/p>\n<h3>8.2 Comparaison avec tidyr::drop_na()<\/h3>\n<p>L&rsquo;\u00e9cosyst\u00e8me sp\u00e9cialis\u00e9 propose une alternative d\u00e9clarative d\u00e9di\u00e9e au sein du paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/tidyr.tidyverse.org\/\">tidyr<\/a> avec la fonction <code>drop_na()<\/code>. L&rsquo;analyse comparative entre <code>complete.cases()<\/code> et <code>drop_na()<\/code> repose principalement sur des arbitrages entre d\u00e9pendance logicielle, flexibilit\u00e9 s\u00e9mantique et expressivit\u00e9 du code :<\/p>\n<p><code># Approche Tidyverse idiomatique<\/code><br \/>\n<code>table_epuree &lt;- table_initiale %&gt;% drop_na(age, score_depression)<\/code><\/p>\n<p><code># Approche hybride complete.cases<\/code><br \/>\n<code>table_epuree &lt;- table_initiale %&gt;% filter(complete.cases(age, score_depression))<\/code><\/p>\n<p>La fonction <code>drop_na()<\/code> pr\u00e9sente l&rsquo;avantage stylistique d&rsquo;autoriser l&rsquo;usage des s\u00e9lecteurs contextuels de variables (<em>tidyselect<\/em>), tels que <code>starts_with(\"item_\")<\/code>, <code>contains(\"test\")<\/code> ou <code>where(is.numeric)<\/code>. Elle s&rsquo;av\u00e8re donc particuli\u00e8rement intuitive lors de l&rsquo;exploration interactive.<\/p>\n<p>Cependant, dans un contexte de d\u00e9veloppement de biblioth\u00e8ques logicielles ou de d\u00e9ploiement d&rsquo;algorithmes en production industrielle, l&#8217;emploi exclusif de <code>complete.cases()<\/code> \u00e9limine toute d\u00e9pendance envers des biblioth\u00e8ques externes lourdes (dont les d\u00e9pendances transitives telles que <code>rlang<\/code> ou <code>vctrs<\/code>), garantissant une robustesse et une p\u00e9rennit\u00e9 d&rsquo;ex\u00e9cution absolue face \u00e0 d&rsquo;\u00e9ventuelles \u00e9volutions de syntaxe des paquets tiers.<\/p>\n<h3>8.3 Filtrage conditionnel group\u00e9 via group_by()<\/h3>\n<p>Un cas d&rsquo;usage avanc\u00e9 en recherche comportementale concerne l&rsquo;\u00e9valuation de la compl\u00e9tude au sein de sous-groupes exp\u00e9rimentaux ou de grappes observationnelles (par exemple, des classes scolaires ou des centres hospitaliers). L&rsquo;articulation de <code>complete.cases()<\/code> avec le verbe <code>group_by()<\/code> permet d&rsquo;imposer des r\u00e8gles de compl\u00e9tude stratifi\u00e9es :<\/p>\n<p><code>donnees_filtrees_par_centre &lt;- base_recueil %&gt;%<br \/>\n&nbsp;&nbsp;group_by(centre_investigateur) %&gt;%<br \/>\n&nbsp;&nbsp;filter(mean(complete.cases(.)) &gt;= 0.75) %&gt;%<br \/>\n&nbsp;&nbsp;ungroup()<\/code><\/p>\n<p>Dans cet exemple, l&rsquo;op\u00e9ration n&rsquo;\u00e9limine pas simplement les lignes manquantes isol\u00e9es, mais calcule pr\u00e9alablement le taux global de compl\u00e9tude au sein de chaque centre investigateur. Si un centre pr\u00e9sente un taux d&rsquo;abandon sup\u00e9rieur \u00e0 25 % (ratio de compl\u00e9tude inf\u00e9rieur \u00e0 0.75), l&rsquo;ensemble des donn\u00e9es associ\u00e9es \u00e0 cette unit\u00e9 structurelle est \u00e9cart\u00e9 afin de pr\u00e9venir l&rsquo;inclusion d&rsquo;environnements exp\u00e9rimentaux non fiables dans l&rsquo;analyse finale.<\/p>\n<h2>9. Diagnostic et quantification exploratoire des donn\u00e9es manquantes<\/h2>\n<h3>9.1 D\u00e9nombrement et calcul des pourcentages de compl\u00e9tude<\/h3>\n<p>Pr\u00e9alablement \u00e0 toute d\u00e9cision d\u00e9finitive relative \u00e0 l&rsquo;\u00e9limination ou \u00e0 l&rsquo;imputation de donn\u00e9es incompl\u00e8tes, une d\u00e9marche m\u00e9thodologique conforme aux pr\u00e9conisations scientifiques impose de quantifier pr\u00e9cis\u00e9ment l&rsquo;\u00e9tendue des pertes. L&rsquo;utilisation directe de <code>complete.cases()<\/code> permet d&rsquo;extraire rapidement les descripteurs cardinaux de l&rsquo;\u00e9chantillon :<\/p>\n<p><code># Calculs de synth\u00e8se exploratoire<\/code><br \/>\n<code>nb_lignes_totales &lt;- nrow(base_donnees)<\/code><br \/>\n<code>nb_lignes_completes &lt;- sum(complete.cases(base_donnees))<\/code><br \/>\n<code>nb_lignes_incompletes &lt;- sum(!complete.cases(base_donnees))<\/code><br \/>\n<code>pourcentage_completude &lt;- mean(complete.cases(base_donnees)) * 100<\/code><\/p>\n<p>Ces \u00e9l\u00e9ments permettent de structurer un tableau synth\u00e9tique de reporting pr\u00e9liminaire essentiel pour les comit\u00e9s d&rsquo;\u00e9thique et les \u00e9valuateurs universitaires. Si la proportion de lignes compl\u00e8tes descend en de\u00e7\u00e0 d&rsquo;un seuil conventionnel de 90 ou 95 %, l&rsquo;analyste doit imp\u00e9rativement documenter les caract\u00e9ristiques d\u00e9mographiques et cliniques des observations \u00e9vinc\u00e9es afin d&rsquo;identifier d&rsquo;\u00e9ventuels biais d&rsquo;exclusion syst\u00e9matiques.<\/p>\n<h3>9.2 Combinaison avec la visualisation des profils de non-r\u00e9ponse<\/h3>\n<p>L&rsquo;indicateur bool\u00e9en fourni par <code>complete.cases()<\/code> peut servir d&rsquo;axe d&rsquo;indexation pour des visualisations graphiques de niveau professionnel. Associ\u00e9 au paquet sp\u00e9cialis\u00e9 <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=VIM\">VIM<\/a> (<em>Visualization and Imputation of Missing Values<\/em>) ou au paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=naniar\">naniar<\/a>, il permet de projeter la cartographie spatiale des patrons de non-r\u00e9ponse :<\/p>\n<p><code>library(VIM)<\/code><br \/>\n<code>aggr(base_donnees, col = c('navyblue', 'red'), numbers = TRUE, sortVars = TRUE,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;labels = names(base_donnees), cex.axis = .7, gap = 3,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ylab = c(\"Proportion de valeurs manquantes\", \"Patron de co-occurrence\"))<\/code><\/p>\n<p>En corr\u00e9lant le vecteur <code>complete.cases(base_donnees)<\/code> avec des covariables d\u00e9mographiques (par le biais d&rsquo;un test du Chi-deux ou d&rsquo;une r\u00e9gression logistique pr\u00e9disant la compl\u00e9tude), le statisticien identifie si la probabilit\u00e9 d&rsquo;incompl\u00e9tude est statistiquement d\u00e9pendante de facteurs tels que l&rsquo;\u00e2ge des r\u00e9pondants ou leur niveau de formation, r\u00e9v\u00e9lant ainsi empiriquement une d\u00e9viation manifeste par rapport au postulat de donn\u00e9es compl\u00e8tement al\u00e9atoires (MCAR).<\/p>\n<h3>9.3 \u00c9laboration d&rsquo;une fonction d&rsquo;audit automatis\u00e9e<\/h3>\n<p>Afin de syst\u00e9matiser le contr\u00f4le qualit\u00e9 au sein d&rsquo;\u00e9quipes de recherche traitant de multiples cohortes, il est recommand\u00e9 de packager ces v\u00e9rifications au sein d&rsquo;une fonction d&rsquo;audit robuste renvoyant un compte rendu d&rsquo;int\u00e9grit\u00e9 :<\/p>\n<p><code>auditer_completude &lt;- function(donnees, seuil_critique = 0.85) {<br \/>\n&nbsp;&nbsp;if (!is.data.frame(donnees) &amp;&amp; !is.matrix(donnees)) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;stop(\"L'argument doit \u00eatre une matrice ou un data frame.\")<br \/>\n&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;lignes_valides &lt;- complete.cases(donnees)<br \/>\n&nbsp;&nbsp;ratio_complet &lt;- mean(lignes_valides)<br \/>\n&nbsp;&nbsp;rapport &lt;- list(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;N_total = nrow(donnees),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;N_valide = sum(lignes_valides),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;N_exclu = sum(!lignes_valides),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;Taux_Completude = round(ratio_complet, 4),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;Statut = ifelse(ratio_complet &gt;= seuil_critique, \"CONFORME\", \"ALERTE_ATTRITION\")<br \/>\n&nbsp;&nbsp;)<br \/>\n&nbsp;&nbsp;if (rapport$Statut == \"ALERTE_ATTRITION\") {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;warning(paste0(\"Le taux de compl\u00e9tude (\", round(ratio_complet * 100, 2),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"%) est sous le seuil critique tol\u00e9r\u00e9 de \", seuil_critique * 100, \"%.\"))<br \/>\n&nbsp;&nbsp;}<br \/>\n&nbsp;&nbsp;return(rapport)<br \/>\n}<\/code><\/p>\n<p>Cette fonction s&rsquo;ins\u00e8re id\u00e9alement au d\u00e9but de scripts d&rsquo;analyse automatis\u00e9s (<em>batch processing<\/em>), interrompant ou alertant imm\u00e9diatement le chercheur en cas d&rsquo;alt\u00e9ration impr\u00e9vue des donn\u00e9es sources.<\/p>\n<h2>10. Enjeux m\u00e9thodologiques et risques de biais en sciences comportementales<\/h2>\n<h3>10.1 Le biais d&rsquo;attrition cons\u00e9cutif \u00e0 la suppression compl\u00e8te (listwise deletion)<\/h3>\n<p>Bien que l&rsquo;application de <code>complete.cases()<\/code> garantisse un jeu de donn\u00e9es rectangulaire parfait, son recours aveugle expose l&rsquo;analyste \u00e0 des cons\u00e9quences scientifiques majeures d\u00e9sign\u00e9es sous le terme g\u00e9n\u00e9rique de biais d&rsquo;attrition ou de s\u00e9lection. Lorsque l&rsquo;absence de r\u00e9ponse est li\u00e9e aux caract\u00e9ristiques intrins\u00e8ques des individus, la population r\u00e9siduelle ne constitue plus un reflet fid\u00e8le de la population cible originale.<\/p>\n<p>En \u00e9pid\u00e9miologie psychiatrique et en psychologie clinique, les individus pr\u00e9sentant des profils s\u00e9v\u00e8res (niveaux \u00e9lev\u00e9s d&rsquo;anxi\u00e9t\u00e9 sociale, troubles cognitifs, addiction prononc\u00e9e) abandonnent fr\u00e9quemment les protocoles exp\u00e9rimentaux avant leur terme. La suppression syst\u00e9matique des cas incomplets a pour effet m\u00e9canique de tronquer la distribution des variables pathologiques. Les moyennes observ\u00e9es sur le groupe purifi\u00e9 sous-estiment alors syst\u00e9matiquement la gravit\u00e9 clinique r\u00e9elle, tandis que la variance des traits mesur\u00e9s se trouve artificiellement contract\u00e9e. Ce tassement de variance att\u00e9nue artificiellement les corr\u00e9lations de Pearson avec d&rsquo;autres facteurs de vuln\u00e9rabilit\u00e9, conduisant potentiellement \u00e0 des conclusions scientifiques fallacieuses.<\/p>\n<h3>10.2 Diagnostic du m\u00e9canisme MCAR pr\u00e9alablement \u00e0 l&rsquo;utilisation de complete.cases()<\/h3>\n<p>Pour conf\u00e9rer une l\u00e9gitimit\u00e9 th\u00e9orique \u00e0 la suppression par liste induite par <code>complete.cases()<\/code>, il est imp\u00e9ratif de tester formellement si le processus g\u00e9n\u00e9rateur de donn\u00e9es incompl\u00e8tes respecte l&rsquo;hypoth\u00e8se MCAR (<em>Missing Completely At Random<\/em>). La m\u00e9thodologie de r\u00e9f\u00e9rence est le test omnibus de <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1080\/01621459.1988.10478722\">Roderick Little (1988)<\/a>.<\/p>\n<p>Ce test statistique \u00e9value si les moyennes des diff\u00e9rentes sous-populations d\u00e9finies par les patrons d&rsquo;absence s&rsquo;\u00e9cartent significativement des esp\u00e9rances th\u00e9oriques globales. Sous R, ce test est facilement ex\u00e9cutable via la fonction <code>mcar_test()<\/code> du paquet <code>naniar<\/code> :<\/p>\n<p><code>library(naniar)<\/code><br \/>\n<code>test_little &lt;- mcar_test(donnees_recherche)<\/code><br \/>\n<code>print(test_little)<\/code><\/p>\n<p>L&rsquo;interpr\u00e9tation de la valeur <em>p<\/em> s&rsquo;articule comme suit :<\/p>\n<ul>\n<li>Si la valeur <em>p<\/em> est strictement sup\u00e9rieure au seuil usuel (par exemple <span class=\"arabpsy-math-inline\" data-latex=\"\\alpha = 0.05\">$\\alpha = 0.05$<\/span>), on ne peut rejeter l&rsquo;hypoth\u00e8se nulle MCAR. L&rsquo;application de <code>complete.cases()<\/code> n&rsquo;introduira pas de distorsion syst\u00e9matique des estimations ponctuelles, bien qu&rsquo;elle affecte la puissance globale du test.<\/li>\n<li>Si la valeur <em>p<\/em> est inf\u00e9rieure \u00e0 0.05, l&rsquo;hypoth\u00e8se de puret\u00e9 al\u00e9atoire est formellement r\u00e9fut\u00e9e. Le m\u00e9canisme sous-jacent est au minimum de type MAR ou MNAR. Dans cette circonstance, l&rsquo;\u00e9viction par <code>complete.cases()<\/code> vicie substantiellement la validit\u00e9 inf\u00e9rentielle, et le recours \u00e0 l&rsquo;imputation multiple (par exemple via le paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=mice\">mice<\/a>) devient m\u00e9thodologiquement imp\u00e9ratif.<\/li>\n<\/ul>\n<h3>10.3 Directives de r\u00e9daction conformes aux normes APA (7e \u00e9dition)<\/h3>\n<p>Les directives de publication scientifique \u00e9dict\u00e9es par l&rsquo;<em>American Psychological Association<\/em> (normes APA, 7e \u00e9dition) exigent une transparence sans faille quant \u00e0 la trajectoire d&rsquo;\u00e9chantillonnage et aux choix de nettoyage op\u00e9r\u00e9s par les auteurs. Il est express\u00e9ment prescrit de ne pas dissimuler la d\u00e9perdition d&rsquo;observations derri\u00e8re des tableaux synth\u00e9tiques sans mention explicite de l&rsquo;\u00e9chantillon initial recueilli.<\/p>\n<p>Dans la section M\u00e9thode \/ Participants du manuscrit scientifique, le protocole de nettoyage bas\u00e9 sur <code>complete.cases()<\/code> doit \u00eatre rigoureusement document\u00e9 :<\/p>\n<ul>\n<li>D\u00e9clarer l&rsquo;effectif initial exact des participants ayant consenti et d\u00e9but\u00e9 l&rsquo;exp\u00e9rimentation (<span class=\"arabpsy-math-inline\" data-latex=\"N_{initial}\">$N_{initial}$<\/span>).<\/li>\n<li>Pr\u00e9ciser l&rsquo;effectif absolu et le pourcentage exact d&rsquo;individus \u00e9cart\u00e9s suite \u00e0 l&rsquo;application du crit\u00e8re de compl\u00e9tude par liste (<span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> et % exclus).<\/li>\n<li>Rapporter les r\u00e9sultats des tests d&rsquo;ind\u00e9pendance de l&rsquo;attrition (ex. test de Little ou r\u00e9gressions logistiques d&rsquo;attrition sur les caract\u00e9ristiques sociod\u00e9mographiques).<\/li>\n<li>Int\u00e9grer, pour les protocoles exp\u00e9rimentaux denses ou longitudinaux, un diagramme de flux d&rsquo;\u00e9chantillon (<em>flowchart<\/em>) d\u00e9taill\u00e9 d\u00e9crivant pr\u00e9cis\u00e9ment les pertes d&rsquo;unit\u00e9s \u00e0 chaque \u00e9tape du pipeline de traitement.<\/li>\n<\/ul>\n<h2>11. \u00c9tudes de cas appliqu\u00e9es en psychom\u00e9trie et recherche exp\u00e9rimentale<\/h2>\n<h3>11.1 \u00c9tude de cas A : Traitement d&rsquo;un questionnaire d&rsquo;anxi\u00e9t\u00e9 de type Likert<\/h3>\n<p>Consid\u00e9rons un protocole de recherche portant sur l&rsquo;anxi\u00e9t\u00e9-\u00e9tat mesur\u00e9e par un inventaire psychom\u00e9trique compos\u00e9 de six items ordinaux (not\u00e9s de 1 \u00e0 4). L&rsquo;investigation porte sur un \u00e9chantillon brut de six cents participants enregistr\u00e9s via un formulaire en ligne. Des interruptions spontan\u00e9es de passation ont g\u00e9n\u00e9r\u00e9 des omissions partielles sur certains items.<\/p>\n<p>Le chercheur entend calculer la coh\u00e9rence interne de l&rsquo;\u00e9chelle par le coefficient Alpha de Cronbach \u00e0 l&rsquo;aide du paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=psych\">psych<\/a>, une op\u00e9ration qui requiert une matrice empirique compl\u00e8te sur les items consid\u00e9r\u00e9s :<\/p>\n<p><code>library(psych)<\/code><\/p>\n<p><code># Simulation du jeu de donn\u00e9es brut<\/code><br \/>\n<code>set.seed(42)<\/code><br \/>\n<code>items_noms &lt;- paste0(\"STAI_\", 1:6)<\/code><br \/>\n<code>reponses_brutes &lt;- as.data.frame(matrix(sample(c(1:4, NA), 600 * 6, replace = TRUE, prob = c(0.2, 0.2, 0.2, 0.3, 0.1)), ncol = 6))<\/code><br \/>\n<code>colnames(reponses_brutes) &lt;- items_noms<\/code><\/p>\n<p><code># Application du filtrage par sous-\u00e9chelle<\/code><br \/>\n<code>masque_valide &lt;- complete.cases(reponses_brutes[, items_noms])<\/code><br \/>\n<code>reponses_nettoyees &lt;- reponses_brutes[masque_valide, ]<\/code><\/p>\n<p><code># Diagnostic psychom\u00e9trique<\/code><br \/>\n<code>resultat_alpha &lt;- psych::alpha(reponses_nettoyees)<\/code><br \/>\n<code>print(resultat_alpha$total)<\/code><\/p>\n<p>Dans ce sc\u00e9nario, le recours \u00e0 <code>complete.cases()<\/code> garantit que le calcul de la matrice de covariance inter-items ne souffre d&rsquo;aucune distorsion par traitement par paire (<em>pairwise<\/em>), lequel peut engendrer des matrices non d\u00e9finies positives dont l&rsquo;alpha de Cronbach r\u00e9sultant violerait les bornes th\u00e9oriques de validit\u00e9.<\/p>\n<h3>11.2 \u00c9tude de cas B : Exp\u00e9rimentation en temps de r\u00e9action \u00e0 mesures r\u00e9p\u00e9t\u00e9es<\/h3>\n<p>Dans les paradigmes de chronom\u00e9trie mentale, les protocoles \u00e0 mesures r\u00e9p\u00e9t\u00e9es imposent l&rsquo;\u00e9valuation des participants sous diverses conditions exp\u00e9rimentales successives (par exemple : Condition Neutre, Condition Congruente, Condition Incongruente). Les donn\u00e9es sont initialement consign\u00e9es au format large (<em>wide format<\/em>), o\u00f9 chaque condition fait l&rsquo;objet d&rsquo;une colonne distincte.<\/p>\n<p>Si un sujet pr\u00e9sente un enregistrement manquant sur l&rsquo;une des conditions pivots, son inclusion dans une analyse de variance \u00e0 mesures r\u00e9p\u00e9t\u00e9es (ANOVA mixte) d\u00e9s\u00e9quilibrera le plan factoriel. Le protocole d&rsquo;assainissement s&rsquo;orchestre comme suit :<\/p>\n<p><code># Donn\u00e9es exp\u00e9rimentales au format large<\/code><br \/>\n<code>temps_large &lt;- data.frame(<br \/>\n&nbsp;&nbsp;sujet = 1:5,<br \/>\n&nbsp;&nbsp;neutre = c(450, 480, NA, 460, 430),<br \/>\n&nbsp;&nbsp;congruent = c(420, 440, 410, 435, 415),<br \/>\n&nbsp;&nbsp;incongruent = c(520, 560, 510, NA, 500)<br \/>\n)<\/code><\/p>\n<p><code># Assainissement des conditions exp\u00e9rimentales obligatoires<\/code><br \/>\n<code>conditions &lt;- c(\"neutre\", \"congruent\", \"incongruent\")<\/code><br \/>\n<code>sujets_valides &lt;- temps_large[complete.cases(temps_large[, conditions]), ]<\/code><\/p>\n<p><code># Pivotement vers le format long pour mod\u00e9lisation<\/code><br \/>\n<code>library(tidyr)<\/code><br \/>\n<code>temps_long &lt;- pivot_longer(sujets_valides, cols = all_of(conditions), names_to = \"condition\", values_to = \"latence\")<\/code><\/p>\n<p>L&rsquo;utilisation pr\u00e9alable de <code>complete.cases()<\/code> avant le pivotement garantit que chaque sujet conserv\u00e9 dispose d&rsquo;une s\u00e9rie chronom\u00e9trique \u00e9quilibr\u00e9e \u00e0 travers toutes les strates exp\u00e9rimentales, assurant ainsi l&rsquo;orthogonalit\u00e9 rigoureuse du plan factoriel intra-sujets.<\/p>\n<h3>11.3 \u00c9tude de cas C : Mod\u00e9lisation pr\u00e9dictive par r\u00e9gression logistique binaire<\/h3>\n<p>En m\u00e9decine comportementale, l&rsquo;ajustement d&rsquo;un mod\u00e8le de r\u00e9gression logistique binaire (via la fonction <code>glm(family = binomial)<\/code>) est couramment mobilis\u00e9 pour pr\u00e9dire l&rsquo;adh\u00e9sion th\u00e9rapeutique (Variable binaire : 1 = Adh\u00e9sion, 0 = Abandon) \u00e0 partir de marqueurs psychologiques et physiologiques.<\/p>\n<p>L&rsquo;ex\u00e9cution aveugle de <code>glm()<\/code> sur un jeu de donn\u00e9es contenant des <code>NA<\/code> applique par d\u00e9faut <code>na.omit()<\/code> en interne. Toutefois, si l&rsquo;on souhaite r\u00e9aliser des proc\u00e9dures de validation crois\u00e9e (<em>cross-validation<\/em> en <em>k<\/em> plis) ou comparer des mod\u00e8les nich\u00e9s via des tests de rapport de vraisemblance (<em>likelihood ratio test<\/em> par <code>anova(modele1, modele2, test = \"Chisq\")<\/code>), la moindre variation du nombre de lignes trait\u00e9es due \u00e0 des donn\u00e9es manquantes fluctuantes invalidera math\u00e9matiquement la comparaison inter-mod\u00e8les :<\/p>\n<p><code># S\u00e9lection stricte d'un \u00e9chantillon commun d'\u00e9talonnage<\/code><br \/>\n<code>variables_tous_modeles &lt;- c(\"adhesion\", \"auto_efficacite\", \"stress_percu\", \"age\", \"sommeil\")<\/code><br \/>\n<code>cohorte_commune &lt;- cohorte_brute[complete.cases(cohorte_brute[, variables_tous_modeles]), ]<\/code><\/p>\n<p><code># Ajustement des mod\u00e8les embo\u00eet\u00e9s sur effectif strictement invariant<\/code><br \/>\n<code>modele_reduit &lt;- glm(adhesion ~ age + sommeil, data = cohorte_commune, family = binomial)<\/code><br \/>\n<code>modele_complet &lt;- glm(adhesion ~ age + sommeil + auto_efficacite + stress_percu, data = cohorte_commune, family = binomial)<\/code><\/p>\n<p><code># Comparaison formelle l\u00e9gitime<\/code><br \/>\n<code>anova(modele_reduit, modele_complet, test = \"Chisq\")<\/code><\/p>\n<p>La stabilisation de l&rsquo;\u00e9chantillon par <code>complete.cases()<\/code> en amont immunise le statisticien contre les rejets d&rsquo;ajustement g\u00e9n\u00e9r\u00e9s par des dimensions d&rsquo;\u00e9chantillons discordantes lors des comparaisons de mod\u00e8les.<\/p>\n<h2>12. Bonnes pratiques de programmation, pi\u00e8ges courants et optimisation<\/h2>\n<h3>12.1 \u00c9viter les pi\u00e8ges courants li\u00e9s aux types de donn\u00e9es<\/h3>\n<p>L&rsquo;un des pi\u00e8ges les plus d\u00e9vastateurs lors de l&rsquo;utilisation de <code>complete.cases()<\/code> concerne l&rsquo;existence de valeurs sentinelles ou de codes d&rsquo;omission arbitraires non reconnus nativement par le syst\u00e8me R. Dans de nombreux corpus de donn\u00e9es anciens ou export\u00e9s de logiciels tiers (tels que SPSS ou SAS), les valeurs non renseign\u00e9es sont fr\u00e9quemment cod\u00e9es par des entiers extr\u00eames tels que <code>99<\/code>, <code>999<\/code> ou <code>-9999<\/code>, ou par des libell\u00e9s textuels arbitraires du type <code>\"N\/A\"<\/code>, <code>\"Non Renseign\u00e9\"<\/code> ou <code>\"Manquant\"<\/code>.<\/p>\n<p>Pour le compilateur de base de R, la valeur num\u00e9rique <code>999<\/code> constitue un r\u00e9el parfaitement valide, et la cha\u00eene <code>\"N\/A\"<\/code> est un texte authentique de trois caract\u00e8res. Par cons\u00e9quent, <code>complete.cases()<\/code> \u00e9valuera ces enregistrements \u00e0 <code>TRUE<\/code>, annihilant silencieusement le filtrage attendu :<\/p>\n<p><code># \u00c9cueil classique<\/code><br \/>\n<code>x &lt;- c(12, 14, 999, 18)<\/code><br \/>\n<code>complete.cases(x) # Renvoy\u00e9 : TRUE TRUE TRUE TRUE (Erreur critique de diagnostic)<\/code><\/p>\n<p>La r\u00e8gle d&rsquo;or consiste \u00e0 op\u00e9rer une recodification rigoureuse pr\u00e9alable d\u00e8s l&rsquo;importation du fichier source en affectant explicitement la constante primitive <code>NA<\/code> \u00e0 ces marqueurs de substitution :<\/p>\n<p><code>donnees[donnees == 999] &lt;- NA<\/code><br \/>\n<code>donnees[donnees == \"N\/A\"] &lt;- NA<\/code><\/p>\n<p>Ce n&rsquo;est qu&rsquo;une fois cette \u00e9tape d&rsquo;harmonisation s\u00e9mantique valid\u00e9e que <code>complete.cases()<\/code> peut \u00eatre mobilis\u00e9e de fa\u00e7on fiable.<\/p>\n<h3>12.2 Optimisation des performances sur volum\u00e9tries massives (Big Data psychologique)<\/h3>\n<p>\u00c0 mesure que la recherche quantitative int\u00e8gre des cohortes massives (donn\u00e9es d&rsquo;usage d&rsquo;applications mobiles, panels num\u00e9riques, enregistrements physiologiques continus) englobant plusieurs millions d&rsquo;enregistrements, la vitesse de balayage et la consommation m\u00e9moire deviennent pr\u00e9pond\u00e9rantes.<\/p>\n<p>Bien que <code>complete.cases()<\/code> soit intrins\u00e8quement programm\u00e9e en C, son invocation sur des tables gigantesques peut \u00eatre supplant\u00e9e par des architectures alternatives hautement optimis\u00e9es, au premier rang desquelles figure le paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=data.table\">data.table<\/a>. Dans les environnements massifs, l&rsquo;utilisation conjointe des cl\u00e9s d&rsquo;indexation et des m\u00e9canismes de modification par r\u00e9f\u00e9rence \u00e9vite toute r\u00e9allocation de m\u00e9moire vive :<\/p>\n<p><code>library(data.table)<\/code><br \/>\n<code>dt &lt;- as.data.table(donnees_massives)<\/code><br \/>\n<code># Filtrage ultra-rapide sans copie m\u00e9moire superf\u00e9tatoire<\/code><br \/>\n<code>dt_epure &lt;- na.omit(dt, cols = c(\"v1\", \"v2\", \"v3\"))<\/code><\/p>\n<p>Il est par ailleurs fondamental de proscrire formellement l&rsquo;usage de boucles <code>for<\/code> associ\u00e9es \u00e0 des instructions conditionnelles <code>if(is.na())<\/code> pour nettoyer des lignes d&rsquo;un tableau s\u00e9quentiellement. Le paradigme de vectorisation intrins\u00e8que incarn\u00e9 par <code>complete.cases()<\/code> op\u00e8re des centaines de fois plus rapidement que toute structure it\u00e9rative explicite \u00e9quivalente cod\u00e9e en langage R pur.<\/p>\n<h3>12.3 Principes directeurs pour une reproductibilit\u00e9 computationnelle irr\u00e9prochable<\/h3>\n<p>La crise de la reproductibilit\u00e9 qui traverse les sciences empiriques impose une tra\u00e7abilit\u00e9 rigoureuse de chaque modification structurelle inflig\u00e9e au jeu de donn\u00e9es originel. Un script de recherche conforme aux principes de l&rsquo;<em>Open Science<\/em> doit respecter une s\u00e9rie de pr\u00e9ceptes intangibles lors du recours \u00e0 <code>complete.cases()<\/code> :<\/p>\n<ul>\n<li><strong>Sanctuarisation des donn\u00e9es brutes :<\/strong> Le jeu de donn\u00e9es initial (fichiers <code>.csv<\/code>, <code>.rds<\/code> bruts issus de la collecte) ne doit sous aucun pr\u00e9texte \u00eatre \u00e9cras\u00e9 ou modifi\u00e9 directement. Il doit demeurer en lecture seule dans l&rsquo;arborescence du projet.<\/li>\n<li><strong>Explicitation int\u00e9grale du flux de s\u00e9lection :<\/strong> Chaque \u00e9limination d&rsquo;observation doit \u00eatre justifi\u00e9e dans le code source par des commentaires documentant les motivations th\u00e9oriques de l&rsquo;exclusion des cas incomplets.<\/li>\n<li><strong>Tra\u00e7abilit\u00e9 des versions d&rsquo;environnement :<\/strong> Enregistrer syst\u00e9matiquement les m\u00e9tadonn\u00e9es de session via la fonction native <code>sessionInfo()<\/code>, garantissant que les versions de R et des paquets mobilis\u00e9s lors du filtrage soient parfaitement auditables par la communaut\u00e9 scientifique.<\/li>\n<li><strong>Impl\u00e9mentation de tests unitaires formels :<\/strong> Adjoindre au pipeline des v\u00e9rifications de conformit\u00e9 (par exemple \u00e0 l&rsquo;aide du paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=testthat\">testthat<\/a>) validant que les dimensions du tableau purifi\u00e9 correspondent rigoureusement aux attentes th\u00e9oriques et qu&rsquo;aucune incoh\u00e9rence logique n&rsquo;a \u00e9t\u00e9 introduite par l&rsquo;indexation.<\/li>\n<\/ul>\n<p>En observant scrupuleusement ces directives m\u00e9thodologiques et programmatiques, le chercheur s&rsquo;assure que l&rsquo;utilisation de la commande <code>complete.cases()<\/code> sous R contribue \u00e0 l&rsquo;int\u00e9grit\u00e9, \u00e0 la clart\u00e9 et \u00e0 l&rsquo;excellence scientifique de ses inf\u00e9rences quantitatives.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>American Psychological Association. (2020). <em>Publication manual of the American Psychological Association<\/em> (7th ed.). https:\/\/doi.org\/10.1037\/0000165-000<\/p>\n<p>Little, R. J. A. (1988). A test of missing completely at random for multivariate data with missing values. <em>Journal of the American Statistical Association<\/em>, 83(404), 1198\u20131202. https:\/\/doi.org\/10.1080\/01621459.1988.10478722<\/p>\n<p>R Core Team. (2023). <em>R: A language and environment for statistical computing<\/em>. R Foundation for Statistical Computing, Vienna, Austria. https:\/\/www.r-project.org\/<\/p>\n<p>Rubin, D. B. (1976). Inference and missing data. <em>Biometrika<\/em>, 63(3), 581\u2013592. https:\/\/doi.org\/10.1093\/biomet\/63.3.581<\/p>\n<p>Tierney, N. J., &amp; Cook, D. (2023). Expanding tidy data principles to facilitate missing data exploration, visualization and assessment of imputations. <em>Journal of Statistical Software<\/em>, 105(7), 1\u201331. https:\/\/doi.org\/10.18637\/jss.v105.i07<\/p>\n<p>van Buuren, S., &amp; Groothuis-Oudshoorn, K. (2011). mice: Multivariate imputation by chained equations in R. <em>Journal of Statistical Software<\/em>, 45(3), 1\u201367. https:\/\/doi.org\/10.18637\/jss.v045.i03<\/p>\n<p>Wickham, H., &amp; Grolemund, G. (2017). <em>R for data science: Import, tidy, transform, visualize, and model data<\/em>. O&rsquo;Reilly Media. https:\/\/r4ds.had.co.nz\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guide m\u00e9thodologique et pratique sur l&rsquo;utilisation de complete.cases() dans R : syntaxe, traitement des donn\u00e9es manquantes et applications en sciences sociales.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2141,2193],"tags":[5573,3348,4061,3002,16],"class_list":["post-7804","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-quantitative","category-programmation-r","tag-complete-cases","tag-donnees-manquantes","tag-langage-r","tag-nettoyage-de-donnees","tag-psychometrie"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/7804","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=7804"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/7804\/revisions"}],"predecessor-version":[{"id":16862,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/7804\/revisions\/16862"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}