Como você pode visualizar a relação entre três variáveis ​​categóricas?

21

Eu tenho um conjunto de dados com três variáveis ​​categóricas e quero visualizar o relacionamento entre os três em um gráfico. Alguma ideia?

Atualmente, estou usando os três gráficos a seguir: insira a descrição da imagem aqui

Cada gráfico refere-se a um nível de depressão da linha de base (leve, moderado, grave). Então, em cada gráfico, analiso a relação entre tratamento (0,1) e melhora da Depressão (nenhuma, moderada, substancial).

Esses três gráficos funcionam para ver a relação de três vias, mas existe uma maneira conhecida de fazer isso com um gráfico?

Alejandro Ochoa
fonte
4
A publicação dos dados deixaria as pessoas jogarem.
Nick Cox
1
Você tem 3 categorias de linha de base, 2 categorias de tratamento e 3 resultados de depressão. Dado o último. as proporções de cada tipo de depressão podem ser exibidas em 6 pontos em um gráfico triangular (trilinear, ternário).
Nick Cox
4
O que há de errado com esses gráficos?
Aksakal
Você pode fornecer os dados, conforme a @NickCox solicita? Acho que são apenas 18 números.
gung - Restabelece Monica

Respostas:

12

Este é um conjunto de dados interessante para tentar representar graficamente, em parte porque não é realmente categórico. Ambos os fatores de três níveis são ordinais e existe uma possível interação entre eles (presumivelmente, é mais difícil de mild baselineter substantial improvement- ou talvez substantial improvementsignifique algo diferente para cada um baseline).

Com várias variáveis, geralmente não há uma única exibição que mostre todos os recursos com os quais você pode se interessar. Alguns fatores serão mais fáceis de comparar do que outros. Eu acho que sua visão original é boa e seria melhor com as sugestões de Nick Cox: remover legendas duplicadas e usar uma escala de cores ordinais.

Se você for mais interessante em ver a diferença entre os tratamentos, enfatize a alteração usando um gráfico de área empilhada em vez de barras empilhadas.

insira a descrição da imagem aqui

Geralmente, receio o empilhamento em geral, porque é mais difícil ler os valores médios, mas reforça a natureza da soma fixa desses dados. E facilita a leitura da soma moderate+ substantialse isso for relevante. Eu mudei a ordem dos improvementníveis para que mais alto seja melhor para a frequência.

Sem empilhamento, o equivalente é um gráfico de inclinação.

insira a descrição da imagem aqui

É mais fácil ler cada nível, mas é mais difícil entender a interação. Você deve ter em mente que a terceira linha depende diretamente das outras duas.

Dada a natureza ordinal dos dados, pode ser útil converter o improvementvalor em uma pontuação numérica, como costuma ser feito com os dados do Likert . Por exemplo, none=0, moderate=1, substantial=2. Em seguida, você pode representar graficamente essa variável em uma escala contínua. A desvantagem é que você precisa encontrar uma pontuação razoável (por exemplo, talvez 0, 1 e 5 seria uma representação mais verdadeira).

insira a descrição da imagem aqui

Colophon : esses gráficos foram feitos com o recurso Graph Builder no pacote de software JMP (que eu ajudo a desenvolver). Embora feito de maneira interativa, um script, por exemplo, para o gráfico de área, sem as personalizações de cores, é:

Graph Builder(
    Graph Spacing( 15 ),
    Variables( X( :treatment ), Y( :frequency ),
        Group X( :baseline ), Overlay( :improvement )
    ),
    Elements( Area( X, Y ) )
);
xan
fonte
2
+1. Algumas idéias excelentes aqui. Muito embora eu esteja enjoado com o empilhamento, acho que o primeiro gráfico funciona melhor. Isso traz à tona a interação interessante: o tratamento 1 sempre produz mais instâncias de melhoria substancial e mais de nenhuma!
Nick Cox
Ótimo post. Existe alguma maneira de construir o primeiro gráfico exibido em R? Eu não uso o JMP há algum tempo.
Alejandro Ochoa
1
@AlejandroOchoa ggplot tem um geom de área. Consulte Fazendo um gráfico de área empilhada usando ggplot2 .
xan
10

Primeiro, aqui está minha leitura do gráfico fornecido dos dados para quem deseja jogar (experimente, se quiser). NB erros off-by-one são certamente possíveis, assim como erros grosseiros.

    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  

Aqui está uma reformulação do design original. Um detalhe dos dados originais simplifica: o número de pessoas em cada uma das combinações de preditores é o mesmo; portanto, as frequências de plotagem e as porcentagens de plotagem são iguais. Aqui, em vez de um gráfico de barras empilhado (subdividido, segmentado), separamos as barras em um gráfico de barras bidirecional ou no design de plotagem de tabela.

Grande parte dos detalhes gráficos é exatamente isso, detalhe. Várias pequenas fraquezas em um gráfico podem prejudicar sua eficácia e várias pequenas melhorias também podem ajudar.

insira a descrição da imagem aqui

Para soletrar:

  1. Aqui não são necessários três painéis, com repetição de eixos, legenda e texto.

  2. Uma lenda é sempre uma maldição e uma bênção, obrigando o leitor a ir e vir mentalmente (ou memorizar a lenda, não algo que apele, por mais fácil que seja). O texto informativo junto às barras é mais fácil de seguir.

  3. O código de cores da salada de frutas é dispensável. Parece arbitrário também: a melhoria "substancial" é um grande negócio, mas acho que até o amarelo forte tem uma cor suave. Mas não precisamos de cores quando temos texto para explicar.

  4. Embora alguns gritem horrorizados por violar a distinção entre Figura e Tabela, também podemos mostrar as frequências. É útil poder pensar em "4 pessoas nesta categoria".

  5. Há aqui uma homenagem à plotagem tradicional de resposta no eixo vertical, assim como no original.

Tudo isso dito, é difícil ver muita estrutura nesses dados. Nesse caso, também é difícil compartilhar a culpa entre (a) dados sem muita estrutura e (b) os pontos fracos de um design gráfico por escolher não apenas efeitos preditores, mas também possíveis interações. O tratamento parece menos importante que a condição basal. Mas então, se a linha de base foi "moderada", quanto espaço havia para uma melhoria "substancial"? Vou parar por aí para parar de me fazer de bobo quando o estudo dos dados de saúde mental certamente não é uma especialidade, especialmente se os dados forem falsos. Mas se forem reais, poderíamos fazer um tamanho de amostra muito maior. (Normalmente dizemos isso, mas lá está você.)

EDIT O gráfico pode naturalmente ser complicado por um esquema de cores ordinais, se desejado:

insira a descrição da imagem aqui

Para o registro: os gráficos usavam o código Stata, incluindo meu próprio programa para tabplotdownload 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)) 
Nick Cox
fonte
Existe alguma maneira de fazer o upload do seu gráfico com um esquema de cores que reflete a natureza ordinal dos dados? Além disso, qual software você usou para criar o visual?
Alejandro Ochoa
Estas são tramas muito bonitas
shadowtalker
4

Gosto de usar um eixo x de dois níveis para dados como este. Portanto, suas categorias de eixo x para um único gráfico podem ser:

  • Tratamento = 0, Linha de base = Leve
  • Tratamento = 0, Linha de base = Moderada
  • Tratamento = 0, Linha de base = Grave
  • Tratamento = 1, Linha de base = Leve
  • Tratamento = 1, Linha de base = Moderada
  • Tratamento = 1, Linha de base = Grave

... com as mesmas contagens por categorias [nenhum / moderado / substancial] barras de histograma.

Poder maximo
fonte
+1. Eu concordo com a idéia principal aqui, conforme implementada na minha resposta. Não sei dizer se o design do gráfico de barras está próximo do que você estava imaginando.
Nick Cox
Obrigado, seu gráfico está ótimo. Você tentou analisar com Tratamento 0/1 como a categoria externa e Linha de base = Leve / Moderada / Grave como a categoria mais próxima do eixo x? Acho que se você a apresentasse dessa maneira, veria um padrão mais claro de - para o tratamento = 0, as barras de melhoria "substanciais" aumentam constantemente à medida que a linha de base sobe de Leve / Moderada / Grave. E que você veria o mesmo padrão (em menor grau) no tratamento = 1. Em geral, coloquei a variável com menos categorias (por exemplo, tratamento aqui) do lado de fora. Mas talvez você já tenha visto dessa maneira.
Max Power
Não tentei de outra maneira, mas tinha em mente que o pesquisador talvez quisesse comparar os efeitos dos tratamentos dados na linha de base, o que deveria ser mais fácil do que fiz.
Nick Cox
Isso faz sentido para mim.
Max Power
4

A plotagem Mosaic não é especialmente projetada para esse fim?

Em R seria 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 variável categórica vai para uma extremidade do quadrado, que é subdividida por seus rótulos. (Assim, se você subdividir cada aresta em apenas um nível, no máximo 4 variáveis ​​categóricas podem ser representadas. IMHO, além de 3, fica confuso e difícil de interpretar). O tamanho dos retângulos é proporcional à frequência. Essa é a principal idéia por trás da plotagem de mosaico e é a mesma nesta resposta e na resposta de Paweł Kleka.

As diferenças estão nos layouts desses retângulos e "detalhes" fornecidos por um pacote R específico usado para esse tipo de plotagem. Como você vê na resposta de Paweł Kleka, o graphicspacote subdivide a borda superior em 2 níveis, em vez de usar a borda direita. Usei vcdpacote com opções padrão, para que a cor indique o grau de associação entre as variáveis. Cinza significa que os dados são consistentes com (você não pode rejeitar a hipótese de) independência variável. Azul significa que existe associação positiva entre a linha de base "grave" e a melhoria "substancial" para os tratamentos "0" e "1". (Surpresa, surpresa! Traduzo da seguinte forma: se você tiver uma depressão severa, provavelmente ficará substancialmente melhor com um tratamento ou não.

Pode-se ajustar o enredo de acordo com suas necessidades, veja, por exemplo, aqui . O pacote também possui várias vinhetas, google "exemplo de mosaico vcd" (como acabei de fazer). O artigo da Wikipedia citado no início também explica como construir esse tipo de enredo e intuição por trás dele.

insira a descrição da imagem aqui

Quando você compara minha foto com a da resposta de Paweł Kleka, não importa, o 'tratamento' fica na borda esquerda de cada foto. Você pode alterar facilmente a localização da borda alterando a última linha do meu código e ajustando o layout de acordo com suas necessidades. A prática comum é que, à esquerda, vá a variável mais importante ou a variável com o menor número de rótulos. Você também pode alterar a ordem dos rótulos (por exemplo, para que, na borda direita, o pedido seja "nenhum moderado substancial"), tornando o fator correspondente variável em R ordenado e ajustando seus níveis.

lanenok
fonte
No momento, escrevemos duas respostas em gráficos de mosaico. Seria útil se cada um de vocês expandisse o que seu gráfico mostra e por que é útil, principalmente porque os gráficos são bem diferentes.
Nick Cox
@NickCox esse certamente parece diferente dos outros. Eles são quase a mesma tela
shadowtalker
Ambos têm tratamento no eixo y. O que seria ouro de seus proponentes é um comentário sobre as vantagens e limitações de cada exibição.
Nick # # # # Cox Cox
Obrigado por expandir sua resposta. Eu acho que o interesse aqui é provável em comparar respostas dadas tratamento e linha de base. Naturalmente, concordo que você pode mexer com qual variável vai para onde, mas você tentou as outras possibilidades e qual funciona melhor? Ao analisar a resposta aqui, o leitor precisa comparar duas linhas de blocos simultaneamente.
Nick Cox
Obrigado por seus comentários. Foi a única coisa que me motivou a expandir. Eu fiz não tentar outras possibilidades. Na verdade, acho que, se o autor da pergunta achar útil esse tipo de enredo, ele deve tentar de tudo, postar e explicar os resultados para a comunidade. A propósito, não estou dizendo que esse tipo de enredo seja melhor que outros. O ponto é: ele foi especialmente desenvolvido para variáveis ​​categóricas e para visualizar a independência e / ou violação da independência.
Lanenok 4/15
3

Sugiro usar enredo em mosaico

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

mosaicplot ()

Paweł Kleka
fonte
No momento, escrevemos duas respostas em gráficos de mosaico. Seria útil se cada um de vocês expandisse o que seu gráfico mostra e por que é útil, principalmente porque os gráficos são bem diferentes.
Nick Cox
2

Uma opção que eu consideraria é usar conjuntos paralelos. Algumas das comparações serão mais fáceis do que outras, mas você ainda pode ver as relações entre três variáveis ​​categóricas.

Aqui está um exemplo com os dados do Titanic Survival:

Aqui está um exemplo com dados de sobrevivência do Titanic.

Em R (dadas suas tags), usei o ggparallel para implementá-lo. Algumas pessoas discutiram aqui no CV como implementá-lo de outras maneiras.

nazareno
fonte
Estou tendo problemas para imaginar isso. Alguma chance de você conseguir simular um exemplo?
Shadowtalker
Uma linha no gráfico tem sua largura proporcional à frequência de coocorrências de duas categorias. Para os dados utilizados nas parcelas da pergunta original, haveria três eixos horizontais: depressão inicial, tratamento e melhora da depressão. Em cada uma existem áreas separadas para cada nível dessa categoria. As co-moedas são vinculadas, com uma largura representando sua frequência.
Nazareno 6/15
2

As informações também podem ser transmitidas usando o seguinte gráfico de linhas simples:

insira a descrição da imagem aqui

A melhoria é mostrada por diferentes tipos de linha, enquanto o grupo de linha de base é mostrado em cores. Estes e o parâmetro do eixo x (tratamento aqui) também podem ser trocados, se desejado.

rnso
fonte
1

Semelhante aos conjuntos paralelos, conforme publicado por nazareno acima, você pode usar gráficos aluviais que estão disponíveis no pacote R aluvial. http://www.r-bloggers.com/alluvial-diagrams/

Ankur Chakravarthy
fonte