Pregunta

Tengo algunos datos multivariados de belleza frente a las edades. Las edades varían de 20-40 a intervalos de 2 (20, 22, 24 .... 40), y para cada registro de datos, se les da una calificación de edad y belleza de 1-5. Cuando hago diagramas de caja de estos datos (edades en el eje X, las clasificaciones de belleza en el eje Y), hay algunos valores atípicos trazados fuera de los bigotes de cada caja.

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 gráficos de caja. A continuación se muestra un ejemplo de cómo podrían ser mis datos.enter image description here

¿Fue útil?

Solución

Ok, debe aplicar algo como esto a su conjunto de datos. ¡No reemplace y guarde o destruirá sus datos! Y, por cierto, (casi) nunca debe eliminar los valores atípicos de sus 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, nunca debes hacer esto por tu cuenta, ¡los valores atípicos están destinados a serlo! =)

EDITAR: yo añadí na.rm = TRUE por defecto.

Edit2: Remoto quantile La función, la suscripción agregada, por lo tanto, hizo la función más rápida! =)

enter image description here

Otros consejos

Nadie ha publicado la respuesta más simple:

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

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

Usar outline = FALSE Como opción cuando realiza el cuadro (¡lee la ayuda!).

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

enter image description here

La función de placa de caja devuelve los valores utilizados para hacer la trazado (que en realidad se realiza 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 respondí la pregunta específica porque considero una negligencia estadística eliminar los "valores atípicos". Considero que es una práctica aceptable no trazarlos en un diagrama de caja, pero eliminarlos solo porque exceden un número de desviaciones estándar o un número de anchos inter-cuartiles es una destrozada sistemática y no científica del registro de observación.

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

Encuentro esto muy fácil de eliminar valores atípicos. En el ejemplo anterior, solo estoy extrayendo 2 percentil al percentil 98 de valores de atributos.

Busqué paquetes relacionados con la eliminación de valores atípicos, y encontré este paquete (¡sorprendentemente llamado "valores atípicos"!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
Si lo revisa, ves diferentes formas de eliminar valores atípicos y entre ellos encontré rm.outlier Lo más conveniente para usar y, como dice en el enlace anterior: "Si el valor atípico se detecta y confirma mediante pruebas estadísticas, esta función puede eliminarlo o reemplazar por media de muestra o mediana" y también aquí está la parte de uso de la misma fuente :
"Uso

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

Argumentos
X Un conjunto de datos, con mayor frecuencia un vector. Si el argumento es un marco de datos, entonces el valiente atípico se elimina de cada columna por Sapply. Se aplica el mismo comportamiento aplicado cuando se da la matriz.
llenar Si se establece en verdadero, la mediana o la media se coloca en lugar de atípico. De lo contrario, los valores atípicos son/simplemente se eliminan.
mediana Si se establece en True, la mediana se usa en lugar de la media en el reemplazo atípico. opuesto si se establece en verdadero, da un valor opuesto (si el valor más grande tiene la máxima diferencia de la media, le da a los más pequeños y viceversa) "

No lo haría:

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

lograr esta tarea con bastante facilidad?

Además de la sugerencia de @sefarkas y el uso de cuantiles como cortes, uno podría explorar 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, .99))[1]) ) 

Esto eliminará los puntos más allá del 99º cuantil. Se debe tener cuidado como lo que AL3XA estaba diciendo sobre mantener atípicos. Debe eliminarse solo para obtener una visión conservadora alternativa de los datos.

Prueba esto. Alimente su variable en la función y guarde la O/P en la variable que contendría valores atípicos eliminados

              outliers<-function(variable){
              iqr<-IQR(variable)
              q1<-as.numeric(quantile(variable,0.25))
              q3<-as.numeric(quantile(variable,0.75))
              mild_low<-q1-(1.5*iqr)
              mild_high<-q3+(1.5*iqr)
              new_variable<-variable[variable>mild_low & variable<mild_high]
              return(new_variable)
              }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top