Diferença entre o boxplot gerado pelo R e o resultado da função quantile()

Eu estava voltando do almoço quando meu colega de laboratório exclamou: “Tenho uma dúvida para tirar com você no R. Perdi a manhã inteira com isso.”

Apesar de não ser uma especialista em R, costumo ser solidária ao problema alheio e mal sabia eu que também perderia metade da tarde para entender as origens de tal “problema”.

Bom, tudo começa com dois conjuntos de dados:

conjunto1 <- c(23, 23, 25, 19, 27, 23, 21, 19, 20, 20, 21, 24, 24, 23, 21, 18, 17, 23, 22, 16, 25, 23, 18, 25, 17, 18, 17, 25, 27, 24, 21, 19, 16, 19, 19, 20, 22, 20, 21, 23, 19, 20, 20, 21, 20, 20, 22, 19, 18, 19, 20, 23, 20, 19, 19, 23, 19, 19, 21, 21, 20, 24, 21, 18)

conjunto2 <-c(22, 28, 23, 19, 23, 25, 18, 19, 19, 20, 21, 19, 23, 20, 27, 23, 21, 26, 20, 24, 18, 21)

A missão era tão simples quanto gerar um boxplot dos dois conjuntos lado a lado.

Isso pode ser facilmente realizado pelo comando:

boxplot(conjunto1,conjunto2)

gerando o seguinte gráfico:

Boxplot

Boxplot

O que chamou a atenção do meu colega é que o primeiro quartil de ambos boxplots está identicamente localizado em 19.

No entanto, ele achava que isso era um erro do R pois, ao usar a função quantile(), o resultado era:

> quantile(conjunto1)
  0%  25%  50%  75% 100% 
  16   19   20   23   27 
> quantile(conjunto2)
   0%   25%   50%   75%  100% 
18.00 19.25 21.00 23.00 28.00

O R não está errado, mas nessa jornada acabei aprendendo coisas novas.

A função boxplot do R utiliza os quartis calculados pela função boxplot.stats(), que resulta em valores coerentes com o que foi plotado:

> boxplot.stats(conjunto1)$stats
[1] 16 19 20 23 27
> boxplot.stats(conjunto2)$stats
[1] 18 19 21 23 28

Por que será então que ambas funções dão valores diferentes de quartis?

Ahá! Simples: por que existem inúmeras maneiras de calcular quartis, diferentes daquela que você aprendeu na escola, e que todas estão corretas e tudo depende da implementação que a biblioteca adota.

A função boxplot.stats() adota uma implementação baseada em “hinges”, ou dobradiças. Uma boa ilustração é dada no site WolframMathWorld: Hinge.

Já a função quantile() é mais complexa e possui diferentes implementações de cálculo de quartil. Uma boa leitura no help desta função ajuda a elucidar o problema.

Em particular, o help da função faz referência a um artigo bem interessante:

Rob J. Hyndman and Yanan Fan, “Sample Quantiles in Statistical Packages”, The American Statistician, Vol. 50, No. 4, Nov., 1996

Fazendo uma tradução livre do abstract deste artigo:

“Existe um grande número de definições diferentes usadas para o cálculo de quantis de amostras em pacotes computacionais estatísticos. Frequentemente, dentro de um mesmo pacote uma definição pode ser usada para calcular quantis explicitamente, enquanto outras definições podem ser usadas para produzir um boxplot, um gráfico de probabilidade ou um gráfico QQ.”

No artigo os autores comparam diferentes implementações e realçam a importância de se adotar uma implementação padrão. Faz sentido não é?

Finalmente, se você quiser calcular diversos tipos de quantis de maneira interativa, fica a dica do meu colega para este site: http://www.wessa.net/quart.wasp

E fim!

Próximo problema!

Anúncios

Deixe seu comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s