В R mean()
и median()
есть стандартные функции, которые делают то, что вы ожидаете. mode()
сообщает вам режим внутренней памяти объекта, а не значение, которое встречается чаще всего в его аргументе. Но есть ли стандартная библиотечная функция, которая реализует статистический режим для вектора (или списка)?
r
statistics
r-faq
Ник
источник
источник
mode
таким же, как функцияclass
?Ответы:
Еще одно решение, которое работает как с числовыми, так и символьно-факторными данными:
На моей маленькой машинке, которая может генерировать и находить режим 10M-целочисленного вектора примерно за полсекунды.
Если в вашем наборе данных может быть несколько режимов, вышеуказанное решение использует тот же подход
which.max
, что и возвращает первое появившееся значение набора режимов. Чтобы вернуть все режимы, используйте этот вариант (из @digEmAll в комментариях):источник
c(1,1,2,2)
). Вы должны изменить свою последнюю строку на:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
ux[which.max(tabulate(match(x, ux)))]
простоmax(tabulate(match(x, ux)))
.Mode(1:3)
дает1
иMode(3:1)
дает3
, поэтому Mode возвращает наиболее частый элемент или первый, если все они уникальны.0
илиNA
в тех случаях.Существует пакет,
modeest
который обеспечивает оценки режима одномерных одномодальных (а иногда и мультимодальных) данных и значений режимов обычных вероятностных распределений.Для получения дополнительной информации см эту страницу
источник
mfv(mySamples)[1]
.1
Является важным , поскольку он фактически возвращает наиболее часто встречающееся значение сек .mfv(mySamples)
нашел это в списке рассылки r, надеюсь, это поможет. Это также то, о чем я думал в любом случае. Вы хотите, чтобы таблица () данных, сортировать, а затем выбрать имя. Это взломано, но должно работать.
источник
Я обнаружил, что пост Кена Уильямса выше, отличный, я добавил несколько строк для учета значений NA и сделал его функцией для удобства.
источник
Быстрый и грязный способ оценки режима вектора чисел, который, по вашему мнению, исходит из непрерывного одномерного распределения (например, нормального распределения), определяет и использует следующую функцию:
Затем, чтобы получить оценку режима:
источник
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
. Однако, если у вас есть только один объект данных, тогда значение этого объекта, вероятно, будет вашим лучшим предположением для режима ...estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } }
я тестирую метод оценки преобладающего направления ветра, а не среднего направления, используя векторное среднее с круговым пакетом. Я работаю с точками над полигоном, поэтому иногда есть только одна точка с направлением. Спасибо!Следующая функция поставляется в трех формах:
method = "mode" [по умолчанию]: вычисляет режим для унимодального вектора, в противном случае возвращает
метод NA = "nmodes": вычисляет количество режимов в векторе.
method = "mode": перечисляет все режимы для унимодального или полимодального вектор
источник
method = 'modes'
. Затем функция возвращает все уникальные значения, однако на самом деле режима нет, поэтому она должна вернутьсяNA
. Я добавлю еще один ответ, содержащий слегка оптимизированную версию вашей функции, спасибо за вдохновение!Здесь другое решение:
источник
Я пока не могу голосовать, но ответ Расмуса Батха - это то, что я искал. Тем не менее, я бы немного его изменил, позволяя ограничить распределение, например, для значений только между 0 и 1.
Мы понимаем, что вы можете вообще не хотеть ограничивать свой дистрибутив, поэтому установите из = - "БОЛЬШОЙ НОМЕР" в = "БОЛЬШОЙ НОМЕР"
источник
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
Небольшая модификация ответа Кена Уильямса, добавление необязательных параметров
na.rm
иreturn_multiple
.В отличие от ответов, на которые опирается
names()
, этот ответ поддерживает тип данныхx
в возвращаемых значениях.Чтобы показать, что он работает с необязательными параметрами и поддерживает тип данных:
Спасибо @Frank за упрощение.
источник
Я написал следующий код для генерации режима.
Давай попробуем:
источник
Основано на функции @ Chris для расчета режима или связанных метрик, однако для расчета частот используется метод Кена Уильямса. Этот предоставляет исправление для случая отсутствия режимов вообще (все элементы одинаково часты), и некоторые более читаемые
method
имена.Так как он использует метод Кена для расчета частот, производительность также оптимизируется, используя пост AkselA, я сравнил некоторые из предыдущих ответов, чтобы показать, насколько моя функция близка к производительности Кена, с условностями для различных вариантов вывода, вызывающими лишь незначительные накладные расходы:
источник
Mode
функции, найденной вpracma
пакете. Хотите объяснить?pracma
пакета вы ссылаетесь? Насколько я вижу, версия 1.9.3 имеет совершенно другую реализацию.Этот хак должен работать нормально. Дает вам значение, а также счетчик режима:
источник
R имеет так много дополнительных пакетов, что некоторые из них вполне могут обеспечить [статистический] режим числового списка / серии / вектора.
Однако в стандартной библиотеке R, похоже, нет такого встроенного метода! Один из способов обойти это - использовать некоторую конструкцию, подобную следующей (и превратить ее в функцию, если вы часто используете ...):
Для большего списка образцов следует рассмотреть возможность использования временной переменной для значения max (tabSmpl) (я не знаю, что R автоматически оптимизирует это)
Ссылка: см. "Как насчет медианы и моды?" в этом уроке KickStarting R
Это, кажется, подтверждает, что (по крайней мере, на момент написания этого урока) в R нет функции mode (хорошо ... mode (), как вы выяснили, используется для определения типа переменных ).
источник
Это работает довольно хорошо
источник
Вот функция для поиска режима:
источник
Ниже приведен код, который можно использовать для поиска режима векторной переменной в R.
источник
Есть несколько решений для этого. Я проверил первый и после этого написал свой. Разместите здесь, если это кому-нибудь поможет:
Давайте проверим это на нескольких примерах. Я беру
iris
набор данных. Позволяет проверить с числовыми даннымичто вы можете проверить это правильно.
Теперь единственное нечисловое поле в наборе данных радужной оболочки (Виды) не имеет режима. Давайте проверим на нашем собственном примере
РЕДАКТИРОВАТЬ
Как упоминалось в комментариях, пользователь может захотеть сохранить тип ввода. В этом случае функцию режима можно изменить на:
Последняя строка функции просто приводит окончательное значение режима к типу исходного ввода.
источник
y[,1] <- sort(unique(x))
Я бы использовал функцию density () для определения сглаженного максимума (возможно, непрерывного) распределения:
где х - сбор данных. Обратите внимание на параметры настройки функции плотности, которые регулируют сглаживание.
источник
Хотя мне нравится простая функция Кена Уильямса, я хотел бы получить несколько режимов, если они существуют. Имея это в виду, я использую следующую функцию, которая возвращает список режимов, если несколько или один.
источник
mode
возвращает список с несколькими значениями, то r [1] не является первым значением; вместо этого это список длины 1, содержащий первое значение, и вы должны выполнить r [[1]], чтобы получить первый режим в виде числа, а не списка. Теперь, когда есть один режим, ваш r не является списком, поэтому r [1] работает, поэтому я подумал, что это противоречиво. Но так как r [[1]] также работает, когда r - простой вектор, на самом деле есть последовательность, которую я не осознавал, которую вы всегда можете использовать[[
для доступа к элементам.Я просматривал все эти варианты и начал задумываться об их относительных характеристиках и характеристиках, поэтому я провел несколько тестов. В случае, если кому-то еще интересно то же самое, я поделюсь своими результатами здесь.
Не желая беспокоиться обо всех функциях, опубликованных здесь, я решил сосредоточиться на выборке, основанной на нескольких критериях: функция должна работать как с символьными, факторными, логическими и числовыми векторами, так и с соответствующими NA и другими проблемными значениями, и вывод должен быть «разумным», то есть не иметь числовых значений как символов или других подобных глупостей.
Я также добавил собственную функцию, основанную на той же
rle
идее, что и chrispy, за исключением адаптированной для более общего использования:В итоге я выполнил пять функций на двух наборах тестовых данных
microbenchmark
. Названия функций относятся к их соответствующим авторам:Функция Криса была установлена на
method="modes"
иna.rm=TRUE
по умолчанию, чтобы сделать ее более сопоставимой, но кроме этого функции использовались, как представлено здесь их авторами.Только в отношении скорости версия Kens выигрывает легко, но она также является единственной из них, которая сообщает только об одном режиме, независимо от того, сколько их на самом деле. Как это часто бывает, существует компромисс между скоростью и универсальностью. В
method="mode"
версии Криса будет возвращено значение, если есть один режим, иначе NA. Я думаю, что это приятное прикосновение. Я также думаю, что интересно, как на некоторые функции влияет увеличение числа уникальных значений, в то время как на другие это не так сильно. Я не изучал код подробно, чтобы выяснить, почему это так, кроме устранения логической / числовой причины.источник
Режим не может быть полезным в любой ситуации. Таким образом, функция должна решать эту ситуацию. Попробуйте следующую функцию.
Вывод,
источник
Это основывается на ответе jprockbelly, добавляя ускорение для очень коротких векторов. Это полезно при применении режима к data.frame или для данных с большим количеством небольших групп:
источник
Другой простой вариант, который дает все значения, упорядоченные по частоте, заключается в использовании
rle
:источник
Другое возможное решение:
Применение:
Вывод:
источник
В моем случае ваши наблюдения - это классы из вещественных чисел, и вы ожидаете, что режим будет равен 2,5, когда ваши наблюдения равны 2, 2, 3 и 3, тогда вы можете оценить режим,
mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)
где l1 .. нижний предел наиболее часто встречающегося класса, f1 . .frequency самого частого класса, f0 .. частота классов перед самым частым классом, f2 .. частота классов после самого частого класса и интервал i ..Class, как указано, например, в 1 , 2 , 3 :Если вам нужен самый частый уровень и у вас есть более одного наиболее частого уровня, вы можете получить их все, например:
источник
Добавление возможного подхода data.table
источник
Вот несколько способов сделать это во время выполнения Theta (N)
источник
Можно попробовать следующую функцию:
источник
Режим расчета в основном для факторной переменной, тогда мы можем использовать
HouseVotes84 - это набор данных, доступный в пакете mlbench.
это даст максимальное значение метки. это проще использовать встроенными функциями без написания функции.
источник
Мне кажется, что если у коллекции есть режим, то его элементы могут быть сопоставлены один к одному с натуральными числами. Таким образом, проблема поиска режима сводится к созданию такого сопоставления, нахождению режима сопоставленных значений, а затем сопоставлению некоторых элементов в коллекции. (Работа с
NA
происходит на этапе отображения).У меня есть
histogram
функция, которая работает по аналогичному принципу. (Специальные функции и операторы, используемые в представленном здесь коде, должны быть определены в Shapiro и / или neatOveRse . Части Shapiro и neatOveRse, дублированные в данном документе, дублируются с разрешения; дублированные фрагменты могут использоваться в соответствии с условиями этого сайта. ) R псевдокод дляhistogram
is(Специальные бинарные операторы выполняют конвейер , карри и композицию ) У меня также есть
maxloc
функция, которая похожаwhich.max
, но возвращает все абсолютные максимумы вектора. R псевдокод дляmaxloc
isзатем
а также
будет вычислять режим любой коллекции, при условии определения соответствующих
map
функций -ping иunmap
-ping.источник