16 votos

Encontrar puntos de inflexión en R a partir de datos suavizados

Tengo algunos datos que suavizo utilizando loess . Me gustaría encontrar los puntos de inflexión de la línea suavizada. ¿Es esto posible? Estoy seguro de que alguien ha hecho un método elegante para resolver esto ... Quiero decir ... después de todo, es R!

Me parece bien que se cambie la función de suavizado que uso. Acabo de utilizar loess porque eso es lo que he usado en el pasado. Pero cualquier función de suavizado está bien. Soy consciente de que los puntos de inflexión dependerán de la función de suavizado que utilice. Estoy de acuerdo con eso. Me gustaría empezar con cualquier función de suavizado que pueda ayudar a escupir los puntos de inflexión.

Este es el código que utilizo:

x = seq(1,15)
y = c(4,5,6,5,5,6,7,8,7,7,6,6,7,8,9)
plot(x,y,type="l",ylim=c(3,10))
lo <- loess(y~x)
xl <- seq(min(x),max(x), (max(x) - min(x))/1000)
out = predict(lo,xl)
lines(xl, out, col='red', lwd=2)

enter image description here

3 votos

Tal vez quiera echar un vistazo a análisis del punto de cambio .

0 votos

He encontrado esta línea de código muy útil: infl <- c(FALSE, diff(diff(out)>0)!=0) Pero este código encuentra todos los puntos de inflexión independientemente de que se doble hacia arriba o hacia abajo. ¿Cómo puedo saber qué puntos giran hacia arriba y cuáles hacia abajo en una serie temporal? Por ejemplo, trazar y colorear en verde los puntos de giro hacia arriba y en rojo los que giran hacia abajo.

17voto

Brandon Puntos 1968

Desde la perspectiva del uso de R para encontrar las inflexiones en la curva suavizada, sólo necesita encontrar aquellos lugares en los valores de y suavizados donde el cambio en y cambia de signo.

infl <- c(FALSE, diff(diff(out)>0)!=0)

A continuación, puedes añadir puntos a la gráfica donde se producen estas inflexiones.

points(xl[infl ], out[infl ], col="blue")

Desde el punto de vista de la búsqueda de puntos de inflexión estadísticamente significativos, estoy de acuerdo con @nico en que deberías buscar el análisis de puntos de cambio, a veces también denominado regresión segmentada.

0 votos

Esto parece hacer el trabajo algo bien. Entiendo que no es lo ideal y el resultado que da no es ciertamente ideal. Sin embargo, gracias por la contribución. Cubre la mayoría de los casos, excepto los de una línea recta.

3 votos

No estoy seguro de entenderlo, @usuario164846. Una línea recta no tiene puntos de inflexión.

0 votos

Además, es posible que quieras echar un vistazo a los suavizadores que proporcionan inmediatamente derivadas, por ejemplo, los filtros Savitzky-Golay. Sin embargo, la elección del alisador siempre debe ser decidida por sus datos y su aplicación, ¡y no al revés!

4voto

Nick Cox Puntos 22819

Aquí hay problemas a varios niveles.

En primer lugar, el loess sólo es un alisador y hay muchos, muchos para elegir. Los optimistas sostienen que casi cualquier alisador razonable encontrará un patrón real y que casi todos los alisadores razonables coinciden en los patrones reales. Los pesimistas sostienen que éste es el problema y que los "alisadores razonables" y los "patrones reales" se definen aquí en términos del otro. Al grano, ¿por qué el loess y por qué cree que es una buena opción en este caso? La elección no es sólo de un único suavizador o de una única implementación de un suavizador (no todo lo que se denomina loess o lowess es idéntico en todos los programas), sino también de un único grado de suavizado (aunque lo elija la rutina por ti). Usted menciona este punto, pero no lo aborda.

Más concretamente, como muestra tu ejemplo de juguete, las características básicas como los puntos de inflexión pueden fácilmente no ser preservadas por el loess (tampoco es para destacar el loess). Tu primer mínimo local desaparece y tu segundo mínimo local se ve desplazado por el suavizado particular que muestras. Las inflexiones definidas por los ceros de la segunda derivada en lugar de la primera pueden ser aún más volubles.

0 votos

Elegí el loess porque lo saqué de internet. Tengo mucha experiencia en el alisado en general, así que simplemente cogí el código de internet. ¿Tienes alguna sugerencia mejor?

0 votos

Lo siento, pero no entiendo su comentario. Si tienes mucha experiencia en el alisado, deberías tener argumentos sobre qué alisadores preservan mejor las inflexiones a la vez que suprimen el ruido. A mí me parece un objetivo contradictorio, pero me encantaría escuchar argumentos técnicos de por qué estoy equivocado.

0 votos

Lo siento, no quise decir "inexperto" jaja

2voto

sd2k9 Puntos 21

Hay un montón de enfoques excelentes para esta cuestión. Algunos incluyen. (1) - paquete de puntos de cambio (2) - paquete segmentado. Pero es necesario elegir el número de puntos de cambio. (3) MARS como se implementa en el paquete -earth-.

Dependiendo de la relación entre el sesgo y la varianza, todos le darán información ligeramente diferente. Vale la pena echar un vistazo a -segmented-. Los modelos con diferente número de puntos de cambio se pueden comparar con AIC/BIC

1voto

gauss Puntos 110

Tal vez puedas utilizar la biblioteca fda, y una vez que hayas estimado una función continua adecuada, podrás encontrar fácilmente los lugares donde la segunda derivada es cero.

FDA CRAN

Introducción de la FDA

0 votos

Los ceros de la primera derivada definen los mínimos y los máximos. Creo que te refieres a la segunda. ¿Qué es "fácilmente", de cualquier manera? Hay más de una forma de diferenciar numéricamente.

0voto

user59651 Puntos 51

He recibido muchas visitas en el blog sobre el paquete changepoint (>650 hasta el 11 de noviembre de 2014), así que aquí tienes un post actualizado con CausalImpact. http://r-datameister.blogspot.com/2014/11/causality-in-time-series-look-at-2-r.html

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X