2013-07-25 12 views
19

Sono curioso di sapere quale algoritmo utilizza la funzione media di R. C'è qualche riferimento alle proprietà numeriche di questo algoritmo?Quale algoritmo usa R per calcolare la media?

ho trovato il seguente codice C in 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; 

Sembra di fare un dritto up medio:

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

Poi si aggiunge quello che presumo è un correzione numerica che sembra essere la differenza media dalla media dei dati:

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

Non sono stato in grado di rintracciare s algoritmo giù ovunque (significa che non è un grande termine di ricerca).

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Questa è una parte, ma come fa 'mean.R' chiama 'summary.c'? Non capisco come '.Internal (mean (x))' chiama 'summary.c'. Grazie per eventuali suggerimenti su come sono collegati i due file. Scusa se questo è troppo lontano dalla tua domanda. Spero solo di imparare. –

+3

@MarkMiller: tutte le chiamate '.Internal' sono mappate in' src/main/names.c'. Cerca quel file con "mean" e vedrai quale funzione C lo chiama. Quindi puoi cercare i file sorgente per quella funzione C. Vedi [questa domanda] (http://stackoverflow.com/q/13279256/271616). –

+0

Link a questa stessa domanda su r-devel: https://stat.ethz.ch/pipermail/r-devel/2013-July/067053.html –

risposta

14

Non sono sicuro di quale algoritmo sia, ma Martin Maechler ha menzionato il metodo di aggiornamento di West, 1979 in risposta a PR#1228, che è stato implementato da Brian Ripley in R-2.3.0. Non sono riuscito a trovare un riferimento nel codice sorgente o nei registri di controllo della versione che elencavano l'algoritmo utilizzato. È stato implementato in cov.c nella revisione 37389 e in summary.c nella revisione 37393.

+0

Grazie per avermi indicato nella giusta direzione, dovrò tenere traccia giù una copia di questo documento. – Zach

+1

+1 per 'svn blame' –

+1

Non penso che sia il metodo di West.Ho appena scaricato la carta e West propone un metodo a un passaggio per calcolare la varianza - R usa un metodo a due passaggi per calcolare la media. – hadley

9

Credo che l'algoritmo R funzioni come segue.

Il primo calcolo standard della media è effettivamente una stima della media algebrica, a causa di errori in virgola mobile (che peggiora ulteriormente man mano che la somma si allontana dagli elementi accumulati).

Il secondo passaggio somma le differenze degli elementi dalla media stimata. Non ci dovrebbero essere differenze nette in quanto i valori su entrambi i lati della media dovrebbero essere bilanciati, ma abbiamo un errore in virgola mobile. Le differenze rispetto alla media hanno ancora il potenziale di errore, ma queste dovrebbero essere più piccole della peggiore differenza potenziale tra un elemento e la somma accumulata (almeno la media stimata vive da qualche parte all'interno dell'intervallo di valori, mentre la somma può sfuggire ad essa) . Dividere per N ti dà la differenza media dalla media, che poi usi per spingere la tua stima iniziale più vicina alla media vera. Potresti ripetere questo per avvicinarti sempre di più, ma ad un certo punto l'errore del punto in virgola mobile nel calcolare la differenza media dalla media ti sconfiggerà. Immagino che un passaggio sia abbastanza vicino.

Questo mi è stato spiegato da mia moglie.

Non sono sicuro di dove sia la fonte dell'algoritmo e non sono sicuro di come questo si colleghi ad altri metodi, come la sommatoria di Kahan. Credo che dovrò fare qualche test.

Problemi correlati