Quel algorithme utilise R pour calculer la moyenne?

Je suis curieux de savoir quelle fonction moyenne de l’algorithme R utilise. Y a-t-il une référence aux propriétés numériques de cet algorithme?

J’ai trouvé le code C suivant dans summary.c: do_summary ():

case REALSXP: PROTECT(ans = allocVector(REALSXP, 1)); for (i = 0; i < n; i++) s += REAL(x)[i]; s /= n; if(R_FINITE((double)s)) { for (i = 0; i < n; i++) t += (REAL(x)[i] - s); s += t/n; } REAL(ans)[0] = s; break; 

Il semble faire une moyenne droite:

 for (i = 0; i < n; i++) s += REAL(x)[i]; s /= n; 

Ensuite, il ajoute ce que je suppose être une correction numérique qui semble correspondre à la différence moyenne par rapport à la moyenne des données:

 for (i = 0; i < n; i++) t += (REAL(x)[i] - s); s += t/n; 

Je n’ai pas été capable de localiser cet algorithme (la moyenne n’est pas un bon terme de recherche).

Toute aide serait très appréciée.

Je ne sais pas de quel algorithme il s’agit, mais Martin Maechler a mentionné la méthode de mise à jour de West, 1979, en réponse au PR 1228 mis en œuvre par Brian Ripley dans la version R-2.3.0. Je n’ai pas trouvé de référence dans les journaux de contrôle de code source ou de version répertoriant l’algorithme utilisé. Il a été mis en œuvre dans cov.c dans la révision 37389 et dans summary.c dans la révision 37393.

Je crois que l’algorithme R fonctionne comme suit.

Le premier calcul standard de la moyenne est effectivement une estimation de la moyenne algébrique, due à des erreurs en virgule flottante (qui s’aggrave à mesure que la sum s’éloigne des éléments accumulés).

La seconde passe résume les différences entre les éléments et la moyenne estimée. Il ne devrait y avoir aucune différence nette car les valeurs de chaque côté de la moyenne devraient s’équilibrer, mais nous avons une erreur en virgule flottante. Les différences par rapport à la moyenne ont toujours un potentiel d’erreur, mais elles devraient être inférieures à la pire différence potentielle entre un élément et la sum accumulée (au moins la moyenne estimée vit quelque part dans la plage de valeurs, pendant que la sum peut y échapper) . La division par N vous donne la différence moyenne par rapport à la moyenne, que vous utilisez ensuite pour décaler votre estimation initiale plus près de la moyenne réelle. Vous pouvez répéter cette opération pour vous rapprocher, mais à un moment donné, l’erreur en virgule flottante dans le calcul de la différence moyenne par rapport à la moyenne vous fera perdre. Je suppose qu’un seul passage est assez proche.

Cela m’a été expliqué par ma femme.

Je ne sais pas quelle est la source de l’algorithme et comment il se compare à d’autres méthodes, telles que la sommation de Kahan. Je suppose que je vais devoir faire des tests.