Stima media solida con efficienza di aggiornamento O (1)


9

Sto cercando una stima robusta della media che ha una proprietà specifica. Ho un insieme di elementi per i quali voglio calcolare questa statistica. Quindi, aggiungo nuovi elementi uno alla volta e per ogni elemento aggiuntivo vorrei ricalcolare la statistica (nota anche come algoritmo online). Vorrei che questo calcolo di aggiornamento fosse veloce, preferibilmente O (1), cioè non dipendente dalla dimensione della lista.

La solita media ha questa proprietà che può essere aggiornata in modo efficiente, ma non è robusta per i valori anomali. Gli stimatori robusti tipici della media, come la media inter-quartile e la media ritagliata, non possono essere aggiornati in modo efficiente (poiché richiedono il mantenimento di un elenco ordinato).

Gradirei qualsiasi suggerimento per statistiche affidabili che possono essere calcolate / aggiornate in modo efficiente.


Perché non usare semplicemente un segmento iniziale dei dati - come i primi 100 o i primi 1000 o altro - per erigere "recinti" per lo screening dei valori anomali? Non è necessario aggiornarli di nuovo, quindi non è necessario mantenere strutture di dati aggiuntive.
whuber

@whuber Non posso garantire che il campione iniziale rappresenterà il resto dei dati. Ad esempio, l'ordine in cui mi vengono dati i dati non è casuale (immagina uno scenario in cui prima mi vengono dati valori più alti e poi valori più bassi).
Bitwise,

1
Questa è un'osservazione cruciale. Implica che devi prenderti più cura del solito, perché inizialmente otterrai una stima "robusta" degli alti valori erratici medi. Continuando ad aggiornare tale stima, potresti finire col buttare via tutti i valori più bassi. Pertanto, sarà necessaria una struttura di dati in cui le parti chiave dell'intera distribuzione dei dati vengano registrate e aggiornate periodicamente. Dai un'occhiata alle nostre discussioni con le parole chiave "online" e "quantile" per idee. Due di questi promettenti sono su stats.stackexchange.com/questions/3372 e stats.stackexchange.com/q/3377 .
whuber

Vorrei offrire una taglia ma non ho abbastanza reputazione
Jason S

1
Per continuare con l'idea nel primo commento di @buber, puoi mantenere un sottoinsieme casuale campionato uniformemente di dimensioni o da tutti i dati visti finora. Questo set e le "recinzioni" associate possono essere aggiornate in O (1) volta. 10001001000
Innuo

Risposte:


4

Questa soluzione implementa un suggerimento fatto da @Innuo in un commento alla domanda:

È possibile mantenere un sottoinsieme casuale uniformemente campionato di dimensioni 100 o 1000 da tutti i dati visti finora. Questo set e le "recinzioni" associate possono essere aggiornate in volta.O(1)

Una volta che sappiamo come mantenere questo sottoinsieme, possiamo selezionare qualsiasi metodo che ci piace per stimare la media di una popolazione da tale campione. Questo è un metodo universale, senza fare alcuna ipotesi, che funzionerà con qualsiasi flusso di input con un'accuratezza che può essere prevista usando formule di campionamento statistico standard. (La precisione è inversamente proporzionale alla radice quadrata della dimensione del campione.)


Questo algoritmo accetta come input un flusso di dati una dimensione del campione e genera un flusso di campioni ciascuno dei quali rappresenta la popolazione . In particolare, per , è un semplice campione casuale di dimensione da (senza sostituzione).t = 1 , 2 , , m s ( t ) X ( t ) = ( x ( 1 ) , x ( 2 ) , , x ( t ) ) 1 i t s ( i ) m X ( t )x(t), t=1,2,,ms(t)X(t)=(x(1),x(2),,x(t))1its(i)mX(t)

Perché ciò accada, è sufficiente che ogni sottoinsieme -elemento di abbia pari possibilità di essere gli indici di in . Ciò implica la possibilità che sia in uguale a fornito .{ 1 , 2 , , t } x s ( t ) x ( i ) , 1 i < t , s ( t ) m / t t mm{1,2,,t}xs(t)x(i), 1i<t,s(t)m/ttm

All'inizio raccogliamo solo il flusso fino a quando elementi sono stati memorizzati. A quel punto esiste un solo campione possibile, quindi la condizione di probabilità è banalmente soddisfatta.m

L'algoritmo prende il sopravvento quando . Supponiamo induttivamente che sia un semplice campione casuale di per . Impostare provvisoriamente . Sia una variabile casuale uniforme (indipendente da qualsiasi variabile precedente utilizzata per costruire ). Se sostituisce un elemento di scelto casualmente con . Questa è l'intera procedura!s ( t ) X ( t ) t > m s ( t + 1 ) = s ( t ) U ( t + 1 ) s ( t ) U ( t + 1 ) m / ( t + 1 ) s x ( t + 1 )t=m+1s(t)X(t)t>ms(t+1)=s(t)U(t+1)s(t)U(t+1)m/(t+1)sx(t+1)

Chiaramente ha probabilità di essere in . Inoltre, per l'ipotesi di induzione, aveva probabilità di essere in quando . Con probabilità = sarà stato rimosso da , da cui la sua probabilità di rimanere ugualem / ( t + 1 ) s ( t + 1 ) x ( i ) m / t s ( t ) i t m / ( t + 1 ) × 1 / m 1 / ( t + 1 ) s ( t + 1 )x(t+1)m/(t+1)s(t+1)x(i)m/ts(t)itm/(t+1)×1/m1/(t+1)s(t+1)

mt(11t+1)=mt+1,

esattamente come necessario. Per induzione, quindi, tutte le probabilità di inclusione di in sono corrette ed è chiaro che non esiste alcuna correlazione speciale tra tali inclusioni. Ciò dimostra che l'algoritmo è corretto.s ( t )x(i)s(t)

L'efficienza dell'algoritmo è perché in ogni fase vengono calcolati al massimo due numeri casuali e al massimo viene sostituito un elemento di un array di valori . Il requisito di archiviazione è .m O ( m )O(1)mO(m)

La struttura dei dati per questo algoritmo è costituita dai campioni insieme all'indice della popolazione che campiona. Inizialmente prendiamo e procediamo con l'algoritmo per Ecco un'implementazione per aggiornare con un valore per produrre . (L'argomento gioca il ruolo di ed è . L'indice verrà mantenuto dal chiamante.)t X ( t ) s = X ( m ) t = m + 1 , m + 2 , . ( s , t ) x ( s , t + 1 ) t m tstX(t)s=X(m)t=m+1,m+2,.R(s,t)x(s,t+1)ntsample.sizemt

update <- function(s, x, n, sample.size) {
  if (length(s) < sample.size) {
    s <- c(s, x)
  } else if (runif(1) <= sample.size / n) {
    i <- sample.int(length(s), 1)
    s[i] <- x
  }
  return (s)
}

Per illustrare e testare questo, userò il solito (non robusto) stimatore della media e confronterò la media stimata da con la media effettiva di (l'insieme cumulativo di dati visto ad ogni passaggio ). Ho scelto un flusso di input un po 'difficile che cambia in modo abbastanza regolare ma periodicamente subisce salti drammatici. La dimensione del campione di è abbastanza piccola, permettendoci di vedere le fluttuazioni di campionamento in questi grafici.X ( t ) m = 50s(t)X(t)m=50

n <- 10^3
x <- sapply(1:(7*n), function(t) cos(pi*t/n) + 2*floor((1+t)/n))
n.sample <- 50
s <- x[1:(n.sample-1)]
online <- sapply(n.sample:length(x), function(i) {
  s <<- update(s, x[i], i, n.sample)
  summary(s)})
actual <- sapply(n.sample:length(x), function(i) summary(x[1:i]))

A questo punto onlineè la sequenza delle stime medie prodotte mantenendo questo campione corrente di valori mentre è la sequenza delle stime medie prodotte da tutti i dati disponibili in ogni momento. Il grafico mostra i dati (in grigio), (in nero) e due applicazioni indipendenti di questa procedura di campionamento (a colori). L'accordo è all'interno dell'errore di campionamento previsto:50actualactual

plot(x, pch=".", col="Gray")
lines(1:dim(actual)[2], actual["Mean", ])
lines(1:dim(online)[2], online["Mean", ], col="Red")

figura


Per stimatori affidabili della media, si prega di cercare nel nostro sito termini e termini correlati. Tra le possibilità che vale la pena considerare ci sono le medie Winsorized e gli stimatori M.


non mi è chiaro come appare la soglia di rifiuto in questo approccio (ad esempio la soglia oltre la quale le osservazioni vengono respinte come valori anomali). Puoi aggiungerli alla trama?
user603

@ user603 La "soglia di rifiuto", o qualsiasi metodo robusto utilizzato per stimare la media, è irrilevante: scegliere qualunque metodo si desideri stimare la media. (Non tutti i metodi efficaci funzionano erigendo le soglie e rifiutando i dati, a proposito.) Questo sarebbe fatto nel codice della mia risposta sostituendolo summarycon una variante robusta.
whuber

Qualcosa non mi è chiaro in questo esempio. I dati in grigio sono "buoni" o "valori anomali". Se il precedente, sembra che la misura sia distorta (dovrebbe adattarsi meglio poiché la situazione sarebbe simile alla tendenza al ribasso di @ Bitwise che vorremmo seguire). Se i dati grigi con valori di indice più alti sono anomali, allora l'adattamento è distorto verso l'alto. Qual è l'obiettivo che vuoi adattare qui? L'attuale adattamento sembra lacerato tra questi due scenari.
Deathkill14,

@Death Come spiegato nel testo che precede immediatamente la figura, i dati grigi sono il flusso originale di dati. La sua media corrente è la curva nera. Le curve colorate si basano sull'algoritmo. Le deviazioni verticali delle curve colorate rispetto alla curva nera sono dovute alla casualità nel campionamento. La quantità prevista di deviazione in qualsiasi indice è proporzionale alla deviazione standard dei valori di grigio che precedono quell'indice e inversamente proporzionale alla radice quadrata della dimensione del campione (presa come 50 in questo esempio).
whuber

3

Potresti pensare di mettere in relazione il tuo problema con quello del diagramma di controllo ricorsivo. Tale diagramma di controllo valuterà se una nuova osservazione è sotto controllo. In tal caso, questa osservazione è inclusa nella nuova stima della media e della varianza (necessaria per determinare i limiti di controllo).

Alcuni retroscena su grafici di controllo robusti, ricorsivi e univariati sono disponibili qui . Uno dei testi classici sul controllo di qualità e sulle carte di controllo sembra essere disponibile online qui .

Intuitivamente, usando una media, e una varianza come input, è possibile determinare se una nuova osservazione al momento è errata per un certo numero di approcci. Uno sarebbe dichiarare un valore anomalo se è al di fuori di un certo numero di deviazioni standard di (dato , ma ciò potrebbe incorrere in problemi se i dati lo fanno non conforme a determinati presupposti distributivi. Se vuoi percorrere questa strada, supponi di aver determinato se un nuovo punto non è un valore anomalo e desideri includerlo nella stima media senza un tasso speciale di dimenticanza. Quindi non puoi fare di meglio di: σ 2 t - 1 t x t μ t - 1 σ 2 t - 1 )μt1σt12txtμt1σt12)

μt=t1tμt1+1txt

Allo stesso modo, dovrai aggiornare ricorsivamente la varianza:

σt2=t1tσt12+1t1(xtμt)2

Tuttavia, potresti voler provare alcuni grafici di controllo più convenzionali. Altri grafici di controllo che sono più robusti per la distribuzione dei dati e che possono ancora gestire la non stazionarietà (come il del tuo processo che va lentamente verso l'alto) sono raccomandati EWMA o CUSUM (vedi il libro di testo linkato sopra per maggiori dettagli su i grafici e i loro limiti di controllo). Questi metodi saranno in genere meno intensivi dal punto di vista computazionale rispetto a quelli robusti perché hanno il vantaggio di dover semplicemente confrontare una singola nuova osservazione con informazioni derivate da osservazioni non anomale. È possibile affinare le stime del processo a lungo termine e utilizzate nei calcoli del limite di controllo di questi metodi con le formule di aggiornamento fornite sopra, se lo si desidera.μ σ 2μμσ2

Per quanto riguarda un grafico come l'EWMA, che dimentica le vecchie osservazioni e dà più peso a quelle nuove, se si ritiene che i dati siano stazionari (il che significa che i parametri della distribuzione generatrice non cambiano) non è necessario dimenticare in modo esponenziale le osservazioni più vecchie. È possibile impostare il fattore di dimenticanza di conseguenza. Tuttavia, se ritieni che sia non stazionarietà, dovrai selezionare un buon valore per il fattore di dimenticanza (vedi di nuovo il libro di testo per un modo per farlo).

Dovrei anche menzionare che prima di iniziare a monitorare e aggiungere nuove osservazioni online, è necessario ottenere stime di e (i valori dei parametri iniziali basati su un set di dati di addestramento) che non sono influenzati dai valori anomali. Se sospetti che ci siano valori anomali nei dati di allenamento, puoi pagare il costo una tantum dell'utilizzo di un metodo affidabile per stimarli.σ 2 0μ0σ02

Penso che un approccio in tal senso porterà all'aggiornamento più rapido per il tuo problema.


1
L'uso di grafici di controllo è un'idea interessante. Sembra tuttavia difficile superare le sfide delineate nei commenti alla domanda. Nel caso non stazionario se si "dimentica" valori più vecchi sembra possibile che le stime possano essere fortemente distorte. Ad esempio, come potrebbero essere i tuoi suggerimenti su un flusso di dati fornito da ? (Questo scende molto gradualmente, salta improvvisamente e sale molto gradualmente, salta di nuovo improvvisamente, e così via.)xt=cos(πt/106)+2t/106
whuber

@Bitwise dice che il campione iniziale potrebbe non rappresentare dati futuri. Senza informazioni su quanto sarà diverso il resto dei dati, in pratica non puoi fare nulla. Tuttavia, se i dati iniziali contengono informazioni sulla non stazionarietà del processo (diciamo una tendenza al ribasso), possono essere consentite nuove osservazioni nel tenere conto del fatto che ci aspettiamo che siano inferiori. Tuttavia, sono necessarie alcune informazioni sulla non stazionarietà. Proponi un tipo patologico di non stazionarietà. Alcuni metodi, ad esempio l'EWMA, sono ottimali per un processo specifico ma sono generalmente piuttosto buoni. Il tuo processo richiederebbe un lavoro più personalizzato.
Deathkill14,

(Rilevo un matematico in te, perché è una mossa molto matematica liquidare come "patologico" qualcosa che non puoi gestire :-). Ma mi permetto di dissentire dalla tua prognosi: metodi come quelli suggeriti da @Innuo possono davvero proteggere da tali "patologie" e da qualsiasi altra cosa che il mondo reale potrebbe lanciarti, specialmente quando la randomizzazione è incorporata nel campionamento.
whuber

In realtà, concordo sul fatto che non si dovrebbe respingere un problema che si sta affrontando. Potresti collegarmi ai metodi discussi su @Innuo (non riesco a trovarli da questo post - erano nei link che hai fornito sopra e mi sono persi?). Grazie.
Deathkill14,

@Innuo ha pubblicato un breve commento su stats.stackexchange.com/questions/56494/… suggerendo che un campione casuale uniforme di tutti i dati precedentemente osservati potrebbe essere mantenuto in tempo . Anche se non è del tutto chiaro come si farebbe, accoppiarlo a un solido stimatore della media costituirebbe una soluzione universale, applicabile a qualsiasi flusso di dati qualunque. O(1)
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.