¿Cómo puedes visualizar la relación entre 3 variables categóricas?


21

Tengo un conjunto de datos con tres variables categóricas y quiero visualizar la relación entre las tres en un gráfico. ¿Algunas ideas?

Actualmente estoy usando los siguientes tres gráficos: ingrese la descripción de la imagen aquí

Cada gráfico es para un nivel de depresión basal (leve, moderado, severo). Luego, dentro de cada gráfico, miro la relación entre el tratamiento (0,1) y la mejora de la depresión (ninguna, moderada, sustancial).

Estas 3 gráficas funcionan para ver la relación de 3 vías, pero ¿hay alguna forma conocida de hacer esto con una gráfica?


44
Publicar los datos permitiría que la gente juegue.
Nick Cox

1
Tiene 3 categorías de referencia, 2 categorías de tratamiento y 3 resultados de depresión. Dado lo último. las proporciones de cada tipo de depresión podrían mostrarse en 6 puntos en una gráfica triangular (trilineal, ternaria).
Nick Cox

44
¿Qué hay de malo en estos gráficos?
Aksakal

¿Puede proporcionar los datos, como lo solicita @NickCox? Supongo que solo son 18 números.
gung - Restablece a Monica

Respuestas:


12

Este es un conjunto de datos interesante para tratar de representar gráficamente, en parte porque no es realmente categórico. Ambos factores de 3 niveles son ordinales y existe una posible interacción entre ellos (presumiblemente, es más difícil de mild baselinetener substantial improvement, o tal vez substantial improvementsignifica algo diferente para cada uno baseline).

Con múltiples variables, generalmente no hay una sola vista que muestre todas las características que podrían interesarle. Algunos factores serán más fáciles de comparar que otros. Creo que su vista original es buena y sería mejor con las sugerencias de Nick Cox: eliminar leyendas duplicadas y usar una escala de color ordinal.

Si es más interesante al ver la diferencia entre los tratamientos, puede enfatizar el cambio utilizando un gráfico de área apilada en lugar de barras apiladas.

ingrese la descripción de la imagen aquí

Por lo general, desconfío del apilamiento en general porque es más difícil leer los valores medios, pero sí refuerza la naturaleza de suma fija de estos datos. Y hace que sea fácil leer la suma moderate+ substantialsi es relevante. He cambiado el orden de los improvementniveles para que mayor sea mejor para la frecuencia.

Sin apilamiento, el equivalente es un gráfico de pendiente.

ingrese la descripción de la imagen aquí

Es más fácil leer cada nivel, pero es más difícil entender la interacción. Debe tener en cuenta que la tercera línea depende directamente de las otras dos.

Dada la naturaleza ordinal de los datos, puede ser útil convertir el improvementvalor en una puntuación numérica, como a menudo se hace con los datos de Likert . Por ejemplo, none=0, moderate=1, substantial=2. Luego puedes graficar esa variable en una escala continua. La desventaja es que debe encontrar una puntuación razonable (por ejemplo, tal vez 0, 1 y 5 serían una representación más verdadera).

ingrese la descripción de la imagen aquí

Colofón : Estas parcelas se hicieron con la función Graph Builder en el paquete de software JMP (que ayudo a desarrollar). Aunque se hizo de forma interactiva, un guión, por ejemplo, para el diagrama del área, sin las personalizaciones de colores, es:

Graph Builder(
    Graph Spacing( 15 ),
    Variables( X( :treatment ), Y( :frequency ),
        Group X( :baseline ), Overlay( :improvement )
    ),
    Elements( Area( X, Y ) )
);

2
+1. Algunas ideas excelentes aquí. Aunque estoy preocupado por el apilamiento, creo que el primer gráfico funciona mejor. Destaca la interacción interesante: ¡el tratamiento 1 siempre produce más casos de mejora sustancial y más de ninguno!
Nick Cox

Buena publicación. ¿Hay alguna forma de construir el primer gráfico que muestra en R? No he usado JMP en mucho tiempo.
Alejandro Ochoa

1
@AlejandroOchoa ggplot tiene un área geom. Consulte Crear un diagrama de área apilada con ggplot2 .
xan

10

Primero, aquí está mi lectura del gráfico provisto de los datos para aquellos que desean jugar (experimente, si lo desea). NB errores off-by-one son ciertamente posibles, como son los errores graves.

    improvement  treatment   baseline   frequency  
           none          0       mild          5  
       moderate          0       mild         41  
    substantial          0       mild          4  
           none          1       mild         19  
       moderate          1       mild         19  
    substantial          1       mild         12  
           none          0   moderate         19  
       moderate          0   moderate         24  
    substantial          0   moderate          7  
           none          1   moderate         20  
       moderate          1   moderate         14  
    substantial          1   moderate         16  
           none          0     severe          7  
       moderate          0     severe         21  
    substantial          0     severe         22  
           none          1     severe         12  
       moderate          1     severe         15  
    substantial          1     severe         23  

Aquí hay una reelaboración del diseño original. Un detalle de los datos originales simplifica las cosas: el número de personas en cada una de las combinaciones de predictores es el mismo, por lo que las frecuencias de trazado y los porcentajes de trazado son los mismos. Aquí, en lugar de un gráfico de barras apiladas (subdivididas, segmentadas), separamos las barras en un diseño de diagrama de tabla o gráfico de barras bidireccional.

Gran parte del detalle en los gráficos es solo eso, detalle. Varias pequeñas debilidades en un gráfico pueden socavar su efectividad y varias pequeñas mejoras también pueden ayudar.

ingrese la descripción de la imagen aquí

Para deletrearlo:

  1. Aquí no se necesitan tres paneles, con su repetición de ejes, leyenda y texto.

  2. Una leyenda es siempre una maldición y una bendición, obligando al lector a ir "hacia adelante y hacia atrás" mentalmente (o memorizar la leyenda, no algo que atraiga, por fácil que sea). El texto informativo junto a las barras es más fácil de seguir.

  3. La codificación de color de la ensalada de frutas es prescindible. También parece arbitrario: la mejora "sustancial" es un gran problema, pero incluso el amarillo fuerte es un color tenue. Pero no necesitamos color cuando tenemos texto para explicar.

  4. Aunque algunos gritarán de horror al violar la distinción entre Figura y Tabla, también podemos mostrar las frecuencias. Es útil poder pensar "4 personas en esta categoría".

  5. Aquí se rinde homenaje al trazado tradicional de la respuesta en el eje vertical, al igual que en el original.

Dicho todo esto, es difícil ver mucha estructura en estos datos. Cuando es así, también es difícil compartir la culpa entre (a) datos sin mucha estructura y (b) las debilidades de un diseño gráfico para seleccionar no solo los efectos predictores sino también las posibles interacciones. El tratamiento parece menos importante que la condición basal. Pero entonces, si la línea de base fue "leve", ¿cuánto margen había para una mejora "sustancial"? Me detendré allí para dejar de hacer el ridículo cuando el estudio de los datos de salud mental ciertamente no sea una especialidad, especialmente si los datos resultan ser falsos. Pero si son reales, podríamos hacerlo con un tamaño de muestra mucho mayor. (Normalmente decimos eso, pero ahí lo tienes).

EDITAR El gráfico puede complicarse naturalmente por un esquema de color ordinal si así se desea:

ingrese la descripción de la imagen aquí

Para el registro: los gráficos usaron el código Stata, incluido mi propio programa tabplotdescargable usando ssc inst tabplot.

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*4)) bfcolor(emerald*0.2)

tabplot improvement group [w=frequency] , showval ///
xmla(1.5 "mild" 3.5 "moderate" 5.5 "severe", noticks labgap(*4) labsize(medsmall)) ///
xla(1 "0" 2 "1" 3 "0" 4 "1" 5 "0" 6 "1") ///
xtitle(baseline and treatment) xsc(titlegap(*2)) ///
sep(improvement2) bar3(bfcolor(emerald*0.2)) bar2(bfcolor(emerald*0.6)) ///
bar1(bfcolor(emerald)) barall(blcolor(green)) 

¿Hay alguna forma de cargar su gráfico con un esquema de color que refleje la naturaleza ordinal de los datos? ¿También qué software usaste para crear el visual?
Alejandro Ochoa

Estas son tramas muy bonitas
shadowtalker

4

Me gusta usar un eje x de 2 niveles para datos como este. Por lo tanto, las categorías del eje x para un solo gráfico pueden ser:

  • Tratamiento = 0, línea de base = leve
  • Tratamiento = 0, basal = moderado
  • Tratamiento = 0, basal = severo
  • Tratamiento = 1, línea de base = leve
  • Tratamiento = 1, basal = moderado
  • Tratamiento = 1, basal = severo

... con los mismos recuentos por categorías [ninguno / moderado / sustancial] barras de histograma.


+1. Estoy de acuerdo con la idea principal aquí, como se implementa en mi respuesta. No puedo decir qué tan cerca está mi diseño de gráfico de barras de lo que estabas imaginando.
Nick Cox

Gracias, su gráfico se ve muy bien. ¿Intentó verlo con Tratamiento 0/1 como categoría externa y Línea de base = Leve / Moderado / Severo como la categoría más cercana al eje x? Creo que si lo presenta de esa manera, vería un patrón más claro de: para dentro del tratamiento = 0, las barras de mejora "sustanciales" aumentan constantemente a medida que la línea de base aumenta de Leve / Moderado / Severo. Y que vería el mismo patrón (en menor medida) dentro del tratamiento = 1. En general, pongo la variable con menos categorías (por ejemplo, tratamiento aquí) en el exterior. Pero tal vez ya lo miraste de esa manera.
Max Power

No intenté lo contrario, pero tenía en mente que el investigador podría querer comparar los efectos de los tratamientos dados en la línea de base, lo que debería ser más fácil de la forma en que lo hice.
Nick Cox

Eso tiene sentido para mí.
Max Power

4

¿No es la trama de mosaico especialmente diseñada para este propósito?

En R sería como

library(vcd)
d = read.table("data.dat", header=TRUE)
tab = xtabs(frequency ~ treatment+baseline+improvement, data=d)
mosaic(data=tab,~ treatment+baseline+improvement, shade=TRUE, cex=2.5)

Cada variable categórica va a un borde del cuadrado, que está subdividido por sus etiquetas. (Por lo tanto, si subdivide cada borde en un solo nivel, como máximo se pueden representar 4 variables categóricas. En mi humilde opinión, más allá de 3 se vuelve desordenado y más difícil de interpretar). El tamaño de los rectángulos es proporcional a la frecuencia. Esta es la idea principal detrás de la trama de mosaico y es la misma en esta respuesta y la respuesta de Paweł Kleka.

Las diferencias están en los diseños de esos rectángulos y "detalles" proporcionados por un paquete R específico utilizado para este tipo de diagrama. Como puede ver en la respuesta de Paweł Kleka, el graphicspaquete subdivide el borde superior en 2 niveles en lugar de usar el borde derecho. Utilicé el vcdpaquete con opciones predeterminadas, de modo que el color indica el grado de asociación entre las variables. Gris significa que los datos son consistentes con (no se puede rechazar la hipótesis de) la independencia variable. Azul significa que existe una asociación positiva entre la línea de base "severa" y la mejora "sustancial" para el tratamiento "0" y "1". (¡Sorpresa, sorpresa! Lo traduzco de la siguiente manera: si tiene una depresión severa, es probable que mejore sustancialmente si tiene un tratamiento o no.

Uno puede ajustar la trama de acuerdo a las necesidades de uno, ver, por ejemplo, aquí . El paquete también tiene varias viñetas, google "ejemplo de mosaico vcd" (como acabo de hacer). El artículo de Wikipedia citado al principio también explica cómo construir este tipo de argumento e intuición detrás de él.

ingrese la descripción de la imagen aquí

Cuando compara mi imagen con la imagen en la respuesta de Paweł Kleka, no importa, ese 'tratamiento' está en el borde izquierdo de cada imagen. Puede cambiar fácilmente la ubicación del borde cambiando la última línea de mi código y ajustando el diseño según sus necesidades. La práctica común es que a la izquierda va la variable más importante o la variable con el menor número de etiquetas. También puede cambiar el orden de las etiquetas (por ejemplo, para que en el borde derecho el orden sea "ninguno moderado sustancial") haciendo que el factor correspondiente sea variable en R ordenado y ajustando sus niveles.


En el momento de escribir dos respuestas en las parcelas de mosaico. Sería útil si cada uno de ustedes ampliara lo que muestra su trama y por qué es útil, sobre todo porque las tramas son bastante diferentes.
Nick Cox

@NickCox este ciertamente se ve diferente de los demás. Difícilmente son la misma pantalla
shadowtalker

Ambos tienen tratamiento en el eje y. Lo que sería oro de sus defensores es el comentario sobre las ventajas y limitaciones de cada pantalla.
Nick Cox

Gracias por ampliar tu respuesta. Creo que el interés aquí es probable en la comparación de respuestas dado el tratamiento y la línea de base. Naturalmente, estoy de acuerdo en que puede analizar qué variable va a dónde, pero ¿probó las otras posibilidades y cuál funciona mejor? Al observar la respuesta aquí, el lector tiene que comparar dos filas de bloques simultáneamente.
Nick Cox

@Nick Cox Gracias por tus comentarios. Fue lo único que me motivó a expandirme. yo si no probar otras posibilidades. En realidad, creo que, si el autor de la pregunta se encuentra este tipo de parcela útil, se debe probar de todo, a continuación, publicar y explicar los resultados para la comunidad. Por cierto, no estoy diciendo que este tipo de trama sea mejor que otras. El punto es: fue especialmente diseñado para variables categóricas y para visualizar la independencia y / o violación de la independencia.
lanenok

3

Sugerí usar mosaico

mosaicplot(table(moz), sort = c(3,1,2), color = T)

mosaicplot ()


En el momento de escribir dos respuestas en las parcelas de mosaico. Sería útil si cada uno de ustedes ampliara lo que muestra su trama y por qué es útil, sobre todo porque las tramas son bastante diferentes.
Nick Cox

2

Una opción que consideraría es usar conjuntos paralelos. Algunas de las comparaciones serán más fáciles que otras, pero aún puede ver las relaciones entre tres variables categóricas.

Aquí hay un ejemplo con los datos de supervivencia del Titanic:

Aquí hay un ejemplo con los datos de supervivencia del Titanic.

En R (dadas tus etiquetas) he usado ggparallel para implementarlo. Algunas personas han discutido aquí en CV cómo implementarlo de otras maneras.


Tengo problemas para imaginar esto. ¿Hay alguna posibilidad de que puedas simular un ejemplo?
shadowtalker

Una línea en el gráfico tiene su ancho proporcional a la frecuencia de coocurrencias de dos categorías. Para los datos utilizados en los gráficos de la pregunta original, habría tres ejes horizontales: depresión basal, tratamiento y mejora de la depresión. En cada uno hay áreas separadas para cada nivel de esa categoría. Las coocurrencias están vinculadas, con un ancho que representa su frecuencia.
Nazareno

2

La información también se puede transmitir utilizando el siguiente gráfico de líneas simple:

ingrese la descripción de la imagen aquí

La mejora se muestra mediante diferentes tipos de línea, mientras que el grupo de línea de base se muestra en colores. Estos y el parámetro del eje x (tratamiento aquí) también se pueden intercambiar si se desea.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.