Come rimuovere i valori anomali da un set di dati

Ho alcuni dati multivariati di bellezza vs età. Le età variano da 20 a 40 a intervalli di 2 (20, 22, 24 …. 40) e per ogni record di dati viene assegnata un’età e una valutazione di bellezza da 1 a 5. Quando eseguo i grafici a scatola di questi dati (età attraverso l’asse X, valutazioni di bellezza sull’asse Y), ci sono alcuni valori anomali tracciati fuori dai baffi di ogni scatola.

Voglio rimuovere questi valori anomali dal frame dati stesso, ma non sono sicuro di come R calcoli i valori anomali per i relativi grafici. Di seguito è riportato un esempio di come potrebbero essere i miei dati. inserisci la descrizione dell'immagine qui

OK, dovresti applicare qualcosa di simile al tuo set di dati. Non sostituire e salvare o distruggi i tuoi dati! E, btw, dovresti (quasi) non rimuovere mai i valori anomali dai tuoi dati:

 remove_outliers < - function(x, na.rm = TRUE, ...) { qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...) H <- 1.5 * IQR(x, na.rm = na.rm) y <- x y[x < (qnt[1] - H)] <- NA y[x > (qnt[2] + H)] < - NA y } 

Per vederlo in azione:

 set.seed(1) x < - rnorm(100) x <- c(-10, x, 10) y <- remove_outliers(x) ## png() par(mfrow = c(1, 2)) boxplot(x) boxplot(y) ## dev.off() 

E ancora una volta, non dovresti mai farlo da solo, i valori anomali sono pensati solo per essere! =)

EDIT: ho aggiunto na.rm = TRUE come predefinito.

EDIT2: rimossa la funzione quantile , aggiunta la sottoscrizione, quindi ha reso la funzione più veloce! =)

inserisci la descrizione dell'immagine qui

Nessuno ha pubblicato la risposta più semplice:

 x[!x %in% boxplot.stats(x)$out] 

Vedi anche: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/

Usa outline = FALSE come opzione quando fai il boxplot (leggi la guida!).

 > m < - c(rnorm(10),5,10) > bp < - boxplot(m, outline = FALSE) 

inserisci la descrizione dell'immagine qui

La funzione boxplot restituisce i valori usati per eseguire il plottaggio (che in realtà viene eseguito da bxp ():

 bstats < - boxplot(count ~ spray, data = InsectSprays, col = "lightgray") #need to "waste" this plot bstats$out <- NULL bstats$group <- NULL bxp(bstats) # this will plot without any outlier points 

Di proposito non ho risposto alla domanda specifica perché ritengo che sia un errore statistico rimuovere i "valori anomali". Considero accettabile la pratica di non tracciarli in un boxplot, ma rimuoverli è una manipolazione sistematica e ingiustificata della registrazione osservativa.

 x< -quantile(retentiondata$sum_dec_incr,c(0.01,0.99)) data_clean <- data[data$attribute >=x[1] & data$attribute< =x[2],] 

Trovo molto facile rimuovere i valori anomali. Nell'esempio precedente sto solo estraendo dal 2% al 98 percentile dei valori degli attributi.

Ho cercato pacchetti relativi alla rimozione di valori anomali e ho trovato questo pacchetto (sorprendentemente chiamato “valori anomali”!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
se si passa attraverso di esso si vedono diversi modi di rimuovere i rm.outlier anomali e tra questi ho trovato rm.outlier più comodo da usare e come si dice nel link qui sopra: “Se il valore anomalo viene rilevato e confermato da test statistici, questa funzione può rimuovere o sostituire con media campionaria o mediana “e anche qui è la parte di utilizzo dalla stessa fonte:
Uso

 rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE) 

argomenti
x un set di dati, più frequentemente un vettore. Se l’argomento è un dataframe, allora il valore anomalo viene rimosso da ogni colonna in maniera approssimativa. Lo stesso comportamento è applicato da applicare quando viene fornita la matrice.
riempimento Se impostato su TRUE, la mediana o la media viene posizionata al posto di valori anomali. Altrimenti, i valori anomali sono / vengono semplicemente rimossi.
mediana Se impostata su TRUE, la mediana viene utilizzata al posto della media nella sostituzione outlier. opposto se impostato su VERO, fornisce un valore opposto (se il valore più grande ha la differenza massima dalla media, dà il più piccolo e viceversa) ”

Aggiungendo al suggerimento di @sefarkas e usando quantile come cut-off, si potrebbe esplorare la seguente opzione:

 newdata < - subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) ) 

Questo rimuoverà i punti oltre il 99 ° quantile. Bisogna fare attenzione come quello che aL3Xa stava dicendo riguardo alla conservazione dei valori anomali. Dovrebbe essere rimosso solo per ottenere una visione conservativa alternativa dei dati.

Non sarebbe:

 z < - df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) & df$x < quantile(df$x, .75) + 1.5*IQR(df$x), ] #rows 

svolgere questo compito abbastanza facilmente?