J'essaie de trouver les maxima locaux pour une fonction de densité de probabilité (trouvée en utilisant la density
méthode de R ). Je ne peux pas faire une simple méthode "regarder autour des voisins" (où l'on regarde autour d'un point pour voir s'il s'agit d'un maximum local par rapport à ses voisins) car il y a un grand volume de données. De plus, il semble plus efficace et générique d'utiliser quelque chose comme l'interpolation Spline et de trouver ensuite les racines de la dérivée première, au lieu de construire un "regard autour des voisins" avec une tolérance aux pannes et d'autres paramètres.
Alors, mes questions:
- Étant donné une fonction de
splinefun
, quelles méthodes trouveront les maxima locaux? - Existe-t-il un moyen simple / standard de trouver les dérivés d'une fonction renvoyée à l'aide de
splinefun
? - Existe-t-il un moyen meilleur / standard de trouver les maxima locaux d'une fonction de densité de probabilité?
Pour référence, ci-dessous est un tracé de ma fonction de densité. Les autres fonctions de densité avec lesquelles je travaille sont de forme similaire. Je dois dire que je suis nouveau dans R, mais pas nouveau dans la programmation, donc il peut y avoir une bibliothèque ou un package standard pour réaliser ce dont j'ai besoin.
Merci de votre aide!!
density()
n'évalue pas la densité pour chaque donnée, il estime la densité à n valeurs, où n est un paramètre spécifié par l'utilisateur avec la valeur par défaut n = 512.msExtrema {msProcess}
) et je n'ai pu identifier que quelques-uns des maximums, jamais tous, en jouant avec les paramètres de tolérance.msExtrema
, c'est un simple wrapper pourpeaks
lesplus2R
package, que vous feriez mieux d'utiliser directement si vous ne voulez que les maxima locaux et non les minima locaux. Je ne vois pas pourquoi l'utilisation de la valeur par défautspan=3
ne trouverait pas tous les maxima locaux. Et 2 ^ 15 = 32768 ne devrait pas être assez grand pour que l'efficacité soit un gros problème.peaks
semble être bogué: il appellemax.col
avec le paramètre par défaut deties.method = "random"
, qui non seulement rompt les liens au hasard, mais définit également une tolérance relative de 1e-5 pour déclarer une égalité. Le premier est déroutant, le second n'est certainement pas ce que vous voulez ici.peaks()
prend également unstrict
paramètre mal documenté et, en regardant le code de la fonction, ne fait rien. Ah, les joies des bibliothèques de logiciels fournies par les utilisateurs! Vous pourriez bien être en mesure de le corriger si, comme vous dites que vous n'êtes pas nouveau à la programmation,Réponses:
Ce que vous voulez faire, c'est la détection des pics en chimiométrie. Il existe différentes méthodes pour cela. Je ne démontre ici qu'une approche très simple.
la source