In R mean()
und median()
sind Standardfunktionen, die das tun, was Sie erwarten. mode()
Gibt den internen Speichermodus des Objekts an, nicht den Wert, der in seinem Argument am häufigsten vorkommt. Aber gibt es eine Standardbibliotheksfunktion, die den statistischen Modus für einen Vektor (oder eine Liste) implementiert?
r
statistics
r-faq
Nick
quelle
quelle
mode
mit der Funktion identischclass
?Antworten:
Eine weitere Lösung, die sowohl für numerische als auch für Zeichen- / Faktordaten funktioniert:
Auf meiner kleinen Maschine kann das den Modus eines 10M-Integer-Vektors in etwa einer halben Sekunde erzeugen und finden.
Wenn Ihr Datensatz möglicherweise mehrere Modi hat, verwendet die obige Lösung denselben Ansatz wie
which.max
und gibt den zuerst erscheinenden Wert des Satzes von Modi zurück. Verwenden Sie diese Variante, um alle Modi zurückzugeben (von @digEmAll in den Kommentaren):quelle
c(1,1,2,2)
. B. ) nicht alle Modi zurück . Sie sollten Ihre letzte Zeile ändern mit:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
ux[which.max(tabulate(match(x, ux)))]
mit nurmax(tabulate(match(x, ux)))
.Mode(1:3)
gibt1
undMode(3:1)
gibt3
, also gibt Mode das häufigste oder das erste Element zurück, wenn alle eindeutig sind.0
oderNA
in diesen Fällen.Es gibt ein Paket,
modeest
das Schätzer für den Modus univariater unimodaler (und manchmal multimodaler) Daten und Werte der Modi üblicher Wahrscheinlichkeitsverteilungen bereitstellt.Weitere Informationen finden Sie auf dieser Seite
quelle
mfv(mySamples)[1]
. Das1
ist wichtig, da es tatsächlich den häufigsten Wert s zurückgibt .mfv(mySamples)
fand dies auf der r Mailingliste, hoffe es ist hilfreich. Es ist auch das, was ich sowieso gedacht habe. Sie möchten die Daten tabellieren (), sortieren und dann den Vornamen auswählen. Es ist hackisch, sollte aber funktionieren.
quelle
Ich fand den obigen Beitrag von Ken Williams großartig. Ich habe ein paar Zeilen hinzugefügt, um die NA-Werte zu berücksichtigen, und ihn zur Vereinfachung gemacht.
quelle
Eine schnelle und schmutzige Methode zur Schätzung des Modus eines Zahlenvektors, von dem Sie glauben, dass er aus einer kontinuierlichen univariaten Verteilung (z. B. einer Normalverteilung) stammt, besteht darin, die folgende Funktion zu definieren und zu verwenden:
Um dann die Modusschätzung zu erhalten:
quelle
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
. Wenn Sie jedoch nur einen Datenpunkt haben, ist der Wert dieses Datenpunkts wahrscheinlich sowieso Ihre beste Vermutung für den Modus ...estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } }
Ich teste die Methode zur Schätzung des Windes in vorherrschender Richtung anstelle des Richtungsmittelwerts unter Verwendung des vektoriellen Durchschnitts mit kreisförmigem Paket. Ich arbeite mit Punkten über einer Polygonnote, daher gibt es manchmal nur einen Punkt mit Richtung. Vielen Dank!Die folgende Funktion gibt es in drei Formen:
method = "mode" [Standard]: Berechnet den Modus für einen unimodalen Vektor, andernfalls wird eine NA zurückgegeben.
method = "nmodes": Berechnet die Anzahl der Modi im Vektor.
method = "mode": Listet alle Modi für einen unimodalen oder polymodalen Vektor auf Vektor
quelle
method = 'modes'
. Dann gibt die Funktion alle eindeutigen Werte zurück, es gibt jedoch keinen Modus, sodass sieNA
stattdessen zurückgegeben werden sollte. Ich werde eine weitere Antwort hinzufügen, die eine leicht optimierte Version Ihrer Funktion enthält, danke für die Inspiration!Hier eine andere Lösung:
quelle
Ich kann noch nicht abstimmen, aber Rasmus Bååths Antwort ist genau das, wonach ich gesucht habe. Ich würde es jedoch ein wenig modifizieren, um die Verteilung beispielsweise für Werte nur zwischen 0 und 1 einzuschränken.
Wir sind uns bewusst, dass Sie Ihre Verteilung möglicherweise nicht einschränken möchten, und setzen Sie dann von = - "BIG NUMBER" auf = "BIG NUMBER".
quelle
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
Eine kleine Änderung an Ken Williams 'Antwort, die optionale Parameter
na.rm
undreturn_multiple
.Im Gegensatz zu den Antworten, auf die
names()
sich diese Antwort stützt , behält diese Antwort den Datentypx
der zurückgegebenen Werte bei.Um zu zeigen, dass es mit den optionalen Parametern funktioniert und den Datentyp beibehält:
Vielen Dank an @Frank für die Vereinfachung.
quelle
Ich habe den folgenden Code geschrieben, um den Modus zu generieren.
Lass es uns versuchen:
quelle
Basierend auf der Funktion von @ Chris zur Berechnung des Modus oder verwandter Metriken, jedoch unter Verwendung der Methode von Ken Williams zur Berechnung der Frequenzen. Dieser bietet eine Lösung für den Fall, dass überhaupt keine Modi vorhanden sind (alle Elemente gleich häufig) und einige besser lesbare
method
Namen.Da die Methode zur Berechnung der Frequenzen nach Ken verwendet wird, wird auch die Leistung optimiert. Mit dem Beitrag von AkselA habe ich einige der vorherigen Antworten verglichen, um zu zeigen, wie nahe meine Funktion an der Leistung von Ken liegt, wobei die Bedingungen für die verschiedenen Ausgangsoptionen nur einen geringen Overhead verursachen:
quelle
Mode
impracma
Paket enthaltenen Funktion zu sein. Möchtest du das erklären?pracma
Pakets beziehen Sie sich? Version 1.9.3 hat, soweit ich sehen kann, eine völlig andere Implementierung.Dieser Hack sollte gut funktionieren. Gibt Ihnen den Wert sowie die Anzahl der Modi:
quelle
R hat so viele Add-On-Pakete, dass einige von ihnen möglicherweise den [statistischen] Modus einer numerischen Liste / Serie / eines Vektors bereitstellen.
Die Standardbibliothek von R selbst scheint jedoch keine solche eingebaute Methode zu haben! Eine Möglichkeit, dies zu umgehen, besteht darin, ein Konstrukt wie das folgende zu verwenden (und dies in eine Funktion umzuwandeln, wenn Sie es häufig verwenden ...):
Für eine größere Beispielliste sollte eine temporäre Variable für den Maximalwert (tabSmpl) verwendet werden (ich weiß nicht, dass R dies automatisch optimieren würde).
Referenz: siehe "Wie wäre es mit Median und Modus?" in dieser KickStarting R-Lektion
Dies scheint zu bestätigen, dass (zumindest zum Zeitpunkt des Schreibens dieser Lektion) in R keine Modusfunktion vorhanden ist (nun ... mode (), wie Sie herausgefunden haben, wird zum Aktivieren des Variablentyps verwendet ).
quelle
Das funktioniert ganz gut
quelle
Hier ist eine Funktion, um den Modus zu finden:
quelle
Unten ist der Code, mit dem der Modus einer Vektorvariablen in R ermittelt werden kann.
quelle
Für diese gibt es mehrere Lösungen. Ich habe den ersten überprüft und danach meinen eigenen geschrieben. Poste es hier, wenn es jemandem hilft:
Testen wir es anhand einiger Beispiele. Ich nehme den
iris
Datensatz. Testet mit numerischen Datenwas Sie überprüfen können, ist korrekt.
Jetzt hat das einzige nicht numerische Feld im Iris-Datensatz (Species) keinen Modus. Lassen Sie uns mit unserem eigenen Beispiel testen
BEARBEITEN
Wie in den Kommentaren erwähnt, möchte der Benutzer möglicherweise den Eingabetyp beibehalten. In diesem Fall kann die Modusfunktion geändert werden in:
Die letzte Zeile der Funktion erzwingt einfach den endgültigen Moduswert zum Typ der ursprünglichen Eingabe.
quelle
y[,1] <- sort(unique(x))
Ich würde die Dichte () -Funktion verwenden, um ein geglättetes Maximum einer (möglicherweise kontinuierlichen) Verteilung zu identifizieren:
Dabei ist x die Datenerfassung. Achten Sie auf den Einstellparameter der Dichtefunktion, der die Glättung reguliert.
quelle
Während ich Ken Williams einfache Funktion mag, möchte ich die verschiedenen Modi abrufen, wenn sie existieren. In diesem Sinne verwende ich die folgende Funktion, die eine Liste der Modi zurückgibt, wenn mehrere oder einzelne.
quelle
mode
eine Liste mit mehreren Werten zurückgegeben wird, ist r [1] nicht der erste Wert. Es ist stattdessen eine Liste der Länge 1, die den ersten Wert enthält, und Sie müssen r [[1]] ausführen, um den ersten Modus als numerische und nicht als Liste zu erhalten. Wenn es einen einzelnen Modus gibt, ist Ihr r keine Liste, daher funktioniert r [1], weshalb ich dachte, es sei inkonsistent. Aber da r [[1]] auch funktioniert, wenn r ein einfacher Vektor ist, gibt es tatsächlich eine Konsistenz, die ich nicht erkannt hatte, dass Sie immer[[
auf Elemente zugreifen können.Ich habe all diese Optionen durchgesehen und mich über ihre relativen Merkmale und Leistungen gewundert, also habe ich einige Tests durchgeführt. Falls jemand anderes neugierig ist, teile ich meine Ergebnisse hier.
Da ich mich nicht um alle hier veröffentlichten Funktionen kümmern wollte, konzentrierte ich mich auf ein Beispiel, das auf einigen Kriterien beruhte: Die Funktion sollte sowohl mit Zeichen-, Faktor-, logischen als auch numerischen Vektoren arbeiten, mit NAs und anderen problematischen Werten angemessen umgehen. und die Ausgabe sollte "vernünftig" sein, dh keine Zahlen als Zeichen oder andere solche Dummheiten.
Ich habe auch eine eigene Funktion hinzugefügt, die auf der gleichen
rle
Idee wie die von chrispy basiert, außer für eine allgemeinere Verwendung angepasst:Am Ende habe ich fünf Funktionen auf zwei Testdatensätzen ausgeführt
microbenchmark
. Die Funktionsnamen beziehen sich auf die jeweiligen Autoren:Chris 'Funktion war auf
method="modes"
und eingestelltna.rm=TRUE
standardmäßig , um sie vergleichbarer zu machen. Ansonsten wurden die Funktionen so verwendet, wie sie hier von ihren Autoren vorgestellt wurden.Allein in Bezug auf die Geschwindigkeit gewinnt die Kens-Version problemlos, aber es ist auch die einzige, die nur einen Modus meldet, egal wie viele es tatsächlich gibt. Wie so oft gibt es einen Kompromiss zwischen Geschwindigkeit und Vielseitigkeit. In
method="mode"
Chris 'Version wird ein Wert zurückgegeben, wenn es einen Modus gibt, andernfalls NA. Ich denke, das ist eine nette Geste. Ich finde es auch interessant, wie einige Funktionen von einer erhöhten Anzahl eindeutiger Werte beeinflusst werden, während andere bei weitem nicht so stark sind. Ich habe den Code nicht im Detail studiert, um herauszufinden, warum das so ist, abgesehen davon, dass logisch / numerisch als Ursache beseitigt wurde.quelle
Der Modus kann nicht in allen Situationen nützlich sein. Die Funktion sollte sich also mit dieser Situation befassen. Versuchen Sie die folgende Funktion.
Ausgabe,
quelle
Dies baut auf der Antwort von jprockbelly auf, indem eine Beschleunigung für sehr kurze Vektoren hinzugefügt wird. Dies ist nützlich, wenn Sie den Modus auf einen Datenrahmen anwenden oder mit vielen kleinen Gruppen datierbar sind:
quelle
Eine andere einfache Option, die alle nach Häufigkeit geordneten Werte angibt, ist die Verwendung von
rle
:quelle
Eine andere mögliche Lösung:
Verwendungszweck:
Ausgabe:
quelle
I Fall Ihre Beobachtungen sind Klassen von Reelle Zahlen und Sie erwarten , dass der Modus 2.5 sein , wenn Sie Ihre Beobachtungen sind 2, 2, 3 und 3 , dann können Sie den Modus schätzen mit
mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)
dem l1 ..lower Grenze der häufigsten Klasse, f1 . Häufigkeit der häufigsten Klasse, f0 Häufigkeit der Klassen vor der häufigsten Klasse, f2 Häufigkeit der Klassen nach der häufigsten Klasse und i .. Klassenintervall wie z. B. in 1 , 2 , 3 :Wenn Sie das häufigste Level möchten und mehr als ein häufigstes Level haben, können Sie alle erhalten, z. B.:
quelle
Hinzufügen eines möglichen data.table-Ansatzes
quelle
Hier sind verschiedene Möglichkeiten, wie Sie dies in Theta (N) -Laufzeit tun können
quelle
Könnte die folgende Funktion versuchen:
quelle
Der Berechnungsmodus ist meistens im Fall einer Faktorvariablen, die wir verwenden können
HouseVotes84 ist ein Datensatz, der im Paket 'mlbench' verfügbar ist.
Es wird der maximale Etikettenwert angegeben. Es ist einfacher, die eingebauten Funktionen selbst ohne Schreibfunktion zu verwenden.
quelle
Es scheint mir, dass wenn eine Sammlung einen Modus hat, ihre Elemente eins zu eins mit den natürlichen Zahlen abgebildet werden können. Das Problem des Findens des Modus reduziert sich also darauf, eine solche Zuordnung zu erstellen, den Modus der zugeordneten Werte zu finden und dann wieder auf einige der Elemente in der Sammlung abzubilden. (Der Umgang mit
NA
erfolgt in der Mapping-Phase).Ich habe eine
histogram
Funktion, die nach einem ähnlichen Prinzip arbeitet. (Die speziellen Funktionen und Operatoren, die in dem hier vorgestellten Code verwendet werden, sollten in Shapiro und / oder in ordentlichem OveRse definiert werden . Die hier duplizierten Teile von Shapiro und ordentlichOveRse werden mit Genehmigung dupliziert. Die duplizierten Schnipsel können unter den Bedingungen dieser Website verwendet werden. ) R Pseudocode fürhistogram
ist(Die speziellen binären Operatoren führen Piping , Currying und Komposition durch. ) Ich habe auch eine
maxloc
Funktion, die ähnlich istwhich.max
, aber alle absoluten Maxima eines Vektors zurückgibt . R Pseudocode fürmaxloc
istDann
und
berechnet den Modus jeder Sammlung, vorausgesetzt, die entsprechenden Funktionen
map
-ping undunmap
-ping sind definiert.quelle