W R, mean()
a median()
to standardowe funkcje które robią to, czego można oczekiwać. mode()
informuje o trybie pamięci wewnętrznej obiektu, a nie o wartości, która występuje najczęściej w jego argumencie. Ale czy istnieje standardowa funkcja biblioteki, która implementuje tryb statystyczny dla wektora (lub listy)?
r
statistics
r-faq
Nacięcie
źródło
źródło
mode
się za taki sam jak funkcjaclass
?Odpowiedzi:
Jeszcze jedno rozwiązanie, które działa zarówno w przypadku danych liczbowych, jak i danych / współczynników:
Na mojej przeklętej małej maszynie, która może wygenerować i znaleźć tryb wektora liczb całkowitych 10M w około pół sekundy.
Jeśli Twój zestaw danych może mieć wiele trybów, powyższe rozwiązanie przyjmuje to samo podejście
which.max
i zwraca pierwszą wartość z zestawu trybów. Aby zwrócić wszystkie tryby, użyj tego wariantu (od @digEmAll w komentarzach):źródło
c(1,1,2,2)
.). Powinieneś zmienić swój ostatni wiersz za pomocą:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
ux[which.max(tabulate(match(x, ux)))]
justmax(tabulate(match(x, ux)))
.Mode(1:3)
daje1
iMode(3:1)
daje3
, więc Tryb zwraca najczęstszy element lub pierwszy, jeśli wszystkie są unikalne.0
lubNA
w takich przypadkach.Istnieje pakiet,
modeest
który zapewnia estymatory trybu jednowymiarowych danych unimodalnych (a czasem multimodalnych) oraz wartości trybów zwykłych rozkładów prawdopodobieństwa.Aby uzyskać więcej informacji, zobacz tę stronę
źródło
mfv(mySamples)[1]
.1
Jest ważna, gdyż faktycznie zwraca najczęstsza wartość s .mfv(mySamples)
znalazłem to na liście mailingowej r, mam nadzieję, że jest to pomocne. Tak też myślałem. Będziesz chciał zebrać () dane, posortować, a następnie wybrać imię. To jest hackerskie, ale powinno działać.
źródło
Uznałem, że powyższy post Kena Williamsa jest świetny, dodałem kilka wierszy, aby uwzględnić wartości NA i uczyniłem go łatwym.
źródło
Szybkim i brudnym sposobem oszacowania trybu wektora liczb, który Twoim zdaniem pochodzi z ciągłego rozkładu jednowymiarowego (np. Rozkład normalny), jest zdefiniowanie i użycie następującej funkcji:
Następnie, aby uzyskać oszacowanie trybu:
źródło
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
. Jeśli jednak masz tylko jeden punkt danych, to i tak wartość tego punktu będzie prawdopodobnie najlepszym sposobem naestimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } }
metodę szacowania dominującego wiatru kierunkowego, zamiast średniej kierunku przy użyciu średniej wektorowej z pakietem kołowym. I ', pracując z punktami powyżej stopnia wielokąta, więc czasami jest tylko jeden punkt z kierunkiem. Dzięki!Następująca funkcja występuje w trzech postaciach:
method = "mode" [default]: oblicza tryb dla wektora unimodalnego, w przeciwnym razie zwraca
metodę NA = "nmodes": oblicza liczbę trybów w wektorze
method = " styles ": wyświetla wszystkie tryby dla unimodalnego lub polimodalnego wektor
źródło
method = 'modes'
. Następnie funkcja zwraca wszystkie unikalne wartości, jednak tak naprawdę nie ma trybu, więc powinna powrócićNA
. Dodam kolejną odpowiedź zawierającą nieco zoptymalizowaną wersję twojej funkcji, dzięki za inspirację!Oto inne rozwiązanie:
źródło
Nie mogę jeszcze głosować, ale szukałem odpowiedzi Rasmusa Bååtha. Jednak zmodyfikowałbym to trochę, pozwalając ograniczyć rozkład, na przykład dla wartości tylko od 0 do 1.
Wiemy, że możesz nie chcieć ograniczać całej dystrybucji, a następnie ustaw od = - „DUŻY NUMER” do = „DUŻY NUMER”
źródło
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
Mała modyfikacja odpowiedzi Kena Williamsa, dodająca opcjonalne parametry
na.rm
ireturn_multiple
.W przeciwieństwie do odpowiedzi, na których się opiera
names()
, odpowiedź ta zachowuje typ danychx
w zwracanych wartościach.Aby pokazać, że działa z opcjonalnymi parametrami i zachowuje typ danych:
Dzięki @Frank za uproszczenie.
źródło
Napisałem następujący kod, aby wygenerować tryb.
Spróbujmy:
źródło
Na podstawie funkcji @ Chrisa do obliczenia trybu lub powiązanych wskaźników, jednak z wykorzystaniem metody Kena Williamsa do obliczenia częstotliwości. Ten zapewnia poprawkę w przypadku braku trybów (wszystkie elementy są jednakowo częste), a niektóre bardziej czytelne
method
nazwy.Ponieważ używa metody Kena do obliczania częstotliwości, wydajność jest również zoptymalizowana, używając postu AkselA porównałem niektóre z poprzednich odpowiedzi, aby pokazać, jak moja funkcja jest zbliżona do wydajności Kena, przy czym warunki dla różnych opcji wyjścia powodują jedynie niewielki narzut:
źródło
Mode
funkcji znalezionej wpracma
pakiecie. Chcesz to wyjaśnić?pracma
pakietu się odwołujesz? O ile mi wiadomo, wersja 1.9.3 ma zupełnie inną implementację.Ten hack powinien działać dobrze. Podaje wartość, a także liczbę trybów:
źródło
R ma tak wiele dodatków, że niektóre z nich mogą zapewnić tryb [statystyczny] listy numerycznej / serii / wektora.
Jednak standardowa biblioteka samego R nie wydaje się mieć takiej wbudowanej metody! Jednym ze sposobów obejścia tego jest użycie takiej konstrukcji jak poniżej (i włączenie tej funkcji, jeśli często ją używasz ...):
W przypadku większej listy próbek należy rozważyć użycie zmiennej tymczasowej dla wartości max (tabSmpl) (nie wiem, czy R automatycznie to zoptymalizuje)
Odniesienie: patrz „Co z medianą i trybem?” w tej lekcji KickStarting R
To wydaje się potwierdzać, że (przynajmniej w momencie pisania tej lekcji) nie ma funkcji trybu w R (no cóż ... tryb (), jak się przekonałeś, służy do potwierdzenia typu zmiennych ).
źródło
To działa całkiem dobrze
źródło
Oto funkcja znajdowania trybu:
źródło
Poniżej znajduje się kod, którego można użyć do znalezienia trybu zmiennej wektorowej w R.
źródło
Istnieje wiele rozwiązań dla tego. Sprawdziłem pierwszy, a potem napisałem własny. Opublikowanie go tutaj, jeśli pomoże komukolwiek:
Przetestujmy to na kilku przykładach. Biorę
iris
zestaw danych. Pozwala przetestować dane numerycznektóry możesz zweryfikować, jest poprawny.
Teraz jedyne pole nienumeryczne w zestawie danych tęczówki (Gatunek) nie ma trybu. Przetestujmy na naszym własnym przykładzie
EDYTOWAĆ
Jak wspomniano w komentarzach, użytkownik może chcieć zachować typ danych wejściowych. W takim przypadku funkcję trybu można zmienić na:
Ostatni wiersz funkcji po prostu wymusza wartość trybu końcowego na typ oryginalnego wejścia.
źródło
y[,1] <- sort(unique(x))
Użyłbym funkcji gęstości (), aby zidentyfikować wygładzone maksimum (ewentualnie ciągłego) rozkładu:
gdzie x to zbiór danych. Zwróć uwagę na regulowany parametr funkcji gęstości, który reguluje wygładzanie.
źródło
Chociaż lubię prostą funkcję Kena Williamsa, chciałbym odzyskać wiele trybów, jeśli istnieją. Mając to na uwadze, korzystam z następującej funkcji, która zwraca listę trybów, jeśli jest ich wiele lub jeden.
źródło
mode
zwraca listę z kilkoma wartościami, wówczas r [1] nie jest pierwszą wartością; zamiast tego jest to lista o długości 1 zawierająca pierwszą wartość i musisz zrobić r [[1]], aby uzyskać pierwszy tryb jako liczbę, a nie listę. Teraz, gdy jest jeden tryb, twój r nie jest listą, więc r [1] działa, dlatego pomyślałem, że to niespójne. Ale ponieważ r [[1]] działa również, gdy r jest prostym wektorem, w rzeczywistości istnieje spójność, której nie zdawałem sobie sprawy z tego, że zawsze można użyć[[
do uzyskania dostępu do elementów.Przeglądałem wszystkie te opcje i zacząłem się zastanawiać nad ich względnymi funkcjami i wydajnością, więc zrobiłem kilka testów. W przypadku, gdy ktoś jest ciekawy tego samego, dzielę się tutaj swoimi wynikami.
Nie chcąc zawracać sobie głowy wszystkimi opublikowanymi tutaj funkcjami, postanowiłem skupić się na próbce opartej na kilku kryteriach: funkcja powinna działać zarówno na wektorach znakowych, czynnikowych, logicznych i liczbowych, powinna odpowiednio radzić sobie z NA i innymi problematycznymi wartościami, a dane wyjściowe powinny być „rozsądne”, tj. nie mogą zawierać znaków numerycznych ani innych podobnych głupstw.
Dodałem także własną funkcję, która opiera się na tej samej
rle
idei co chrispy, z wyjątkiem tego, że jest przystosowana do bardziej ogólnego zastosowania:Skończyło się na tym, że uruchomiłem pięć funkcji na dwóch zestawach danych testowych
microbenchmark
. Nazwy funkcji odnoszą się do ich autorów:Funkcja Chrisa została ustawiona na
method="modes"
ina.rm=TRUE
domyślnie, aby uczynić ją bardziej porównywalną, ale poza tym funkcje były używane w sposób przedstawiony tutaj przez ich autorów.Jeśli chodzi o samą szybkość, wersja Kensa wygrywa z łatwością, ale jest to również jedyny z nich, który zgłasza tylko jeden tryb, bez względu na to, ile tak naprawdę jest. Jak to często bywa, istnieje kompromis między szybkością a wszechstronnością. W
method="mode"
wersji Chris zwróci wartość, jeśli jest jeden tryb, w przeciwnym razie NA. Myślę, że to miły akcent. Myślę też, że to ciekawe, jak na niektóre funkcje wpływa zwiększona liczba unikalnych wartości, podczas gdy inne nie są tak bardzo. Nie studiowałem szczegółowo kodu, aby dowiedzieć się, dlaczego tak jest, oprócz wyeliminowania logicznej / numerycznej przyczyny.źródło
Tryb nie może być przydatny w każdej sytuacji. Dlatego funkcja powinna rozwiązać tę sytuację. Wypróbuj następującą funkcję.
Wynik,
źródło
Opiera się to na odpowiedzi jprockbelly, dodając przyspieszenie dla bardzo krótkich wektorów. Jest to przydatne, gdy stosuje się tryb do data.frame lub danych z dużą liczbą małych grup:
źródło
Inną prostą opcją, która podaje wszystkie wartości uporządkowane według częstotliwości, jest użycie
rle
:źródło
Inne możliwe rozwiązanie:
Stosowanie:
Wynik:
źródło
Uważam, że twoje obserwacje są klasami z liczb rzeczywistych i oczekujesz, że tryb będzie wynosił 2,5, gdy twoje obserwacje to 2, 2, 3 i 3, to możesz oszacować tryb, w
mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)
którym l1 .. dolna granica najczęstszej klasy, f1 . . częstotliwość najczęstszych klas, f0 .. częstotliwość klas przed najczęstszymi klasami, f2 .. częstotliwość klas po najczęstszych klasach i i. przedział klas podany np. w 1 , 2 , 3 :Jeśli chcesz mieć najczęstszy poziom i masz więcej niż jeden najczęstszy poziom, możesz uzyskać je wszystkie, np .:
źródło
Dodanie możliwego podejścia do tabeli danych
źródło
Oto kilka sposobów na zrobienie tego w czasie wykonywania Theta (N)
źródło
Można wypróbować następującą funkcję:
źródło
Tryb obliczania dotyczy głównie zmiennej czynnikowej, którą możemy zastosować
HouseVotes84 to zestaw danych dostępny w pakiecie „mlbench”.
da maksymalną wartość etykiety. jest łatwiejszy w użyciu dzięki wbudowanym funkcjom bez funkcji zapisu.
źródło
Wydaje mi się, że jeśli kolekcja ma tryb, to jego elementy można mapować jeden na jeden z liczbami naturalnymi. Problem znalezienia trybu sprowadza się więc do utworzenia takiego mapowania, znalezienia trybu mapowanych wartości, a następnie mapowania z powrotem do niektórych elementów w kolekcji. (Do czynienia z
NA
występuje w fazie mapowania).Mam
histogram
funkcję, która działa na podobnej zasadzie. (Funkcje specjalne i operatory użyte w kodzie prezentowanym w niniejszym dokumencie powinny być zdefiniowane w Shapiro i / lub neatOveRse . Części Shapiro i neatOveRse tutaj zduplikowane są tak powielone za zgodą; zduplikowane fragmenty mogą być używane zgodnie z warunkami tej witryny. ) Pseudokod R dlahistogram
is(Szczególne Operatory wykonania rur , currying i skład ) również mają
maxloc
funkcję podobną dowhich.max
, ale zwraca wszystkie absolutnym maxima wektora. Pseudokod R dlamaxloc
isNastępnie
i
obliczy tryb dowolnej kolekcji, pod warunkiem zdefiniowania odpowiednich funkcji
map
-ping iunmap
-ping.źródło