Para calcular la moda agrupando datos se usa la siguiente ecuación:
\[ m=L_{i}+\dfrac{f_i-f_{i-1}}{2\cdot{f}_i-f_{i-1}-f_{i+1}}\cdot{t}_i \] Donde:
Con esta ecuación se puede definir la siguiente función:
modgr <- function(x, breaks = 100){
# Se crea una tabla de intervalos
tabla.intervalos = transform(table(cut(x, breaks = breaks)))
# Se identifican las etiquetas que se generaron en los intervalos
labs <- levels(cut(x, breaks = breaks))
# Se identifica cada uno de los rangos a partir de las etiquetas
labs <- cbind(lower = as.numeric( sub("\\((.+),.*", "\\1", labs) ), upper = as.numeric( sub("[^,]*,([^]]*)\\]", "\\1", labs) ))
fila <- as.integer(tabla.intervalos[tabla.intervalos$Freq==max(tabla.intervalos$Freq),][1])
# Se identifica el valor mínimo del rango modal
li <- labs[fila, 1]
# Se identifica el valor de la amplitud del intervalo modal
ti <- labs[fila, 2] - labs[fila,1]
# Se identifica la frecuencia del intervalo modal
fi <- tabla.intervalos[fila, 2]
# Se identifica la frecuencia del intervalo anterior al intervalo modal
fh <- ifelse(fila == 1, 0, tabla.intervalos[fila - 1, 2])
# Se identifica la frecuencia del intervalo siguiente al intervalo modal
fj <- ifelse(fila == breaks, 0, tabla.intervalos[fila + 1, 2])
# Se calcula la moda, usando la ecuación descrita antes
return(li+ti*((fi-fh)/(2*fi-fh-fj)))
}
Se muestra un ejemplo usando la distribución gamma:
n <- 1000000
a <- rgamma(n, shape = 2, scale = 5) #Se crea una simulación de n escenarios con distribución gamma
hist(a,breaks = 50) # Se pinta el histograma de la simulación realizada
abline(v = modgr(a, breaks=1000), col='red') # Se traza una línea vertical roja en el punto de la moda
abline(v = mean(a), col='green') # Se traza una línea vertical verde en el punto de la media
modgrSi se quiere tener la función modgr instalada se puede instalar el paquete jblib que tiene esta función incorporada:
if (!require("devtools")) install.packages("devtools")
library(devtools)
devtools::install_github("jabernalv/jblib")
Ahora se puede cargar la librería jblib:
library(jblib)
E invocar la función modgr
?modgr