Estoy tratando de encontrar los máximos locales para una función de densidad de probabilidad (encontrada usando R's density
método ). No puedo hacer un simple método de "mirar alrededor de los vecinos" (donde uno mira alrededor de un punto para ver si es un máximo local con respecto a sus vecinos) ya que hay un gran volumen de datos. Además, parece más eficiente y genérico usar algo como la interpolación de Spline y luego encontrar las raíces de la primera derivada, en lugar de construir una "mirada a los vecinos" con tolerancia a fallas y otros parámetros.
Entonces, mis preguntas:
- Dada una función de
splinefun
, ¿qué métodos encontrarán los máximos locales? - ¿Hay una manera fácil / estándar de encontrar derivadas de una función devuelta usando
splinefun
? - ¿Existe una forma mejor / estándar de encontrar los máximos locales de una función de densidad de probabilidad?
Como referencia, a continuación hay una gráfica de mi función de densidad. Otras funciones de densidad con las que estoy trabajando son similares en forma. Debo decir que soy nuevo en R, pero no soy nuevo en programación, por lo que puede haber una biblioteca o paquete estándar para lograr lo que necesito.
¡¡Gracias por tu ayuda!!
density()
no estima la densidad para cada dato, estima la densidad en n valores, donde n es un parámetro especificado por el usuario con un valor predeterminado n = 512.msExtrema {msProcess}
) y solo pude identificar algunos de los máximos, nunca todos, jugando con la configuración de tolerancia.msExtrema
, es un contenedor simple parapeaks
elsplus2R
paquete, que sería mejor usar directamente si solo desea los máximos locales y no los mínimos locales. No puedo ver por qué usar el valor predeterminadospan=3
no encontraría todos los máximos locales. Y 2 ^ 15 = 32768 no debería ser lo suficientemente grande como para que la eficiencia sea una gran preocupación.peaks
parece tener errores: llamamax.col
con la configuración predeterminada deties.method = "random"
, que no solo rompe los lazos al azar, sino que también establece una tolerancia relativa de 1e-5 para declarar un empate. Lo primero es confuso, lo último definitivamente no es lo que quieres aquí.peaks()
también toma unstrict
parámetro que está mal documentado y, mirando el código de la función, no hace nada. ¡Ah, las alegrías de las bibliotecas de software aportadas por los usuarios! Es posible que también sea capaz de arreglarlo, aunque, como usted dice que no es nuevo en la programación,Respuestas:
Lo que quieres hacer se llama detección de picos en quimiometría. Hay varios métodos que puede usar para eso. Aquí solo demuestro un enfoque muy simple.
fuente