Подтвердить что ты не робот

Какой алгоритм используется R для вычисления среднего?

Мне любопытно узнать, какую функцию использует функция R. Есть ли какая-то ссылка на числовые свойства этого алгоритма?

Я нашел следующий код C в 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;

Кажется, что он делает прямое значение:

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

Затем он добавляет то, что я предполагаю, это числовая коррекция, которая, как представляется, является средней разницей от среднего значения данных:

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

Я не смог отследить этот алгоритм где-нибудь (среднее значение не является отличным поисковым термином).

Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Я не уверен, какой алгоритм это, но Мартин Маечер упомянул метод обновления West, 1979 в ответ на PR # 1228, который был выполнен Брайаном Рипли в R-2.3.0. Я не мог найти ссылку в журналах управления исходным кодом или версией, в которых указан фактический используемый алгоритм. Он был реализован в cov.c в редакции 37389 и в summary.c в редакции 37393.

Ответ 2

Я считаю, что алгоритм R работает следующим образом.

Первый стандартный расчет среднего значения - это, по сути, оценка алгебраического среднего из-за ошибок с плавающей запятой (что ухудшается, в дальнейшем сумма уходит от накопленных элементов).

Второй проход суммирует различия элементов из оцененного среднего. Не должно быть чистой разницы, так как значения по обе стороны от среднего должны балансироваться, но мы имеем ошибку с плавающей запятой. Отличия от среднего по-прежнему имеют потенциал для ошибки, но они должны быть меньше наихудшей разности потенциалов между элементом и суммой накопления (по крайней мере, оценочное среднее значение живет где-то в пределах диапазона значений, в то время как суммирование может избежать этого), Разделение на N дает вам среднее отличие от среднего, которое вы затем используете, чтобы подтолкнуть исходную оценку ближе к истинному среднему значению. Вы можете повторить это, чтобы все ближе и ближе, но в какой-то момент ошибка с плавающей запятой при вычислении средней разницы от среднего приведет к победе над вами. Я думаю, что один проход достаточно близко.

Это объяснялось мне моей женой.

Я не уверен, где находится источник алгоритма, и я не уверен, как это сравнивается с другими методами, такими как суммирование Кахана. Думаю, мне нужно будет провести некоторое тестирование.