14 votos

Boxplot equivalente para el pesado de cola de las distribuciones?

Durante aproximadamente una distribución normal de los datos, boxplots son una gran manera de visualizar rápidamente la mediana y la difusión de los datos, así como la presencia de valores atípicos.

Sin embargo, para el más pesado de cola de las distribuciones, una gran cantidad de puntos se muestran como valores atípicos, ya que los valores extremos se definen como fuera de factor fijo de la IQR, y esto sucede por supuesto, mucho más frecuentemente con las colas de las distribuciones.

Entonces, ¿qué hace que la gente usa para visualizar este tipo de datos? ¿Hay algo más adaptado? Yo uso ggplot en R, si lo que importa.

9voto

AdamSane Puntos 1825

El problema central que el OP parece tener, es que tienen muy pesado de cola de datos - y no creo que la mayoría de los presentes respuestas realmente lidiar con ese problema en absoluto, por lo que estoy promoviendo mi comentario anterior a una respuesta.

Si usted desea permanecer con boxplots, algunas opciones se enumeran a continuación. He creado algunos datos en R que muestra el problema básico:

 set.seed(seed=7513870)
 x <- rcauchy(80)
 boxplot(x,horizontal=TRUE,boxwex=.7)

unsatisfactory boxplot

La mitad de los datos se reduce a una pequeña tira de un par de mm de ancho. El mismo problema afecta a la mayoría de las otras sugerencias - incluyendo gráficos QQ, tira de gráficos, colmena/beeswarm parcelas, violín y parcelas.

Ahora algunas posibles soluciones:

1) la transformación,

Si los registros, o inversas, de producir una lectura boxplot, que puede ser una muy buena idea, y la escala original todavía puede ser mostrado en el eje.

El gran problema es que hay a veces no "intuitivo" de la transformación. Hay un pequeño problema que mientras cuantiles sí mismos traducir con monótona de las transformaciones bastante bien, las vallas no; si sólo boxplot de los datos transformados (como lo hice aquí), el bigotes será a diferentes valores de x que en la trama original.

boxplot of transformed values

Aquí he utilizado un inversa hiperbólico-pecado (asinh); es una especie de registro-como en las colas y similar a la lineal cerca de cero, pero la gente en general no es una intuitiva de transformación, por lo que en general no recomiendo esta opción a menos que sea una forma bastante intuitiva transformación como registro es obvio. Código:

xlab <- c(-60,-20,-10,-5,-2,-1,0,1,2,5,10,20,40)
boxplot(asinh(x),horizontal=TRUE,boxwex=.7,axes=FALSE,frame.plot=TRUE)
axis(1,at=asinh(xlab),labels=xlab)

2) escala de rompe - extremar los valores atípicos y comprimirlos en estrechas ventanas en cada extremo con un mucho más comprimido escala que en el centro. Yo recomiendo una ruptura completa a través de toda la escala si usted hace esto.

boxplot with scale breaks

opar <- par()
layout(matrix(1:3,nr=1,nc=3),heights=c(1,1,1),widths=c(1,6,1))
par(oma = c(5,4,0,0) + 0.1,mar = c(0,0,1,1) + 0.1)
stripchart(x[x< -4],pch=1,cex=1,xlim=c(-80,-5))
boxplot(x[abs(x)<4],horizontal=TRUE,ylim=c(-4,4),at=0,boxwex=.7,cex=1)
stripchart(x[x> 4],pch=1,cex=1,xlim=c(5,80))
par(opar)

3) el recorte de los extremos de los valores atípicos (que yo normalmente no aconsejar sin que indica muy claramente, pero parece que el gráfico siguiente, sin el "<5" y "2>" en cualquiera de los extremos), y

4) ¿qué voy a llamar a la extrema atípico "flechas" - similar a la de corte, pero con la cantidad de valores tapizados indicado en cada extremo

boxplot with count of, and arrows pointing to, the extreme values

xout <- boxplot(x,range=3,horizontal=TRUE)$out
xin <- x[!(x %in% xout)]
noutl <- sum(xout<median(x))
nouth <- sum(xout>median(x))
boxplot(xin,horizontal=TRUE,ylim=c(min(xin)*1.15,max(xin)*1.15))
text(x=max(xin)*1.17,y=1,labels=paste0(as.character(nouth)," >"))
text(x=min(xin)*1.17,y=1,labels=paste0("< ",as.character(noutl)))

4voto

tylerharms Puntos 79

Personalmente me gusta usar un stripplot con jitter al menos para tener una idea de los datos. El gráfico siguiente es con celosía en R (lo siento, no ggplot2). Me gustan estas parcelas debido a que son muy fáciles de interpretar. Como usted dice, una razón para esto es que no hay ningún tipo de transformación.

df <- data.frame(y1 = c(rnorm(100),-4:4), y2 = c(rnorm(100),-5:3), y3 = c(rnorm(100),-3:5))
df2 <- stack(df)
library(lattice)
stripplot(df2$values ~ df2$ind, jitter=T)

enter image description here

El beeswarm paquete ofrece una gran alternativa para stripplot (gracias a @de enero por la sugerencia).

beeswarm(df2$values ~ df2$ind)

enter image description here

Con sus datos, ya que es aproximadamente una distribución normal, otra cosa a tratar podría ser un qqplot, qqnorm en este caso.

par(mfrow=c(1,3))
for(i in 1:3) { qqnorm(df[,i]); abline(c(0,0),1,col="red") }

enter image description here

2voto

coledot Puntos 674

Usted puede pegarse a boxplots. Hay diferentes posibilidades para la definición de los bigotes. Dependiendo de la cola de espesor, número de muestras y la tolerancia a los valores atípicos puede elegir dos más o menos extremas de cuantiles. Dado el problema que yo no bigotes define a través de la RIC.
A menos que, por supuesto, usted desea transformar sus datos, que en este caso hace que la comprensión más difícil.

0voto

Sum guy Puntos 21

Supongo que esta pregunta es acerca de la comprensión de los datos (como opuesto a lo contrario de "gestión")
Si los datos son pesadas colas y/o multimodal, me parece que estas "capas" de ggplot2 muy útil para el propósito: geom_violin y geom_jitter.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X