jueves, 26 de mayo de 2011

Calculo de nùmero de Clases por la regla de Sturges

Muchas veces es necesario encontrar el numero de clases que es estadisticamente optimo para realizar un histograma. Herbert Sturger en 1926, desarrollo un método  basado en el N de las muestras para encontrar este numero de clases y su amplitud de rango.
Este metodo es útil también para definir estadìos de desarrollo, basados por ejemplo en medidas de distancia.
Obviamente esta función también ha sido escrita para R y es realmente muy sencilla, así que manos a la obra:


>estadios<-c(18.30,18.70,19.60,20.20,21.00,22.70,22.75,22.50,22.89,22.90,23.00,23.20,23.28,23.30,23.40,24.07,24.40,24.78,24.90,25.41,25.60,26.10,26.20,26.60,25.60,26.13,26.30,26.31,26.56,26.60,27.04,26.80,27.50,28.00,28.32,29.50,28.90,29.00,29.10,29.30,30.20,30.35,30.50,30.50,30.50,29.60,30.50,30.60,30.90,31.20,32.00,31.40,31.73,32.60,32.04,32.70,34.00,34.10,42.40,42.00,45.10,45.50,47.90,47.00,47.80,48.60,53.70,55.80,52.90,57.30,56.20,58.40,60.40,59.90,62.30,63.00,63.90,65.30,71.20,68.70,70.40,71.30,73.30,78.60,80.20,92.10,72.02,89.96,67.59,73.23,71.96,73.13,74.20,78.92,85.36,88.55,88.71,88.25,97.38,98.09,99.01,97.94,46.09,55.26,56.91,64.63,62.84,67.01,65.65,68.63,71.19,71.28,71.62,72.45,75.37,80.33,86.07,89.90,99.57,89.52,84.22,78.47,74.48,75.72,71.26,69.75,67.83,67.00,63.68,65.50,58.66,57.70,53.68,38.24,33.78,31.12,32.69,30.94,29.83,30.36,29.80,28.54,28.82,28.04,26.45,26.33,25.59,26.64,24.48,22.64,24.13,22.99,21.67,100.63,98.32,88.10,87.39,81.44,83.92,74.31,69.22,60.43,110.10,99.65,62.39,92.00,88.64,83.74,79.71,77.74,75.69,71.64,73.57,72.70,70.79,67.99,65.28,61.86,61.30,60.69,56.09,51.70,49.66,49.25,45.36,40.22,29.99,31.68,27.96,27.99,27.82,26.41,27.98,25.36,27.41,26.56,26.92,24.14,25.28,23.20,23.80,20.91,21.65,14.23,21.03,16.62,16.63)


#Escribimos un vector con la lista de medidas que tenemos, en este caso se utilizan las medidas de longitudes estándar de individuos de una especie de Pez de la familia Loricariidae, colectados en un Rio.


> nclass.Sturges(estadios)


#Obtenemos el Nùmero de clases en los que se debe dividir la muestra, para que sea consistente, en este caso serà 9.
[1] 9


> summary (estadios)


#Obtenemos los estadísticos descriptivos básicos que serán utilizados para hallar la amplitud de rango de cada estadìo o clase.
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
  14.23   26.72   45.36   49.56   71.23  110.10



> RangoTotal<-(110.10-14.23)


#Obtenemos el rango total que tiene muestra muestra.


> RangoTotal
[1] 95.87



> amplitudtotal<-(RangoTotal+1)


#Sumamos 1 al rango total, para obtener la amplitud de rango total, necesaria para calcular la amplitud de rango para nuestras clases.


> amplitudtotal
[1] 96.87



> amplitudderango<-(amplitudtotal/9)


#Hallamos la amplitud de rango de nuestras clases o estadìos.


> amplitudderango
[1] 10.76333



Y listo!!!! de este modo, tendremos en este ejemplo 9 clases o estadios de amplitud de rango de 10.76333


así:


Estadio 1: 14.23 a 24.99
Estadio 2: 25.00 a 35.75
Estadio 3: 35.76 a 46.51
Estadio 4: 46.52 a 57.27
Estadio 5: 57.28 a 68.03
Estadio 6: 68.04 a 78.79
Estadio 7: 78.80 a 89.55
Estadio 8: 89.56 a 100.31
Estadio 9: 100.31 a 111.07



Que les sirva y que les rinda!!!!







3 comentarios:

  1. Algo más automatico

    nclass_e <- nclass.Sturges(estadios)
    range_e <- range(estadios)
    rango <- diff(range_e)
    amplitud_total <- rango + 1
    amplitud_rango <- amplitud_total/nclass_e
    cortes <- cumsum(c(min(estadios), rep(amplitud_rango, 9)))

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Hola Durlak o Luciano..

    Muchas gracias por comentar.
    Definitivamente si es mucho mas automático, (aunque permanece con el mismo numero de comandos, estos son mas sintetizados).
    Casualmente, Daniel Miranda también estaba preocupado por el calculo de la amplitud de rango y configuro una pequeñisima función en Rstudio (ya que esta pegadisimo y engomado con Rstudio) que decia lo siguiente:

    >amplitud_rango <- function (estadios) {amprango<-((diff(range(estadios))+1)/(nclass_e))}

    He decidio unir los apoortes de los dos y formular la siguiente linea de comandos, en orden de realizar mucho mas rápido los cálculos:

    > range(estadios)
    > nclass_e <- nclass.Sturges(estadios)
    > amplitud_rango <- function (estadios) {amprango<-((diff(range(estadios))+1)/(nclass_e))}
    >valor<-amplitud_rango(estadios)
    >cortes <- cumsum(c(min(estadios), rep(valor, nclass_e)))

    Obviamente la función podría ser universal (y cambiar los rótulos de "estadios" por nombres fijos (como "X") del vector que entremos, de este modo aplicando la linea de comandos nos serviría para cualquier set de datos que incluyamos)

    Muchas gracias a los dos por comentar!!
    Hasta la Vista....

    ResponderEliminar