En R, mean()
y median()
son funciones estándar que hacen lo que cabría esperar. mode()
le dice el modo de almacenamiento interno del objeto, no el valor que ocurre más en su argumento. Pero, ¿existe una función de biblioteca estándar que implemente el modo estadístico para un vector (o lista)?
r
statistics
r-faq
Mella
fuente
fuente
mode
lo mismo que la funciónclass
?Respuestas:
Una solución más, que funciona para datos numéricos y de caracteres / factores:
En mi pequeña máquina pequeña, eso puede generar y encontrar el modo de un vector entero de 10M en aproximadamente medio segundo.
Si su conjunto de datos puede tener múltiples modos, la solución anterior toma el mismo enfoque
which.max
y devuelve el valor que aparece por primera vez del conjunto de modos. Para devolver todos los modos, use esta variante (de @digEmAll en los comentarios):fuente
c(1,1,2,2)
). Debería cambiar su última línea con:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
ux[which.max(tabulate(match(x, ux)))]
con solomax(tabulate(match(x, ux)))
.Mode(1:3)
da1
yMode(3:1)
da3
, por lo que el modo devuelve el elemento más frecuente o el primero si todos son únicos.0
oNA
en esos casos.Hay paquete
modeest
que proporciona estimadores del modo de datos univariados unimodales (y a veces multimodales) y valores de los modos de distribuciones de probabilidad habituales.Para más información ver esta página
fuente
mfv(mySamples)[1]
. El1
ser importante ya que en realidad devuelve el valor más frecuente s .mfv(mySamples)
Encontré esto en la lista de correo, espero que sea útil. También es lo que estaba pensando de todos modos. Querrás poner en la tabla () los datos, ordenarlos y luego elegir el nombre. Es hack pero debería funcionar.
fuente
Encontré que la publicación de Ken Williams anterior es excelente, agregué algunas líneas para tener en cuenta los valores de NA y la convertí en una función fácil.
fuente
Una forma rápida y sucia de estimar el modo de un vector de números que cree que provienen de una distribución univariada continua (por ejemplo, una distribución normal) es definir y utilizar la siguiente función:
Luego para obtener el modo estimado:
fuente
set.seed(1); a<-runif(100); mode<-density(a)$x[which.max(density(a)$y)]; abline(v=mode)
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
density
. Sin embargo, si solo tiene un punto de datos, el valor de ese punto de datos probablemente será su mejor suposición para el modo de todos modos ...estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } }
estoy probando el método para estimar la dirección predominante del viento, en lugar de la media de la dirección usando el promedio vectorial con paquete circular. I ', trabajando con puntos sobre un grado de polígono, entonces, a veces solo hay un punto con dirección. ¡Gracias!La siguiente función viene en tres formas:
method = "mode" [default]: calcula el modo para un vector unimodal, de lo contrario devuelve un
método NA = "nmodes": calcula el número de modos en el vector
method = "modes": enumera todos los modos para unimodal o polimodal vector
fuente
method = 'modes'
. Luego, la función devuelve todos los valores únicos, sin embargo, en realidad no hay modo, por lo que debería volverNA
en su lugar. Agregaré otra respuesta que contenga una versión ligeramente optimizada de su función, ¡gracias por la inspiración!Aquí, otra solución:
fuente
Todavía no puedo votar, pero la respuesta de Rasmus Bååth es lo que estaba buscando. Sin embargo, lo modificaría un poco, lo que permitiría contrainformar la distribución, por ejemplo, para valores solo entre 0 y 1.
Sabemos que es posible que no desee restringir en absoluto su distribución, luego establezca desde = - "BIG NUMBER" a = "BIG NUMBER"
fuente
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
Una pequeña modificación a la respuesta de Ken Williams, agregando parámetros opcionales
na.rm
yreturn_multiple
.A diferencia de las respuestas en las que se basa
names()
, esta respuesta mantiene el tipo de datos dex
los valores devueltos.Para mostrar que funciona con los parámetros opcionales y mantiene el tipo de datos:
Gracias a @Frank por la simplificación.
fuente
He escrito el siguiente código para generar el modo.
Vamos a intentarlo:
fuente
Basado en la función de @ Chris para calcular el modo o las métricas relacionadas, sin embargo, utilizando el método de Ken Williams para calcular las frecuencias. Este proporciona una solución para el caso de ningún modo en absoluto (todos los elementos igualmente frecuentes) y algunos
method
nombres más legibles .Dado que utiliza el método de Ken para calcular las frecuencias, el rendimiento también está optimizado, utilizando la publicación de AkselA comparé algunas de las respuestas anteriores para mostrar cómo mi función está cerca del rendimiento de Ken, con los condicionales para las diversas opciones de salida que causan solo una sobrecarga menor:
fuente
Mode
función que se encuentra en elpracma
paquete. ¿Le importaria explicar?pracma
paquete se refiere? La versión 1.9.3 tiene una implementación completamente diferente por lo que puedo ver.Este truco debería funcionar bien. Te da el valor y el conteo del modo:
fuente
R tiene tantos paquetes adicionales que algunos de ellos pueden proporcionar el modo [estadístico] de una lista numérica / serie / vector.
¡Sin embargo, la biblioteca estándar de R en sí no parece tener un método tan integrado! Una forma de evitar esto es usar alguna construcción como la siguiente (y convertir esto en una función si la usa a menudo ...):
Para una lista de muestra más grande, uno debería considerar usar una variable temporal para el valor máximo (tabSmpl) (no sé si R optimizaría esto automáticamente)
Referencia: consulte "¿Qué tal la mediana y la moda?" en esta lección de KickStarting R
Esto parece confirmar que (al menos al momento de escribir esta lección) no hay una función de modo en R (bueno ... el modo () como descubriste se usa para afirmar el tipo de variables )
fuente
Esto funciona bastante bien
fuente
Aquí hay una función para encontrar el modo:
fuente
A continuación se muestra el código que se puede usar para encontrar el modo de una variable vectorial en R.
fuente
Hay múltiples soluciones proporcionadas para este. Revisé el primero y luego escribí el mío. Publicarlo aquí si ayuda a alguien:
Vamos a probarlo con algunos ejemplos. Estoy tomando el
iris
conjunto de datos. Vamos a probar con datos numéricosque puedes verificar es correcto.
Ahora el único campo no numérico en el conjunto de datos del iris (Especie) no tiene modo. Probemos con nuestro propio ejemplo
EDITAR
Como se menciona en los comentarios, el usuario puede querer conservar el tipo de entrada. En cuyo caso, la función de modo se puede modificar para:
La última línea de la función simplemente coacciona el valor del modo final al tipo de la entrada original.
fuente
y[,1] <- sort(unique(x))
Usaría la función densidad () para identificar un máximo suavizado de una distribución (posiblemente continua):
donde x es la recopilación de datos. Preste atención al parámetro de ajuste de la función de densidad que regula el suavizado.
fuente
Si bien me gusta la función simple de Ken Williams, me gustaría recuperar los modos múltiples si existen. Con eso en mente, uso la siguiente función que devuelve una lista de los modos si es múltiple o único.
fuente
mode
devuelve una lista con varios valores, entonces r [1] no es el primer valor; en cambio, es una lista de longitud 1 que contiene el primer valor y debe hacer r [[1]] para obtener el primer modo como un número y no como una lista. Ahora, cuando hay un modo único, su r no es una lista, por lo que r [1] funciona, por eso pensé que era inconsistente. Pero dado que r [[1]] también funciona cuando r es un vector simple, en realidad hay una consistencia que no me había dado cuenta de que siempre se puede usar[[
para acceder a los elementos.Estaba examinando todas estas opciones y comencé a preguntarme acerca de sus características y actuaciones relativas, así que hice algunas pruebas. En caso de que alguien más tenga curiosidad por lo mismo, estoy compartiendo mis resultados aquí.
Como no quería preocuparme por todas las funciones publicadas aquí, decidí centrarme en una muestra basada en algunos criterios: la función debería funcionar tanto en vectores de caracteres, factores, lógicos y numéricos, debería tratar los NA y otros valores problemáticos de manera adecuada, y la salida debe ser "sensata", es decir, sin números como caracteres u otras tonterías.
También agregué una función propia, que se basa en la misma
rle
idea que la de chrispy, excepto que está adaptada para un uso más general:Terminé ejecutando cinco funciones, en dos conjuntos de datos de prueba, a través
microbenchmark
. Los nombres de las funciones se refieren a sus respectivos autores:La función de Chris se estableció en
method="modes"
yna.rm=TRUE
de forma predeterminada para que sea más comparable, pero aparte de eso, las funciones se usaron tal como las presentaron sus autores.Solo en cuestión de velocidad, la versión de Kens gana fácilmente, pero también es el único de estos que solo informará un modo, sin importar cuántos haya realmente. Como suele ser el caso, hay una compensación entre velocidad y versatilidad. En
method="mode"
, la versión de Chris devolverá un valor si hay un modo, de lo contrario NA. Creo que es un buen toque. También creo que es interesante cómo algunas funciones se ven afectadas por un mayor número de valores únicos, mientras que otras no lo son tanto. No he estudiado el código en detalle para entender por qué, aparte de eliminar la lógica / numérica como la causa.fuente
El modo no puede ser útil en todas las situaciones. Entonces la función debería abordar esta situación. Prueba la siguiente función.
Salida,
fuente
Esto se basa en la respuesta de jprockbelly, al agregar una velocidad para vectores muy cortos. Esto es útil cuando se aplica el modo a un data.frame o datatable con muchos grupos pequeños:
fuente
Otra opción simple que da todos los valores ordenados por frecuencia es usar
rle
:fuente
Otra posible solución:
Uso:
Salida:
fuente
Me caso de que sus observaciones son las clases de números reales y se puede esperar que el modo de ser de 2,5 cuando sus observaciones son 2, 2, 3 y 3 Posteriormente, se podría estimar el modo en
mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)
donde L1 ..lower límite de la mayoría de clase frecuentes, f1 . .frecuencia de la clase más frecuente, f0 ..frecuencia de clases antes de la clase más frecuente, f2 ..frecuencia de clases después de la clase más frecuente e i .. Intervalo de clase como se da, por ejemplo, en 1 , 2 , 3 :En caso de que desee el nivel más frecuente y tenga más de un nivel más frecuente, puede obtenerlos todos, por ejemplo, con:
fuente
Agregar un posible enfoque de data.table
fuente
Aquí hay varias formas de hacerlo en tiempo de ejecución Theta (N)
fuente
Podría probar la siguiente función:
fuente
El modo de cálculo es principalmente en el caso de la variable de factor, entonces podemos usar
HouseVotes84 es un conjunto de datos disponible en el paquete 'mlbench'.
le dará el valor máximo de la etiqueta. es más fácil de usar por funciones incorporadas sin escribir la función.
fuente
Me parece que si una colección tiene un modo, sus elementos pueden asignarse uno a uno con los números naturales. Por lo tanto, el problema de encontrar el modo se reduce a producir dicho mapeo, encontrar el modo de los valores mapeados y luego volver a mapear algunos de los elementos de la colección. (El tratamiento se
NA
produce en la fase de mapeo).Tengo una
histogram
función que opera en un director similar. (Las funciones y operadores especiales utilizados en el código presentado en este documento deben definirse en Shapiro y / o neatOveRse . Las partes de Shapiro y neatOveRse duplicadas en este documento se duplican con permiso; los fragmentos duplicados se pueden usar bajo los términos de este sitio. ) R pseudocódigo parahistogram
is(Los operadores binarios especiales logran tuberías , curry y composición ) También tengo una
maxloc
función, que es similar awhich.max
, pero devuelve todos los máximos absolutos de un vector. R pseudocódigo paramaxloc
isEntonces
y
calculará el modo de cualquier colección, siempre que se
map
definan las funciones apropiadas de -ping yunmap
-ping.fuente