Mostrando entradas con la etiqueta Moda. Mostrar todas las entradas
Mostrando entradas con la etiqueta Moda. Mostrar todas las entradas

2015-02-09

Múltiples modas en R

Title En una entrada anterior calculamos la moda usando la función mlv del paquete modeest. En esta entrada veremos cómo obtener varias modas cuando el valor más frecuente no es único.

# Si modeest no está instalado y cargado
install.packages("modeest") 
library(modeest)

Problema

Cuando existen múltiples valores con la misma frecuencia, mlv devuelve la media de dichos valores. Por ejemplo en la columna Girth del data frame trees.

mlv(trees$Girth, method = "mfv")[1]
$M
[1] 13.325
El valor anterior no existe en nuestros datos. Es el promedio de las múltiples modas: 11, 11,4, 12,9 y 18.

Solución

Para obtener los valores correspondientes a las múltiples modas, emplearemos dos opciones: funciones del paquete base o del paquete dplyr.

  • Paquete base

# base-package
trees_nuevo <- subset(data.frame(table(trees$Girth)), Freq == max(Freq))
   Var1 Freq
7    11    2
11 11.4    2
14 12.9    2
26   18    2
mean(as.numeric(as.character(trees_nuevo$Var1))) # factor a numérico
[1] 13.325
  • Paquete dplyr

# dplyr
trees_nuevo <- trees %>% 
                count(Girth) %>%
                filter(n == max(n)) 
Source: local data frame [4 x 2]

  Girth n
1  11.0 2
2  11.4 2
3  12.9 2
4  18.0 2
mean(trees_nuevo$Girth)
[1] 13.325

Entradas relacionadas

2015-01-22

Medidas de tendencia central en histogramas en R: moda

Title En esta entrada añadiremos a los histogramas otra medida de tendencia central: la moda. Completamos así una entrada anterior en la que añadimos la media y la mediana.

Asimétrica negativa o a la izquierda

media < mediana < moda

    rbeta(n, 5, 2)

Simétrica

media = mediana = moda

    rbeta(n, 5, 5)

Asimétrica positiva o a la derecha

media > mediana > moda

    rbeta(n, 2, 5)
    parámetro x de legend = "topright"

Código

Instalamos y cargamos el paquete modeest, para calcular la moda de las distribuciones con las funciones betaMode y normMode.

install.packages("modeest")
library(modeest)
Empleamos la función de densidad de beta:

dbeta(x, shape1, shape2, ncp = 0, log = FALSE)

Modificaremos los parámetros de la distribución beta a (shape1) y b (shape2) para alterar la forma de la distribución y que sea asimétrica negativa, simétrica o asimétrica positiva.

Asimétrica negativa: shape1 = 5, shape2 =2
Simétrica: shape1 = 5, shape2 =5
Asimétrica positiva: shape1 = 2, shape2 =5

# Ejemplo: asimétrica negativa
set.seed(2014)
vble  <- rbeta(1000000, 5, 2) # Parametros a modificar

# Histograma
hist(vble, 
     prob = TRUE,
     xlim = c(0, 1),
     col = "slategray2",
     border = "white",
     main = "Asimetría negativa", 
     xlab = "", 
     las = 1) 

# Función de densidad
lines(density(vble), # density plot
      lwd = 2, # thickness of line
      col = "darkblue")

# Líneas
  # Media
mean  <- mean(vble)
segments(x0 = mean, y0 = 0, 
         x1 = mean, y1 = dbeta(mean, 5, 2), # Parametros a modificar
         col = "blue", lwd = 2) # lty = 3 dotted line
  # Mediana
median <-  median(vble)
segments(x0 = median, y0 = 0, 
         x1 = median, y1 = dbeta(median, 5, 2), # Parametros a modificar
         col = "red", lwd = 2)
  # Moda
mode <- betaMode(5, 2)
segments(x0 = mode, y0 = 0, x1 = mode, 
         y1 = dbeta(mode, 5, 2), 
         col = "orange", lwd = 2)

# Leyenda
legend(x = "topleft", # Ubicación de la leyenda
       c("Función de densidad", "Media", "Mediana"),
       col = c("darkblue", "blue", "red"),
       lwd = c(2, 2, 2),
       bty = "n")

Alternativa

Podemos añadir las líneas de la media y mediana mediante la función abline. La diferencia respecto al ejemplo anterior con segments es que la línea cortará a la función de densidad pues es infinita.

set.seed(2014)
vble  <- rnorm(n = 1000000) 
hist(vble, 
     prob = TRUE,
     xlim = c(-3,3), 
     ylim = c(0, .4),
     col = "slategray2",
     border = "white",
     main = "Simétrica", 
     xlab = "", 
     las = 1) 

# Función de densidad
lines(density(vble), # density plot
      lwd = 2, # thickness of line
      col = "darkblue")
# Media
abline(v = mean(vble),
       col = "blue",
       lwd = 2)
# Mediana
abline(v = median(vble),
       col = "red",
       lwd = 2)
# Mode
abline(v = normMode(),
       col = "orange",
       lwd = 2)

Entradas relacionadas

  • Calcular la moda en R usando el paquete modeest
  • Medidas de tendencia central en histogramas en R: media y mediana
  • Generar una distribución normal aleatoria en R
  • Operaciones básicas con la distribución normal en R
  • 2015-01-20

    Calcular la moda en R usando el paquete modeest

    Title R no dispone de una función en su paquete base que nos permita calcular la moda. La función mode devuelve el tipo o modo de almacenamiento de un objeto. Hay múltiples formas de calcular la moda haciendo uso de otras funciones de R. Sin embargo, ahora optamos por cargar el paquete modeest y usar la función mlv que devuelve el valor de un vector numérico.

    # Si modeest no está instalado y cargado
    install.packages("modeest") 
    library(modeest)
    
    Usamos como ejemplo el data frame trees.

    mlv(trees$Volume, method = "mfv") # O mlv(trees$Volume, method = "discrete")
    
    Mode (most frequent value): 10.3 
    Bickel's modal skewness: 0.8709677 
    Call: mlv.default(x = trees$Volume, method = "discrete") 
    
    Si tan sólo queremos el valor más frecuente:

    mlv(trees$Volume, method = "mfv")[1]
    

    Calcular la moda de múltiples columnas

    apply(trees, 2, mlv,  method = "mfv")
    
    $Girth
    Mode (most frequent value): 13.325 
    Bickel's modal skewness: -0.1612903 
    Call: mlv.default(x = newX[, i], method = "discrete") 
    
    $Height
    Mode (most frequent value): 80 
    Bickel's modal skewness: -0.3870968 
    Call: mlv.default(x = newX[, i], method = "discrete") 
    
    $Volume
    Mode (most frequent value): 10.3 
    Bickel's modal skewness: 0.8709677 
    Call: mlv.default(x = newX[, i], method = "discrete") 
    

    Entradas relacionadas

    2014-08-06

    Moda de serie alfanumérica y duplicados en un rango

    Anteriormente vimos cómo calcular el valor más repetido en una serie de datos en la que no hay ningún valor exactamente igual. Esta vez queremos calcular la moda de una serie de valores de texto.

    La función MODA no funciona con texto. Tenemos que recurrir introducir otras funciones para obtener el resultado deseado.

    C1 = INDICE(A2:A19;MODA(COINCIDIR(A2:A17;A2:A17;0)))
    D1 = CONTAR.SI(A2:A19;C2)

    Duplicados en un rango

    En D1 tenemos el número de repeticiones del texto encontrado en C1. Para obtener el número máximo de repeticiones o duplicados en un rango (tanto texto como números), usamos la siguiente fórmula matricial (Ctrl+Mayús+Entrar):

    {=MAX(CONTAR.SI(A2:A19;A2:A19))}

    Referencias

    Most Frequently Occurring Word

    2014-06-27

    Valor más repetido aproximado en datos sin moda.

    La moda es el valor que se repite con más frecuencia en una matriz o rango de datos. En Excel lo calculamos fácilmente con la fórmula MODA. Pero cuando todos los valores son diferentes y no hay moda, ¿cómo podemos calcular el valor aproximadamente más repetido?

    En nuestro ejemplo tenemos una serie original de números, todos diferentes. Si queremos calcular el valor aproximado más repetido tenemos que recurrir a redondear (un decimal en nuestro ejemplo) o truncar el número decimal. Si truncamos, convertimos el número en entero sin redondearlo (14,5 se convierte en 14 no en 15). Podemos usar columnas auxiliares como la B o C, o directamente usar una fórmula.

    Compara con:

    =MODA(REDONDEAR(A2:A11;0))=15
    =MODA(REDONDEAR.MENOS(A2:A11;0))=10, equivalente de truncar.

    Porcentajes

    En el caso de porcentajes no podemos usar la función truncar pues convertiría en ceros todos los números. Usamos la función redondear. Elegimos el número de decimales de acuerdo a la precisión deseada o necesidades.

    ¿Cuántas veces se repite?

    Otro pregunta adicional es saber cuantas veces se repite dicho número. En condiciones normales o con columnas auxiliares con los números redondeados bastaría con la función CONTAR.SI. En este caso usamos la función SUMAR PRODUCTO.

    Empleamos el doble operador negativo(double unary operator) para convertir los valores lógicos en numéricos positivos. Es la alternativa más rápida. Aunque es poco probable encontrar una situación en la que obtengamos una ganancia significativa por ello. Otras alternativas son:

    =SUMAPRODUCTO(N((REDONDEAR(A2:A11;1)=A14)))
    =SUMAPRODUCTO(0+(REDONDEAR(A2:A11;1)=A14))
    =SUMAPRODUCTO(1*(REDONDEAR(A2:A11;1)=A14))
    =SUMAPRODUCTO((REDONDEAR(A2:A11;1)=A14)^1)

    Referencias:
    Moda

    Nube de datos