Em R, mean()
e median()
são funções padrão que fazem o que você esperaria. mode()
informa o modo de armazenamento interno do objeto, não o valor que ocorre mais em seu argumento. Mas existe uma função de biblioteca padrão que implementa o modo estatístico para um vetor (ou lista)?
r
statistics
r-faq
usuario
fonte
fonte
mode
o mesmo que a funçãoclass
?Respostas:
Mais uma solução, que funciona para dados numéricos e de caracteres / fator:
Na minha pequena máquina, isso pode gerar e encontrar o modo de um vetor inteiro de 10M em cerca de meio segundo.
Se seu conjunto de dados pode ter vários modos, a solução acima adota a mesma abordagem que
which.max
e retorna o primeiro valor que aparece no conjunto de modos. Para retornar todos os modos, use esta variante (de @digEmAll nos comentários):fonte
c(1,1,2,2)
). Você deve alterar sua última linha com:tab <- tabulate(match(x, ux)); ux[tab == max(tab)]
ux[which.max(tabulate(match(x, ux)))]
por apenasmax(tabulate(match(x, ux)))
.Mode(1:3)
dá1
eMode(3:1)
dá3
, portanto o Mode retorna o elemento mais frequente ou o primeiro, se todos eles forem únicos.0
ouNA
nesses casos.Existe um pacote
modeest
que fornece estimadores do modo de dados unimodais unimodais (e às vezes multimodais) e valores dos modos de distribuições usuais de probabilidade.Para mais informações, consulte esta página
fonte
mfv(mySamples)[1]
,. O1
ser importante, na verdade, retorna os valores mais frequentes s .mfv(mySamples)
encontrou isso na lista de discussão r, espero que seja útil. É também o que eu estava pensando de qualquer maneira. Você deseja tabular () os dados, classificar e escolher o primeiro nome. É um truque, mas deve funcionar.
fonte
Achei o post de Ken Williams acima ótimo, adicionei algumas linhas para explicar os valores de NA e o tornei uma função para facilitar.
fonte
Uma maneira rápida e suja de estimar o modo de um vetor de números que você acredita vir de uma distribuição univariada contínua (por exemplo, uma distribuição normal) está definindo e usando a seguinte função:
Então, para obter a estimativa de modo:
fonte
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
. No entanto, se você tiver apenas um datapoint então o valor do que datapoint será provavelmente o seu melhor palpite para o modo de qualquer maneira ...estimate_mode <- function(x) { if (length(x)>1){ d <- density(x) d$x[which.max(d$y)] }else{ x } }
estou testando o método para estimar a direção predominante do vento, em vez da média da direção, usando a média vetorial com pacote circular. Eu ', trabalhando com pontos acima de uma grade de polígono, então, às vezes, há apenas um ponto com direção. Obrigado!A seguinte função vem em três formas:
method = "mode" [padrão]: calcula o modo para um vetor unimodal, mas retorna um
método NA = "nmodes": calcula o número de modos no vetor
method = "modes": lista todos os modos de um unimodal ou polmodal vetor
fonte
method = 'modes'
. Em seguida, a função retorna todos os valores exclusivos, no entanto, na verdade, não há modo, portanto, ele deve retornarNA
. Vou adicionar outra resposta contendo uma versão ligeiramente otimizada da sua função, obrigado pela inspiração!Aqui, outra solução:
fonte
Ainda não posso votar, mas a resposta de Rasmus Bååth é o que eu estava procurando. No entanto, eu o modificaria um pouco, permitindo restringir a distribuição, por exemplo, para valores apenas entre 0 e 1.
Sabemos que você pode não querer restringir toda a sua distribuição e defina de = - "NÚMERO GRANDE" a = "NÚMERO GRANDE"
fonte
error in density.default(x, from = from, to = to) : need at least 2 points to select a bandwidth automatically
Uma pequena modificação na resposta de Ken Williams, adicionando parâmetros opcionais
na.rm
ereturn_multiple
.Diferentemente das respostas
names()
, essa resposta mantém o tipo de dadosx
no (s) valor (es) retornado (s).Para mostrar que funciona com os parâmetros opcionais e mantém o tipo de dados:
Obrigado a @Frank pela simplificação.
fonte
Eu escrevi o código a seguir para gerar o modo.
Vamos tentar:
fonte
Com base na função de @ Chris para calcular o modo ou métricas relacionadas, porém usando o método de Ken Williams para calcular frequências. Este fornece uma correção para o caso de nenhum modo (todos os elementos são igualmente frequentes) e alguns
method
nomes mais legíveis .Como ele usa o método de Ken para calcular frequências, o desempenho também é otimizado. Usando o post de AkselA, comparei algumas das respostas anteriores para mostrar como minha função está próxima da de Ken no desempenho, com as condicionais para as várias opções de saída, causando apenas uma pequena sobrecarga:
fonte
Mode
função encontrada nopracma
pacote. Gostaria de explicar?pracma
pacote você se refere? A versão 1.9.3 tem uma implementação completamente diferente, tanto quanto posso ver.Esse hack deve funcionar bem. Fornece o valor e a contagem do modo:
fonte
O R possui tantos pacotes complementares que alguns deles podem fornecer o modo [estatístico] de uma lista / série / vetor numérico.
No entanto, a biblioteca padrão do próprio R não parece ter um método embutido! Uma maneira de contornar isso é usar alguma construção como a seguinte (e transformá-la em uma função se você costuma usar ...):
Para uma lista de amostras maior, deve-se considerar o uso de uma variável temporária para o valor máximo (tabSmpl) (não sei se R otimizaria isso automaticamente)
Referência: consulte "Que tal mediana e modo?" nesta lição do KickStarting R
Isso parece confirmar que (pelo menos na redação desta lição) não há uma função de modo no R (bem ... mode (), como você descobriu que é usada para afirmar o tipo de variáveis )
fonte
Isso funciona muito bem
fonte
Aqui está uma função para encontrar o modo:
fonte
Abaixo está o código que pode ser usado para encontrar o modo de uma variável vetorial em R.
fonte
Existem várias soluções fornecidas para este. Eu verifiquei o primeiro e depois escrevi o meu. Colocá-lo aqui, se ajudar alguém:
Vamos testá-lo com alguns exemplos. Estou pegando o
iris
conjunto de dados. Permite testar com dados numéricosque você pode verificar está correto.
Agora, o único campo não numérico no conjunto de dados da íris (Espécies) não possui um modo. Vamos testar com nosso próprio exemplo
EDITAR
Conforme mencionado nos comentários, o usuário pode querer preservar o tipo de entrada. Nesse caso, a função mode pode ser modificada para:
A última linha da função simplesmente restringe o valor do modo final ao tipo da entrada original.
fonte
y[,1] <- sort(unique(x))
Eu usaria a função density () para identificar um máximo suavizado de uma distribuição (possivelmente contínua):
onde x é a coleta de dados. Preste atenção ao parâmetro de ajuste da função de densidade que regula a suavização.
fonte
Enquanto eu gosto da função simples de Ken Williams, gostaria de recuperar os vários modos, se existirem. Com isso em mente, uso a seguinte função, que retorna uma lista dos modos, se múltiplos ou únicos.
fonte
mode
retornar uma lista com vários valores, então r [1] não é o primeiro valor; em vez disso, é uma lista do comprimento 1 que contém o primeiro valor e você deve executar r [[1]] para obter o primeiro modo como numérico e não como lista. Agora, quando existe um modo único, seu r não é uma lista, então r [1] funciona, e é por isso que eu pensei que era inconsistente. Mas como r [[1]] também funciona quando r é um vetor simples, na verdade há uma consistência que eu não tinha percebido, que você sempre pode usar[[
para acessar elementos.Eu estava analisando todas essas opções e comecei a me perguntar sobre suas características e desempenhos relativos, então fiz alguns testes. Caso alguém mais tenha curiosidade sobre o mesmo, estou compartilhando meus resultados aqui.
Não querendo se preocupar com todas as funções postadas aqui, optei por focar em uma amostra com base em alguns critérios: a função deve funcionar com caracteres, fatores, vetores lógicos e numéricos, deve lidar com NAs e outros valores problemáticos de forma adequada, e a saída deve ser 'sensata', ou seja, nenhum número como caractere ou outra bobagem.
Também adicionei uma função própria, que é baseada na mesma
rle
idéia que a de chrispy, exceto adaptada para uso mais geral:Acabei executando cinco funções, em dois conjuntos de dados de teste
microbenchmark
. Os nomes das funções se referem aos seus respectivos autores:A função de Chris foi definida como
method="modes"
ena.rm=TRUE
por padrão para torná-la mais comparável, mas, além disso, as funções foram usadas conforme apresentadas aqui por seus autores.Apenas em questão de velocidade, a versão Kens vence com facilidade, mas também é a única que relatará apenas um modo, não importa quantos realmente existam. Como costuma ser o caso, há uma troca entre velocidade e versatilidade. Na
method="mode"
versão de Chris retornará um valor se houver um modo, senão NA. Eu acho que é um toque legal. Também acho interessante como algumas das funções são afetadas por um número maior de valores únicos, enquanto outras não são quase o mesmo. Não estudei o código em detalhes para descobrir por que, além de eliminar a lógica / numérica como causa.fonte
O modo não pode ser útil em todas as situações. Portanto, a função deve resolver esta situação. Tente a seguinte função.
Resultado,
fonte
Isso se baseia na resposta de jprockbelly, adicionando uma velocidade para vetores muito curtos. Isso é útil ao aplicar o modo a um data.frame ou tabela de dados com vários grupos pequenos:
fonte
Outra opção simples que fornece todos os valores ordenados por frequência é usar
rle
:fonte
Outra solução possível:
Uso:
Resultado:
fonte
Caso suas observações sejam classes de números reais e você espera que o modo seja 2,5 quando suas observações forem 2, 2, 3 e 3, você poderá estimar o modo com
mode = l1 + i * (f1-f0) / (2f1 - f0 - f2)
onde l1 .. limite inferior da classe mais frequente, f1 . .frequency de classe mais frequente, f0 ..frequency das classes antes de mais classe frequente, f2 ..frequency das classes após mais frequente e classe i ..Class intervalo como determinado por exemplo, em 1 , 2 , 3 :Caso você deseje o nível mais frequente e possua mais de um nível mais frequente, poderá obter todos eles, por exemplo, com:
fonte
Adicionando uma possível abordagem data.table
fonte
Aqui estão várias maneiras de fazer isso em tempo de execução Theta (N)
fonte
Pode tentar a seguinte função:
fonte
Modo de cálculo é principalmente no caso de variável fator, então podemos usar
HouseVotes84 é um conjunto de dados disponível no pacote 'mlbench'.
isso fornecerá o valor máximo do rótulo. é mais fácil usar as funções embutidas sem a função de gravação.
fonte
Parece-me que, se uma coleção tem um modo, seus elementos podem ser mapeados individualmente com os números naturais. Portanto, o problema de localizar o modo se reduz a produzir esse mapeamento, localizar o modo dos valores mapeados e, em seguida, mapear de volta para alguns dos itens da coleção. (Lidando com
NA
ocorre na fase de mapeamento).Eu tenho uma
histogram
função que opera com um diretor semelhante. (As funções e operadores especiais usados no código aqui apresentado devem ser definidos no Shapiro e / ou no neatOveRse . As partes do Shapiro e do neatOveRse duplicadas neste documento são duplicadas com permissão; os trechos duplicados podem ser usados sob os termos deste site. ) R pseudocódigo parahistogram
é(Os operadores binários especiais realizam tubulação , currying e composição ). Também tenho uma
maxloc
função que é semelhante awhich.max
, mas retorna todos os máximos absolutos de um vetor. R pseudocódigo paramaxloc
éEntão
e
calculará o modo de qualquer coleção, desde que definidas as funções -ping
map
e -ping apropriadasunmap
.fonte