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

14

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

Estoy bien con cambiar la función de suavizado que uso. Solo lo utilicé loessporque eso era lo que yo había usado en el pasado. Pero cualquier función de suavizado está bien. Me doy cuenta de que los puntos de inflexión dependerán de la función de suavizado que use. Estoy de acuerdo con eso. Me gustaría comenzar simplemente teniendo cualquier función de suavizado que pueda ayudar a escupir los puntos de inflexión.

Aquí está el código que uso:

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)

ingrese la descripción de la imagen aquí

usuario164846
fuente
3
Tal vez desee echar un vistazo al análisis de puntos de cambio .
nico
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 giro, independientemente de que suba o baje. ¿Cómo puedo saber qué puntos se doblan y cuáles se doblan en una serie de tiempo? Por ejemplo, trazar y colorear el punto de inflexión hacia arriba verde y hacia abajo los rojos.
user3511894

Respuestas:

14

Desde la perspectiva de usar R para encontrar las inflexiones en la curva suavizada, solo necesita encontrar esos lugares en los valores y suavizados donde el cambio en y cambia de signo.

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

Luego puede agregar puntos al gráfico donde ocurren estas inflexiones.

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

Desde la perspectiva de encontrar puntos de inflexión estadísticamente significativos, estoy de acuerdo con @nico en que debe analizar el análisis de puntos de cambio, a veces también denominado regresión segmentada.

Jean V. Adams
fuente
Esto parece hacer el trabajo algo bien. Entiendo que no es ideal y el resultado que da ciertamente no es ideal. Gracias por la contribución sin embargo. Cubre la mayoría de los casos, excepto por cosas como una línea recta.
user164846
3
No estoy seguro de entender, @ user164846. Una línea recta no tiene puntos de inflexión.
Jean V. Adams
Además, es posible que desee echar un vistazo a los suavizadores que proporcionan inmediatamente derivados, por ejemplo, filtros Savitzky-Golay. Sin embargo, la elección del suavizador siempre debe decidirse por sus datos y su aplicación, ¡no al revés!
Cbeleites descontento con SX
4

Hay problemas en varios niveles aquí.

En primer lugar, loess resulta ser más suave y hay muchos, muchos para elegir. Los optimistas argumentan que casi cualquier suavizador razonable encontrará un patrón real y que casi todos los suavizadores razonables están de acuerdo en patrones reales. Los pesimistas sostienen que este es el problema y que los "suavizadores razonables" y los "patrones reales" se definen aquí en términos mutuos. Hasta el punto, ¿por qué loess y por qué crees que es una buena opción aquí? La elección no es solo un único suavizador o una sola implementación de un suavizador (no todo lo que se conoce con el nombre de loess o lowess es idéntico en todo el software), sino también un único grado de suavizado (incluso si es elegido por el rutina para ti). Usted menciona este punto, pero eso no lo aborda.

Más específicamente, como muestra su ejemplo de juguete, las características básicas como los puntos de inflexión pueden no ser fácilmente preservadas por loess (tampoco para destacarlo). Su primer mínimo local desaparece y su segundo mínimo local es desplazado por la suavidad particular que muestra. Se puede esperar que las inflexiones definidas por ceros de la segunda derivada en lugar de la primera sean aún más volubles.

Nick Cox
fuente
Elegí loess porque lo tomé de internet. Tengo mucha experiencia en suavizado en general, así que simplemente tomé el código en línea. Tienes una mejor sugerencia?
user164846
Lo siento, pero no entiendo tu comentario. Si tiene mucha experiencia en suavizado, debe tener argumentos sobre qué suavizadores conservan mejor las inflexiones mientras suprimen el ruido. Me parece un objetivo contradictorio, pero me alegraría escuchar argumentos técnicos por los que me equivoco.
Nick Cox
Lo siento, quiero decir "sin experiencia" jaja
usuario164846
1
Veo. La vida es corta y no puedes probar todos los métodos posibles. No podemos ver sus datos reales, pero su ejemplo de juguete subraya que el suavizado puede eliminar la estructura identificable.
Nick Cox
2

Hay un montón de excelentes enfoques para este problema. Algunos incluyen (1) - paquete de punto de cambio (2) - segmentado - paquete. Pero debe elegir el número de puntos de cambio. (3) MARS implementado en el paquete -earth-

Dependiendo de su compromiso de sesgo / variación, todo le dará información ligeramente diferente. -segmentado- bien vale la pena echarle un vistazo. Se pueden comparar diferentes números de modelos de puntos de cambio con AIC / BIC

Charles
fuente
1

Tal vez podría usar la biblioteca fda, ​​y una vez que haya estimado una función continua apropiada, puede encontrar fácilmente los lugares donde la segunda derivada es cero.

GRÚA DE LA FDA

Introducción a la FDA

DL Dahly
fuente
Los ceros de la primera derivada definen mínimos y máximos. Creo que te refieres al segundo. ¿Qué es "fácilmente", de cualquier manera? Hay más de una forma de diferenciar numéricamente.
Nick Cox