Estimar la moda en R

Estadística con R Medidas de tendencia central
Calcular la moda en R de datos discretos o continuos

La moda es una medida de localización que se define como el valor más probable de una variable aleatoria o como el valor más frecuente de un conjunto de observaciones. Es una medida robusta que coincide con la media y con la mediana en distribuciones simétricas. En este tutorial revisaremos como calcular la moda en R tanto para variables unidimensionales tanto discretas como continuas.

Estimación unimodal discreta

Considera que tienes el siguiente vector x:

x <- c(1, 5, 1, 6, 2, 1, 6, 7, 1)

La moda se calcula como el valor más repetido dentro de la variable, que en este caso es 1. Una manera sencilla de calcular la moda en R es usar la siguiente función:

mode <- function(x) {
   return(as.numeric(names(which.max(table(x)))))
}

En este caso, podemos comprobar que la moda es 1 pasando el vector a la función:

mode(x) # 1

Si queremos visualizar el número de veces que se repite cada dato también podemos crear un gráfico de barras:

barplot(table(x), col = c(4, rep("gray", 4)))
legend("topright", "Moda", fill = 4)

Valor más repetido o frecuente en el gráfico de barras

Estimación unimodal continua

Si nuestra variable de interés es continua en lugar de discreta no podremos utilizar el procedimiento anterior, sino que debemos recurrir a otro método. El procedimiento más habitual en la literatura es calcular el máximo de la estimación de la función de densidad de los datos mediante algún algoritmo.

Consideremos los siguientes datos normales (unimodales) con media 0 y desviación típica 1. Como la distribución normal es simétrica, sabemos que la media, la mediana y la moda son iguales (0).

set.seed(1234)
x2 <- rnorm(1000)

Para visualizar las modas podemos dibujar el histograma y la estimación de la función de densidad de los datos. Ten en cuenta que la selección del parámetro ventana determinará la forma de la densidad estimada.

# Histograma
hist(x2, freq = FALSE)
# Densidad
dx <- density(x2)
lines(dx$x, dx$y, col = 2, lwd = 2)
# Moda teórica
abline(v = 0, col = 4, lty = 2, lwd = 3)

Histograma, densidad y la moda en datos discretos

Para realizar el cálculo recomendamos recurrir a la función mlv de la librería modeest, que nos permite seleccionar entre diferentes algoritmos. Nosotros aconsejamos utilizar el algoritmo mean-shift como se indica en el siguiente bloque.

# install.packages("modeest")
library(modeest)

# Moda
mlv(x2, method = "meanshift") # -0.03912067

Podemos observar que la moda estimada (-0.039) es muy próxima a la moda teórica (0). Otros métodos disponibles son “lientz”, “naive”, “venter”, “grenander”, “hsm”, “parzen”, “tsybakov” y “asselin”.

Estimación multimodal discreta

A diferencia de la mediana o la media, la moda puede tomar varios valores a la vez. Como ejemplo, considera el vector y, donde hay dos modas.

y <- c(3, 5, 3, 3, 5, 6, 5)

# Histograma
hist(y)

Datos discretos multimodales

En este caso los valores más repetidos son 3 y 5. Para calcular varias modas podemos recurrir a la función mlv del paquete modeest y aplicar el método mfv.

# install.packages("modeest")
library(modeest)

# Modas
mlv(y, method = "mfv") # 3 5 

Estimación multimodal continua

Si queremos calcular varias modas en el caso de tener una variable continua podemos recurrir a la función locmodes de la librería multimode.

Considera los siguientes datos multimodales, cuyas modas teóricas son 40 y 120, representadas con líneas rojas verticales.

n <- 1000
bin <- rbinom(n, 1, 0.6)
y2 <- rnorm(n, mean = 120, sd = 11) * bin +
      rnorm(n, mean = 40, sd = 5) * (1 - bin)

# Histograma
hist(y2)
# Moda teórica 1
abline(v = 40, col = 2, lwd = 2) 
# Moda teórica 2
abline(v = 120, col = 2, lwd = 2)

Estimación multimodal en R

A los datos anteriores les podemos aplicar la función locmodes, indicando el número de modas que esperamos encontrar en el argumento mod0.

# install.packages("multimode")
library(multimode)

modas <- locmodes(y2, mod0 = 2)
modas
Estimated location
Modes: 40.56825  120.8625 
Antimode: 69.94661 

Estimated value of the density
Modes: 0.02535653  0.02033563 
Antimode: 8.184294e-08 

Critical bandwidth: 3.746696

Warning message:
In locmodes(y, mod0 = 2) :
  If the density function has an unbounded support, artificial modes may have been created in the tails

En la salida anterior podemos observar que las modas estimadas son 40.57 y 120.86, muy próximas a los valores teóricos.

La librería también incorpora un método S3 para dibujar las estimaciones que devuelve la función locmodes, indicando la localización de las modas y de las antimodas, así como la ventana utilizada.

plot(modas)

Estimación de varias modas en R con datos continuos

La librería también incluye la función modetest, para contrastar la existencia de multimodalidad en los datos, así como funciones para explorar el número de modas, entre ellas se encuentran las funciones modetree, modeforest y sizes.