Gráficos alternativos para plotagens de "guiador"

15

Na minha área de pesquisa, uma maneira popular de exibir dados é usar uma combinação de um gráfico de barras com "guias". Por exemplo,

insira a descrição da imagem aqui

O "guidão" alterna entre erros padrão e desvios padrão, dependendo do autor. Normalmente, os tamanhos das amostras para cada "barra" são bastante pequenos - cerca de seis.

Esses gráficos parecem ser particularmente populares nas ciências biológicas - veja os primeiros artigos da BMC Biology, volume 3, para exemplos.

Então, como você apresentaria esses dados?

Por que eu não gosto desses enredos

Pessoalmente, não gosto dessas tramas.

  1. Quando o tamanho da amostra é pequeno, por que não exibir apenas os pontos de dados individuais.
  2. É o sd ou o se que está sendo exibido? Ninguém concorda com o que usar.
  3. Por que usar barras? Os dados não (geralmente) vão de 0, mas uma primeira passagem no gráfico sugere que sim.
  4. Os gráficos não dão uma idéia sobre o intervalo ou o tamanho da amostra dos dados.

Script R

Este é o código R que eu usei para gerar o gráfico. Dessa forma, você pode (se quiser) usar os mesmos dados.

                                        #Generate the data
set.seed(1)
names = c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
prevs = c(38, 37, 31, 31, 29, 26, 40, 32, 39)

n=6; se = numeric(length(prevs))
for(i in 1:length(prevs))
  se[i] = sd(rnorm(n, prevs, 15))/n

                                        #Basic plot
par(fin=c(6,6), pin=c(6,6), mai=c(0.8,1.0,0.0,0.125), cex.axis=0.8)
barplot(prevs,space=c(0,0,0,3,0,0, 3,0,0), names.arg=NULL, horiz=FALSE,
        axes=FALSE, ylab="Percent", col=c(2,3,4), width=5, ylim=range(0,50))

                                        #Add in the CIs
xx = c(2.5, 7.5, 12.5, 32.5, 37.5, 42.5,  62.5, 67.5, 72.5)
for (i in 1:length(prevs)) {
  lines(rep(xx[i], 2), c(prevs[i], prevs[i]+se[i]))
  lines(c(xx[i]+1/2, xx[i]-1/2), rep(prevs[i]+se[i], 2))
}

                                        #Add the axis
axis(2, tick=TRUE, xaxp=c(0, 50, 5))
axis(1, at=xx+0.1, labels=names, font=1,
     tck=0, tcl=0, las=1, padj=0, col=0, cex=0.1)
csgillespie
fonte
6
Ajudar o seu campo a chegar a um consenso sobre apenas a questão v. Sd seria um grande avanço. Eles significam coisas completamente diferentes.
John
Eu concordo - se é geralmente escolhido porque dá uma região menor!
precisa saber é o seguinte
Talvez algum título mais informativo?
3
Apenas para referência, eu já vi esses gráficos de barras com barras de erro chamadas "Gráficos de dinamite" antes. Aqui estão algumas referências que dão exatamente as mesmas recomendações que todo mundo tem (gráficos de ponto). Tatsuki Koyama, Cuidado com o Pôster de Dinamite e Drummond & Vowler, 2011 .
Andy W
1
Por favor, adicione a imagem novamente, se puder. Use o carregador de imagens desta vez para que não se torne um link morto.
endolith

Respostas:

16

Obrigado por todas as respostas. Para completar, pensei em incluir o que costumo fazer. Costumo fazer uma combinação das sugestões fornecidas: pontos, gráficos de caixa (quando n é grande) e intervalos se (ou sd).

( Removido pelo moderador porque o site que hospeda a imagem não parece mais funcionar corretamente. )

A partir do gráfico de pontos, fica claro que os dados estão muito mais dispersos do que os gráficos do "guiador" sugerem. De fato, existe um valor negativo em A3!


Eu fiz essa resposta uma CW para não ganhar rep

csgillespie
fonte
3
Essa é uma boa resposta. Além disso, sugiro que os pontos sejam alterados horizontalmente, para que eles não se sobreponham, especialmente se você tiver mais pontos por grupo do que isso. No ggplot2, o geom_jitter () fará isso.
Harlan
@ Harlan: Eu concordo. Embora se eu tivesse muitos outros pontos, provavelmente usaria um boxplot.
Csgillespie 20/10/10
1
Também gosto de gráficos de dispersão para pequenos conjuntos de dados (nb, eu uso o termo 'gráfico de pontos' para me referir a um gráfico ligeiramente diferente). No entanto, pelo que vale, o gráfico de barras acima é mais limpo e fácil de ler do que este. Não tenho certeza de que isso melhore, mas vale a pena ressaltar.
gung - Restabelece Monica
@ Harlan: Como alternativa, torne os pontos transparentes para que vários pontos se amontoem e produzam um ponto mais escuro?
endolith
você tem a imagem original para substituir este link morto?
endolith
10

A palestra de Frank Harrell (mais excelente) intitulada "Alergia à informação" na useR! o mês passado mostrou alternativas para isso: em vez de ocultar os dados brutos pela agregação fornecida pelas barras, os dados brutos também são mostrados como pontos (ou pontos). "Por que esconder os dados?" foi o comentário de Frank.

Dada a mistura de alpa, isso parece a sugestão mais sensata (e o todo fala mais cheio de pepitas boas e importantes).

Dirk Eddelbuettel
fonte
1
Está disponível como um vídeo? Parece ótimo.
Henrik
1
Eu acho que a palavra é "será eventualmente" - as palestras foram gravadas.
Dirk Eddelbuettel
1
isso é fácil no ggplot, eu acho, ou seja, had.co.nz/ggplot2/geom_jitter.html
Mike Dewar
1
jittertambém está na planície R.
2
Apenas para o protocolo, a palestra de Frank (em vídeo) agora está on-line: r-bloggers.com/RUG/2010/08/user-2010-conference-videos
Tal Galili
7

Do ponto de vista psicológico, defendo a plotagem dos dados, além da sua incerteza sobre os dados. Assim, em um gráfico como você mostra, eu nunca me preocuparia em estender as barras até zero, o que serve apenas para minimizar a capacidade do olho de distinguir diferenças no intervalo de dados.

Além disso, sou francamente antigráfico; Os gráficos de barras mapeiam duas variáveis ​​para o mesmo atributo estético (localização do eixo x), o que pode causar confusão. Uma abordagem melhor é evitar o mapeamento estético redundante, mapeando uma variável para o eixo x e outra variável para outro atributo estético (por exemplo, forma ou cor do ponto ou ambas).

Finalmente, no gráfico acima, você inclui apenas barras de erro acima do valor, o que dificulta a capacidade de comparar os intervalos de incerteza em relação às barras acima e abaixo do valor.

Aqui está como eu plotaria os dados (através do pacote ggplot2). Note que eu adiciono linhas conectando pontos da mesma série; alguns argumentam que isso só é apropriado quando as séries através das quais as linhas estão conectadas são numéricas (como parece ser neste caso), no entanto, desde que haja alguma relação ordinal razoável entre os níveis da variável do eixo x, acho linhas de conexão são úteis para ajudar o olho a associar pontos através do eixo x. Isso pode se tornar particularmente útil para detectar interações, que realmente se destacam nas linhas.

library(ggplot2)
a = data.frame(names,prevs,se)
a$let = substr(a$names,1,1)
a$num = substr(a$names,2,2)
ggplot(data = a)+
layer(
    geom = 'point'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , shape = let
    )
)+
layer(
    geom = 'line'
    , mapping = aes(
        x = num
        , y = prevs
        , colour = let
        , linetype = let
        , group = let
    )    
)+
layer(
    geom = 'errorbar'
    , mapping = aes(
        x = num
        , ymin = prevs-se
        , ymax = prevs+se
        , colour = let
    )
    , alpha = .5
    , width = .5
)

enter image description here

Mike Lawrence
fonte
1
Devo acrescentar que minha recomendação "plotar apenas os dados e a incerteza" deve ser qualificada: ao apresentar dados para um público que tem experiência / conhecimento com a variável que está sendo plotada, plote apenas os dados e a incerteza. Ao apresentar dados para um público ingênuo e quando zero é um ponto de dados significativo, primeiro mostro os dados que se estendem a zero, para que o público possa se orientar para a escala, depois amplia para mostrar apenas os dados e a incerteza.
Mike Lawrence
desde que você se deu ao trabalho de escrever o código R, poderia incluir uma imagem jpeg do gráfico final. Acho que apenas enviar a imagem para img84.imageshack.us e vincular a ela é bastante fácil. Oh obrigado pela resposta :)
csgillespie
@csgillespie: pronto.
Mike Lawrence
Descobri que é mais fácil ler um gráfico como este, geom_ribbon()indicando o erro. Se você não gosta de produzir estimativas aparentes para regiões entre 1 e 2, reduza pelo menos a largura da barra de erro.
JoRhwld
@ JoFrwld: Eu também gosto de fitas, embora eu costumo reservá-las para casos em que a variável do eixo x é realmente numérica; minha versão da regra "não desenhe linhas, a menos que a variável do eixo x seja numérica" ​​que eu declaro violar na minha resposta acima: Op
Mike Lawrence
2

Estou curioso para saber por que você não gosta dessas tramas. Eu os uso o tempo todo. Sem querer afirmar o óbvio do florescimento, eles permitem comparar as médias de diferentes grupos e ver se seus ICs de 95% se sobrepõem (ou seja, a verdadeira média provavelmente será diferente).

É importante obter um equilíbrio de simplicidade e informações para diferentes propósitos, eu acho. Mas quando uso esses enredos, estou dizendo: "esses dois grupos são diferentes um do outro de alguma maneira importante" [ou não].

Parece ótimo para mim, mas eu estaria interessado em ouvir contra-exemplos. Suponho implícito no uso do gráfico que os dados não têm uma distribuição bizzare que torna a média inválida ou enganosa.

Chris Beeley
fonte
Adicionei uma pequena seção sobre por que não gosto desses gráficos.
csgillespie
1
@ Chris verificar isso sobre como interpretar CIs sobrepostas pubs.amstat.org/doi/abs/10.1198/000313001317097960 Também a pergunta original é também em torno da confusão de usar SE ou SD alternadamente, enquanto eles são duas coisas diferentes
tosonb1
Ou, para uma análise neste site, consulte stats.stackexchange.com/questions/18215 . @ tosonb1 Seu link está atingindo o tempo limite. Você poderia fornecer uma referência ao artigo?
whuber
2

Se os dados são taxas : esse é o número de sucessos dividido pelo número de tentativas, um método muito elegante é um gráfico de funil. Por exemplo, consulte http://qshc.bmj.com/content/11/4/390.2.full (desculpas se o link exigir uma assinatura - avise-me e vou encontrar outra).

Pode ser possível adaptá-lo a outros tipos de dados, mas não vi nenhum exemplo.

ATUALIZAR:

Aqui está um link para um exemplo que não requer uma assinatura (e tem uma boa explicação de como eles podem ser usados): http://understandingunertaty.org/fertility

Eles podem ser usados ​​para dados não-taxa, simplesmente plotando a média contra o erro padrão; no entanto, eles podem perder parte de sua simplicidade.

O artigo da wikipedia não é ótimo, pois apenas discute seu uso em meta-análises. Eu diria que eles poderiam ser úteis em muitos outros contextos.

Simon Byrne
fonte
Os dados não são taxas necessárias. Poderia ser qualquer coisa.
csgillespie
Infelizmente, link de inscrição.
Matt Parker
... mas aqui está o link da Wikipedia sobre gráficos de funil: en.wikipedia.org/wiki/Funnel_plot
Matt Parker
2

Eu usaria boxplots aqui; limpo, significativo, não paramétrico ... Ou vioplot, se a distribuição for mais interessante.


fonte
2
Eu não tenho certeza boxplots ou vioplots seria adequado com um tamanho tão pequeno da amostra (n = 6)
csgillespie
Certo, admito que não li a pergunta com atenção suficiente, por isso foi uma ideia geral; no entanto, acho que 6 pontos são mínimos, mas o suficiente para um boxplot. Eu fiz alguns experimentos e eles foram significativos. Por outro lado, obviamente o boxplot não indica o número de observações (que é uma informação importante aqui), então eu prefiro usar uma combinação delas e de pontos.
Com 6 pontos - gráfico de dispersão é provavelmente o melhor (talvez com a adição de um ponto vermelho para a média)
Tal Galili
2
Geralmente uso boxplots com pontos sobrepostos, acho muito "visual". Parcelas de violino, em vez disso, são um pouco difíceis de entender na minha opinião.
Nico
1
@csgillespie: O que indicaria que os gráficos de barra e bigode são melhores? Eles estão mostrando basicamente as mesmas informações que um boxplot (como você ressalta, os bigodes podem representar várias coisas), eles apenas dão o erro apenas em uma direção, o que pode ser bastante confuso, se não for falso ... Não argumentando por boxplots . Mas as parcelas de feijão / violino ainda devem funcionar, mesmo para tamanhos de amostra relativamente baixos, porque é apenas uma estimativa da densidade gaussiana, como expliquei aqui .
naught101
1

Simplifying @csgillespie's terrific code from above:

qplot(
    data=a,
    x=num,
    y=prevs,
    colour=let,
    shape=let,
    group=let,
    ymin=prevs-se,
    ymax=prevs+se,
    position=position_dodge(width=0.25),
    geom=c("point", "line", "errorbar")
    )
James Waters
fonte
0

I prefer geom_pointrange to errorbar and think the lines are distracting rather than helpful. Here is version that I find much cleaner than the @James or @csgillespie version:

qplot(
 data=a,
 x=num,
 y=prevs,
 colour=let,
 ymin=prevs-se,
 ymax=prevs+se,
 position=position_dodge(width=0.25),
 geom=c("pointrange"), size=I(2)
 )
Kent Johnson
fonte