Estou tentando encontrar o máximo local para uma função de densidade de probabilidade (encontrada usando o density
método de R ). Não consigo fazer um método simples de "olhar ao redor dos vizinhos" (onde se olha em torno de um ponto para ver se é um máximo local em relação aos vizinhos), pois há um grande volume de dados. Além disso, parece mais eficiente e genérico usar algo como a interpolação Spline e, em seguida, encontrar as raízes da 1ª derivada, em vez de criar um "olhar ao redor dos vizinhos" com tolerância a falhas e outros parâmetros.
Então, minhas perguntas:
- Dada uma função de
splinefun
, quais métodos encontrarão os máximos locais? - Existe uma maneira fácil / padrão de encontrar derivadas de uma função retornada usando
splinefun
? - Existe uma maneira melhor / padrão de encontrar os máximos locais de uma função de densidade de probabilidade?
Para referência, abaixo está um gráfico da minha função de densidade. Outras funções de densidade com as quais estou trabalhando são semelhantes em forma. Devo dizer que sou novo no R, mas não sou novo na programação; portanto, pode haver uma biblioteca ou pacote padrão para alcançar o que eu preciso.
Obrigado pela ajuda!!
density()
não estimar a densidade para cada dado, estima a densidade a n valores, onde n é um parâmetro especificado pelo usuário com valor padrão n = 512.msExtrema {msProcess}
) e só consegui identificar alguns dos máximos, nunca todos, jogando com as configurações de tolerância.msExtrema
, é um invólucro simples parapeaks
osplus2R
pacote, que seria melhor usar diretamente se você quiser apenas o máximo local e não o mínimo local. Não vejo por que usar o padrãospan=3
não encontraria todos os máximos locais. E 2 ^ 15 = 32768 não deve ser grande o suficiente para que a eficiência seja uma grande preocupação.peaks
parece estar com erros: chamamax.col
com a configuração padrão deties.method = "random"
, que não apenas quebra os vínculos aleatoriamente, mas também define uma tolerância relativa de 1e-5 para declarar um empate. O primeiro é confuso, o último definitivamente não é o que você quer aqui.peaks()
também pega umstrict
parâmetro mal documentado e, olhando o código da função, não faz nada. Ah, as alegrias das bibliotecas de software contribuídas pelos usuários! Você pode corrigi-lo, como diz que não éRespostas:
O que você quer fazer é chamado de detecção de pico em quimiometria. Existem vários métodos que você pode usar para isso. Eu demonstro apenas uma abordagem muito simples aqui.
fonte