Boxplot equivalente para distribuciones de cola pesada?

13

Para datos distribuidos aproximadamente normalmente, los diagramas de caja son una excelente 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 las distribuciones de colas más pesadas, muchos puntos se muestran como valores atípicos, ya que los valores atípicos se definen como fuera del factor fijo del IQR, y esto sucede, por supuesto, con mucha más frecuencia con las distribuciones de colas pesadas.

Entonces, ¿qué utilizan las personas para visualizar este tipo de datos? ¿Hay algo más adaptado? Yo uso ggplot en R, si eso importa.

static_rtti
fuente
1
Las muestras de distribuciones de cola pesada tienden a tener un rango enorme en comparación con el 50% medio. ¿Qué quieres hacer al respecto?
Glen_b -Reinstate a Monica el
77
Varios hilos relevantes ya, por ejemplo, stats.stackexchange.com/questions/13086/… ¡ La respuesta corta incluye transformar primero y luego! histogramas tramas cuantiles de diversos tipos; tirar parcelas de varios tipos.
Nick Cox
@Glen_b: ese es precisamente mi problema, hace que los diagramas de caja sean ilegibles.
static_rtti
2
La cuestión es que hay más de una cosa que se puede hacer ... entonces, ¿qué quieres que haga?
Glen_b -Reinstate a Monica el
2
Tal vez valga la pena señalar que la mayoría del mundo estadístico conoce diagramas de caja por su nomenclatura y (re) introducción por John Tukey en la década de 1970. (Se usaron durante varias décadas antes en climatología y geografía). Pero en los capítulos posteriores de su libro de 1977 sobre Análisis de datos exploratorios (Reading, MA: Addison-Wesley) tiene ideas bastante diferentes sobre el manejo de distribuciones de cola pesada. Parece que ninguno ha captado en absoluto. Pero las gráficas cuantiles tienen un espíritu similar.
Nick Cox

Respuestas:

8

El problema central de la OP parece tener es que tienen datos de cola muy pesadas - y no creo que la mayoría de los presentes respuestas realidad se ocupan de esa cuestión en absoluto , por lo que estoy promoviendo mi comentario anterior a una respuesta.

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

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

diagrama de caja insatisfactorio

La mitad central 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, incluidas las parcelas QQ, los gráficos de bandas, las parcelas de colmena / abejas y las parcelas de violín.

Ahora algunas soluciones potenciales:

1) transformación ,

Si los registros o inversas producen una gráfica de caja legible, pueden ser una muy buena idea, y la escala original todavía se puede mostrar en el eje.

El gran problema es que a veces no hay transformación 'intuitiva'. Hay un problema menor que, si bien los cuantiles se traducen con transformaciones monotónicas lo suficientemente bien, las cercas no; si solo traza en caja los datos transformados (como hice aquí), los bigotes tendrán valores de x diferentes que en el gráfico original.

diagrama de caja de valores transformados

Aquí usé un inverso-hiperbólico-sin (asinh); es similar a un registro en las colas y similar a lineal cerca de cero, pero a la gente generalmente no le parece una transformación intuitiva, por lo que en general no recomendaría esta opción a menos que una transformación bastante intuitiva como el registro sea obvia. Código para eso:

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) saltos de escala: tome valores extremos extremos y comprímalos en ventanas estrechas en cada extremo con una escala mucho más comprimida que en el centro. Le recomiendo un descanso completo en toda la escala si hace esto.

diagrama de caja con saltos de escala

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) recorte de valores atípicos extremos (que normalmente no recomendaría sin indicar esto muy claramente, pero parece la siguiente trama, sin "<5" y "2>" en cada extremo), y

4) lo que llamaré "flechas" extremadamente atípicas - similar al recorte, pero con el recuento de valores recortados indicado en cada extremo

diagrama de caja con conteo y flechas que apuntan a los valores extremos

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)))
Glen_b -Reinstate a Monica
fuente
¡Gracias por tomarse el tiempo de escribir esto! Este es exactamente el tipo de respuesta que esperaba. Ahora solo necesito saber cómo implementar estas parcelas con R :)
static_rtti
1
Algún código está ahí ahora. No di código para 3) porque es una versión más simple de 4); deberías poder obtenerlo cortando líneas de eso.
Glen_b -Reinstate Monica
Por cierto, la mayoría de estas ideas también funcionan con las otras grandes exhibiciones sugeridas aquí: diagramas de tiras nerviosas y parcelas de abejas / colmenas y parcelas de violín y demás.
Glen_b -Reinstate Monica
Gracias de nuevo. Estoy seguro de que esta respuesta será útil para algunas personas.
static_rtti
Estoy de acuerdo, esto aborda la pregunta mucho mejor que mi respuesta. Buen material.
TooTone
4

Personalmente, me gusta usar un diagrama de tira con jitter al menos para tener una idea de los datos. El siguiente diagrama es con celosía en R (lo siento, no ggplot2). Me gustan estas tramas porque son muy fáciles de interpretar. Como dices, una razón para esto es que no hay ninguna 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)

ingrese la descripción de la imagen aquí

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

beeswarm(df2$values ~ df2$ind)

ingrese la descripción de la imagen aquí

Con sus datos, ya que se distribuyen aproximadamente de manera normal, otra cosa para intentar 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") }

ingrese la descripción de la imagen aquí

TooTone
fuente
2
También me gustan los diagramas de bandas, pero la pregunta es explícitamente sobre qué hacer con las distribuciones de cola pesada.
Nick Cox
1
El punto es solo que el consejo para usar, por ejemplo, qqnorm no coincide con la pregunta. Estoy de acuerdo en que otros tipos de tramas cuantil-cuantil podrían ser una muy buena idea, como mencioné anteriormente.
Nick Cox
1
Incluso mejor que los gráficos de tira de R son los gráficos del beeswarmpaquete.
enero
1
@ Enero Sí, eso es genial, lo estoy agregando a mi respuesta (si te opones, dilo).
TooTone
1
Mi respuesta fue publicada en stats.stackexchange.com/questions/13086 , que veo como una versión (inconsecuentemente más estrecha) de esta pregunta. Lo resumí como "no cambie el algoritmo de diagrama de caja: vuelva a expresar los datos". El problema insinuado por el "adaptado" en esta pregunta se aborda mediante técnicas estándar de Análisis de datos exploratorios para encontrar expresiones útiles de variables.
whuber
2

Puedes apegarte a las gráficas de caja. Existen diferentes posibilidades para definir los bigotes. Dependiendo del grosor de la cola, el número de muestras y la tolerancia a los valores atípicos, puede elegir dos cuantiles más o menos extremos. Dado su problema, evitaría los bigotes definidos a través del IQR.
A menos, por supuesto, que desee transformar sus datos, lo que en este caso dificulta la comprensión.

Cuarzo
fuente
1
La última oración no está calificada para pasarla sin comentarios. La transformación no es una panacea, pero no transformar datos muy sesgados no hace que sea más fácil de entender. Si todos los datos son positivos, al menos puede intentar usar la raíz, la escala logarítmica o recíproca. Si realmente no ayuda, entonces retrocede.
Nick Cox
¿A qué dificultades para comprender los datos asimétricos se refiere? ¿Aquellos con bigotes dependientes de IQR? Eso es un problema incluso con colas ligeras. ¿Y no estamos hablando de colas pesadas, independientemente de la asimetría? Las colas de aligeramiento de las transformaciones seguramente brindan gráficos de caja más regulares, pero agregan una capa de interpretación, intercambiando comprensión por comodidad. Pero uno puede llamar a eso una característica si le gusta.
Quartz
2
Las transformaciones a menudo ayudan: esa es mi conclusión. Una persona estadística que no ha aprendido que muchas cosas se ven más claras en la escala logarítmica (especialmente) se está perdiendo seriamente uno de los trucos más antiguos y efectivos que existen. Parecías estar negando eso; Espero haberte leído mal.
Nick Cox
1
Estoy en desacuerdo. Transformado datos muy sesgados todo el tiempo y mi experiencia es que esto es mucho más que una cuestión de estética. A menudo funciona Un estadístico anónimo escribió hace algún tiempo que lognormal es más normal que lo normal. Él / ella estaba siendo un poco gracioso, pero también hay una verdad importante allí. (No es que muchas otras distribuciones no sean mejores).
Nick Cox
1
Supongo que tengo que parar aquí para dejar que otros juzguen, pero mi opinión no es excéntrica. La transformación se discute como una posibilidad en, por ejemplo, stats.stackexchange.com/questions/13086/… Sugiero que responda o comente allí para explicar por qué ese consejo no es correcto.
Nick Cox
0

Supongo que esta pregunta se trata de comprender los datos (en lugar de “administrarlos”).
Si los datos son de cola pesada y / o multimodales, considero que estas "capas" de ggplot2 son muy útiles para este propósito: geom_violiny geom_jitter.

6to
fuente
3
¿Podría resumir por qué las gráficas de violín y / o los puntos nerviosos serían útiles con distribuciones de cola pesada?
chl