¿Cómo encuentro picos en un conjunto de datos?

47

Si tengo un conjunto de datos que produce un gráfico como el siguiente, ¿cómo determinaría algorítmicamente los valores de x de los picos mostrados (en este caso, tres de ellos):

ingrese la descripción de la imagen aquí

no axiomático
fuente
13
Veo seis máximos locales. ¿A qué tres te refieres? :-). (Por supuesto, es obvio: el objetivo de mi comentario es alentarlo a definir un "pico" con mayor precisión, porque esa es la clave para crear un buen algoritmo.)
whuber
3
Si los datos son una serie temporal puramente periódica con algún componente de ruido aleatorio agregado, podría ajustarse a una función de regresión armónica donde el período y la amplitud son parámetros que se estiman a partir de los datos. El modelo resultante sería una función periódica que es uniforme (es decir, una función de algunos senos y cosenos) y, por lo tanto, tendrá puntos de tiempo identificables de forma única cuando la primera derivada sea cero y la segunda derivada sea negativa. Esos serían los picos. Los lugares donde la primera derivada es cero y la segunda derivada es positiva serán lo que llamamos valles.
Michael Chernick
2
He agregado la etiqueta de modo, mira algunas de esas preguntas, tendrán respuestas de interés.
Andy W
Gracias a todos por sus respuestas y comentarios, ¡lo apreciamos mucho! Me llevará algún tiempo comprender e implementar los algoritmos sugeridos en relación con mis datos, pero me aseguraré de actualizarlos más tarde con comentarios.
axiomático
Tal vez sea porque mis datos son realmente ruidosos, pero no tuve éxito con la respuesta a continuación. Sin embargo, tuve éxito con esta respuesta: stackoverflow.com/a/16350373/84873
Daniel

Respuestas:

36

Un enfoque general es suavizar los datos y luego encontrar picos comparando un filtro máximo local con el suavizado . En 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)
}

Su valor de retorno incluye los argumentos de los máximos locales ( x), que responden a la pregunta, y los índices en las matrices x e y donde ocurren esos máximos locales ( i).

Hay dos parámetros para ajustarse a las circunstancias: w es el ancho medio de la ventana utilizada para calcular el máximo local. (Su valor debe ser sustancialmente menor que la mitad de la longitud de la matriz de datos). Los valores pequeños recogerán pequeñas protuberancias locales, mientras que los valores más grandes pasarán por encima de ellos. Otro, no explícito en este código, es el spanargumento del loesssuavizador. (Por lo general, está entre cero y uno; refleja el ancho de una ventana como una proporción del rango de valores de x). Los valores más grandes suavizarán los datos de manera más agresiva, haciendo desaparecer por completo los baches locales.

Para ver este ajuste en efecto, creemos una pequeña función de prueba para trazar los resultados:

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)
}

Aquí hay algunos experimentos aplicados a algunos datos sintéticos, un poco ruidosos.

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)

Parcelas

Ya sea una ventana ancha (gráfico central) o una suavidad más agresiva (gráfico inferior) eliminan los máximos locales detectados en el gráfico superior. La mejor combinación aquí es probablemente una ventana amplia y solo un suavizado suave, porque el suavizado agresivo parece cambiar estos picos (vea los puntos medio y derecho en el gráfico inferior y compare sus ubicaciones con los picos aparentes de los datos sin procesar). En este ejemplo, w=50y span=0.05hace un gran trabajo (no se muestra).

Observe que los máximos locales en los puntos finales no se detectan. Estos pueden ser inspeccionados por separado. (Para respaldar esto, argmaxdevuelve los valores de y suavizados).


Este enfoque tiene varias ventajas sobre el modelado más formal para el trabajo de propósito general:

  • No adopta ningún modelo preconcebido de los datos.

  • Se puede adaptar a las características de los datos.

  • Se puede adaptar para detectar los tipos de picos que le interesan.

whuber
fuente
3
Por el contrario, @Michael: no asumo nada sobre periodicidad. De hecho, el ejemplo parece periódico, pero no lo es: observe el término cuadrático. La regresión armónica fallará con este ejemplo (y con muchas otras series similares). Además, no selecciono nada "visualmente": todo se hace con el algoritmo. (¿Por qué tengo la fuerte impresión de que realmente no has leído esta respuesta?)
whuber
1
Puedo encontrar los picos algorítmicamente a través de la primera y segunda prueba de derivados, mientras que necesitas usar otros medios (tal vez algo como una búsqueda numérica). Mi punto no era tratar de afirmar que un enfoque era mejor que el otro ni criticaba su respuesta en absoluto. Solo veo muchas similitudes y algunas diferencias, y estaba tratando de obtener una comprensión más clara sobre cómo identificar sus picos.
Michael Chernick
3
@ Michael Los picos son ubicaciones que no exceden un máximo móvil; esto los hace rápidos y fáciles de calcular: no hay búsqueda numérica, solo un escaneo simple . La ventaja de utilizar un suavizado diferenciable es que puede interpolar picos entre valores de x dados: esto es útil para resoluciones de x gruesas o desiguales. O(n)
whuber
44
@Michael, si no tiene "tiempo" para leer una respuesta / comentario, entonces puede considerar abstenerse de responder / hacer afirmaciones sobre la publicación. Esto es algo que has hecho repetidamente y a menudo conduce a intercambios poco constructivos y / o a hacer declaraciones incorrectas que luego retractas. Parece una pérdida de tiempo y de los demás que entablas en tales conversaciones. Por ejemplo, todo este hilo de comentarios seguramente tomó más tiempo que solo leer la respuesta para comenzar. Por qué eliges usar el sitio de esta manera continúa desconcertando. No veo cómo le sirve a nadie.
Macro
2
Gracias por el interesante enfoque. Creo que también entiendo el punto al que estaba llegando Michael: necesitabas ver los gráficos para decidir los mejores valores para wy span, y también descubrir que valores más altos de spanestaban cambiando los picos. Parece que incluso estos pasos podrían automatizarse. Por ejemplo, para el primer problema, si pudiéramos evaluar la calidad de los picos descubiertos, ¡podríamos ejecutar optimizelos parámetros! Para el segundo problema, por ejemplo, elija una ventana a cada lado del pico descubierto y busque valores más altos.
Darren Cook
1

Como mencioné en el comentario, si la serie temporal parece ajustarse periódicamente, un modelo de regresión armónica proporciona una forma de suavizar la función e identificar el pico aplicando las pruebas derivadas primera y segunda. Huber ha señalado una prueba no paramétrica que tiene ventajas cuando hay múltiples picos y la función no es necesariamente periódica. Pero no hay almuerzo gratis. Si bien existen las ventajas de su método que menciona, puede haber desventajas si un modelo paramétrico es apropiado. Esa es siempre la otra cara del uso de técnicas no paramétricas. Aunque evita suposiciones paramétricas, el enfoque paramétrico es mejor cuando las suposiciones paramétricas son apropiadas. Su procedimiento tampoco aprovecha al máximo la estructura de series temporales en los datos.

Creo que si bien es apropiado señalar las ventajas de un procedimiento sugerido, también es importante señalar las posibles desventajas. Tanto mi enfoque como el de Huber encuentran los picos de manera eficiente. Sin embargo, creo que su procedimiento requiere un poco más de trabajo cuando un máximo local es más bajo que el pico más alto previamente determinado.

Michael Chernick
fuente
2
¿Podría por favor demostrar la "manera eficiente" de su enfoque? Parte del desafío es diseñar un algoritmo para encontrar múltiples picos, lo que en su caso significa encontrar todos los ceros de una derivada (calculada costosamente), no solo un cero, y ser explícito sobre cuál de estos puntos críticos clasificará como "picos" y cuáles no. Además, un poco de apoyo o amplificación de su afirmación de que "el enfoque paramétrico es mejor cuando los supuestos paramétricos son apropiados" sería bueno, ya que, como todos sabemos, los supuestos paramétricos nunca son exactamente correctos.
whuber
@whuber Dije que entonces se ajustaría al modelo, ya que el modelo es una suma de senos y cosenos, la función es periódica, los picos ocurren cuando la primera derivada es cero y la segunda derivada en el punto cero está disminuyendo. Eso es lo que quise decir cuando dije que tomas las pruebas derivadas primera y segunda. Ahora puede resolver encontrar todas las soluciones, pero si tiene un pico, los otros están a un período y a varios períodos de la solución que tiene. Mi punto es no reclamar ninguna superioridad del método. Solo quiero señalar que no hay almuerzo gratis.
Michael Chernick
Los métodos no paramétricos tienen la ventaja de no requerir una suposición de modelado, en este caso no se supone una periodicidad. Mi afirmación acerca de que los enfoques paramétricos son mejores que los enfoques no paramétricos cuando se cumplen los supuestos de modelado debería serle muy familiar. No necesito discutir sobre supuestos paramétricos que nunca se sostienen exactamente. Esa es una opinión con la que básicamente estoy de acuerdo. Pero estoy hablando de algo como la eficiencia de Pitman. Las estimaciones no paramétricas no son tan eficientes como las estimaciones paramétricas cuando el modelo es "correcto".
Michael Chernick
Eso es teoría. En la práctica, los modelos paramétricos pueden ser buenas aproximaciones a la realidad. En ese caso, la estimación paramétrica (digamos mle) es más eficiente que la estimación no paramétrica. Además, los intervalos de confianza paramétricos serán mejores porque serán más ajustados. Pero muchas veces no sabes qué tan bueno es el modelo paramétrico para tu ejemplo. En tales casos, debe decidir entre el conservadurismo (estar seguro) con el enfoque no paramétrico o ser audaz (y posiblemente incorrecto) utilizando el enfoque paramétrico.
Michael Chernick
1
Lo que estoy tratando de sugerir, Michael, es que en este caso el enfoque no paramétrico probablemente sea mucho mejor que cualquier enfoque paramétrico, excepto cuando los datos se unen especialmente al modelo, e incluso entonces funcionará bien. Asumir la periodicidad es un gran ejemplo: su algoritmo cometerá errores del mismo orden de magnitud que las desviaciones de la periodicidad dentro de los datos. La posibilidad de cometer tales errores anula cualquier ventaja conferida por una mayor eficiencia asintótica. Usar un procedimiento de este tipo sin realizar pruebas exhaustivas de GoF sería una mala idea.
whuber
1

Un enfoque clásico de detección de picos en el procesamiento de señales es el siguiente:

  1. Filtre la señal a un rango razonable razonable, dependiendo de la frecuencia de muestreo y las propiedades de la señal, por ejemplo, para ECG, un filtro de paso de banda IIR @ 0.5-20Hz, un filtro de fase cero asegurará que no se introduzca un cambio de fase (y el retraso de tiempo asociado)
  2. Una transformación hilbert o un enfoque wavelet se puede utilizar para enfatizar los picos
  3. Entonces se puede aplicar un umbral estático o dinámico, donde todas las muestras por encima del umbral se consideran picos. En el caso de un umbral dinámico, generalmente se define como un umbral N desviaciones estándar por encima o por debajo de una estimación promedio móvil de la media.

Otro enfoque que funciona es comparar una señal filtrada de paso alto agudo con una señal altamente suavizada (paso bajo o filtrado medio) y aplicar el paso 3.

Espero que esto ayude.

BGreene
fuente