{"id":4568,"date":"2026-09-11T09:25:06","date_gmt":"2026-09-11T09:25:06","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-calculer-sommes-cumulees-r-exemples\/"},"modified":"2026-09-11T09:25:11","modified_gmt":"2026-09-11T09:25:11","slug":"comment-calculer-sommes-cumulees-r-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-calculer-sommes-cumulees-r-exemples","title":{"rendered":"Comment calculer des sommes cumul\u00e9es dans R (avec exemples)"},"content":{"rendered":"<p>L&rsquo;analyse empirique de s\u00e9ries temporelles, de protocoles exp\u00e9rimentaux longitudinaux et de processus stochastiques requiert fr\u00e9quemment l&rsquo;\u00e9valuation continue de grandeurs qui s&rsquo;accumulent au fil du temps. Dans le domaine du calcul statistique et de la science des donn\u00e9es, la somme cumul\u00e9e constitue l&rsquo;un des op\u00e9rateurs fondamentaux permettant de passer d&rsquo;une vision discr\u00e8te et locale des observations \u00e0 une vision int\u00e9gr\u00e9e et dynamique de leur progression. Qu&rsquo;il s&rsquo;agisse de mesurer la trajectoire d&rsquo;acquisition d&rsquo;une comp\u00e9tence motrice chez un sujet au cours d&rsquo;essais successifs, de quantifier le volume progressif d&rsquo;\u00e9v\u00e9nements observ\u00e9s dans une cohorte clinique ou de suivre l&rsquo;\u00e9volution budg\u00e9taire d&rsquo;un projet, la ma\u00eetrise de cet op\u00e9rateur s&rsquo;av\u00e8re indispensable pour tout praticien de la mod\u00e9lisation quantitative.<\/p>\n<p>Le langage de programmation statistique <a rel=\"noopener noreferrer\" href=\"https:\/\/www.r-project.org\/\">R<\/a>, d\u00e9velopp\u00e9 initialement par Ross Ihaka et Robert Gentleman comme une impl\u00e9mentation moderne du langage S, a \u00e9t\u00e9 con\u00e7u d\u00e8s son origine autour du concept fondamental de vectorisation. Contrairement aux environnements proc\u00e9duraux classiques o\u00f9 l&rsquo;accumulation s\u00e9quentielle n\u00e9cessite l&rsquo;\u00e9criture explicite de structures it\u00e9ratives sujettes aux goulets d&rsquo;\u00e9tranglement calculatoires, R int\u00e8gre des routines compiled de bas niveau d\u00e9di\u00e9es aux calculs incr\u00e9mentaux. L&rsquo;expression de la somme cumul\u00e9e y trouve une concr\u00e9tisation canonique et optimis\u00e9e \u00e0 travers la fonction interne <code>cumsum()<\/code>, enrichie par les \u00e9cosyst\u00e8mes modernes que constituent le <a rel=\"noopener noreferrer\" href=\"https:\/\/www.tidyverse.org\/\">Tidyverse<\/a> et la biblioth\u00e8que de haute performance <code>data.table<\/code>.<\/p>\n<p>Cet article propose une exploration m\u00e9thodique, exhaustive et rigoureuse du calcul des sommes cumul\u00e9es dans l&rsquo;environnement R. Depuis les fondements alg\u00e9briques et fonctionnels qui r\u00e9gissent ces op\u00e9rations jusqu&rsquo;aux cas d&rsquo;usage avanc\u00e9s de segmentation group\u00e9e, de gestion fine des donn\u00e9es manquantes, d&rsquo;optimisation en m\u00e9moire vive et de visualisation scientifique de niveau publication, chaque dimension sera abord\u00e9e avec le souci de la pr\u00e9cision math\u00e9matique et de l&rsquo;efficience computationnelle. Les d\u00e9veloppements th\u00e9oriques seront syst\u00e9matiquement illustr\u00e9s de d\u00e9monstrations empiriques permettant d&rsquo;en appr\u00e9hender toute la port\u00e9e m\u00e9thodologique.<\/p>\n<h2>1. Introduction th\u00e9orique et conceptuelle aux sommes cumul\u00e9es dans le logiciel R<\/h2>\n<h3>1.1 D\u00e9finition formelle et propri\u00e9t\u00e9s math\u00e9matiques de la somme cumul\u00e9e<\/h3>\n<p>D&rsquo;un point de vue strictement formel, consid\u00e9rons une s\u00e9rie discr\u00e8te unidimensionnelle de valeurs num\u00e9riques r\u00e9elles index\u00e9e sur un ensemble fini ou d\u00e9nombrable d&rsquo;indices entiers ordonn\u00e9s, not\u00e9e sous la forme <span class=\"arabpsy-math-inline\" data-latex=\"X = (x_1, x_2, dots, x_n)\">$X = (x_1, x_2, dots, x_n)$<\/span> o\u00f9 chaque \u00e9l\u00e9ment <span class=\"arabpsy-math-inline\" data-latex=\"x_i in \\mathbb{R}\">$x_i in \\mathbb{R}$<\/span> pour tout indice <span class=\"arabpsy-math-inline\" data-latex=\"i in {1, dots, n}\">$i in {1, dots, n}$<\/span>. L&rsquo;op\u00e9rateur de somme cumulative, couramment not\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"S_k\">$S_k$<\/span>, applique une transformation d&rsquo;un vecteur de dimension <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> vers un nouveau vecteur <span class=\"arabpsy-math-inline\" data-latex=\"S = (s_1, s_2, dots, s_n)\">$S = (s_1, s_2, dots, s_n)$<\/span> de m\u00eame cardinalit\u00e9, dans lequel chaque composante de rang <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> correspond \u00e0 l&rsquo;accumulation arithm\u00e9tique de l&rsquo;ensemble des termes pr\u00e9c\u00e9dant et incluant l&rsquo;indice courant.<\/p>\n<p>Math\u00e9matiquement, l&rsquo;application est formellement d\u00e9finie par l&rsquo;expression sommatoire suivante :<\/p>\n<p><span class=\"arabpsy-math-display\" data-latex=\"s_k = \\sum_{i=1}^{k} x_i = s_{k-1} + x_k \\quad \\text{a\\vec} \\quad s_1 = x_1 \\quad \\text{pour tout} \\quad k in {1, dots, n}\">$$s_k = \\sum_{i=1}^{k} x_i = s_{k-1} + x_k \\quad \\text{a\\vec} \\quad s_1 = x_1 \\quad \\text{pour tout} \\quad k in {1, dots, n}$$<\/span><\/p>\n<p>Il importe de distinguer rigoureusement la somme cumul\u00e9e d&rsquo;autres concepts arithm\u00e9tiques apparent\u00e9s mais conceptuellement distincts, tels que la somme totale ou les sommes partielles classiques. Alors que la somme globale r\u00e9duit l&rsquo;ensemble du vecteur <span class=\"arabpsy-math-inline\" data-latex=\"X\">$X$<\/span> \u00e0 un scalaire unique invariant par permutation de ses indices selon la propri\u00e9t\u00e9 de commutativit\u00e9 de l&rsquo;addition, la somme cumul\u00e9e pr\u00e9serve scrupuleusement la dimensionnalit\u00e9 temporelle ou ordonn\u00e9e de la structure d&rsquo;origine. Chaque <span class=\"arabpsy-math-inline\" data-latex=\"s_k\">$s_k$<\/span> repr\u00e9sente l&rsquo;\u00e9tat d&rsquo;un accumulateur s\u00e9quentiel au pas <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span>, ce qui conf\u00e8re \u00e0 cette m\u00e9trique une d\u00e9pendance directe et stricte \u00e0 l&rsquo;ordre d&rsquo;agencement initial des observations.<\/p>\n<p>Sur le plan des propri\u00e9t\u00e9s alg\u00e9briques fondamentales, la monotonie de la s\u00e9quence r\u00e9sultante d\u00e9pend intimement du signe des \u00e9l\u00e9ments constituant le vecteur d&rsquo;entr\u00e9e. Lorsque tous les termes <span class=\"arabpsy-math-inline\" data-latex=\"x_i\">$x_i$<\/span> satisfont la condition de non-n\u00e9gativit\u00e9 (<span class=\"arabpsy-math-inline\" data-latex=\"x_i ge 0\">$x_i ge 0$<\/span>), la s\u00e9rie cumulative <span class=\"arabpsy-math-inline\" data-latex=\"(s_k)_{k ge 1}\">$(s_k)_{k ge 1}$<\/span> pr\u00e9sente une monotonie croissante stricte ou large, telle que <span class=\"arabpsy-math-inline\" data-latex=\"s_k ge s_{k-1}\">$s_k ge s_{k-1}$<\/span> pour tout <span class=\"arabpsy-math-inline\" data-latex=\"k ge 2\">$k ge 2$<\/span>. Cette propri\u00e9t\u00e9 conf\u00e8re \u00e0 la somme cumul\u00e9e le r\u00f4le d&rsquo;une fonction de r\u00e9partition non normalis\u00e9e. Dans le cadre de l&rsquo;analyse s\u00e9quentielle d&rsquo;\u00e9v\u00e9nements, elle permet de mod\u00e9liser avec fid\u00e9lit\u00e9 l&rsquo;\u00e9puisement progressif de stocks, l&rsquo;agr\u00e9gation de doses th\u00e9rapeutiques re\u00e7ues ou la survenue r\u00e9p\u00e9t\u00e9e d&rsquo;occurrences ponctuelles au sein d&rsquo;un intervalle d&rsquo;observation d\u00e9fini.<\/p>\n<h3>1.2 R\u00f4le des calculs cumulatifs dans l&rsquo;analyse quantitative et comportementale<\/h3>\n<p>Dans les sciences comportementales, les neurosciences computationnelles et l&rsquo;\u00e9pid\u00e9miologie exp\u00e9rimentale, les mesures isol\u00e9es au temps <span class=\"arabpsy-math-inline\" data-latex=\"t\">$t$<\/span> ne fournissent qu&rsquo;une vision parcellaire des dynamiques sous-jacentes. L&rsquo;\u00e9valuation continue de variables cumulatives permet d&rsquo;appr\u00e9hender des processus d&rsquo;apprentissage, d&rsquo;habituation ou d&rsquo;extinction qui ne peuvent \u00eatre d\u00e9tect\u00e9s par l&rsquo;analyse statique des moyennes globales. Par exemple, la vitesse \u00e0 laquelle un sujet accumule des r\u00e9ponses correctes lors de blocs d&rsquo;essais successifs r\u00e9v\u00e8le la courbure intrins\u00e8que de sa trajectoire d&rsquo;assimilation cognitive, souvent caract\u00e9ris\u00e9e par une mont\u00e9e exponentielle initiale suivie d&rsquo;une d\u00e9c\u00e9l\u00e9ration progressive vers une asymptote fonctionnelle.<\/p>\n<p>Dans le domaine psychom\u00e9trique, l&rsquo;analyse des temps de r\u00e9ponse cumul\u00e9s fournit un outil diagnostique pr\u00e9cieux pour \u00e9tudier la fatigabilit\u00e9 attentionnelle et la r\u00e9gulation m\u00e9tacognitive. L&rsquo;agr\u00e9gation s\u00e9quentielle des scores d&rsquo;items ordonn\u00e9s par difficult\u00e9 croissante permet d&rsquo;observer la coh\u00e9rence des patterns de compl\u00e9tion d&rsquo;un individu. Toute d\u00e9viation brutale dans la pente de la droite cumulative signale un d\u00e9crochage attentionnel ou une modification qualitative de la strat\u00e9gie d&rsquo;exploration adopt\u00e9e par le r\u00e9pondant, des ph\u00e9nom\u00e8nes que la simple agr\u00e9gation finale sous forme de score brut total oblit\u00e8re irr\u00e9m\u00e9diablement.<\/p>\n<p>Par ailleurs, l&rsquo;identification de points d&rsquo;inflexion au sein d&rsquo;une trajectoire cumulative pr\u00e9sente un int\u00e9r\u00eat analytique majeur pour caract\u00e9riser les transitions de phase comportementales. En d\u00e9rivant num\u00e9riquement la s\u00e9rie cumulative par rapport \u00e0 l&rsquo;indice d&rsquo;essai, on retrouve la fr\u00e9quence instantan\u00e9e d&rsquo;\u00e9mission des r\u00e9ponses, permettant ainsi de situer avec une extr\u00eame pr\u00e9cision l&rsquo;instant exact o\u00f9 une strat\u00e9gie heuristique est supplant\u00e9e par un raisonnement algorithmique stable lors de protocoles de r\u00e9solution de probl\u00e8mes complexes.<\/p>\n<h3>1.3 Vue d&rsquo;ensemble de l&rsquo;\u00e9cosyst\u00e8me R pour le traitement s\u00e9quentiel des donn\u00e9es<\/h3>\n<p>L&rsquo;environnement R offre une infrastructure computationnelle particuli\u00e8rement adapt\u00e9e au traitement s\u00e9quentiel et vectoriel de grands ensembles de donn\u00e9es. H\u00e9ritier du <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/S_(programming_language)\">langage S<\/a> formalis\u00e9 aux laboratoires Bell par John Chambers, R traite le vecteur atomique comme l&rsquo;unit\u00e9 minimale de manipulation structur\u00e9e. Cette philosophie architecturale implique que les op\u00e9rations \u00e9l\u00e9mentaires ne sont pas con\u00e7ues pour s&rsquo;ex\u00e9cuter \u00e9l\u00e9ment par \u00e9l\u00e9ment dans le code utilisateur interpr\u00e9t\u00e9, mais sont d\u00e9l\u00e9gu\u00e9es \u00e0 des routines internes pr\u00e9compil\u00e9es en langage C ou Fortran hautement optimis\u00e9es pour la m\u00e9moire cache et les registres processeurs modernes.<\/p>\n<p>Le package <code>base<\/code>, charg\u00e9 par d\u00e9faut dans toute session R active, met \u00e0 disposition des utilisateurs la fonction primitive <code>cumsum()<\/code>. Cette derni\u00e8re contourne int\u00e9gralement l&rsquo;interpr\u00e9teur de code lors du parcours s\u00e9quentiel des \u00e9l\u00e9ments, offrant une vitesse de traitement quasi instantan\u00e9e m\u00eame sur des s\u00e9quences comptant plusieurs dizaines de millions d&rsquo;enregistrements. Historiquement, l&rsquo;essor des m\u00e9thodes quantitatives appliqu\u00e9es a exig\u00e9 une transition paradigmatique radicale : l&rsquo;abandon progressif des boucles imp\u00e9ratives traditionnelles au profit de fonctions d&rsquo;accumulation vectoris\u00e9es.<\/p>\n<p>L&rsquo;\u00e9volution contemporaine de l&rsquo;\u00e9cosyst\u00e8me R a vu l&rsquo;\u00e9mergence de dialectes compl\u00e9mentaires enrichissant cette approche native. Alors que les commandes historiques de R de base privil\u00e9gient la compacit\u00e9 syntaxique et l&rsquo;absence de d\u00e9pendance externe, le paradigme moderne incarn\u00e9 par le <code>tidyverse<\/code> permet d&rsquo;int\u00e9grer le calcul cumulatif au sein de pipelines de transformation lisibles, structur\u00e9s par le verbe <code>mutate()<\/code> et segment\u00e9s par <code>group_by()<\/code>. Simultan\u00e9ment, le package <code>data.table<\/code> repousse les fronti\u00e8res de l&rsquo;efficience temporelle et spatiale gr\u00e2ce \u00e0 la modification par r\u00e9f\u00e9rence en m\u00e9moire partag\u00e9e, r\u00e9pondant ainsi aux contraintes s\u00e9v\u00e8res pos\u00e9es par les ensembles massifs de donn\u00e9es volumineuses.<\/p>\n<h2>2. Analyse approfondie de la fonction native cumsum() en R de base<\/h2>\n<h3>2.1 Signature, param\u00e8tres et type de retour de la fonction cumsum()<\/h3>\n<p>La fonction <code>cumsum()<\/code> appartient \u00e0 la famille des fonctions primitives internes de R, ce qui signifie que son impl\u00e9mentation sous-jacente est directement \u00e9crite en code natif compil\u00e9 sans passer par le m\u00e9canisme standard d&rsquo;\u00e9valuation diff\u00e9r\u00e9e des promesses propres aux fonctions R ordinaires. La signature canonique de la fonction pr\u00e9sente une compacit\u00e9 extr\u00eame :<\/p>\n<p><code>cumsum(x)<\/code><\/p>\n<p>Le param\u00e8tre formel <code>x<\/code> attend obligatoirement un objet vectoriel num\u00e9rique ou logique. Toute tentative d&rsquo;application de cette fonction sur des structures multidimensionnelles complexes qui ne peuvent \u00eatre directement aplaties en vecteurs atomiques, telles que des listes h\u00e9t\u00e9rog\u00e8nes d&rsquo;objets arbitraires, g\u00e9n\u00e8re imm\u00e9diatement une exception d&rsquo;ex\u00e9cution. La fonction impose une contrainte stricte d&rsquo;homog\u00e9n\u00e9it\u00e9 du type sous-jacent.<\/p>\n<p>Sur le plan dimensionnel, la fonction <code>cumsum()<\/code> garantit une pr\u00e9servation absolue et invariante de la longueur : si le vecteur d&rsquo;entr\u00e9e comporte <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> \u00e9l\u00e9ments (d\u00e9termin\u00e9 par l&rsquo;instruction <code>length(x)<\/code>), le vecteur de sortie contiendra rigoureusement <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> \u00e9l\u00e9ments. De surcro\u00eet, lorsque le vecteur d&rsquo;entr\u00e9e poss\u00e8de un attribut de noms (<code>names<\/code>), ces identifiants lexicaux sont syst\u00e9matiquement conserv\u00e9s et r\u00e9assign\u00e9s un \u00e0 un aux composantes correspondantes du vecteur cumul\u00e9 en sortie, assurant ainsi la tra\u00e7abilit\u00e9 des unit\u00e9s d&rsquo;observation.<\/p>\n<p>Le tableau suivant synth\u00e9tise les r\u00e8gles strictes de typage r\u00e9gissant l&rsquo;entr\u00e9e et la sortie de la fonction <code>cumsum()<\/code> :<\/p>\n<ul>\n<li><strong>Entr\u00e9e de type integer (entier standard) :<\/strong> La sortie demeure typ\u00e9e en <code>integer<\/code>, sous r\u00e9serve absolue qu&rsquo;aucun d\u00e9passement de capacit\u00e9 arithm\u00e9tique ne survienne au cours de l&rsquo;accumulation s\u00e9quentielle.<\/li>\n<li><strong>Entr\u00e9e de type double (r\u00e9el \u00e0 virgule flottante) :<\/strong> Le r\u00e9sultat retourn\u00e9 adopte obligatoirement le type fondamental <code>double<\/code>, respectant la norme internationale IEEE 754 pour les repr\u00e9sentations num\u00e9riques.<\/li>\n<li><strong>Entr\u00e9e de type logical (bool\u00e9en logique) :<\/strong> Une coercition implicite et transparente vers le type <code>integer<\/code> est op\u00e9r\u00e9e de mani\u00e8re native avant le calcul de l&rsquo;accumulation, traduisant <code>TRUE<\/code> en l&rsquo;entier 1 et <code>FALSE<\/code> en l&rsquo;entier 0.<\/li>\n<li><strong>Entr\u00e9e de type character ou factor :<\/strong> Aucune coercition implicite n&rsquo;est tent\u00e9e ; l&rsquo;interpr\u00e9teur interrompt imm\u00e9diatement l&rsquo;\u00e9valuation en \u00e9mettant un message d&rsquo;erreur fatal d&rsquo;incompatibilit\u00e9 de type.<\/li>\n<\/ul>\n<h3>2.2 Comparaison conceptuelle avec les fonctions math\u00e9matiques de la m\u00eame famille<\/h3>\n<p>L&rsquo;environnement R standard met \u00e0 la disposition des mod\u00e9lisateurs une fratrie de quatre op\u00e9rateurs s\u00e9quentiels cumulatifs partageant des propri\u00e9t\u00e9s architecturales identiques mais diff\u00e9rant par l&rsquo;op\u00e9ration arithm\u00e9tique ou logique appliqu\u00e9e le long de la s\u00e9quence : <code>cumsum()<\/code> pour l&rsquo;accumulation sommatoire, <code>cumprod()<\/code> pour le produit cumul\u00e9, <code>cummin()<\/code> pour le suivi continu du minimum historique rencontr\u00e9, et <code>cummax()<\/code> pour l&rsquo;enregistrement du maximum s\u00e9quentiel atteint.<\/p>\n<p>Alors que <code>cumsum()<\/code> est l&rsquo;\u00e9quivalent discret de l&rsquo;op\u00e9rateur d&rsquo;int\u00e9gration temporelle <span class=\"arabpsy-math-inline\" data-latex=\"\\int_0^t f(\\tau) d\\tau\">$\\int_0^t f(\\tau) d\\tau$<\/span>, la fonction <code>cumprod()<\/code> mat\u00e9rialise l&rsquo;accumulation multiplicative de taux de croissance instantan\u00e9s ou de probabilit\u00e9s conditionnelles conjointes ind\u00e9pendantes. \u00c0 l&rsquo;oppos\u00e9, <code>cummin()<\/code> et <code>cummax()<\/code> ne modifient pas la nature d&rsquo;\u00e9chelle des donn\u00e9es mais g\u00e9n\u00e8rent des fonctions en escalier monotones non d\u00e9croissantes (pour le maximum) ou non croissantes (pour le minimum), mod\u00e9lisant des ph\u00e9nom\u00e8nes de records ou de barri\u00e8res d&rsquo;activation dans des t\u00e2ches chronom\u00e9tr\u00e9es.<\/p>\n<p>Il existe une sym\u00e9trie fondamentale entre l&rsquo;op\u00e9rateur de cumul et l&rsquo;op\u00e9rateur de diff\u00e9rentiation s\u00e9quentielle impl\u00e9ment\u00e9 par la fonction <code>diff()<\/code>. En effet, l&rsquo;op\u00e9rateur <code>diff()<\/code> calcule les accroissements marginaux d&rsquo;ordre 1 selon la formule <span class=\"arabpsy-math-inline\" data-latex=\"y_k = x_{k+1} - x_k\">$y_k = x_{k+1} &#8211; x_k$<\/span>. Par cons\u00e9quent, pour tout vecteur num\u00e9rique <span class=\"arabpsy-math-inline\" data-latex=\"X\">$X$<\/span> de longueur <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span>, la reconstitution exacte du profil s\u00e9quentiel original \u00e0 partir de son vecteur cumul\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"S = \\text{cum\\sum}(X)\">$S = \\text{cum\\sum}(X)$<\/span> s&rsquo;obtient de mani\u00e8re d\u00e9terministe en appliquant :<\/p>\n<p><code>c(S[1], diff(S))<\/code><\/p>\n<p>Cette relation de bijectivit\u00e9 alg\u00e9brique garantit la conservation int\u00e9grale de l&rsquo;information structurelle au cours de la transformation cumulative.<\/p>\n<h3>2.3 Typage des donn\u00e9es admissibles et conversions implicites de vecteurs<\/h3>\n<p>Le comportement de <code>cumsum()<\/code> vis-\u00e0-vis des diff\u00e9rents modes de stockage en m\u00e9moire refl\u00e8te la rigueur du syst\u00e8me de typage atomique de R. La conversion implicite des vecteurs de bool\u00e9ens (<code>logical<\/code>) constitue l&rsquo;une des fonctionnalit\u00e9s les plus puissantes pour le traitement statistique rapide. Dans un vecteur logique o\u00f9 chaque \u00e9l\u00e9ment indique la r\u00e9alisation (<code>TRUE<\/code>) ou la non-r\u00e9alisation (<code>FALSE<\/code>) d&rsquo;un crit\u00e8re clinique ou exp\u00e9rimental, l&rsquo;appel \u00e0 <code>cumsum()<\/code> fournit directement la fonction de comptage du nombre d&rsquo;\u00e9v\u00e9nements positifs survenus jusqu&rsquo;au point d&rsquo;\u00e9chantillonnage courant.<\/p>\n<p>N\u00e9anmoins, des difficult\u00e9s m\u00e9thodologiques apparaissent fr\u00e9quemment lorsque les analystes manipulent des variables qualitatives nominales ou ordinales encod\u00e9es sous forme de facteurs (<code>factor<\/code>), ou des mesures quantitatives import\u00e9es par erreur sous forme de cha\u00eenes de caract\u00e8res (<code>character<\/code>). L&rsquo;ex\u00e9cution directe de l&rsquo;accumulation sur de tels objets d\u00e9clenche une interruption explicite :<\/p>\n<p><em>Error in cumsum(x) : argument non num\u00e9rique pour une fonction math\u00e9matique<\/em><\/p>\n<p>Pour pr\u00e9venir ces arr\u00eats d&rsquo;ex\u00e9cution au sein de scripts automatis\u00e9s, il est imp\u00e9ratif de mettre en place des protocoles d\u00e9fensifs de transtypage rigoureux. L&rsquo;extraction des niveaux textuels d&rsquo;un facteur n\u00e9cessite obligatoirement une double conversion pr\u00e9ventive via la syntaxe canonique <code>as.numeric(as.character(x))<\/code>, \u00e9vitant ainsi l&rsquo;\u00e9cueil classique consistant \u00e0 sommer les identifiants d&rsquo;indexation internes du facteur plut\u00f4t que ses valeurs num\u00e9riques r\u00e9elles.<\/p>\n<h2>3. Application pratique : Calcul d&rsquo;une somme cumul\u00e9e sur un vecteur num\u00e9rique unidimensionnel<\/h2>\n<h3>3.1 Instanciation d&rsquo;un vecteur num\u00e9rique et ex\u00e9cution s\u00e9quentielle de base<\/h3>\n<p>Afin de concr\u00e9tiser le fonctionnement de l&rsquo;op\u00e9rateur cumulatif, consid\u00e9rons une situation exp\u00e9rimentale issue d&rsquo;une \u00e9tude d&rsquo;ergonomie cognitive. Un sujet r\u00e9alise une s\u00e9rie de huit blocs cons\u00e9cutifs d&rsquo;une t\u00e2che d&rsquo;attention soutenue, et le chercheur rel\u00e8ve \u00e0 chaque bloc le nombre de stimuli cibles correctement d\u00e9tect\u00e9s. Les mesures d&rsquo;observation peuvent \u00eatre instanci\u00e9es sous la forme d&rsquo;un vecteur num\u00e9rique atomique en R de la mani\u00e8re suivante :<\/p>\n<p><code>performances &lt;- c(14, 18, 12, 22, 19, 25, 23, 27)<\/code><\/p>\n<p>L&rsquo;application directe de la fonction native sur cette structure unidimensionnelle s&rsquo;effectue sans param\u00e8tre additionnel par un simple appel fonctionnel :<\/p>\n<p><code>cumul_performances &lt;- cumsum(performances)<\/code><\/p>\n<p>L&rsquo;\u00e9valuation dans la console interactive de R produit imm\u00e9diatement le r\u00e9sultat vectoriel suivant :<\/p>\n<p><code>[1]  14  32  44  66  85 110 133 160<\/code><\/p>\n<p>La validation empirique des r\u00e9sultats interm\u00e9diaires confirme le principe de r\u00e9currence arithm\u00e9tique : le premier terme demeure invariant (14), le second terme repr\u00e9sente l&rsquo;addition du premier et du second relev\u00e9 exp\u00e9rimental (<span class=\"arabpsy-math-inline\" data-latex=\"14 + 18 = 32\">$14 + 18 = 32$<\/span>), le troisi\u00e8me int\u00e8gre la valeur marginale suivante (<span class=\"arabpsy-math-inline\" data-latex=\"32 + 12 = 44\">$32 + 12 = 44$<\/span>), et ainsi de suite jusqu&rsquo;au huiti\u00e8me \u00e9l\u00e9ment (<span class=\"arabpsy-math-inline\" data-latex=\"133 + 27 = 160\">$133 + 27 = 160$<\/span>). La derni\u00e8re coordonn\u00e9e du vecteur cumul\u00e9 correspond strictement \u00e0 la valeur qu&rsquo;aurait renvoy\u00e9e l&rsquo;instruction globale <code>sum(performances)<\/code>.<\/p>\n<h3>3.2 D\u00e9composition pas \u00e0 pas de l&rsquo;accumulation it\u00e9rative interne<\/h3>\n<p>Pour appr\u00e9hender l&rsquo;efficacit\u00e9 de la routine sous-jacente, il convient d&rsquo;examiner le m\u00e9canisme algorithmique mobilis\u00e9 par l&rsquo;interpr\u00e9teur lors de cette \u00e9valuation. Contrairement \u00e0 une boucle <code>for<\/code> utilisateur qui allouerait des environnements temporaires \u00e0 chaque it\u00e9ration, la primitive C alloue directement un bloc de m\u00e9moire contigu d&rsquo;une taille rigoureusement identique \u00e0 celle du vecteur source.<\/p>\n<p>Le processus interne peut \u00eatre formalis\u00e9 par la trace algorithmique suivante sur les quatre premi\u00e8res positions de notre vecteur d&rsquo;exemple :<\/p>\n<ul>\n<li><strong>Indice k = 1 :<\/strong> L&rsquo;accumulateur interne re\u00e7oit la premi\u00e8re valeur : <span class=\"arabpsy-math-inline\" data-latex=\"s_1 = x_1 = 14\">$s_1 = x_1 = 14$<\/span>. Cette valeur est inscrite dans la premi\u00e8re case m\u00e9moire du vecteur de destination.<\/li>\n<li><strong>Indice k = 2 :<\/strong> L&rsquo;accumulateur additionne la valeur marginale : <span class=\"arabpsy-math-inline\" data-latex=\"s_2 = s_1 + x_2 = 14 + 18 = 32\">$s_2 = s_1 + x_2 = 14 + 18 = 32$<\/span>. Inscription \u00e0 l&rsquo;adresse index\u00e9e 2.<\/li>\n<li><strong>Indice k = 3 :<\/strong> Nouvelle sommation incr\u00e9mentale : <span class=\"arabpsy-math-inline\" data-latex=\"s_3 = s_2 + x_3 = 32 + 12 = 44\">$s_3 = s_2 + x_3 = 32 + 12 = 44$<\/span>. Inscription \u00e0 l&rsquo;adresse index\u00e9e 3.<\/li>\n<li><strong>Indice k = 4 :<\/strong> Poursuite d\u00e9terministe : <span class=\"arabpsy-math-inline\" data-latex=\"s_4 = s_3 + x_4 = 44 + 22 = 66\">$s_4 = s_3 + x_4 = 44 + 22 = 66$<\/span>. Inscription \u00e0 l&rsquo;adresse index\u00e9e 4.<\/li>\n<\/ul>\n<p>Sur le plan computationnel, cet algorithme poss\u00e8de une complexit\u00e9 temporelle optimale d&rsquo;ordre lin\u00e9aire, not\u00e9e <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(n)\">$\\mathcal{O}(n)$<\/span>, o\u00f9 chaque \u00e9l\u00e9ment du vecteur source n&rsquo;est lu qu&rsquo;une seule et unique fois en m\u00e9moire cache processeur. En regard, une impl\u00e9mentation na\u00efve cod\u00e9e en script R classique qui appellerait de mani\u00e8re r\u00e9p\u00e9t\u00e9e la fonction de sommation globale sur des sous-segments croissants du vecteur (par exemple en utilisant une boucle imbriqu\u00e9e du type <code>for (i in 1:n) s[i] &lt;- sum(x[1:i])<\/code>) pr\u00e9senterait une complexit\u00e9 quadratique d\u00e9l\u00e9t\u00e8re d&rsquo;ordre <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(n^2)\">$\\mathcal{O}(n^2)$<\/span>, requ\u00e9rant un volume de calculs prohibitif d\u00e8s que <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> d\u00e9passe quelques milliers d&rsquo;observations.<\/p>\n<h3>3.3 Manipulation de vecteurs d&rsquo;entiers versus vecteurs de r\u00e9els \u00e0 virgule flottante<\/h3>\n<p>L&rsquo;attribution et la conservation des classes d&rsquo;objets au cours du calcul cumulatif constituent un facteur critique influen\u00e7ant la fid\u00e9lit\u00e9 des r\u00e9sultats et la gestion des ressources syst\u00e8me. Lorsque les donn\u00e9es d&rsquo;observation sont issues de d\u00e9comptes discrets non fractionnaires, elles peuvent \u00eatre instanci\u00e9es formellement sous le type entier strict en suffixant chaque constante num\u00e9rique par la lettre majuscule <code>L<\/code> :<\/p>\n<p><code>comptages_entiers &lt;- c(5L, 10L, 15L, 20L)<\/code><\/p>\n<p>L&rsquo;application de <code>cumsum(comptages_entiers)<\/code> pr\u00e9serve rigoureusement la classe <code>integer<\/code> du conteneur en sortie, assurant une compacit\u00e9 optimale de 4 octets par observation en m\u00e9moire vive. N\u00e9anmoins, l&rsquo;univers des entiers sign\u00e9s sur une architecture standard 32 ou 64 bits est born\u00e9 sup\u00e9rieurement par la constante <span class=\"arabpsy-math-inline\" data-latex=\"2^{31} - 1\">$2^{31} &#8211; 1$<\/span>, soit 2 147 483 647. Si l&rsquo;accumulation s\u00e9quentielle franchit ce plafond th\u00e9orique, le moteur natif de R n&rsquo;op\u00e8re pas une transition automatique silencieuse vers les r\u00e9els ; il g\u00e9n\u00e8re un d\u00e9passement de capacit\u00e9 arithm\u00e9tique (d\u00e9fini comme un <em>integer overflow<\/em>), transformant les valeurs ult\u00e9rieures en marqueurs <code>NA<\/code> et \u00e9mettant un avertissement explicite.<\/p>\n<p>Inversement, lorsque l&rsquo;entr\u00e9e est de type <code>double<\/code> (occupant 8 octets par \u00e9l\u00e9ment selon la norme IEEE 754 \u00e0 double pr\u00e9cision), la plage dynamique couverte est consid\u00e9rablement plus vaste (jusqu&rsquo;\u00e0 environ <span class=\"arabpsy-math-inline\" data-latex=\"1.8 \\times 10^{308}\">$1.8 \\times 10^{308}$<\/span>). Cependant, les calculs cumulatifs sur de tr\u00e8s longues s\u00e9quences de nombres r\u00e9els \u00e0 virgule flottante pr\u00e9sentent le risque inh\u00e9rent d&rsquo;accumulation progressive d&rsquo;erreurs d&rsquo;arrondi binaire. Lors de la sommation d&rsquo;une valeur marginale infinit\u00e9simale \u00e0 un accumulateur d\u00e9j\u00e0 devenu gigantesque, la limite de mantisse de 53 bits peut conduire \u00e0 l&rsquo;oblit\u00e9ration des chiffres les moins significatifs, un ph\u00e9nom\u00e8ne classique de troncature qui doit \u00eatre surveill\u00e9 avec attention lors de l&rsquo;int\u00e9gration chronom\u00e9trique de microsecondes.<\/p>\n<h2>4. Int\u00e9gration et manipulation de sommes cumul\u00e9es au sein de structures data.frame<\/h2>\n<h3>4.1 Cr\u00e9ation d&rsquo;une variable cumulative dans un tableau de donn\u00e9es tabulaires<\/h3>\n<p>Dans la pratique courante de l&rsquo;ing\u00e9nierie des donn\u00e9es sous R, les observations brutes sont rarement stock\u00e9es sous la forme de vecteurs isol\u00e9s, mais sont encapsul\u00e9es au sein de structures tabulaires h\u00e9t\u00e9rog\u00e8nes de type <code>data.frame<\/code>. L&rsquo;enrichissement d&rsquo;un tel tableau par une colonne mod\u00e9lisant la somme progressive s&rsquo;appuie sur la pr\u00e9servation de la dimensionnalit\u00e9 assur\u00e9e par <code>cumsum()<\/code>, qui garantit que le vecteur d\u00e9riv\u00e9 poss\u00e8de un nombre de lignes rigoureusement identique \u00e0 la structure r\u00e9ceptrice.<\/p>\n<p>L&rsquo;approche idiomatique la plus directe en R de base fait appel \u00e0 l&rsquo;op\u00e9rateur d&rsquo;assignation directe par le symbole dollar :<\/p>\n<p><code>donnees<span class=\"arabpsy-math-inline\" data-latex=\"cumul_variable &lt;- cum\\sum(donnees\">$cumul_variable &lt;- cum\\sum(donnees$<\/span>variable_marginale)<\/code><\/p>\n<p>Une syntaxe alternative \u00e9l\u00e9gante repose sur l&rsquo;utilisation de la fonction <code>transform()<\/code>, qui permet de d\u00e9finir plusieurs variables transform\u00e9es en une seule instruction lisible, sans r\u00e9p\u00e9ter continuellement le nom du tableau source :<\/p>\n<p><code>donnees &lt;- transform(donnees, cumul_variable = cumsum(variable_marginale))<\/code><\/p>\n<p>Quelle que soit la m\u00e9thode retenue, la coh\u00e9rence analytique repose enti\u00e8rement sur le maintien de l&rsquo;alignement univoque entre chaque observation individuelle, son index chronologique et la valeur cumulative correspondante. L&rsquo;absence totale de d\u00e9calage spatial des cellules assure une int\u00e9grit\u00e9 relationnelle imm\u00e9diate entre les pr\u00e9dicteurs exog\u00e8nes et la dynamique accumul\u00e9e.<\/p>\n<h3>4.2 Exemple d\u00e9taill\u00e9 : Traitement d&rsquo;une s\u00e9rie temporelle trimestrielle<\/h3>\n<p>Afin d&rsquo;illustrer la manipulation concr\u00e8te de ces structures, simulons une cohorte clinique suivie sur une temporalit\u00e9 de quinze trimestres cons\u00e9cutifs, o\u00f9 l&rsquo;on enregistre l&rsquo;inclusion marginale de nouveaux patients \u00e9ligibles \u00e0 un protocole th\u00e9rapeutique novateur. Construisons tout d&rsquo;abord le tableau de donn\u00e9es sous-jacent :<\/p>\n<p><code>serie_inclusions &lt;- data.frame(<br \/>\n&nbsp;&nbsp;trimestre = paste0(\"T\", 1:15),<br \/>\n&nbsp;&nbsp;annee = rep(2021:2023, each = 5),<br \/>\n&nbsp;&nbsp;patients_inclus = c(12, 15, 19, 23, 18, 25, 30, 28, 34, 31, 29, 27, 24, 20, 16)<br \/>\n)<\/code><\/p>\n<p>Proc\u00e9dons ensuite \u00e0 l&rsquo;int\u00e9gration de la colonne mat\u00e9rialisant l&rsquo;effectif cumul\u00e9 total de la cohorte active au fil des p\u00e9riodes :<\/p>\n<p><code>serie_inclusions<span class=\"arabpsy-math-inline\" data-latex=\"effectif_total_cumule &lt;- cum\\sum(serie_inclusions\">$effectif_total_cumule &lt;- cum\\sum(serie_inclusions$<\/span>patients_inclus)<\/code><\/p>\n<p>L&rsquo;inspection analytique de la structure de l&rsquo;objet enrichi peut \u00eatre entreprise \u00e0 l&rsquo;aide des primitives d&rsquo;inspection globale :<\/p>\n<p><code>head(serie_inclusions, n = 5)<\/code><\/p>\n<p>Cette commande renvoie l&rsquo;affichage tabulaire des cinq premiers trimestres d&rsquo;investigation :<\/p>\n<p><code>&nbsp;&nbsp;trimestre annee patients_inclus effectif_total_cumule<br \/>\n1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T1&nbsp;&nbsp;2021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12<br \/>\n2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T2&nbsp;&nbsp;2021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;27<br \/>\n3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T3&nbsp;&nbsp;2021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;46<br \/>\n4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T4&nbsp;&nbsp;2021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;69<br \/>\n5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T5&nbsp;&nbsp;2021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;87<\/code><\/p>\n<p>L&rsquo;analyse pr\u00e9cise de la ligne 5 r\u00e9v\u00e8le une valeur cumul\u00e9e de 87 patients \u00e0 la fin du cinqui\u00e8me trimestre d&rsquo;inclusion. Cette valeur condense l&rsquo;int\u00e9gralit\u00e9 du cheminement ant\u00e9rieur (<span class=\"arabpsy-math-inline\" data-latex=\"12 + 15 + 19 + 23 + 18 = 87\">$12 + 15 + 19 + 23 + 18 = 87$<\/span>). Elle permet aux gestionnaires de l&rsquo;essai clinique de confronter la r\u00e9alit\u00e9 du terrain aux hypoth\u00e8ses initiales de puissance statistique sans n\u00e9cessiter de recompilations partielles co\u00fbteuses.<\/p>\n<h3>4.3 Indexation conditionnelle et extraction de m\u00e9triques cumul\u00e9es<\/h3>\n<p>L&rsquo;inclusion d&rsquo;une variable cumulative facilite consid\u00e9rablement le filtrage conditionnel et la segmentation temporelle d&rsquo;un jeu de donn\u00e9es. Il devient particuli\u00e8rement ais\u00e9 d&rsquo;isoler la fen\u00eatre temporelle exacte durant laquelle un seuil analytique d&rsquo;int\u00e9r\u00eat a \u00e9t\u00e9 franchi. Par exemple, pour extraire l&rsquo;ensemble des trimestres post\u00e9rieurs au recrutement du centi\u00e8me patient, une indexation logique bool\u00e9enne suffit :<\/p>\n<p><code>phases_post_centieme &lt;- serie_inclusions[serie_inclusions$effectif_total_cumule &gt;= 100, ]<\/code><\/p>\n<p>De m\u00eame, pour capturer de mani\u00e8re robuste la valeur terminale cumul\u00e9e sans devoir expliciter le rang ordinal de la derni\u00e8re ligne, on combinera l&rsquo;op\u00e9rateur de s\u00e9lection avec la fonction <code>nrow()<\/code> ou <code>tail()<\/code> :<\/p>\n<p><code>recrutement_definitif &lt;- tail(serie_inclusions$effectif_total_cumule, n = 1)<\/code><\/p>\n<p>Cette approche permet d&rsquo;\u00e9tablir une passerelle analytique directe entre les variations marginales instantan\u00e9es observ\u00e9es \u00e0 chaque p\u00e9riode trimestrielle et les tendances asymptotiques globales vers lesquelles converge le protocole d&rsquo;observation.<\/p>\n<h2>5. Gestion rigoureuse des valeurs manquantes (NA) lors du calcul cumulatif<\/h2>\n<h3>5.1 Comportement syst\u00e9matique de cumsum() face aux valeurs non attribu\u00e9es<\/h3>\n<p>La pr\u00e9sence de donn\u00e9es manquantes, universellement encod\u00e9es par la constante sp\u00e9ciale <code>NA<\/code> (<em>Not Available<\/em>) dans le langage R, pose un d\u00e9fi m\u00e9thodologique fondamental lors de l&rsquo;ex\u00e9cution de calculs s\u00e9quentiels cumulatifs. Contrairement aux fonctions d&rsquo;agr\u00e9gation globale telles que <code>sum()<\/code>, <code>mean()<\/code> ou <code>sd()<\/code>, qui acceptent un param\u00e8tre formel bool\u00e9en <code>na.rm = TRUE<\/code> permettant d&rsquo;exclure les omissions avant traitement, la primitive <code>cumsum()<\/code> ne comporte rigoureusement aucun argument direct d&rsquo;omission de cette nature.<\/p>\n<p>Ce choix de conception d\u00e9coule d&rsquo;une exigence logique : dans une cha\u00eene d&rsquo;accumulation temporelle, si l&rsquo;incr\u00e9ment intervenant au temps <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> demeure inconnu, l&rsquo;\u00e9tat global de l&rsquo;accumulateur pour l&rsquo;ensemble des pas ult\u00e9rieurs (<span class=\"arabpsy-math-inline\" data-latex=\"k+1, k+2, dots, n\">$k+1, k+2, dots, n$<\/span>) devient math\u00e9matiquement ind\u00e9termin\u00e9. En cons\u00e9quence, la fonction <code>cumsum()<\/code> manifeste un comportement strict de contamination unilat\u00e9rale ou propagation irr\u00e9versible : d\u00e8s qu&rsquo;un <code>NA<\/code> est rencontr\u00e9 dans le vecteur d&rsquo;entr\u00e9e, la valeur de sortie \u00e0 cet index devient <code>NA<\/code>, et l&rsquo;ensemble exhaustif des \u00e9l\u00e9ments situ\u00e9s en aval adopte \u00e9galement la valeur <code>NA<\/code> jusqu&rsquo;au terme de la s\u00e9quence.<\/p>\n<p>Consid\u00e9rons l&rsquo;exemple empirique suivant :<\/p>\n<p><code>serie_corrompue &lt;- c(10, 20, NA, 30, 40)<br \/>\ncumsum(serie_corrompue)<\/code><\/p>\n<p>Le r\u00e9sultat g\u00e9n\u00e9r\u00e9 illustre de mani\u00e8re spectaculaire cette propagation d&rsquo;ind\u00e9termination :<\/p>\n<p><code>[1] 10 30 NA NA NA<\/code><\/p>\n<p>Dans le contexte des \u00e9tudes de cohortes longitudinales, une telle rupture de cha\u00eene est susceptible de paralyser compl\u00e8tement les pipelines analytiques si des protocoles explicites de traitement des valeurs manquantes ne sont pas mis en place en amont.<\/p>\n<h3>5.2 Strat\u00e9gies d&rsquo;imputation et de neutralisation des donn\u00e9es manquantes<\/h3>\n<p>La strat\u00e9gie la plus fr\u00e9quemment adopt\u00e9e pour surmonter l&rsquo;ind\u00e9termination s\u00e9quentielle consiste \u00e0 op\u00e9rer une neutralisation arithm\u00e9tique ponctuelle des donn\u00e9es manquantes en substituant la valeur neutre de l&rsquo;addition (c&rsquo;est-\u00e0-dire l&rsquo;\u00e9l\u00e9ment z\u00e9ro) \u00e0 l&rsquo;ensemble des marqueurs <code>NA<\/code>. Cette transformation repose sur l&rsquo;identification bool\u00e9enne pr\u00e9alable des indices d\u00e9faillants via la fonction <code>is.na()<\/code> :<\/p>\n<p><code>serie_imputee &lt;- serie_corrompue<br \/>\nserie_imputee[is.na(serie_imputee)] &lt;- 0<br \/>\ncumul_impute &lt;- cumsum(serie_imputee)<\/code><\/p>\n<p>L&rsquo;\u00e9valuation produit d\u00e9sormais une s\u00e9rie cumulative continue :<\/p>\n<p><code>[1]  10  30  30  60 100<\/code><\/p>\n<p>Toutefois, sur le plan de la rigueur \u00e9pist\u00e9mologique et de la mod\u00e9lisation statistique, l&rsquo;imputation m\u00e9canique par z\u00e9ro ne peut \u00eatre tenue pour neutre. Elle introduit implicitement l&rsquo;hypoth\u00e8se nulle forte selon laquelle aucun \u00e9v\u00e9nement, aucun co\u00fbt ou aucune variation marginale n&rsquo;est survenu durant l&rsquo;intervalle d&rsquo;\u00e9chantillonnage non document\u00e9. Si cette hypoth\u00e8se peut s&rsquo;av\u00e9rer d\u00e9fendable dans le cas du suivi passif d&rsquo;inclusions o\u00f9 l&rsquo;absence de d\u00e9claration traduit effectivement une absence d&rsquo;admission, elle devient scientifiquement discutable lors du suivi de variables physiologiques continues (telles que la glyc\u00e9mie ou le poids corporel), o\u00f9 l&rsquo;insertion d&rsquo;un z\u00e9ro d\u00e9formerait lourdement la cin\u00e9tique de la trajectoire cumulative.<\/p>\n<h3>5.3 Techniques avanc\u00e9es de conservation des NA sans rupture du calcul s\u00e9quentiel<\/h3>\n<p>Pour concilier l&rsquo;exactitude de l&rsquo;accumulation continue et la fid\u00e9lit\u00e9 de l&rsquo;\u00e9tiquetage des incertitudes, une d\u00e9marche avanc\u00e9e consiste \u00e0 sommer s\u00e9quentiellement les \u00e9l\u00e9ments observ\u00e9s tout en r\u00e9tablissant les marqueurs <code>NA<\/code> \u00e0 leurs positions spatiales pr\u00e9cises au sein du vecteur de sortie. De la sorte, on \u00e9vite la contamination en cha\u00eene de l&rsquo;accumulateur tout en signalant que la valeur marginale \u00e0 ce point pr\u00e9cis n&rsquo;a pu \u00eatre mesur\u00e9e.<\/p>\n<p>Cette logique d&rsquo;ing\u00e9nierie vectorielle peut \u00eatre condens\u00e9e au sein d&rsquo;une expression personnalis\u00e9e exploitant l&rsquo;\u00e9valuation conditionnelle vectoris\u00e9e <code>ifelse()<\/code> :<\/p>\n<p><code>cumul_preserve &lt;- function(vecteur) {<br \/>\n&nbsp;&nbsp;indices_manquants &lt;- is.na(vecteur)<br \/>\n&nbsp;&nbsp;vecteur_remplace &lt;- vecteur<br \/>\n&nbsp;&nbsp;vecteur_remplace[indices_manquants] &lt;- 0<br \/>\n&nbsp;&nbsp;accumulation &lt;- cumsum(vecteur_remplace)<br \/>\n&nbsp;&nbsp;accumulation[indices_manquants] &lt;- NA<br \/>\n&nbsp;&nbsp;return(accumulation)<br \/>\n}<\/code><\/p>\n<p>En appliquant cette fonction personnalis\u00e9e \u00e0 notre vecteur d&rsquo;essai <code>serie_corrompue &lt;- c(10, 20, NA, 30, 40)<\/code>, nous obtenons l&rsquo;agencement suivant :<\/p>\n<p><code>[1]  10  30  NA  60 100<\/code><\/p>\n<p>\u00c0 l&rsquo;index 4, la valeur cumul\u00e9e refl\u00e8te fid\u00e8lement la sommation de l&rsquo;ensemble des composantes valides observ\u00e9es en amont (<span class=\"arabpsy-math-inline\" data-latex=\"10 + 20 + 30 = 60\">$10 + 20 + 30 = 60$<\/span>), sans que l&rsquo;omission survenue \u00e0 l&rsquo;index 3 n&rsquo;ait interrompu le calcul de la trajectoire, tout en alertant le mod\u00e9lisateur sur l&rsquo;inexistence de la mesure marginale au troisi\u00e8me temps d&rsquo;observation.<\/p>\n<h2>6. Calculs de sommes cumul\u00e9es segment\u00e9es par groupes avec l&rsquo;\u00e9cosyst\u00e8me Tidyverse<\/h2>\n<h3>6.1 Combinaison synergique de group_by() et mutate() dans dplyr<\/h3>\n<p>Dans les jeux de donn\u00e9es multidimensionnels issus d&rsquo;essais factoriels ou de suivis multicentriques, l&rsquo;accumulation ne doit que rarement \u00eatre calcul\u00e9e de mani\u00e8re globale sur l&rsquo;ensemble des lignes. Le plus souvent, elle doit \u00eatre r\u00e9initialis\u00e9e pour chaque unit\u00e9 exp\u00e9rimentale, sujet ou strate de cohorte. Le package <code>dplyr<\/code>, c\u0153ur battant de la collection <a rel=\"noopener noreferrer\" href=\"https:\/\/dplyr.tidyverse.org\/\">tidyverse<\/a>, formalise cette t\u00e2che \u00e0 travers le paradigme architectural d\u00e9sormais universel <em>split-apply-combine<\/em>.<\/p>\n<p>L&rsquo;impl\u00e9mentation repose sur le cha\u00eenage fluide de la directive de groupement <code>group_by()<\/code> avec le verbe de transformation structurelle <code>mutate()<\/code>. Consid\u00e9rons un jeu de donn\u00e9es simulant les essais successifs accomplis par deux participants distincts soumis \u00e0 trois sessions d&rsquo;entra\u00eenement :<\/p>\n<p><code>library(dplyr)<\/p>\n<p>registre_sujets &lt;- tibble(<br \/>\n&nbsp;&nbsp;identifiant = rep(c(\"Sujet_A\", \"Sujet_B\"), each = 4),<br \/>\n&nbsp;&nbsp;temps_reponse = c(450, 420, 390, 380, 510, 480, 470, 440)<br \/>\n)<\/code><\/p>\n<p>Le calcul de la trajectoire de latence cumul\u00e9e propre \u00e0 chaque sujet s&rsquo;\u00e9crit avec une transparence syntaxique absolue :<\/p>\n<p><code>registre_analyse &lt;- registre_sujets %&gt;%<br \/>\n&nbsp;&nbsp;group_by(identifiant) %&gt;%<br \/>\n&nbsp;&nbsp;mutate(latence_cumulee = cumsum(temps_reponse)) %&gt;%<br \/>\n&nbsp;&nbsp;ungroup()<\/code><\/p>\n<p>Sous le capot, <code>dplyr<\/code> s\u00e9pare virtuellement les donn\u00e9es en deux sous-tables ind\u00e9pendantes index\u00e9es par la cl\u00e9 <code>identifiant<\/code>, ex\u00e9cute la primitive <code>cumsum()<\/code> \u00e0 l&rsquo;int\u00e9rieur de chaque environnement local, puis reconstitue la table globale tout en maintenant scrupuleusement l&rsquo;int\u00e9grit\u00e9 ordonn\u00e9e des enregistrements initiaux. L&rsquo;instruction terminale <code>ungroup()<\/code> constitue une bonne pratique d\u00e9fensive indispensable \u00e9vitant que les op\u00e9rations de regroupement subs\u00e9quentes ne soient pollu\u00e9es par la cl\u00e9 pr\u00e9c\u00e9dente.<\/p>\n<h3>6.2 R\u00e9initialisation dynamique du compteur cumulatif selon une variable de partition<\/h3>\n<p>Il se pr\u00e9sente fr\u00e9quemment des architectures analytiques o\u00f9 la r\u00e9initialisation de la somme cumul\u00e9e ne d\u00e9pend pas d&rsquo;un identifiant de sujet statique, mais de la transition logique d&rsquo;une variable d&rsquo;\u00e9tat signalant un changement de condition exp\u00e9rimentale, de phase d&rsquo;\u00e9tude ou de jour calendaire. Pour mod\u00e9liser cette dynamique, on combine la fonction <code>cumsum()<\/code> appliqu\u00e9e \u00e0 une condition bool\u00e9enne avec un second appel cumulatif.<\/p>\n<p>Consid\u00e9rons un sc\u00e9nario exp\u00e9rimental continu dans lequel une variable binaire indique l&rsquo;amorce d&rsquo;un nouveau protocole th\u00e9rapeutique :<\/p>\n<p><code>donnees_essais &lt;- tibble(<br \/>\n&nbsp;&nbsp;essai = 1:8,<br \/>\n&nbsp;&nbsp;nouvelle_session = c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE),<br \/>\n&nbsp;&nbsp;score = c(5, 7, 6, 8, 9, 7, 8, 10)<br \/>\n)<\/code><\/p>\n<p>Pour r\u00e9initialiser le cumul du score au d\u00e9but de chaque session, nous g\u00e9n\u00e9rons en premier lieu un identifiant de session incr\u00e9mental en calculant la somme cumul\u00e9e de la colonne logique <code>nouvelle_session<\/code>, puis nous regroupons les donn\u00e9es selon cette nouvelle cl\u00e9 synth\u00e9tique :<\/p>\n<p><code>donnees_essais &lt;- donnees_essais %&gt;%<br \/>\n&nbsp;&nbsp;mutate(session_id = cumsum(nouvelle_session)) %&gt;%<br \/>\n&nbsp;&nbsp;group_by(session_id) %&gt;%<br \/>\n&nbsp;&nbsp;mutate(score_cumule_session = cumsum(score)) %&gt;%<br \/>\n&nbsp;&nbsp;ungroup()<\/code><\/p>\n<p>Cette formulation \u00e9l\u00e9gante et purement vectoris\u00e9e \u00e9limine le recours \u00e0 des boucles conditionnelles complexes, permettant d&rsquo;adapter dynamiquement l&rsquo;accumulation aux \u00e9v\u00e9nements survenant en temps r\u00e9el au cours du protocole.<\/p>\n<h3>6.3 Pipeline analytique complet int\u00e9grant tri pr\u00e9alable et fen\u00eatrage<\/h3>\n<p>L&rsquo;une des erreurs conceptuelles les plus d\u00e9vastatrices lors de l&rsquo;int\u00e9gration de sommes cumul\u00e9es au sein de pipelines de traitement r\u00e9side dans l&rsquo;omission de la d\u00e9pendance temporelle stricte. Les tables de donn\u00e9es relationnelles brutes ou import\u00e9es de syst\u00e8mes de bases de donn\u00e9es distribu\u00e9es ne sont presque jamais ordonn\u00e9es chronologiquement de mani\u00e8re d\u00e9terministe. Or, l&rsquo;op\u00e9rateur <code>cumsum()<\/code> calcule aveugl\u00e9ment l&rsquo;accumulation dans l&rsquo;ordre spatial o\u00f9 les lignes se pr\u00e9sentent en m\u00e9moire.<\/p>\n<p>Il est donc m\u00e9thodologiquement imp\u00e9ratif d&rsquo;incorporer explicitement un verbe de tri via <code>arrange()<\/code> imm\u00e9diatement en amont du calcul de l&rsquo;accumulation :<\/p>\n<p><code>donnees_traitees &lt;- table_brute %&gt;%<br \/>\n&nbsp;&nbsp;filter(!is.na(valeur_mesuree)) %&gt;%<br \/>\n&nbsp;&nbsp;arrange(identifiant_cohorte, date_evenement, horodatage) %&gt;%<br \/>\n&nbsp;&nbsp;group_by(identifiant_cohorte) %&gt;%<br \/>\n&nbsp;&nbsp;mutate(accumulation_chronologique = cumsum(valeur_mesuree)) %&gt;%<br \/>\n&nbsp;&nbsp;ungroup()<\/code><\/p>\n<p>L&rsquo;adoption rigoureuse de cette structure op\u00e9rationnelle au sein des flux de travail analytiques garantit une parfaite reproductibilit\u00e9 des calculs statistiques, ind\u00e9pendamment des transformations ou des filtres appliqu\u00e9s en amont dans la base de donn\u00e9es source.<\/p>\n<h2>7. Optimisation des calculs cumulatifs sur de volumineuses bases de donn\u00e9es avec data.table<\/h2>\n<h3>7.1 Syntaxe d&rsquo;assignation par r\u00e9f\u00e9rence := pour le calcul cumulatif haute performance<\/h3>\n<p>Lorsque le volume des jeux de donn\u00e9es atteint des \u00e9chelles critiques (plusieurs millions ou dizaines de millions d&rsquo;enregistrements), l&rsquo;approche standard de R de base ainsi que les m\u00e9canismes internes de <code>dplyr<\/code> rencontrent des contraintes substantielles li\u00e9es \u00e0 la duplication de m\u00e9moire. Chaque modification d&rsquo;un tableau implique traditionnellement une copie superficielle ou profonde de l&rsquo;objet h\u00f4te (m\u00e9canisme de <em>copy-on-modify<\/em>), g\u00e9n\u00e9rant une surcharge majeure sur le ramasse-miettes (<em>garbage collector<\/em>) du syst\u00e8me.<\/p>\n<p>Le package hautement sp\u00e9cialis\u00e9 <a rel=\"noopener noreferrer\" href=\"https:\/\/r-datatable.com\">data.table<\/a> neutralise ce goulet d&rsquo;\u00e9tranglement gr\u00e2ce au paradigme novateur de la modification par r\u00e9f\u00e9rence directe en m\u00e9moire vive, mat\u00e9rialis\u00e9e par l&rsquo;op\u00e9rateur canonique <code>:=<\/code>. La syntaxe pour int\u00e9grer une colonne cumulative au sein d&rsquo;une table sans g\u00e9n\u00e9rer la moindre copie interm\u00e9diaire s&rsquo;\u00e9crit :<\/p>\n<p><code>library(data.table)<\/p>\n<p>dt_observations &lt;- data.table(<br \/>\n&nbsp;&nbsp;id = 1:10000000,<br \/>\n&nbsp;&nbsp;metrique = runif(10000000)<br \/>\n)<\/p>\n<p>dt_observations[, metrique_cumulee := cumsum(metrique)]<\/code><\/p>\n<p>Dans cette instruction, le calcul de la primitive est directement dirig\u00e9 vers l&rsquo;adresse m\u00e9moire allou\u00e9e \u00e0 la nouvelle colonne <code>metrique_cumulee<\/code>. L&#8217;empreinte m\u00e9moire additionnelle est rigoureusement cantonn\u00e9e \u00e0 la taille exacte du vecteur r\u00e9sultat (soit environ 80 m\u00e9gaoctets pour 10 millions de r\u00e9els \u00e0 double pr\u00e9cision), \u00e9vitant tout d\u00e9doublement superflu de la table m\u00e8re de d\u00e9part.<\/p>\n<h3>7.2 Agr\u00e9gation et regroupement ultrarapide par cl\u00e9s via l&rsquo;argument &lsquo;by&rsquo;<\/h3>\n<p>La sup\u00e9riorit\u00e9 computationnelle de <code>data.table<\/code> se manifeste avec une \u00e9clatante nettet\u00e9 lors de l&rsquo;ex\u00e9cution de calculs cumulatifs segment\u00e9s par des regroupements de facteurs complexes \u00e0 haute cardinalit\u00e9. Gr\u00e2ce \u00e0 un algorithme de tri par base (<em>radix sorting<\/em>) interne d&rsquo;une efficience exceptionnelle, l&rsquo;instruction <code>by<\/code> segmente les blocs de donn\u00e9es sans recourir aux tables de hachage conventionnelles :<\/p>\n<p><code>dt_multicentrique &lt;- data.table(<br \/>\n&nbsp;&nbsp;centre = sample(paste0(\"Centre_\", 1:500), 5000000, replace = TRUE),<br \/>\n&nbsp;&nbsp;date = sample(1:365, 5000000, replace = TRUE),<br \/>\n&nbsp;&nbsp;activite = rpois(5000000, lambda = 15)<br \/>\n)<\/p>\n<p>setkey(dt_multicentrique, centre, date)<\/p>\n<p>dt_multicentrique[, cumul_par_centre := cumsum(activite), by = centre]<\/code><\/p>\n<p>La commande <code>setkey()<\/code> pr\u00e9-ordonne physiquement les enregistrements en m\u00e9moire selon la hi\u00e9rarchie <code>centre<\/code> puis <code>date<\/code>. D\u00e8s lors, le calcul de la somme cumul\u00e9e par centre devient une simple op\u00e9ration s\u00e9quentielle lin\u00e9aire parcourant des plages de m\u00e9moire contigu\u00ebs, \u00e9liminant tout surco\u00fbt de recherche ou de partitionnement dynamique.<\/p>\n<h3>7.3 Comparatif d&rsquo;efficacit\u00e9 computationnelle et benchmarks de vitesse<\/h3>\n<p>Pour quantifier concr\u00e8tement les gains de performance offerts par les diff\u00e9rentes impl\u00e9mentations disponibles sous R, r\u00e9alisons un banc d&rsquo;essai comparatif rigoureux via le package <code>microbenchmark<\/code> sur un \u00e9chantillon d&rsquo;un million d&rsquo;enregistrements partitionn\u00e9s en dix mille groupes distincts :<\/p>\n<p><code>library(microbenchmark)<\/p>\n<p># Configuration du banc d'essai<br \/>\nn &lt;- 1000000<br \/>\ndf_test &lt;- data.frame(<br \/>\n&nbsp;&nbsp;groupe = sample(1:10000, n, replace = TRUE),<br \/>\n&nbsp;&nbsp;valeur = rnorm(n)<br \/>\n)<br \/>\ndt_test &lt;- as.data.table(df_test)<\/p>\n<p>bench_resultats &lt;- microbenchmark(<br \/>\n&nbsp;&nbsp;dplyr = df_test %&gt;% group_by(groupe) %&gt;% mutate(c = cumsum(valeur)),<br \/>\n&nbsp;&nbsp;datatable = dt_test[, c := cumsum(valeur), by = groupe],<br \/>\n&nbsp;&nbsp;times = 10<br \/>\n)<\/code><\/p>\n<p>Les r\u00e9sultats empiriques d\u00e9montrent de mani\u00e8re r\u00e9currente un \u00e9cart de vitesse spectaculaire : <code>data.table<\/code> surpasse habituellement les pipelines concurrents par un facteur allant de 5 \u00e0 15, tout en maintenant une allocation m\u00e9moire vive r\u00e9duite au minimum th\u00e9orique. Pour les chercheurs et ing\u00e9nieurs manipulant des volumes de donn\u00e9es massifs (tels que des enregistrements de signaux \u00e9lectrophysiologiques \u00e0 haute fr\u00e9quence d&rsquo;\u00e9chantillonnage ou des transactions financi\u00e8res boursi\u00e8res \u00e0 la milliseconde), <code>data.table<\/code> s&rsquo;impose ainsi comme l&rsquo;infrastructure algorithmique incontournable.<\/p>\n<h2>8. Repr\u00e9sentation graphique \u00e9l\u00e9mentaire des sommes cumul\u00e9es avec R Base Graphics<\/h2>\n<h3>8.1 Construction d&rsquo;un trac\u00e9 lin\u00e9aire continu avec la fonction plot()<\/h3>\n<p>La restitution visuelle des trajectoires d&rsquo;accumulation constitue une \u00e9tape d\u00e9cisive de l&rsquo;analyse exploratoire des donn\u00e9es. Les fonctions graphiques du moteur natif de R (souvent d\u00e9nomm\u00e9es <em>R Base Graphics<\/em>) offrent une v\u00e9locit\u00e9 remarquable pour inspecter imm\u00e9diatement la dynamique d&rsquo;une somme cumul\u00e9e sans n\u00e9cessiter l&rsquo;instanciation de biblioth\u00e8ques tierces volumineuses.<\/p>\n<p>La commande graphique fondamentale <code>plot()<\/code> permet d&rsquo;associer directement l&rsquo;axe des abscisses aux indices chronologiques d&rsquo;observation et l&rsquo;axe des ordonn\u00e9es aux valeurs de l&rsquo;accumulateur s\u00e9quentiel. Afin d&rsquo;assurer une interpr\u00e9tation d\u00e9nu\u00e9e d&rsquo;ambigu\u00eft\u00e9, il est imp\u00e9ratif d&rsquo;ajuster le param\u00e8tre de type de trac\u00e9 avec l&rsquo;argument <code>type = \"l\"<\/code> (pour une ligne continue) ou <code>type = \"b\"<\/code> (associant symboles ponctuels et segments de liaison) :<\/p>\n<p><code>temps &lt;- 1:20<br \/>\nreponses_marginales &lt;- c(2, 4, 3, 5, 7, 6, 8, 9, 7, 10, 11, 8, 12, 14, 13, 15, 17, 16, 18, 20)<br \/>\nreponses_cumulees &lt;- cumsum(reponses_marginales)<\/p>\n<p>plot(temps, reponses_cumulees,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type = \"b\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pch = 19,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = \"navyblue\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lwd = 2,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlab = \"Unit\u00e9s d'observation temporelle\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ylab = \"Volume cumul\u00e9 des r\u00e9ponses\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;main = \"Cin\u00e9tique d'accumulation s\u00e9quentielle des r\u00e9ponses\")<\/code><\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/cumSum1.png\" alt=\"Line plot for cumulative sum in R\" \/><figcaption>Line plot for cumulative sum in R<\/figcaption><\/figure>\n<p>L&rsquo;adjonction de l&rsquo;argument <code>ylim = c(0, max(reponses_cumulees) * 1.1)<\/code> permet de stabiliser l&rsquo;origine visuelle \u00e0 z\u00e9ro, pr\u00e9venant toute distorsion d&rsquo;\u00e9chelle susceptible d&rsquo;exag\u00e9rer artificiellement l&rsquo;amplitude de la croissance lors des premi\u00e8res \u00e9tapes de la cin\u00e9tique.<\/p>\n<h3>8.2 Superposition de diagrammes en barres et de courbes cumulatives<\/h3>\n<p>Une d\u00e9marche p\u00e9dagogique et visuelle particuli\u00e8rement puissante consiste \u00e0 superposer, au sein d&rsquo;un m\u00eame espace graphique, les incr\u00e9ments marginaux instantan\u00e9s sous forme d&rsquo;un diagramme en barres et la trajectoire cumulative sous forme d&rsquo;une courbe continue. Cette double repr\u00e9sentation permet au lecteur d&rsquo;appr\u00e9hender simultan\u00e9ment le volume ponctuel de chaque relev\u00e9 et l&rsquo;int\u00e9gration globale de l&rsquo;effort exp\u00e9rimental.<\/p>\n<p>La mise en \u0153uvre sous le moteur graphique de base requiert l&rsquo;articulation m\u00e9thodique de <code>barplot()<\/code>, de la fonction de bas niveau <code>lines()<\/code> et du param\u00e9trage des axes secondaires via l&rsquo;instruction de bascule <code>par(new = TRUE)<\/code> :<\/p>\n<p><code># D\u00e9finition des marges pour accueillir l'axe secondaire droit<br \/>\npar(mar = c(5, 4, 4, 4) + 0.3)<\/p>\n<p># Trac\u00e9 du diagramme en barres des gains marginaux<br \/>\npositions_barres &lt;- barplot(reponses_marginales,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = \"lightgray\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border = \"white\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlab = \"Blocs d'observation\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ylab = \"Incr\u00e9ments marginaux par bloc\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ylim = c(0, max(reponses_marginales) * 1.5))<\/p>\n<p># Superposition du trac\u00e9 de la somme cumul\u00e9e<br \/>\npar(new = TRUE)<br \/>\nplot(positions_barres, reponses_cumulees,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type = \"l\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = \"darkred\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lwd = 3,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;axes = FALSE,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlab = \"\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ylab = \"\")<\/p>\n<p># Dessin de l'axe secondaire droit et de son libell\u00e9<br \/>\naxis(side = 4, col = \"darkred\", col.axis = \"darkred\")<br \/>\nmtext(\"Somme cumul\u00e9e int\u00e9gr\u00e9e\", side = 4, line = 2.5, col = \"darkred\")<\/code><\/p>\n<p>Cette visualisation synchronis\u00e9e met en \u00e9vidence le lien de d\u00e9rivabilit\u00e9 discr\u00e8te unissant les barres (qui figurent la d\u00e9riv\u00e9e num\u00e9rique locale) et la courbe (qui figure la primitive discr\u00e8te globale de la s\u00e9quence).<\/p>\n<h3>8.3 Personnalisation esth\u00e9tique et annotations m\u00e9thodologiques<\/h3>\n<p>L&rsquo;enrichissement s\u00e9mantique d&rsquo;un graphique d&rsquo;accumulation \u00e9l\u00e9mentaire exige l&rsquo;int\u00e9gration de rep\u00e8res m\u00e9thodologiques facilitant la prise de d\u00e9cision. L&rsquo;insertion de lignes de seuil horizontales par la commande <code>abline()<\/code> permet d&rsquo;indiquer sans ambigu\u00eft\u00e9 l&rsquo;atteinte d&rsquo;un quota r\u00e9glementaire ou d&rsquo;une cible de recrutement pr\u00e9sp\u00e9cifi\u00e9e.<\/p>\n<p>Consid\u00e9rons l&rsquo;ajout d&rsquo;une limite critique et d&rsquo;une l\u00e9gende explicative normalis\u00e9e :<\/p>\n<p><code>abline(h = 100, col = \"forestgreen\", lty = 2, lwd = 2)<br \/>\ntext(x = 5, y = 105, labels = \"Seuil critique de puissance (N=100)\", col = \"forestgreen\", pos = 4)<\/p>\n<p>legend(\"topleft\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;legend = c(\"Gain marginal par bloc\", \"Accumulation progressive\", \"Objectif exp\u00e9rimental\"),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill = c(\"lightgray\", NA, NA),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border = c(\"white\", NA, NA),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lty = c(NA, 1, 2),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;col = c(NA, \"darkred\", \"forestgreen\"),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lwd = c(NA, 3, 2),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bty = \"n\")<\/code><\/p>\n<p>Ce niveau de personnalisation graphique transforme une simple courbe statistique brute en un instrument de communication scientifique rigoureux et imm\u00e9diatement exploitable au sein de comit\u00e9s de surveillance m\u00e9thodologique.<\/p>\n<h2>9. Visualisation scientifique avanc\u00e9e des trajectoires cumulatives avec ggplot2<\/h2>\n<h3>9.1 Mod\u00e9lisation en couches avec geom_line() et geom_point()<\/h3>\n<p>Pour la production de figures destin\u00e9es \u00e0 l&rsquo;\u00e9valuation par les pairs au sein de revues scientifiques internationales, le syst\u00e8me graphique <a rel=\"noopener noreferrer\" href=\"https:\/\/ggplot2.tidyverse.org\/\">ggplot2<\/a>, fond\u00e9 sur la th\u00e9orie formelle de <em>The Grammar of Graphics<\/em> th\u00e9oris\u00e9e par Leland Wilkinson, offre une puissance d&rsquo;abstraction et une coh\u00e9rence esth\u00e9tique sans \u00e9quivalent.<\/p>\n<p>L&rsquo;articulation graphique s&rsquo;appuie sur la superposition raisonn\u00e9e de couches g\u00e9om\u00e9triques (<em>geoms<\/em>). Pour cartographier l&rsquo;\u00e9volution cumulative d&rsquo;un signal, nous lions les dimensions conceptuelles aux propri\u00e9t\u00e9s esth\u00e9tiques via la fonction <code>aes()<\/code>, en empilant une couche de connexion continue <code>geom_line()<\/code> et une couche de ponctuation discr\u00e8te <code>geom_point()<\/code> :<\/p>\n<p><code>library(ggplot2)<\/p>\n<p>data_parcours &lt;- data.frame(<br \/>\n&nbsp;&nbsp;session = 1:12,<br \/>\n&nbsp;&nbsp;reussites = c(3, 5, 8, 12, 15, 14, 18, 22, 21, 25, 27, 28)<br \/>\n) %&gt;%<br \/>\n&nbsp;&nbsp;mutate(total_reussites = cumsum(reussites))<\/p>\n<p>ggplot(data_parcours, aes(x = session, y = total_reussites)) +<br \/>\n&nbsp;&nbsp;geom_line(color = \"#2C3E50\", linewidth = 1.2) +<br \/>\n&nbsp;&nbsp;geom_point(color = \"#E74C3C\", size = 3, shape = 21, fill = \"white\", stroke = 1.5) +<br \/>\n&nbsp;&nbsp;scale_x_continuous(breaks = 1:12) +<br \/>\n&nbsp;&nbsp;labs(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;title = \"Trajectoire d'acquisition des r\u00e9ponses r\u00e9ussies\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;subtitle = \"Progression continue au fil des sessions exp\u00e9rimentales\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;x = \"Num\u00e9ro d'ordre de la session\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;y = \"Nombre cumul\u00e9 de succ\u00e8s valid\u00e9s\"<br \/>\n&nbsp;&nbsp;) +<br \/>\n&nbsp;&nbsp;theme_classic(base_size = 12) +<br \/>\n&nbsp;&nbsp;theme(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;plot.title = element_text(face = \"bold\", size = 14),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;axis.line = element_line(linewidth = 0.8)<br \/>\n&nbsp;&nbsp;)<\/code><\/p>\n<figure class=\"wpt-preserved-image\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/cumSum2.png\" alt=\"Cumulative sum graph in ggplot2\" \/><figcaption>Cumulative sum graph in ggplot2<\/figcaption><\/figure>\n<p>L&rsquo;utilisation d\u00e9lib\u00e9r\u00e9e du th\u00e8me <code>theme_classic()<\/code> \u00e9limine tout \u00e9l\u00e9ment visuel parasite d&rsquo;arri\u00e8re-plan (grilles grises, bordures superflues), garantissant une conformit\u00e9 parfaite avec les crit\u00e8res typographiques et iconographiques des \u00e9diteurs acad\u00e9miques majeurs.<\/p>\n<h3>9.2 Visualisation comparative multi-groupes et facettage<\/h3>\n<p>L&rsquo;avantage d\u00e9cisif de <code>ggplot2<\/code> r\u00e9side dans son aptitude native \u00e0 g\u00e9rer les dimensions factorielles sans modification complexe du code de trac\u00e9. Lorsque l&rsquo;exp\u00e9rimentateur souhaite comparer les profils cumulatifs de diff\u00e9rents bras de traitement ou cohortes cliniques, il suffit d&rsquo;assigner le facteur de stratification \u00e0 l&rsquo;esth\u00e9tique de groupe ou de couleur :<\/p>\n<p><code>data_comparative &lt;- expand.grid(temps = 1:10, cohorte = c(\"Groupe_Controle\", \"Bras_Actif\")) %&gt;%<br \/>\n&nbsp;&nbsp;mutate(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;gain = ifelse(cohorte == \"Bras_Actif\", rpois(n(), lambda = 12), rpois(n(), lambda = 6))<br \/>\n&nbsp;&nbsp;) %&gt;%<br \/>\n&nbsp;&nbsp;group_by(cohorte) %&gt;%<br \/>\n&nbsp;&nbsp;mutate(gain_cumule = cumsum(gain)) %&gt;%<br \/>\n&nbsp;&nbsp;ungroup()<\/p>\n<p>ggplot(data_comparative, aes(x = temps, y = gain_cumule, color = cohorte, group = cohorte)) +<br \/>\n&nbsp;&nbsp;geom_line(linewidth = 1.3) +<br \/>\n&nbsp;&nbsp;geom_point(size = 2.5) +<br \/>\n&nbsp;&nbsp;scale_color_manual(values = c(\"Groupe_Controle\" = \"#7F8C8D\", \"Bras_Actif\" = \"#2980B9\")) +<br \/>\n&nbsp;&nbsp;facet_wrap(~ cohorte) +<br \/>\n&nbsp;&nbsp;labs(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;x = \"\u00c9tape temporelle ordonn\u00e9e\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;y = \"Indicateur cumulatif global\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;color = \"Bras d'assignation\"<br \/>\n&nbsp;&nbsp;) +<br \/>\n&nbsp;&nbsp;theme_bw(base_size = 11)<\/code><\/p>\n<p>L&rsquo;op\u00e9rateur <code>facet_wrap()<\/code> compartimente la lecture visuelle en sous-graphiques homog\u00e8nes partageant des axes cart\u00e9siens identiques. L&rsquo;observateur peut ainsi \u00e9valuer instantan\u00e9ment la divergence des pentes : une pente cumulative constamment plus forte dans le bras exp\u00e9rimental signale une efficience th\u00e9rapeutique sup\u00e9rieure se maintenant tout au long de la p\u00e9riode de suivi.<\/p>\n<h3>9.3 Remplissage d&rsquo;aires sous la courbe et int\u00e9gration d&rsquo;annotations contextuelles<\/h3>\n<p>Pour accentuer la perception sensorielle de masse ou de volume accumul\u00e9 au cours du temps, la couche g\u00e9om\u00e9trique <code>geom_area()<\/code> offre une alternative graphique \u00e9l\u00e9gante. En associant un gradient de transparence via l&rsquo;argument <code>alpha<\/code>, on mat\u00e9rialise l&rsquo;espace int\u00e9gral sous-tendu par la somme progressive sans occulter la grille de lecture en arri\u00e8re-plan :<\/p>\n<p><code>ggplot(data_parcours, aes(x = session, y = total_reussites)) +<br \/>\n&nbsp;&nbsp;geom_area(fill = \"#3498DB\", alpha = 0.3) +<br \/>\n&nbsp;&nbsp;geom_line(color = \"#2980B9\", linewidth = 1.2) +<br \/>\n&nbsp;&nbsp;annotate(\"segment\", x = 6, xend = 8, y = 60, yend = 90,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrow = arrow(length = unit(0.2, \"cm\")), color = \"#C0392B\", linewidth = 1) +<br \/>\n&nbsp;&nbsp;annotate(\"text\", x = 5.5, y = 55, label = \"Acc\u00e9l\u00e9ration du taux d'acquisition\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color = \"#C0392B\", fontface = \"italic\", size = 3.5) +<br \/>\n&nbsp;&nbsp;theme_minimal()<\/code><\/p>\n<p>L&rsquo;utilisation de la fonction <code>annotate()<\/code> permet d&rsquo;ancrer des explications textuelles et des rep\u00e8res g\u00e9om\u00e9triques pr\u00e9cis\u00e9ment positionn\u00e9s dans l&rsquo;espace des donn\u00e9es, guidant l&rsquo;\u0153il du lecteur vers les inflexions qualitatives majeures du processus cumulatif.<\/p>\n<h2>10. Applications empiriques : Suivi longitudinal et analyse de s\u00e9ries chronologiques<\/h2>\n<h3>10.1 Suivi temporel de l&rsquo;acquisition de comp\u00e9tences et courbes d&rsquo;apprentissage<\/h3>\n<p>Dans l&rsquo;analyse des apprentissages proc\u00e9duraux ou moteurs, la fonction cumulative offre une formalisation canonique des mod\u00e8les d&rsquo;accumulation d&rsquo;essais. Consid\u00e9rons l&rsquo;enregistrement du nombre d&rsquo;erreurs commises par un groupe de participants lors de 50 essais successifs d&rsquo;un protocole de poursuite sur cible mobile. Alors qu&rsquo;une s\u00e9rie brute d&rsquo;erreurs pr\u00e9sente une variance locale consid\u00e9rable d&rsquo;un essai \u00e0 l&rsquo;autre, la somme cumul\u00e9e des erreurs adoucit les fluctuations al\u00e9atoires pour r\u00e9v\u00e9ler la r\u00e9gularit\u00e9 du comportement sous-jacent.<\/p>\n<p>Une courbe cumulative d&rsquo;erreurs exhibe typiquement une concavit\u00e9 dirig\u00e9e vers le bas : les premiers essais accumulent des erreurs \u00e0 un rythme effr\u00e9n\u00e9 (pente abrupte), puis, \u00e0 mesure que la trace motrice se consolide en m\u00e9moire \u00e0 long terme, la probabilit\u00e9 d&rsquo;erreur marginale d\u00e9cro\u00eet drastiquement, conduisant \u00e0 un aplatissement progressif de la courbe vers un plateau asymptotique horizontal.<\/p>\n<p>La mod\u00e9lisation non lin\u00e9aire de cette somme cumul\u00e9e par une fonction puissance de type <span class=\"arabpsy-math-inline\" data-latex=\"S_k = A \\cdot k^{1 - \\alpha}\">$S_k = A \\cdot k^{1 &#8211; \\alpha}$<\/span> (o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"A\">$A$<\/span> repr\u00e9sente le niveau d&rsquo;erreur initial et <span class=\"arabpsy-math-inline\" data-latex=\"\\alpha\">$\\alpha$<\/span> le taux d&rsquo;apprentissage) permet d&rsquo;estimer avec une robustesse statistique remarquable la vitesse individuelle d&rsquo;assimilation motrice, tout en minimisant la sensibilit\u00e9 aux art\u00e9facts d&rsquo;\u00e9chantillonnage locaux.<\/p>\n<h3>10.2 Calcul d&rsquo;indicateurs de distribution et fonction de r\u00e9partition empirique<\/h3>\n<p>Il existe un lien th\u00e9orique et op\u00e9rationnel direct entre l&rsquo;op\u00e9rateur de somme cumulative sur un vecteur discret et la fonction de r\u00e9partition empirique (souvent d\u00e9sign\u00e9e par l&rsquo;acronyme anglo-saxon <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/Empirical_distribution_function\">ECDF<\/a> pour <em>Empirical Cumulative Distribution Function<\/em>). Soit un \u00e9chantillon de mesures quantitatives continues <span class=\"arabpsy-math-inline\" data-latex=\"X = (x_1, dots, x_n)\">$X = (x_1, dots, x_n)$<\/span>. Apr\u00e8s avoir pr\u00e9alablement ordonn\u00e9 ces observations par ordre croissant \u00e0 l&rsquo;aide de la primitive <code>sort()<\/code>, l&rsquo;attribution \u00e0 chaque point de sa fr\u00e9quence relative marginale unitaire (<span class=\"arabpsy-math-inline\" data-latex=\"1\/n\">$1\/n$<\/span>) permet de reconstruire manuellement la fonction de r\u00e9partition int\u00e9gr\u00e9e :<\/p>\n<p><code>observations &lt;- c(4.2, 1.8, 6.5, 3.1, 2.9, 5.4, 3.8)<br \/>\nobs_triees &lt;- sort(observations)<br \/>\nfrequences_relatives &lt;- rep(1 \/ length(obs_triees), length(obs_triees))<br \/>\nrepartition_empirique &lt;- cumsum(frequences_relatives)<\/code><\/p>\n<p>L&rsquo;affichage du vecteur <code>repartition_empirique<\/code> confirme la construction discr\u00e8te de l&rsquo;escalier de probabilit\u00e9 :<\/p>\n<p><code>[1] 0.1428571 0.2857143 0.4285714 0.5714286 0.7142857 0.8571429 1.0000000<\/code><\/p>\n<p>Cette approche permet d&rsquo;extraire de mani\u00e8re totalement transparente les fractiles, quartiles et centiles d&rsquo;une distribution empirique quelconque, sans recourir \u00e0 des hypoth\u00e8ses param\u00e9triques de normalit\u00e9 souvent viol\u00e9es dans les cohortes comportementales r\u00e9elles.<\/p>\n<h3>10.3 Analyse des processus d&rsquo;adoption et de diffusion temporelle<\/h3>\n<p>L&rsquo;\u00e9tude de la diffusion de technologies innovantes ou de l&rsquo;adoption de comportements prophylactiques au sein d&rsquo;une population repose historiquement sur le mod\u00e8le th\u00e9orique formul\u00e9 par Everett Rogers. Ce cadre pr\u00e9dit que la trajectoire cumulative de p\u00e9n\u00e9tration adopte une courbe sigmo\u00efde caract\u00e9ristique (dite \u00ab courbe en S \u00bb), d\u00e9composable en trois r\u00e9gimes s\u00e9quentiels :<\/p>\n<ul>\n<li>Une phase d&rsquo;\u00e9mergence lente, domin\u00e9e par les pionniers et innovateurs, o\u00f9 les gains cumulatifs marginaux progressent faiblement ;<\/li>\n<li>Une phase d&#8217;emballement critique ou d&rsquo;acc\u00e9l\u00e9ration exponentielle, caract\u00e9ris\u00e9e par une pente cumulative maximale traduisant l&rsquo;adh\u00e9sion de la majorit\u00e9 pr\u00e9coce ;<\/li>\n<li>Une phase de saturation asymptotique progressive, o\u00f9 le r\u00e9servoir d&rsquo;individus r\u00e9ceptifs non encore convertis s&rsquo;\u00e9puise, imposant un ralentissement de l&rsquo;accumulation vers un plafond d\u00e9fini par la capacit\u00e9 d&rsquo;accueil globale du syst\u00e8me.<\/li>\n<\/ul>\n<p>Sous R, l&rsquo;identification empirique de ces zones de bascule s&rsquo;op\u00e8re en confrontant la s\u00e9rie cumulative des inclusions r\u00e9elles \u00e0 un mod\u00e8le logistique ajust\u00e9 via la m\u00e9thode de r\u00e9gression non lin\u00e9aire <code>nls()<\/code> (<em>Nonlinear Least Squares<\/em>). La comparaison des r\u00e9sidus permet d&rsquo;attester scientifiquement si la dynamique observ\u00e9e suit effectivement un processus d&rsquo;imitation sociale endog\u00e8ne ou si elle r\u00e9pond \u00e0 des incitations publicitaires exog\u00e8nes constantes (qui produiraient, quant \u00e0 elles, une courbe cumulative purement concave sans acc\u00e9l\u00e9ration initiale).<\/p>\n<h2>11. R\u00e9solution des erreurs courantes, cas limites et pi\u00e8ges computationnels<\/h2>\n<h3>11.1 Diagnostics et corrections des erreurs de type de donn\u00e9es non num\u00e9riques<\/h3>\n<p>L&rsquo;\u00e9cueil le plus trivial mais le plus fr\u00e9quemment rencontr\u00e9 lors de l&rsquo;ex\u00e9cution de <code>cumsum()<\/code> provient de l&rsquo;incompatibilit\u00e9 des types atomiques stock\u00e9s dans les vecteurs d&rsquo;entr\u00e9e. Lorsque des donn\u00e9es proviennent de fichiers d\u00e9limit\u00e9s (fichiers CSV ou exportations de tableurs) mal form\u00e9s, il arrive fr\u00e9quemment qu&rsquo;une valeur manquante encod\u00e9e sous la forme d&rsquo;un point d&rsquo;interrogation textuel ou d&rsquo;un espace ins\u00e9cable contraigne le parseur d&rsquo;importation de R \u00e0 convertir l&rsquo;int\u00e9gralit\u00e9 de la colonne en cha\u00eenes de caract\u00e8res (<code>character<\/code>) ou en facteurs (<code>factor<\/code>).<\/p>\n<p>L&rsquo;\u00e9valuation de <code>cumsum()<\/code> sur une telle colonne d\u00e9clenche imm\u00e9diatement le message d&rsquo;interruption :<\/p>\n<p><em>Error in cumsum(x) : non-numeric argument to mathematical function<\/em><\/p>\n<p>Le diagnostic m\u00e9thodique doit \u00eatre initi\u00e9 par l&rsquo;inspection de la structure de l&rsquo;objet h\u00f4te \u00e0 l&rsquo;aide de <code>str(variable)<\/code> ou <code>typeof(variable)<\/code>. La conversion corrective n\u00e9cessite imp\u00e9rativement une s\u00e9quence de transformation rigoureuse. Pour une colonne de type facteur, l&rsquo;application na\u00efve directe de <code>as.numeric()<\/code> doit \u00eatre rigoureusement prohib\u00e9e, car elle convertirait les indices internes des niveaux du facteur (1, 2, 3&#8230;) plut\u00f4t que les valeurs num\u00e9riques r\u00e9elles encapsul\u00e9es. La syntaxe canonique de d\u00e9sanonymisation s&rsquo;\u00e9crit :<\/p>\n<p><code>valeurs_propres &lt;- as.numeric(as.character(variable_corrompue))<\/code><\/p>\n<p>Ce transtypage g\u00e9n\u00e8re un avertissement pr\u00e9venant de l&rsquo;introduction de <code>NA<\/code> par coercition sur les \u00e9l\u00e9ments non convertibles, nettoyant ainsi le vecteur avant l&rsquo;application subs\u00e9quente de la fonction cumulative.<\/p>\n<h3>11.2 Gestion du d\u00e9passement de capacit\u00e9 arithm\u00e9tique et stabilit\u00e9 num\u00e9rique<\/h3>\n<p>Comme \u00e9voqu\u00e9 pr\u00e9c\u00e9demment, le stockage d&rsquo;un vecteur sous forme d&rsquo;entiers sign\u00e9s (<code>integer<\/code>) expose l&rsquo;analyste au risque critique de d\u00e9passement de capacit\u00e9 (<em>integer overflow<\/em>). Consid\u00e9rons le cas d&rsquo;\u00e9cole suivant o\u00f9 l&rsquo;on accumule des d\u00e9comptes \u00e9lev\u00e9s :<\/p>\n<p><code>comptages_massifs &lt;- rep(1000000000L, 3)<br \/>\ncumsum(comptages_massifs)<\/code><\/p>\n<p>D\u00e8s le troisi\u00e8me \u00e9l\u00e9ment, la sommation th\u00e9orique (<span class=\"arabpsy-math-inline\" data-latex=\"3 \\times 10^9\">$3 \\times 10^9$<\/span>) d\u00e9passe le plafond formel de <span class=\"arabpsy-math-inline\" data-latex=\"2^{31}-1 \\approx 2.147 \\times 10^9\">$2^{31}-1 \\approx 2.147 \\times 10^9$<\/span>. La sortie retourn\u00e9e mat\u00e9rialise l&rsquo;\u00e9chec computationnel :<\/p>\n<p><code>[1] 1000000000 2000000000         NA<br \/>\nWarning message:<br \/>\nIn cumsum(comptages_massifs) : integer overflow - use non-integer type<\/code><\/p>\n<p>La parade pr\u00e9ventive indispensable consiste \u00e0 transtyper imm\u00e9diatement le vecteur vers la double pr\u00e9cision \u00e0 virgule flottante avant d&rsquo;invoquer la primitive :<\/p>\n<p><code>cumul_securise &lt;- cumsum(as.double(comptages_massifs))<\/code><\/p>\n<p>Sur le plan de la stabilit\u00e9 num\u00e9rique pure, il convient d&rsquo;\u00eatre vigilant face aux soustractions cumul\u00e9es de termes de grandeurs disproportionn\u00e9es. L&rsquo;accumulation de nombres r\u00e9els alternant de tr\u00e8s grands nombres positifs et de tr\u00e8s grands nombres n\u00e9gatifs peut engendrer des ph\u00e9nom\u00e8nes d&rsquo;annulation catastrophique o\u00f9 la pr\u00e9cision relative s&rsquo;\u00e9vapore compl\u00e8tement, conduisant \u00e0 des r\u00e9sultats num\u00e9riques aberrants dans les derniers rangs du vecteur calcul\u00e9.<\/p>\n<h3>11.3 Pi\u00e8ges li\u00e9s \u00e0 l&rsquo;ordre d&rsquo;indexation chronologique des observations<\/h3>\n<p>Contrairement \u00e0 l&rsquo;op\u00e9rateur de sommation scalaire <code>sum(X)<\/code>, qui est commutatif et associatif, l&rsquo;op\u00e9rateur de somme cumulative <code>cumsum(X)<\/code> est strictement d\u00e9pendant de l&rsquo;ordre d&rsquo;agencement spatial des \u00e9l\u00e9ments. Une table de donn\u00e9es m\u00e9lang\u00e9e ou tri\u00e9e de mani\u00e8re inad\u00e9quate alt\u00e8re irr\u00e9m\u00e9diablement le sens m\u00e9thodologique de l&rsquo;indicateur d\u00e9riv\u00e9.<\/p>\n<p>Pour illustrer ce danger analytique, consid\u00e9rons un jeu de donn\u00e9es chronologique accidentellement tri\u00e9 par ordre alphab\u00e9tique des mois plut\u00f4t que par leur s\u00e9quence temporelle naturelle :<\/p>\n<p>Avril, F\u00e9vrier, Janvier, Mars&#8230;<\/p>\n<p>Le calcul aveugle de la somme cumul\u00e9e sur un tel agencement produirait une s\u00e9rie sans la moindre signification substantielle, o\u00f9 la performance du mois d&rsquo;avril viendrait amputer ou gonfler artificiellement les r\u00e9sultats ant\u00e9rieurs au mois de f\u00e9vrier. Il est par cons\u00e9quent fortement recommand\u00e9 de formaliser un protocole de test d&rsquo;assertion en amont de toute ex\u00e9cution dans les scripts de production :<\/p>\n<p><code>stopifnot(!is.unsorted(donnees$date_horodatage))<\/code><\/p>\n<p>Cette instruction interrompt imm\u00e9diatement le script si le vecteur temporel n&rsquo;est pas rigoureusement tri\u00e9 par ordre chronologique strict non d\u00e9croissant, prot\u00e9geant ainsi les calculs ult\u00e9rieurs contre toute distorsion m\u00e9thodologique silencieuse.<\/p>\n<h2>12. Bonnes pratiques de programmation, reproductibilit\u00e9 et extensions m\u00e9thodologiques<\/h2>\n<h3>12.1 Encapsulation dans des fonctions personnalis\u00e9es et validation des pr\u00e9conditions<\/h3>\n<p>Dans une perspective d&rsquo;ing\u00e9nierie logicielle robuste et de reproductibilit\u00e9 computationnelle, il est hautement d\u00e9conseill\u00e9 de diss\u00e9miner des appels bruts \u00e0 <code>cumsum()<\/code> au c\u0153ur de scripts \u00e9tendus sans s\u00e9curiser pr\u00e9alablement les entr\u00e9es. La formulation d&rsquo;une fonction d&rsquo;encapsulation (<em>wrapper<\/em>) permet d&rsquo;int\u00e9grer des assertions formelles garantissant le respect scrupuleux des pr\u00e9conditions fonctionnelles.<\/p>\n<p>Consid\u00e9rons l&rsquo;impl\u00e9mentation de la fonction robuste suivante, document\u00e9e et s\u00e9curis\u00e9e :<\/p>\n<p><code>calcul_cumul_robuste &lt;- function(vecteur_donnees, neutraliser_na = FALSE) {<br \/>\n&nbsp;&nbsp;# Validation des pr\u00e9conditions de type<br \/>\n&nbsp;&nbsp;if (!is.numeric(vecteur_donnees) &amp;&amp; !is.logical(vecteur_donnees)) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;stop(\"Erreur formelle : Le vecteur d'entr\u00e9e doit obligatoirement \u00eatre de nature num\u00e9rique ou logique.\")<br \/>\n&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;# Gestion pr\u00e9ventive de l'overflow pour les entiers<br \/>\n&nbsp;&nbsp;if (is.integer(vecteur_donnees)) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;vecteur_donnees &lt;- as.double(vecteur_donnees)<br \/>\n&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;# Traitement optionnel s\u00e9curis\u00e9 des valeurs manquantes<br \/>\n&nbsp;&nbsp;if (neutraliser_na) {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;vecteur_donnees[is.na(vecteur_donnees)] &lt;- 0<br \/>\n&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;# Ex\u00e9cution du calcul vectoris\u00e9 compil\u00e9<br \/>\n&nbsp;&nbsp;return(cumsum(vecteur_donnees))<br \/>\n}<\/code><\/p>\n<p>Cette encapsulation centralise la logique d\u00e9fensive, pr\u00e9vient les erreurs de d\u00e9passement de capacit\u00e9 et standardise le comportement du code au sein des projets collaboratifs complexes.<\/p>\n<h3>12.2 Extensions vers les sommes mobiles et fen\u00eatr\u00e9es avec le package zoo<\/h3>\n<p>Bien que la somme cumulative globale <span class=\"arabpsy-math-inline\" data-latex=\"s_k = \\sum_{i=1}^k x_i\">$s_k = \\sum_{i=1}^k x_i$<\/span> constitue un outil d&rsquo;int\u00e9gration pr\u00e9cieux, elle pr\u00e9sente une m\u00e9moire infinie dans la mesure o\u00f9 le premier \u00e9l\u00e9ment influence continuellement l&rsquo;accumulateur jusqu&rsquo;au terme de l&rsquo;observation. Dans de nombreuses applications d&rsquo;\u00e9pid\u00e9miologie ou d&rsquo;\u00e9conom\u00e9trie financi\u00e8re, il est pr\u00e9f\u00e9rable d&rsquo;\u00e9valuer une accumulation \u00e0 m\u00e9moire locale born\u00e9e, plus commun\u00e9ment appel\u00e9e somme glissante ou somme mobile (<em>rolling sum<\/em>).<\/p>\n<p>Le package sp\u00e9cialis\u00e9 <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=zoo\">zoo<\/a> fournit des fonctions vectoris\u00e9es optimis\u00e9es d\u00e9di\u00e9es aux calculs fen\u00eatr\u00e9s. Contrairement \u00e0 la fonction <code>cumsum()<\/code> qui int\u00e8gre sur une fen\u00eatre d&rsquo;accumulation en expansion continue, la primitive <code>rollsum()<\/code> calcule l&rsquo;agr\u00e9gation sur une fen\u00eatre temporelle de largeur fixe <span class=\"arabpsy-math-inline\" data-latex=\"k\">$k$<\/span> :<\/p>\n<p><code>library(zoo)<\/p>\n<p>serie_journaliere &lt;- c(12, 14, 18, 15, 22, 25, 20, 19, 17, 23)<\/p>\n<p># Calcul de la somme glissante sur une fen\u00eatre fixe de 5 jours cons\u00e9cutifs<br \/>\nsomme_glissante_5j &lt;- rollsum(serie_journaliere, k = 5, fill = NA, align = \"right\")<\/code><\/p>\n<p>L&rsquo;affichage du r\u00e9sultat illustre la diff\u00e9rence fondamentale d&rsquo;horizon :<\/p>\n<p><code>[1]  NA  NA  NA  NA  81  94  100 101  98 102<\/code><\/p>\n<p>Les quatre premi\u00e8res positions re\u00e7oivent la valeur <code>NA<\/code> car la fen\u00eatre d&rsquo;observation de largeur 5 ne dispose pas encore de suffisamment d&rsquo;historique pour s&rsquo;ex\u00e9cuter. \u00c0 l&rsquo;index 5, la valeur $81$ repr\u00e9sente la somme exacte des cinq premiers jours (<span class=\"arabpsy-math-inline\" data-latex=\"12 + 14 + 18 + 15 + 22\">$12 + 14 + 18 + 15 + 22$<\/span>). Au pas suivant, l&rsquo;\u00e9l\u00e9ment le plus ancien ($12$) est \u00e9vinc\u00e9 au profit du plus r\u00e9cent ($25$), fournissant ainsi un indicateur filtr\u00e9 id\u00e9al pour \u00e9liminer les bruits saisonniers haute fr\u00e9quence sans subir la d\u00e9rive syst\u00e9matique vers l&rsquo;infini propre aux sommes cumulatives globales.<\/p>\n<h3>12.3 Recommandations pour la science ouverte et la reproductibilit\u00e9 des analyses<\/h3>\n<p>Pour assurer la p\u00e9rennit\u00e9 et la reproductibilit\u00e9 des protocoles computationnels s&rsquo;appuyant sur des calculs cumulatifs, il est indispensable de documenter formellement l&rsquo;environnement d&rsquo;ex\u00e9cution logiciel. Les variations incr\u00e9mentales entre diff\u00e9rentes versions de l&rsquo;interpr\u00e9teur R ou des packages d&rsquo;extension peuvent induire des modifications subtiles dans le traitement des coercitions ou des types sous-jacents.<\/p>\n<p>Le recours au gestionnaire d&rsquo;environnement de d\u00e9pendances <a rel=\"noopener noreferrer\" href=\"https:\/\/rstudio.github.io\/renv\/\">renv<\/a> permet de figer l&rsquo;ensemble des biblioth\u00e8ques mobilis\u00e9es dans un \u00e9tat rigoureusement d\u00e9termin\u00e9, consign\u00e9 dans un fichier de verrouillage structur\u00e9 <code>renv.lock<\/code>. Concomitamment, l&rsquo;int\u00e9gration des flux de traitement cumulatifs au sein de documents computationnels dynamiques via <a rel=\"noopener noreferrer\" href=\"https:\/\/quarto.org\/\">Quarto<\/a> ou R Markdown assure un couplage ind\u00e9fectible entre le code R source, les sorties num\u00e9riques d&rsquo;accumulation et le texte scientifique narratif de l&rsquo;article.<\/p>\n<p>Enfin, la publication transparente des jeux de donn\u00e9es brutes sur des plateformes institutionnelles d&rsquo;archives ouvertes (telles que Zenodo ou le r\u00e9seau Dataverse), accompagn\u00e9e de scripts de transformation auto-suffisants d\u00e9pourvus de chemins d&rsquo;acc\u00e8s locaux absolus cod\u00e9s en dur, mat\u00e9rialise l&rsquo;aboutissement des standards d&rsquo;ouverture de la science moderne, garantissant \u00e0 l&rsquo;ensemble de la communaut\u00e9 internationale la facult\u00e9 d&rsquo;auditer, de r\u00e9pliquer et d&rsquo;\u00e9tendre les r\u00e9sultats scientifiques pr\u00e9sent\u00e9s.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Chambers, J. M. (2008). <em>Software for data analysis: Programming with R<\/em>. Springer. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/978-0-387-75936-4\">https:\/\/doi.org\/10.1007\/978-0-387-75936-4<\/a><\/li>\n<li>Dowle, M., &amp; Srinivasan, A. (2023). <em>data.table: Extension of `data.frame`<\/em> (R package version 1.14.8). CRAN. <a rel=\"noopener noreferrer\" href=\"https:\/\/CRAN.R-project.org\/package=data.table\">https:\/\/CRAN.R-project.org\/package=data.table<\/a><\/li>\n<li>Ihaka, R., &amp; Gentleman, R. (1996). R: A language for data analysis and graphics. <em>Journal of Computational and Graphical Statistics<\/em>, 5(3), 299\u2013314. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1080\/10618600.1996.10474713\">https:\/\/doi.org\/10.1080\/10618600.1996.10474713<\/a><\/li>\n<li>R Core Team. (2023). <em>R: A language and environment for statistical computing<\/em>. R Foundation for Statistical Computing. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.R-project.org\/\">https:\/\/www.R-project.org\/<\/a><\/li>\n<li>Rogers, E. M. (2003). <em>Diffusion of innovations<\/em> (5th ed.). Free Press.<\/li>\n<li>Wickham, H., Fran\u00e7ois, R., Henry, L., &amp; M\u00fcller, K. (2023). <em>dplyr: A grammar of data manipulation<\/em> (R package version 1.1.2). CRAN. <a rel=\"noopener noreferrer\" href=\"https:\/\/CRAN.R-project.org\/package=dplyr\">https:\/\/CRAN.R-project.org\/package=dplyr<\/a><\/li>\n<li>Wickham, H. (2016). <em>ggplot2: Elegant graphics for data analysis<\/em>. Springer-Verlag. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/978-3-319-24277-4\">https:\/\/doi.org\/10.1007\/978-3-319-24277-4<\/a><\/li>\n<li>Wilkinson, L. (2005). <em>The grammar of graphics<\/em> (2nd ed.). Springer. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/0-387-28695-0\">https:\/\/doi.org\/10.1007\/0-387-28695-0<\/a><\/li>\n<li>Zeileis, A., &amp; Grothendieck, G. (2005). zoo: S3 infrastructure for regular and irregular time series. <em>Journal of Statistical Software<\/em>, 14(6), 1\u201327. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v014.i06\">https:\/\/doi.org\/10.18637\/jss.v014.i06<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour calculer et visualiser des sommes cumul\u00e9es dans R : utilisation de cumsum, gestion des donn\u00e9es manquantes, dplyr et graphiques.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2193,359],"tags":[5247,6496,6498,6497,6499],"class_list":["post-4568","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-r","category-statistiques-appliquees","tag-analyse-de-donnees-r","tag-cumsum-r","tag-dplyr-cumsum","tag-somme-cumulee-r","tag-visualisation-ggplot2"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4568","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=4568"}],"version-history":[{"count":0,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4568\/revisions"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4568"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4568"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}