Boxplot equivalente para distribuições de cauda pesada?

13

Para dados distribuídos aproximadamente normalmente, os boxplots são uma ótima maneira de visualizar rapidamente a mediana e a propagação dos dados, bem como a presença de quaisquer valores extremos.

No entanto, para distribuições de cauda mais pesada, muitos pontos são mostrados como outliers, uma vez que os outliers são definidos como estando fora do fator fixo do IQR, e isso acontece naturalmente com muito mais frequência com distribuições de cauda pesada.

Então, o que as pessoas usam para visualizar esse tipo de dados? Existe algo mais adaptado? Eu uso o ggplot no R, se isso importa.

static_rtti
fonte
1
Amostras de distribuições de cauda pesada tendem a ter uma faixa enorme em comparação com os 50% médios. O que você quer fazer sobre isso?
Glen_b
7
Vários tópicos relevantes já, por exemplo, stats.stackexchange.com/questions/13086/… Resposta curta inclui transformação primeiro e depois! histogramas; parcelas quantílicas de vários tipos; lotes de vários tipos.
Nick Cox
@Glen_b: esse é exatamente o meu problema, torna os boxplots ilegíveis.
static_rtti
2
O problema é que há mais de uma coisa que pode ser feita ... então, o que você quer que faça?
Glen_b -Reinstala Monica
2
Talvez valha a pena notar que a maior parte do mundo estatístico conhece os boxplots pela nomeação e (re) introdução de John Tukey na década de 1970. (Eles foram usados ​​várias décadas antes em climatologia e geografia.) Mas nos capítulos posteriores de seu livro de 1977 sobre análise de dados exploratórios (Reading, MA: Addison-Wesley), ele tem idéias bastante diferentes sobre como lidar com distribuições de cauda pesada. Parece que ninguém pegou nada. Mas parcelas quantílicas têm o mesmo espírito.
Nick Cox

Respostas:

8

O problema central do OP parece ter é que eles têm dados de cauda muito-pesados - e eu não acho que a maioria dos actuais respostas realmente lidar com essa questão em tudo , então eu estou promovendo meu comentário anterior para uma resposta.

Se você quiser ficar com boxplots, algumas opções estão listadas abaixo. Eu criei alguns dados no R que mostra o problema básico:

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

boxplot insatisfatório

A metade do meio dos dados é reduzida para uma faixa minúscula com alguns mm de largura. O mesmo problema afeta a maioria das outras sugestões - incluindo gráficos de QQ, diagramas de tira, gráficos de colméia / abelha quente e gráficos de violino.

Agora, algumas soluções em potencial:

1) transformação ,

Se os logs ou inversos produzem um gráfico de caixa legível, eles podem ser uma ideia muito boa e a escala original ainda pode ser mostrada no eixo.

O grande problema é que às vezes não há transformação "intuitiva". Há um problema menor que, embora os quantis se traduzam com transformações monotônicas o suficiente, as cercas não; se você plotar os dados transformados em caixa (como eu fiz aqui), os bigodes terão valores x diferentes dos do gráfico original.

boxplot de valores transformados

Aqui eu usei um pecado hiperbólico inverso (asinh); é um tipo de log nas caudas e semelhante ao linear próximo de zero, mas as pessoas geralmente não consideram uma transformação intuitiva; portanto, em geral, eu não recomendaria essa opção, a menos que uma transformação bastante intuitiva como o log seja óbvia. Código para isso:

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) quebras de escala - pegue valores extremos extremos e comprima-os em janelas estreitas em cada extremidade com uma escala muito mais comprimida do que no centro. Eu recomendo uma pausa completa em toda a escala, se você fizer isso.

boxplot com quebras 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 extremos extremos (o que eu normalmente não recomendaria sem indicar isso muito claramente, mas parece o próximo gráfico, sem os "<5" e "2>" em cada extremidade), e

4) o que chamarei de "flechas" extremas - semelhantes ao corte, mas com a contagem de valores aparados indicados em cada extremidade

boxplot com contagem e setas apontando para os 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 Monica
fonte
Obrigado por tomar o tempo para escrever isso! Este é exatamente o tipo de resposta que eu estava esperando. Agora eu só preciso descobrir como implementar essas parcelas com R :)
static_rtti
1
Algum código está lá agora. Eu não dei o código para 3) porque é uma versão mais simples de 4); você deve conseguir cortando linhas a partir disso.
Glen_b -Reinstala Monica
Aliás, a maioria dessas idéias também funciona com as outras grandes telas sugeridas aqui - diagramas de strip-tease e parcelas de colmeia / colméia e parcelas de violino e coisas do tipo.
Glen_b -Reinstala Monica
Obrigado novamente. Tenho certeza de que essa resposta será útil para muitas pessoas.
static_rtti
Concordo, isso aborda a questão muito melhor do que minha resposta. Coisa boa.
TooTone
4

Pessoalmente, gosto de usar um stripplot com jitter pelo menos para ter uma ideia dos dados. O gráfico abaixo é com retículo em R (desculpe, não ggplot2). Gosto dessas tramas porque são muito fáceis de interpretar. Como você diz, uma razão para isso é que não há nenhuma transformação.

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)

insira a descrição da imagem aqui

O pacote beeswarm oferece uma ótima alternativa para stripplot (obrigado a @January pela sugestão).

beeswarm(df2$values ~ df2$ind)

insira a descrição da imagem aqui

Com seus dados, como são distribuídos aproximadamente normalmente, outra coisa a tentar pode ser um qqplot, qqnorm nesse caso.

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

insira a descrição da imagem aqui

TooTone
fonte
2
Também gosto de stripplots, mas a pergunta é explicitamente sobre o que fazer com distribuições de cauda pesada.
Nick Cox
1
O ponto é que o conselho a ser usado, por exemplo, qqnorm não corresponde à pergunta. Outros tipos de parcelas quantil-quantil poderiam, eu concordo, ser uma idéia muito boa, como mencionei anteriormente.
Nick Cox
1
Ainda melhores do que as stripplots de R são as plotagens da beeswarmembalagem.
janeiro
1
@ Janeiro Sim, isso é muito legal, eu estou adicionando à minha resposta (se você se opuser, por favor diga).
`` TooTone
1
Minha resposta foi publicada em stats.stackexchange.com/questions/13086 , que vejo como uma versão (inconseqüentemente mais estreita) dessa pergunta. Eu o resumi como "não mude o algoritmo boxplot: expresse novamente os dados". A questão sugerida pelos "adaptados" nesta questão é abordada por técnicas padrão da Análise Exploratória de Dados para encontrar re-expressões úteis de variáveis.
whuber
2

Você pode ficar com boxplots. Existem diferentes possibilidades para definir bigodes. Dependendo da espessura da cauda, ​​número de amostras e tolerância a valores extremos, você pode escolher dois quantis mais ou menos extremos. Dado o seu problema, eu evitaria bigodes definidos pelo IQR.
A menos, é claro, que você queira transformar seus dados, o que, nesse caso, dificulta o entendimento.

Quartzo
fonte
1
A última frase não é qualificada para passar sem comentar. A transformação não é uma panacéia, mas não transformar dados altamente distorcidos não facilita a compreensão. Se todos os dados forem positivos, você pode pelo menos tentar usar a escala raiz, logarítmica ou recíproca. Se realmente não ajudar, recue.
Nick Cox
A que dificuldades você entende os dados distorcidos? Aqueles com bigodes dependentes de IQR? Isso é um problema, mesmo com caudas leves. E não estamos falando de caudas pesadas, independentemente de assimetria? As transformações que iluminam as caudas certamente oferecem boxplots mais regulares, mas adicionam uma camada de interpretação, trocando entendimento por conforto. Mas pode-se chamar isso de recurso, se ele quiser.
Quartzo
2
As transformações geralmente ajudam: esse é o meu resultado final. Uma pessoa estatística que não aprendeu que muitas coisas parecem mais claras em escala logarítmica (especialmente) está perdendo seriamente um dos truques mais antigos e eficazes que existem. Você parecia estar negando isso; Espero ter interpretado mal você.
Nick Cox
1
Discordo. Transformo dados altamente distorcidos o tempo todo e minha experiência é que isso é muito mais do que uma questão de estética. Muitas vezes funciona. Um estatístico anônimo escreveu há algum tempo que o lognormal é mais normal que o normal. Ele / ela estava sendo um pouco brincalhão, mas também há uma verdade importante. (Não que muitas outras distribuições não poderia ser melhor se encaixa.)
Nick Cox
1
Acho que preciso parar por aqui para permitir que outros julguem, mas minha opinião não é excêntrica. A transformação é discutida como uma possibilidade em, por exemplo, stats.stackexchange.com/questions/13086/… Sugiro que você responda ou comente lá para explicar por que esse conselho não é válido.
Nick Cox
0

Suponho que esta pergunta seja sobre a compreensão de dados (em vez de "gerenciá-los").
Se os dados são pesados ​​e / ou multimodais, considero essas "camadas" do ggplot2 muito úteis para a finalidade: geom_violine geom_jitter.


fonte
3
Você poderia resumir por que as parcelas de violino e / ou pontos trêmulos seriam úteis nas distribuições de cauda pesada?
chl