503 Stimmen

Wie findet man den statistischen Modus?

In R, mean() y median() sind Standardfunktionen, die das tun, was Sie erwarten. mode() gibt den internen Speichermodus des Objekts an, nicht den Wert, der am häufigsten in seinem Argument vorkommt. Aber gibt es eine Standardbibliotheksfunktion, die den statistischen Modus für einen Vektor (oder eine Liste) implementiert?

511voto

Ken Williams Punkte 21163

Eine weitere Lösung, die sowohl für numerische als auch für Zeichen-/Faktordaten funktioniert:

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

Auf meinem kleinen Rechner kann ich den Modus eines 10M-ganzzahligen Vektors in etwa einer halben Sekunde erzeugen und finden.

Wenn Ihr Datensatz mehrere Modi haben könnte, verfolgt die obige Lösung denselben Ansatz wie which.max und gibt die Erstes Auftauchen Wert der Menge der Modi. Zur Rückgabe alle Modi, verwenden Sie diese Variante (von @digEmAll in den Kommentaren):

Modes <- function(x) {
  ux <- unique(x)
  tab <- tabulate(match(x, ux))
  ux[tab == max(tab)]
}

77voto

Dan Punkte 5678

Habe dies auf der r-Mailingliste gefunden, hoffe es ist hilfreich. Es ist auch das, was ich sowieso gedacht habe. Du willst die Daten in eine Tabelle() einfügen, sortieren und dann den ersten Namen auswählen. Es ist hackish aber sollte funktionieren.

names(sort(-table(x)))[1]

76voto

George Dontas Punkte 28585

Es gibt ein Paket modeest die Schätzer für den Modus univariater unimodaler (und manchmal multimodaler) Daten und Werte für die Modi üblicher Wahrscheinlichkeitsverteilungen liefern.

mySamples <- c(19, 4, 5, 7, 29, 19, 29, 13, 25, 19)

library(modeest)
mlv(mySamples, method = "mfv")

Mode (most likely value): 19 
Bickel's modal skewness: -0.1 
Call: mlv.default(x = mySamples, method = "mfv")

Für weitere Informationen siehe このページ

63voto

jprockbelly Punkte 1492

Ich fand Ken Williams Beitrag oben zu groß sein, fügte ich ein paar Zeilen für NA-Werte zu berücksichtigen und machte es eine Funktion für Leichtigkeit.

Mode <- function(x, na.rm = FALSE) {
  if(na.rm){
    x = x[!is.na(x)]
  }

  ux <- unique(x)
  return(ux[which.max(tabulate(match(x, ux)))])
}

45voto

Rasmus Bååth Punkte 4477

Eine schnelle und schmutzige Methode zur Schätzung des Modus eines Vektors von Zahlen, von denen man annimmt, dass sie aus einer kontinuierlichen univariaten Verteilung (z. B. einer Normalverteilung) stammen, ist die Definition und Verwendung der folgenden Funktion:

estimate_mode <- function(x) {
  d <- density(x)
  d$x[which.max(d$y)]
}

Dann wird der Modus geschätzt:

x <- c(5.8, 5.6, 6.2, 4.1, 4.9, 2.4, 3.9, 1.8, 5.7, 3.2)
estimate_mode(x)
## 5.439788

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X