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)))
}

Ejemplo:

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

Instalación de librería que trae la función modgr

Si 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