2011-01-24 34 views
67

Tengo algunos datos multivariantes de belleza frente a edades. Las edades van desde 20-40 a intervalos de 2 (20, 22, 24 ... 40), y para cada registro de datos, se les asigna una edad y una calificación de belleza de 1-5. Cuando hago diagramas de caja de estos datos (edades en todo el eje X, clasificaciones de belleza en el eje Y), hay algunos valores atípicos trazados fuera de los bigotes de cada casilla.Cómo eliminar valores atípicos de un conjunto de datos

Quiero eliminar estos valores atípicos del marco de datos en sí, pero no estoy seguro de cómo R calcula los valores atípicos para sus diagramas de caja. A continuación se muestra un ejemplo de cómo se verían mis datos. enter image description here

+1

El' boxplot' función devuelve los valores atípicos (entre otras estadísticas) de manera invisible. Trate 'foo <- diagrama de caja (...); foo' y leer' boxplot' para entender la salida –

+0

debe editar su pregunta de acuerdo a comentar que diste en la respuesta de @ Prasad – aL3xa

+0

@ aL3xa: está en la primera frase de?.! . el segundo párrafo –

Respuesta

82

Bien, debe aplicar algo como esto a su conjunto de datos. No reemplace & guardar o destruirá sus datos! Y, por cierto, usted debe (casi) nunca retire los valores extremos de los datos:

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 
} 

Para verlo en acción:

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() 

Y una vez más, que nunca debe hacer esto por su cuenta, los valores extremos están destinados a ser! =)

EDIT: He añadido na.rm = TRUE por defecto.

EDIT2: Función de quantile, se ha añadido la subscripción, por lo tanto, hizo la función más rápida! =)

enter image description here

+0

¡Gracias por la ayuda! Yo pensaría que si R es capaz de generar los valores atípicos en el diagrama de caja, no debería tener que hacer estos cálculos intermedios. En cuanto a eliminar valores atípicos, esto es solo para una tarea. –

+1

OK, me falta algo aquí. Desea eliminar los valores atípicos de los datos, para que pueda trazarlos con 'boxplot'. Eso es manejable, y debe marcar la respuesta de @ Prasad luego, ya que respondió su pregunta. Si desea excluir valores atípicos mediante el uso de la "regla de valores atípicos" 'q +/- (1.5 * H)', realice un análisis y luego use esta función.Por cierto, hice esto desde cero, sin Google, así que hay una posibilidad de que haya rediseñado el volante con esta función mía ... – aL3xa

+9

¡No deberías estar haciendo preguntas de asignación en stackoverflow! – hadley

24

Utilice outline = FALSE como opción cuando haga el diagrama de caja (¡lea la ayuda!).

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

enter image description here

+2

de hecho, esto eliminará los valores extremos de la misma diagrama de caja, pero yo quiero para eliminar los valores atípicos? desde el marco de datos. –

+2

I se e, entonces, como @Joshua dijo que necesita ver los datos devueltos por la función de diagrama de caja (en particular los elementos 'out' y' group' en la lista). –

14

La función diagrama de caja devuelve los valores que se utilizan para hacer el trazado (que en realidad es a continuación hecho por 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 

A propósito no respondió a la pregunta específica porque Considero que es una mala práctica estadística eliminar "valores atípicos". Considero que es una práctica aceptable no trazarlos en un diagrama de caja, pero eliminarlos es una alteración sistemática e injustificada del registro observacional

+3

Bueno, eludir la pregunta sin saber por qué se formuló la pregunta tampoco es una buena práctica. Sí, no es bueno eliminar los 'valores atípicos' de los datos, pero a veces se necesitan los datos sin valores atípicos para tareas específicas. En una asignación de estadísticas que tuve recientemente, tuvimos que visualizar un conjunto sin sus valores atípicos para determinar el mejor modelo de regresión para usar para los datos. ¡Por lo tanto, allí! –

+4

No estoy considerando el consejo que puede haber recibido en este sentido para "determinar el mejor modelo de regresión" para ser particularmente persuasivo. En cambio, si necesita eliminar valores atípicos para ese propósito vagamente indicado, entonces creo que se refleja pobremente en las personas que lo aconsejaron en lugar de ser evidencia de invalidez de mi posición. –

96

Nadie ha publicado la respuesta más simple:

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

también ver esto: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/

+4

Muy elegante. Gracias. Pero debe tener cuidado si la distribución tiene más de un modo y los valores atípicos son pocos y dispersos. –

+0

Hubiera sido genial si pudieras obtener un índice de ellos en un conjunto de datos. La forma en que termine se filtrará según el valor de los datos. Si el diagrama de caja también está haciendo la agrupación, no necesariamente el mismo valor de datos será atípico en cada grupo – adam

+0

También es importante mencionar que no cambia el conjunto de datos. Esto es solo un método de filtrado. Entonces, si tiene la intención de usar el conjunto de datos sin valores atípicos, asígnelo a una variable. p. 'result = x [! x% en% boxplot.stats (x) $ out]' –

1

Adición a la sugerencia @sefarkas' y utilizando cuantil como cortes, uno podría explore la siguiente opción:

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

Esto eliminará los puntos de puntos más allá del 99. ° cuantil. Se debe tener cuidado como lo que aL3Xa estaba diciendo acerca de mantener valores atípicos. Debe eliminarse solo para obtener una vista alternativa conservadora de los datos.

+0

¿es '0.91' o' 0.99'? como en 'mydata $ var

+0

Si tiene un motivo específico para usar el percentil 91 en vez del percentil 99, puede usarlo. Es solo una heurística –

0

no quiso,

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

realizar esta tarea con bastante facilidad?

+0

Es lo mismo que la respuesta de unL3xa, excepto que usted escribió todo el código en una línea. Lo que prefiera es una cuestión de preferencia – 5th

+0

@ 5th incorrecto. 1/3 de las líneas y mucho más conciso. – d8aninja

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

Me parece muy fácil de eliminar valores atípicos. En el ejemplo anterior, estoy extrayendo 2 percentiles a 98 percentiles de valores de atributos.

3

Miré hacia arriba para paquetes relacionados con la eliminación de valores atípicos, y encontré este paquete (sorprendentemente llamados "atípicos"!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
si vas a través de él que ver diferentes maneras de eliminar los valores atípicos y entre ellos encontré rm.outlier más uno cómodo de usar y como se dice en el siguiente enlace: "Si es detectado y confirmado por pruebas estadísticas el valor atípico, esta función puede eliminar o sustituir por muestra de media o mediana" y también aquí es la parte de uso de la misma fuente:
"uso

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

Argumentos
x un conjunto de datos, lo más frecuentemente un vector. Si el argumento es un marco de datos, el valor atípico es eliminado de cada columna por sapply. El mismo comportamiento se aplica aplica cuando se da la matriz.
llenar Si es verdadero, la mediana o la media se sitúa en lugar de valores atípicos. De lo contrario, el (los) valor (es) atípico (s) simplemente se eliminan.
mediana Si es verdadero, la mediana se utiliza en lugar de la media en el reemplazo de valores atípicos. opuesta Si es verdadero, da valor opuesto (si tiene el valor más grande diferencia máxima de la media, que da más pequeño y viceversa) "

Cuestiones relacionadas