Cálculo do número ideal de posições em um histograma


80

Estou interessado em encontrar o melhor método possível para determinar quantas caixas devo usar em um histograma. Meus dados devem variar de 30 a 350 objetos, no máximo, e, em particular, estou tentando aplicar limiar (como o método de Otsu) em que objetos "bons", dos quais eu deveria ter menos e mais espalhados, são separados de " objetos "ruins", que devem ter um valor mais denso. Um valor concreto teria uma pontuação de 1 a 10 para cada objeto. Eu tinha 5 a 10 objetos com notas de 6 a 10 e 20 a 25 objetos com notas de 1 a 4. Eu gostaria de encontrar um padrão de classificação de histograma que geralmente permita que algo como o método de Otsu limite os objetos de baixa pontuação. No entanto, na implementação de Otsu que eu já vi, o tamanho da lixeira era 256 e, geralmente, tenho muito menos pontos de dados que 256, o que para mim sugere que 256 não é um bom número de lixeira. Com tão poucos dados, que abordagens devo adotar para calcular o número de posições a serem usadas?


Eu acho que a regra de Sturges pode ser usada para n <200; onde n é o número de observações
venkasub

Respostas:


95

A regra Freedman-Diaconis é muito robusta e funciona bem na prática. A largura do compartimento é definida como . Portanto, o número de posições é , onde é o número de observações, max é o valor máximo e min é o valor mínimo.h=2×IQR×n1/3(maxmin)/hn

Na base R, você pode usar:

hist(x, breaks="FD")

Para outras bibliotecas de plotagem sem essa opção (por exemplo, ggplot2), você pode calcular a largura de caixa como:

bw <- 2 * IQR(x) / length(x)^(1/3)

### for example #####
ggplot() + geom_histogram(aes(x), binwidth = bw)

2
@nico. O padrão em R é breaks = "Sturges", que nem sempre fornece bons resultados.
precisa

4
Como se calcula IQR?
Kurt Mueller

1
@KurtMueller IQR significa alcance interquartil. Procure o 1º e o 3º quartil e a diferença é IQR. O IQR já vem com o R para que você possa usá-lo.
Xiaodai #

4
Se não me engano, a resposta deve sernum_bins <- diff(range(x)) / (2 * IQR(x) / length(x)^(1/3))
Jasha

1
nclass.FDnão existia nove anos atrás.
Rob Hyndman

18

Se você usar poucas caixas, o histograma realmente não retrata os dados muito bem. Se você tiver muitas caixas, terá uma aparência de pente quebrada, o que também não dá uma noção da distribuição.

Uma solução é criar um gráfico que mostre todos os valores. Um gráfico de pontos ou uma distribuição de frequência cumulativa, que não requer nenhum compartimento.

Se você deseja criar uma distribuição de frequência com compartimentos igualmente espaçados, decida quantos compartimentos (ou a largura de cada um). A decisão depende claramente do número de valores. Se você tiver muitos valores, seu gráfico ficará melhor e será mais informativo se você tiver muitos compartimentos. Esta página da Wikipedia lista vários métodos para decidir a largura do compartimento a partir do número de observações. O método mais simples é definir o número de posições iguais à raiz quadrada do número de valores que você está classificando.

Esta página do Hideaki Shimazaki explica um método alternativo. É um pouco mais complicado de calcular, mas parece fazer um ótimo trabalho. A parte superior da página é um aplicativo Java. Passe o mouse para ver a teoria e a explicação e continue navegando para encontrar links para os papéis que explicam o método.


O link para a página de Hideaki está quebrado. Eu não tenho certeza se esta é a mesma coisa: toyoizumilab.brain.riken.jp/hideaki/res/histogram.html
darenw

9

Talvez o artigo " Variações no histograma " de Denby e Mallows seja interessante:

Essa nova exibição que denominamos "dhist" (para histograma cortado na diagonal) preserva as características desejáveis ​​tanto do hist de largura igual quanto do hist de área igual. Ele exibirá caixas altas e estreitas, como o histórico, quando houver picos nos dados, e mostrará valores extremos isolados, exatamente como o histograma usual.

Eles também mencionam que o código em R está disponível mediante solicitação.


5

Não sei se isso é estritamente uma boa prática, mas tenho a tendência de produzir mais de um histograma com larguras diferentes de compartimento e escolher o histograma que histograma usar com base no histograma que se encaixa na interpretação que estou tentando comunicar melhor. Enquanto isso introduz alguma objetividade na escolha do histograma, justifico com base em que tive muito mais tempo para entender os dados do que a pessoa para quem estou dando o histograma, por isso preciso enviar uma mensagem muito concisa.

Também sou um grande fã de apresentar histogramas com o mesmo número de pontos em cada compartimento, em vez da mesma largura. Normalmente, acho que esses dados representam os dados muito melhor do que a largura constante da bandeja, embora sejam difíceis de produzir.


1
desculpe, eu deveria ter mencionado que eu preciso fazer isso de forma automatizada. a opção de "fazer isso várias vezes até encontrar o que melhor se adapta ao meu propósito" não funcionará para mim. tem que ser feito computacionalmente ...
Tony Stark

4
Eu concordo - a ideia de que existe uma largura "ideal" de escaninho é uma enorme suposição simplificadora.
Hadley

5

Você viu o método Shimazaki-Shinomoto ?

Embora pareça ser computacionalmente caro, pode fornecer bons resultados. Vale a pena tentar se o tempo computacional não for problema seu. Existem algumas implementações desse método em java, MATLAB, etc, no seguinte link, que é executado com rapidez suficiente: interface da web


3

Se eu precisar determinar o número de posições programaticamente, geralmente começo com um histograma que possui muito mais posições do que o necessário. Depois que o histograma é preenchido, combino os compartimentos até ter entradas suficientes por compartimento para o método que estou usando, por exemplo, se eu quiser modelar incertezas de Poisson em um experimento de contagem com incertezas de uma distribuição normal até que eu tenha mais do que 10 entradas.


2

Por favor, veja esta resposta como um complemento da resposta do Sr. Rob Hyndman .

Para criar gráficos de histograma com exatamente os mesmos intervalos ou 'binwidths' usando a regra Freedman – Diaconis com R básico ou ggplot2pacote, podemos usar um dos valores da hist()função, a saber breaks. Suponha que nós queremos criar um histograma qsecde mtcarsdados usando a regra Freedman-Diaconis. No R básico usamos

x <- mtcars$qsec
hist(x, breaks = "FD")

Enquanto isso, no ggplot2pacote usamos

h <- hist(x, breaks = "FD", plot = FALSE)
qplot(x, geom = "histogram", breaks = h$breaks, fill = I("red"), col = I("white"))

Ou alternativamente

ggplot(mtcars, aes(x)) + geom_histogram(breaks = h$breaks, col = "white")

Todos eles geram gráficos de histograma com exatamente os mesmos intervalos e número de posições desejadas.


-5

Eu tenho 600 observações para Au g / t. O tamanho da lixeira 1 me fornece o seguinte:insira a descrição da imagem aqui

A seleção automática (omitir o intervalo da bandeja) fornece:insira a descrição da imagem aqui

Os dados parecem O'K no primeiro e no segundo gráficos, como se não houvesse problema com a integridade dos dados. Somente o tamanho da bandeja 0,1 (g / t) responde à pergunta: as medidas eram imprecisas e imprecisasinsira a descrição da imagem aqui

Meu julgamento: 1. Não existe uma técnica de medição na Terra para mostrar o verdadeiro valor do fenômeno natural. Todas as medições são aproximadas, algumas sendo próximas ao valor real. Depende do projeto de amostragem, calibração, qualificações humanas, etc. 2. É por isso que a distribuição é distorcida e não simétrica. 3.No entanto, o formato da distribuição deve se parecer com uma seção "em forma de sino", pelo menos aproximadamente. Um sino de cada vez (a menos que haja vários ambientes geológicos). 4.A distribuição de frequência com a manipulação do tamanho da lixeira pode ajudar a revelar o padrão de precisão e exatidão das medidas realizadas. Para que seja necessário um levantamento experimental do tamanho da lixeira em vez de uma regra cortada na pedra.


2
Isso é mais um comentário do que uma resposta, a menos que você explique a moral. Eu diria que a moral é a seguinte: todas as regras são regras práticas, algumas têm mais base estatística do que outras, mas a maioria das regras pode não fazer o que você deseja se as distribuições tiverem uma distorção ou curtose muito alta. Então, use seu julgamento também.
Nick Cox

2
Você adicionou comentários, mas não estou claro que algum contribua com novos detalhes úteis para o tópico. 1. está bem para mim, mas não é o problema aqui. 2. não segue de 1. como algumas distribuições são quase simétricas. 3. é duvidoso: há muitas situações em que são esperadas outras formas além de sinos. 4. também é duvidoso, pois a qualidade das medições originais geralmente não é evidente em nenhum histograma, mas geralmente é melhor examinada com atenção à estrutura muito fina de uma distribuição.
19615 Nick Cox

2. Quase simétrico não é simétrico. Você não pode estar quase grávida: grávida ou não.
Sergo Cusiani

2
Claro, mas a simetria exata dos dados é tão rara que, se eu tivesse dito "simétrico", alguém poderia razoavelmente se opor a isso também. É muito fácil ser quase simétrico; é por isso e como temos medidas de assimetria.
Nick Cox

1
Observado, mas seu comentário foi geral e não teve o contexto que você fornece agora. Por sua vez, eu disse "duvidoso", não "errado". Meu principal comentário é que sua resposta não adiciona muito ao tópico sobre como escolher o tamanho da lixeira ou o número equivalente de lixeiras. Ter outro exemplo em que é difícil é dar uma guinada na pergunta, não realmente uma resposta.
Nick Cox
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.