Comment trouver des pics dans un jeu de données?

47

Si j'ai un ensemble de données qui produit un graphique tel que celui-ci, comment pourrais-je déterminer par un algorithme les valeurs x des pics affichés (dans ce cas, trois d'entre elles):

entrez la description de l'image ici

nonaxiomatique
la source
13
Je vois six maxima locaux. De quoi parlez-vous? :-) (Bien sûr que c'est évident - l'objectif de ma remarque est de vous encourager à définir un "pic" plus précisément, car c'est la clé pour créer un bon algorithme.)
whuber
3
Si les données constituent une série temporelle purement périodique avec une composante de bruit aléatoire ajoutée, vous pouvez adapter une fonction de régression harmonique dans laquelle la période et l'amplitude sont des paramètres estimés à partir des données. Le modèle résultant serait une fonction périodique lisse (c'est-à-dire une fonction de quelques sinus et cosinus) et comportera par conséquent des points temporels identifiables de manière unique lorsque la première dérivée est égale à zéro et la deuxième dérivée est négative. Ce sont les sommets. Les endroits où la première dérivée est zéro et la deuxième dérivée est positive seront ce que nous appelons des creux.
Michael Chernick
2
J'ai ajouté la balise mode, consultez quelques-unes de ces questions, elles auront des réponses intéressantes.
Andy W
Merci à tous pour vos réponses et commentaires, c'est très apprécié! Il me faudra un certain temps pour comprendre et mettre en œuvre les algorithmes suggérés en ce qui concerne mes données, mais je veillerai à mettre à jour plus tard les commentaires.
Nonaxiomatic
C'est peut-être parce que mes données sont très bruyantes, mais je n'ai eu aucun succès avec la réponse ci-dessous. Cependant, ma réponse a été un succès: stackoverflow.com/a/16350373/84873
Daniel

Réponses:

36

Une approche générale consiste à lisser les données , puis à rechercher les pics en comparant un filtre maximum local au filtre lisse . Dans R:

argmax <- function(x, y, w=1, ...) {
  require(zoo)
  n <- length(y)
  y.smooth <- loess(y ~ x, ...)$fitted
  y.max <- rollapply(zoo(y.smooth), 2*w+1, max, align="center")
  delta <- y.max - y.smooth[-c(1:w, n+1-1:w)]
  i.max <- which(delta <= 0) + w
  list(x=x[i.max], i=i.max, y.hat=y.smooth)
}

Sa valeur de retour inclut les arguments des maxima locaux ( x) - qui répondent à la question - et les index dans les tableaux x et y où ces maxima locaux se produisent ( i).

Deux paramètres doivent être adaptés aux circonstances: w la demi-largeur de la fenêtre utilisée pour calculer le maximum local. (Sa valeur doit être sensiblement inférieure à la moitié de la longueur du tableau de données.) De petites valeurs captureront de petites bosses locales alors que des valeurs plus grandes les transmettront directement. Un autre - non explicite dans ce code - est l’ spanargument du loessplus lisse. (Elle est généralement comprise entre zéro et un; elle reflète la largeur de la fenêtre sous forme de proportion de la plage de valeurs x). Des valeurs plus grandes lisseront les données de manière plus agressive, faisant disparaître complètement les bosses locales.

Pour voir cet accord effectif, créons une petite fonction de test pour tracer les résultats:

test <- function(w, span) {
  peaks <- argmax(x, y, w=w, span=span)

  plot(x, y, cex=0.75, col="Gray", main=paste("w = ", w, ", span = ", span, sep=""))
  lines(x, peaks$y.hat,  lwd=2) #$
  y.min <- min(y)
  sapply(peaks$i, function(i) lines(c(x[i],x[i]), c(y.min, peaks$y.hat[i]),
         col="Red", lty=2))
  points(x[peaks$i], peaks$y.hat[peaks$i], col="Red", pch=19, cex=1.25)
}

Voici quelques expériences appliquées à des données synthétiques légèrement bruitées.

x <- 1:1000 / 100 - 5
y <- exp(abs(x)/20) * sin(2 * x + (x/5)^2) + cos(10*x) / 5 + rnorm(length(x), sd=0.05)
par(mfrow=c(3,1))
test(2, 0.05)
test(30, 0.05)
test(2, 0.2)

Parcelles

Une fenêtre large (tracé du milieu) ou plus agressive (tracé du bas) éliminent les maxima locaux détectés dans le tracé du haut. La meilleure combinaison est probablement une fenêtre large et un lissage doux uniquement, car un lissage agressif semble déplacer ces pics (voir les points au centre et à droite du graphique du bas et comparer leurs emplacements aux pics apparents des données brutes). Dans cet exemple, w=50et span=0.05fait un excellent travail (non illustré).

Notez que les maxima locaux aux points finaux ne sont pas détectés. Ceux-ci peuvent être inspectés séparément. (Pour supporter ceci, argmaxretourne les valeurs y lissées.)


Cette approche présente plusieurs avantages par rapport à la modélisation plus formelle pour les travaux généraux:

  • Il n’adopte aucun modèle préconçu des données.

  • Il peut être adapté aux caractéristiques des données.

  • Il peut être adapté pour détecter les types de pics auxquels on s'intéresse.

whuber
la source
3
Au contraire, @ Michael: je ne suppose rien sur la périodicité. En effet, l'exemple semble périodique mais il ne l'est pas: remarquez le terme quadratique. La régression harmonique échouera avec cet exemple (et avec beaucoup d'autres séries similaires). De plus, je ne choisis rien "visuellement": tout est fait avec l'algorithme. (Pourquoi ai-je la forte impression que vous n'avez pas lu cette réponse?)
whuber
1
Je peux trouver les pics de manière algorithmique dans les tests de dérivée première et seconde alors que vous devez utiliser un autre moyen (peut-être quelque chose comme une recherche numérique). Mon but n'était pas de prétendre qu'une approche était meilleure que l'autre et que je ne critiquais pas votre réponse du tout. Je viens de voir beaucoup de similitudes et quelques différences et j'essayais de mieux comprendre comment vous identifiez vos pics.
Michael Chernick
3
@Michael Les pics sont des emplacements qui ne dépassent pas un maximum mobile. cela les rend rapides et faciles à calculer: il n'y a pas de recherche numérique, juste un simple balayage . L'avantage d'utiliser un liss différenciable est qu'il peut interpoler les pics entre des valeurs x données: cela est utile pour les résolutions x grossières ou inégales. O(n)
whuber
4
@ Michael, si vous n'avez pas le temps de lire une réponse ou un commentaire, vous pouvez envisager de vous abstenir de répondre à / faire des affirmations au sujet du message. C’est quelque chose que vous avez fait à maintes reprises et qui conduit souvent à des échanges non constructifs et / ou à des déclarations incorrectes que vous retirez par la suite. Cela semble être une perte de temps et d’autres que vous engagez dans de telles conversations. Par exemple, tout ce fil de commentaire a sûrement pris plus de temps que de lire la réponse pour commencer. Pourquoi choisissez-vous d'utiliser le site de cette manière continue de m'interpeller. Je ne vois pas en quoi cela fait du bien à qui que ce soit.
Macro
2
Merci pour l'approche intéressante. Je pense que j'ai aussi compris le but recherché par Michael: il fallait consulter les graphiques pour déterminer les meilleures valeurs pour wet span, mais aussi pour découvrir que des valeurs plus élevées de spandécalaient les pics. On a l'impression que même ces étapes pourraient être automatisées. Par exemple, pour le premier numéro, si nous pouvions évaluer la qualité des pics découverts, nous pourrions utiliser optimizeles paramètres! Pour le deuxième problème, par exemple, choisissez une fenêtre de part et d'autre du pic découvert et recherchez des valeurs plus élevées.
Darren Cook
1

Comme je l'ai mentionné dans un commentaire, si la série temporelle semble être une adaptation périodique, un modèle de régression harmonique permet de lisser la fonction et d'identifier le pic en appliquant les tests de la première et de la seconde dérivées. Huber a souligné un test non paramétrique qui présente des avantages lorsqu'il existe plusieurs pics et que la fonction n'est pas nécessairement périodique. Mais il n'y a pas de repas gratuit. Bien que sa méthode présente certains avantages, il mentionne qu'il peut y avoir des inconvénients si un modèle paramétrique convient. C'est toujours le revers de l'utilisation de techniques non paramétriques. Bien qu'elle évite les hypothèses paramétriques, l'approche paramétrique est préférable lorsque les hypothèses paramétriques sont appropriées. Sa procédure ne tire pas non plus pleinement parti de la structure des séries chronologiques dans les données.

Je pense que s'il convient de souligner les avantages d'une procédure suggérée, il est également important de souligner les inconvénients potentiels. Mon approche et celle de Huber trouvent les pics de manière efficace. Cependant, je pense que sa procédure demande un peu plus de travail lorsqu'un maximum local est inférieur au pic le plus haut déterminé précédemment.

Michael Chernick
la source
2
Pourriez-vous s'il vous plaît démontrer la "manière efficace" de votre approche? Une partie du défi consiste à concevoir un algorithme pour trouver plusieurs pics - ce qui dans votre cas signifie trouver tous les zéros d’une dérivée (calculée de façon onéreuse), et pas seulement un zéro - et à préciser quels points critiques vous allez classer. comme "pics" et lesquels pas. En outre, votre affirmation selon laquelle "l'approche paramétrique est meilleure lorsque les hypothèses paramétriques sont appropriées" est bien étayée ou corroborée "serait une bonne chose, car, comme nous le savons tous, les hypothèses paramétriques ne sont jamais tout à fait correctes.
whuber
@whuber j'ai dit que vous adapteriez alors le modèle puisque le modèle est une somme de sinus et cosinus, la fonction est périodique, les pics se produisent lorsque la première dérivée est égale à zéro et que la dérivée seconde au point zéro diminue. C'est ce que je voulais dire quand j'ai dit que vous passiez les tests de la première et de la deuxième dérivée. Vous pouvez maintenant résoudre le problème pour trouver toutes les solutions, mais si vous avez un pic, les autres sont une période et plusieurs périodes de la solution que vous avez. Mon but est de ne revendiquer aucune supériorité de la méthode. Je veux juste souligner qu'il n'y a pas de repas gratuit.
Michael Chernick
Les méthodes non paramétriques ont l'avantage de ne pas nécessiter d'hypothèse de modélisation, dans ce cas, aucune hypothèse de périodicité. Mon affirmation selon laquelle les approches paramétriques sont meilleures que les approches non paramétriques lorsque les hypothèses de modélisation sont valables devrait vous être très familière. Je n'ai pas besoin de discuter des hypothèses paramétriques qui ne se vérifient jamais. C'est une opinion avec laquelle je suis fondamentalement d'accord. Mais je parle de quelque chose comme l'efficacité de Pitman. Les estimations non paramétriques ne sont pas aussi efficaces que les estimations paramétriques lorsque le modèle est "correct".
Michael Chernick
C'est la théorie. En pratique, les modèles paramétriques peuvent constituer de bonnes approximations de la réalité. Dans ce cas, l'estimation paramétrique (disons mle) est plus efficace que l'estimation non paramétrique. De plus, les intervalles de confiance paramétriques seront meilleurs car ils seront plus serrés. Mais souvent, vous ne savez pas à quel point le modèle paramétrique convient à votre exemple. Dans de tels cas, vous devez choisir entre conservatisme (sécurité) avec une approche non paramétrique ou audacieux (et éventuellement faux) avec une approche paramétrique.
Michael Chernick
1
Ce que j'essaie de suggérer, Michael, c'est que, dans ce cas, l'approche non paramétrique sera probablement bien meilleure que toute approche paramétrique, sauf lorsque les données se rattachent particulièrement au modèle - et même dans ce cas, il fonctionnera bien. En supposant que la périodicité soit un bon exemple: votre algorithme commettra des erreurs du même ordre de grandeur que les écarts de périodicité dans les données. La possibilité de commettre de telles erreurs annule les avantages conférés par une plus grande efficacité asymptotique. Utiliser une telle procédure sans effectuer de tests approfondis sur GoF serait une mauvaise idée.
whuber
1

Une approche classique de détection de pic dans le traitement du signal est la suivante:

  1. Filtrez le signal sur une plage raisonnable, en fonction de la fréquence d'échantillonnage et des propriétés du signal. Par exemple, pour un ECG, un filtre passe-bande IIR à 0,5-20 Hz, un filtre à phase zéro garantira qu'aucun décalage de phase (et le décalage temporel associé) n'est introduit.
  2. Une transformation de Hilbert ou une approche en ondelettes peut ensuite être utilisée pour souligner les pics.
  3. Un seuil statique ou dynamique peut ensuite être appliqué, tous les échantillons supérieurs au seuil étant considérés comme des pics. Dans le cas d'un seuil dynamique, il est généralement défini comme un seuil N écarts types au-dessus ou au-dessous d'une estimation de la moyenne mobile de la moyenne mobile.

Une autre approche qui fonctionne consiste à comparer un signal filtré nettement passe-haut à un signal fortement lissé (filtre passe-bas ou médian) et à appliquer l'étape 3.

J'espère que cela t'aides.

BGreene
la source