2013-07-25 20 views
19

Jestem ciekawy, jaki algorytm używa funkcja algorytmu R. Czy istnieje odniesienie do właściwości liczbowych tego algorytmu?Jaki algorytm R używa do obliczania średniej?

znalazłem następujący kod C w 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; 

Wydaje zrobić prosto na myśli:

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

Następnie dodaje co zakładam jest korekta numeryczną, która wydaje się być średnia różnica od średniej z danymi:

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

I nie były w stanie śledzić jes s algorytm w dowolnym miejscu (średnia nie jest świetnym terminem wyszukiwania).

Każda pomoc będzie mile widziana.

+0

To jest na bok, ale w jaki sposób "mean.R" nazywa się "summary.c"? Nie rozumiem, jak ".Internal (mean (x))" wywołuje "summary.c". Dziękujemy za wszelkie wskazówki dotyczące połączenia tych dwóch plików. Przepraszamy, jeśli to zbyt daleko od pytania. Mam tylko nadzieję, że się nauczę. –

+3

@MarkMiller: Wszystkie wywołania '.Internal' są mapowane w' src/main/names.c'. Wyszukaj ten plik jako "średni", a zobaczysz, co wywołuje go funkcja C. Następnie możesz wyszukać pliki źródłowe dla tej funkcji C. Zobacz [to pytanie] (http://stackoverflow.com/q/13279256/271616). –

+0

Link do tego samego pytania na r-devel: https://stat.ethz.ch/pipermail/r-devel/2013-July/067053.html –

Odpowiedz

14

Nie jestem pewien, jaki to jest algorytm, ale Martin Maechler wspomniał o metodzie aktualizacji West, 1979 w odpowiedzi na PR#1228, którą zaimplementował Brian Ripley w R-2.3.0. Nie mogłem znaleźć odniesienia w kodzie źródłowym lub dziennikach kontroli wersji, które wymieniałyby używany algorytm. Został on zaimplementowany w wersji cov.c w wersji 37389 oraz w summary.c w wersji 37393.

+0

Dzięki za wskazanie mi we właściwym kierunku, będę musiał śledzić w dół kopię tego dokumentu. – Zach

+1

+1 za 'svn winien'' –

+1

Nie sądzę, że to metoda Westa.Właśnie pobrałem dokument, a West proponuje metodę jednoprzebiegową do obliczania wariancji - R używa metody dwuprzebiegowej do obliczania średniej. – hadley

9

Uważam, że algorytm R działa w następujący sposób.

Pierwszym standardowym obliczeniem średniej jest w rzeczywistości oszacowanie średniej algebraicznej, z powodu błędów zmiennoprzecinkowych (która ulega pogorszeniu, im dalej odrywa się od gromadzonych elementów).

Drugie zdanie podsumowuje różnice elementów od szacowanej średniej. Nie powinno być żadnej różnicy netto, ponieważ wartości po obu stronach średniej powinny się równoważyć, ale mamy błąd zmiennoprzecinkowy. Różnice od średniej wciąż mają potencjał błędu, ale powinny być mniejsze od najgorszej potencjalnej różnicy pomiędzy elementem a sumą kumulacyjną (przynajmniej szacowana średnia żyje gdzieś w zakresie wartości, podczas gdy sumowanie może temu uciec) . Dzielenie przez N daje średnią różnicę od średniej, którą następnie wykorzystasz, aby przesunąć początkową ocenę bliżej prawdziwej średniej. Możesz powtórzyć to, aby zbliżyć się do siebie, ale w pewnym momencie błąd zmiennoprzecinkowy w obliczaniu średniej różnicy od średniej pokona cię. Myślę, że jedno podanie jest wystarczająco blisko.

Zostało to wyjaśnione przez moją żonę.

Nie jestem pewien, skąd pochodzi źródło algorytmu i nie jestem pewien, jak to się ma do innych metod, takich jak suma Kahana. Sądzę, że będę musiał zrobić kilka testów.

Powiązane problemy