2012-11-11 7 views
7

Questa volta non farò una domanda diretta su come rilevare i valori anomali come ho fatto prima in una delle mie domande. Ho letto alcuni post relativi a questo argomento ma non ho ottenuto ciò di cui avevo bisogno. Ho una serie di valori che sono i seguenti:Rilevamento anomalo univariato

y<-c(0.59, 0.61, 0.59, 1.55, 1.33, 3.50, 1.00, 1.22, 2.50, 3.00, 3.79, 3.98, 4.33, 4.45, 4.59, 4.72, 4.82, 4.90, 4.96, 7.92, 5.01, 5.01, 4.94, 5.05, 5.04, 5.03, 5.06, 5.10, 5.04, 5.06, 7.77, 5.07, 5.08, 5.08, 5.12, 5.12, 5.08, 5.17, 5.18) 

Ora, come la maggior parte dei ricercatori dicono che il processo di rilevamento di valori erratici non solo dipende dai dati, ma anche dal contesto. Ho usato diversi pacchetti da R come valori anomali (test di grubbs), extremevalues, mvoutlier (metodo pcout), ma non sono riuscito a trovare il modo migliore per usarli. Qui in questo caso (a seconda delle mie esigenze), 7.77 (numero 31), 7.92 (numero 20) e 3.50 (numero 6) sono valori anomali. Usando il test dei grubbs del pacchetto di outlier posso rilevare 7.77 e 7.92 come valori anomali ma non 3.50. Non so se posso pubblicare la mia trama di dati qui o no ma dopo aver visto la tendenza dei dati sulla trama o sulla distribuzione, l'osservazione n. 6 sarebbe ovvia come un valore anomalo.

Sto cercando di adattare un modello non lineare a questi dati, ma a causa di questi valori anomali, non sono riuscito a trovare la soluzione migliore (l'adattamento migliore non è l'unico requisito) e comunque ho bisogno di rilevare questi valori anomali come farò essere un modello separato su questi valori anomali.

La mia domanda è molto semplice. È possibile che io possa sapere come rilevare questi 3 valori anomali con un pacchetto standard OPPURE come posso usare il mio modello non lineare generato per aiutare a rilevare questi valori anomali?

migliori saluti

Shahzad

enter image description here

+0

Avete considerato di utilizzare rlm nel pacchetto MASS per eseguire invece una regressione lineare robusta? – tcash21

+1

@ tcash21 Sì, l'ho usato ed è una regressione lineare. Ho anche nlrob (regressione non lineare robusta) ma non sono riuscito a trovare un modo per rilevare i suddetti valori anomali con il modello generato. – Shahzad

risposta

4
library(TSA) 
ar = TSA::arima(y, c(1,0,0)) 
detectAO(ar) 

mostra esattamente questi 3 punti (ind è indici di eventuali valori anomali):

> detectAO(ar) 
      [,1]  [,2]  [,3] 
ind  6.000000 20.000000 31.000000 
lambda2 4.739695 5.957604 5.490739 

ma attenzione a applicare questo approccio a qualsiasi tipo di dati .

+0

Grazie. L'ordine regolare di arima (come qui 1,0,0) dipende dai dati? – Shahzad

+0

Voglio dire, dovresti capire la natura dei tuoi dati. – redmode

+0

Ad esempio: la funzione 'auto.arima()' dalla libreria 'forecast' conduce alla ricerca del miglior modello ARIMA in classe di modelli.Ma usando questa stima non sarete in grado di rilevare valori anomali nella misura in cui questi punti saranno trattati come dati tipici che dovrebbero essere dotati di modello, ma non di valori anomali. – redmode

5

Solo per dire che ho provato a utilizzare detectAO() come suggerito sopra e non ha trovato nulla con i miei dati (che sembrava un po 'simile: picchi brevi provenienti da una tendenza continua). Dopo aver cercato su google, ho scoperto che il filtro Hempel (funzione) dal pacchetto poteva fare ciò di cui avevo bisogno. Ho pensato di aggiungere questo nel caso in cui qualcun altro stia cercando una soluzione.

0
install.packages("forecast")   
library(forecast) 
tsoutliers(data) 

Questi tre codici in R rispondono alla tua domanda. Dopo di che tsclean(data) pulirà i tuoi dati.

passaggi sono i seguenti:

install.packages("forecast") 
library(forecast) 
t_s<- ts(y) 
plot(t_s) 
tsoutliers(t_s) 
t_s_new<-tsclean(t_s) 
plot(t_s_new) 

Se esiste ancora problema, tornare a me. Fornirò un rivelatore anomalo più sofisticato.

+1

Dovresti elaborare e spiegare di più le tue risposte – avcajaraville