Rilevamento di valori anomali nei dati di conteggio


21

Ho quello che pensavo ingenuamente di essere un problema piuttosto semplice che comporta il rilevamento anomalo di molti diversi set di dati di conteggio. In particolare, voglio determinare se uno o più valori in una serie di dati di conteggio sono più alti o più bassi del previsto rispetto al resto dei conteggi nella distribuzione.

Il fattore confondente è che devo farlo per 3.500 distribuzioni ed è probabile che alcuni di essi si adattino a un poisson sovraispersato gonfiato a zero, mentre altri potrebbero adattarsi meglio a un binomio negativo o ZINB, mentre altri potrebbero essere normalmente distribuiti. Per questo motivo, i semplici punteggi Z o la rappresentazione della distribuzione non sono appropriati per gran parte del set di dati. Ecco un esempio dei dati di conteggio per i quali voglio rilevare valori anomali.

counts1=[1 1 1 0 2 1 1 0 0 1 1 1 1 1 0 0 0 0 1 2 1 1 2 1 1 1 1 0 0 1 0 1 1 1 1 0 
         0 0 0 0 1 2 1 1 1 1 1 1 0 1 1 2 0 0 0 1 0 1 2 1 1 0 2 1 1 1 0 0 1 0 0 0 
         2 0 1 1 0 2 1 0 1 1 0 0 2 1 0 1 1 1 1 2 0 3]
counts2=[0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
         0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 
         1 1 0 0 0]
counts3=[14 13 14 14 14 14 13 14 14 14 14 14 15 14 14 14 14 14 14 15 14 13 14 14 
         15 12 13 17 13 14 14 14 14 15 14 14 13 14 13 14 14 14 14 13 14 14 14 15 
         15 14 14 14 14 14 15 14 1414 14 15 14 14 14 14 14 14 14 14 14 14 14 14 13 16]
counts4=[0 3 1.......]
and so on up to counts3500.

Inizialmente pensavo che avrei dovuto scrivere un ciclo in Python o R che avrebbe applicato un insieme di modelli a ciascuna distribuzione e selezionare il modello più adatto secondo AIC o altro (forse il fitdistrplus in R?). Potrei quindi chiedere quali fossero gli estremi per la distribuzione data (i conteggi che cadono nelle code, ad esempio un conteggio di "4" sarebbe un valore anomalo nella distribuzione dei conteggi 1 sopra?). Tuttavia, non sono sicuro che questa sia una strategia valida e mi è venuto in mente che potrebbe esserci una metodologia semplice per determinare i valori anomali nei dati di conteggio di cui non ero a conoscenza. Ho cercato a fondo e non ho trovato nulla di appropriato per il mio problema, dato il numero di distribuzioni che voglio guardare.

Il mio obiettivo finale è rilevare aumenti o diminuzioni significativi di un conteggio per ciascuna distribuzione di conteggi, utilizzando la metodologia statisticamente più appropriata.

Risposte:


23

Non è possibile utilizzare la distanza di un'osservazione da un adattamento classico dei dati per rilevare in modo affidabile valori anomali poiché la procedura di adattamento che si utilizza è essa stessa suscettibile di essere trascinata verso i valori anomali (questo è chiamato effetto di mascheramento). Un modo semplice per rilevare in modo affidabile gli outlier è usare l'idea generale che hai suggerito (distanza dall'adattamento) ma sostituire gli stimatori classici con stimatori molto meno suscettibili di essere influenzati dagli outlier. Di seguito presento un'illustrazione generale dell'idea e quindi discuto la soluzione per il tuo problema specifico.

Un'illustrazione: considera le seguenti 20 osservazioni tratte da un (arrotondato alla seconda cifra):N(0,1)

x<-c(-2.21,-1.84,-.95,-.91,-.36,-.19,-.11,-.1,.18,
.3,.31,.43,.51,.64,.67,.72,1.22,1.35,8.1,17.6)

(gli ultimi due dovrebbero essere davvero .81 e 1.76 ma sono stati accidentalmente errati).

Utilizzo di una regola di rilevazione anomala basata sul confronto delle statistiche

|Xio-Ave(Xio)|sd(Xio)

ai quantili di una distribuzione normale non induresti mai a sospettare che 8.1 sia un valore anomalo, portandoti a stimare il della serie "rifilata" come 2 (per confronto la stima grezza, ad esempio non rifilata, di è 4.35).sdsdsd

Avevi usato invece una statistica solida:

|Xio-med(Xio)|pazzo(Xio)

e confrontando i robusti punteggi risultanti con i quantili di una normale, avresti contrassegnato correttamente le ultime due osservazioni come valori anomali (e stimato correttamente il delle serie tagliate a 0.96).sdzsd

(nell'interesse della completezza, dovrei sottolineare che alcune persone, anche in questa età e in questi giorni, preferiscono aggrapparsi alla stima grezza - campagna - di 4,35 piuttosto che usare la stima più precisa basata sul taglio, ma questo non è comprensibile per me )

Per altre distribuzioni la situazione non è così diversa, ma semplicemente dovrai prima trasformare i tuoi dati. Ad esempio, nel tuo caso:

Supponiamo che sia il tuo conteggio originale. Un trucco è utilizzare la trasformazione:X

Y=2X

Y>med(Y)+3

X

YN(med(Y),1)

λ

λλ=3

p

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.