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 鈥渓ientz鈥, 鈥渘aive鈥, 鈥渧enter鈥, 鈥済renander鈥, 鈥渉sm鈥, 鈥減arzen鈥, 鈥渢sybakov鈥 y 鈥渁sselin鈥.

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.