¿Cómo puedo detectar mediante programación segmentos de una serie de datos para ajustarlos a diferentes curvas?

14

¿Hay algún algoritmo documentado para separar secciones de un conjunto de datos dado en diferentes curvas de mejor ajuste?

Por ejemplo, la mayoría de los humanos que miran este cuadro de datos lo dividirían fácilmente en 3 partes: un segmento sinusoidal, un segmento lineal y el segmento exponencial inverso. De hecho, hice este en particular con una onda sinusoidal, una línea y una fórmula exponencial simple.

Gráfico de datos con tres partes distintas visibles

¿Existen algoritmos existentes para encontrar partes como esa, que luego pueden ajustarse por separado a varias curvas / líneas para hacer una especie de serie compuesta de los mejores ajustes de subconjuntos de datos?

Tenga en cuenta que aunque el ejemplo tiene los extremos de los segmentos bastante alineados, este no será necesariamente el caso; También puede haber una sacudida repentina en los valores en un corte de segmento. Quizás esos casos serán más fáciles de detectar.

Actualización: Aquí hay una imagen de un poco de datos del mundo real: Tabla del mundo real

Actualización 2: aquí hay un conjunto inusualmente pequeño de datos del mundo real (solo 509 puntos de datos):

4,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235

Aquí está, trazado, con el appoximate posición de algunos conocidos elemento del mundo real bordes marcados con líneas de puntos, un lujo que normalmente no tendremos:

ingrese la descripción de la imagen aquí

Sin embargo, un lujo que tenemos es la retrospectiva: los datos en mi caso no son una serie temporal, sino que están relacionados espacialmente; solo tiene sentido analizar un conjunto de datos completo (generalmente 5000 - 15000 puntos de datos) a la vez, no de manera continua.

Whybird
fuente
1
ps primera publicación en CV; Soy un desarrollador de software y normalmente me quedo mucho más. Disculpas si he violado algún tabú local. Muchas de mis búsquedas de respuestas condujeron aquí, así que pensé que este sería el mejor lugar para preguntar.
whybird
¿Por qué no publica los datos e intentaré responder a su pregunta con un ejemplo?
IrishStat
Una posibilidad sería ajustar toda la familia de curvas a la vez, utilizando un metamodelo. Para hacer las cosas más precisas, suponga que su objetivo final es suavizar ese histograma, digamos usando un KDE. Entonces, su estimación suave del KDE será más precisa si usa un modelo en el que el ancho del núcleo puede variar sobre el rango de valores de como en el modelo utilizado aquí, ecuaciones (2) - (3)X
user603
1
Construiste el ejemplo para que la idea tenga sentido: hasta ahora, muy bien. Con histogramas reales, es mucho más común que una forma complicada refleje una mezcla de distribuciones superpuestas: el interés no está entonces en los puntos de cambio en el histograma observado que generalmente no existen de manera convincente o no son la forma correcta de pensar en mezclas. Sin embargo, es posible que esté utilizando el "histograma" de una manera mucho más amplia de lo que es estándar en ciencia estadística, donde significa gráfico de barras de distribución de frecuencia o probabilidad (solo).
Nick Cox
@IrishStat: los conjuntos de datos habituales tienen de 5000 a 15000 entradas. Estaba tratando de preparar un resumen real aquí, pero resultó ser un mal ejemplo, y tuve que comenzar de nuevo. Por otro lado, hacer eso me sugirió una respuesta parcial en términos de simplemente suavizar y promediar grupos de datos para buscar inicialmente patrones, para ser refinados más tarde, así que gracias por eso :) Tengo uno real que tiene solo 509 de ancho que parece que podría ser bueno; Agregaré eso a la pregunta cuando pueda.
whybird

Respuestas:

2

Mi interpretación de la pregunta es que el OP está buscando metodologías que se ajusten a la (s) forma (s) de los ejemplos proporcionados, no a los residuos HAC. Además, se desean rutinas automatizadas que no requieran una intervención humana o analista significativa. Box-Jenkins puede no ser apropiado, a pesar de su énfasis en este hilo, ya que requieren una participación sustancial de los analistas.

Existen módulos R para este tipo de coincidencia de patrones sin momento. La agrupación de distribución de permutación es una técnica de coincidencia de patrones desarrollada por un científico del Instituto Max Planck que cumple con los criterios que usted ha descrito. Su aplicación es para datos de series temporales, pero no se limita a eso. Aquí hay una cita para el módulo R que se ha desarrollado:

pdc: un paquete R para la agrupación de series de tiempo basadas en la complejidad por Andreas Brandmaier

Además de PDC, está la rutina de aprendizaje automático, iSax desarrollada por Eamon Keogh en UC Irvine, que también vale la pena comparar.

Finalmente, está este documento sobre Destrucción de datos: descubrir el orden de acecho en los datospor Chattopadhyay y Lipson. Más allá del título inteligente, hay un propósito serio en el trabajo. Aquí está el resumen: "Desde el reconocimiento de voz automático hasta el descubrimiento de estrellas inusuales, la capacidad subyacente de casi todas las tareas de descubrimiento automatizadas es la capacidad de comparar y contrastar flujos de datos entre sí, para identificar conexiones y detectar valores atípicos. A pesar de la prevalencia de datos, los métodos automatizados no están manteniendo el ritmo. Un cuello de botella clave es que la mayoría de los algoritmos de comparación de datos de hoy dependen de un experto humano para especificar qué 'características' de los datos son relevantes para la comparación. Aquí, proponemos un nuevo principio para estimar la similitud entre las fuentes de arbitrariedad flujos de datos, sin utilizar el dominio del conocimiento ni el aprendizaje. Demostramos la aplicación de este principio al análisis de datos de una serie de problemas desafiantes del mundo real, incluyendo la desambiguación de patrones electroencefalográficos relacionados con ataques epilépticos, detección de actividad cardíaca anómala a partir de grabaciones de sonido cardíaco y clasificación de objetos astronómicos a partir de fotometría en bruto. En todos estos casos y sin acceso a ningún conocimiento de dominio, demostramos el rendimiento a la par con la precisión lograda por algoritmos especializados y heurística ideados por expertos en dominio. Sugerimos que los principios de destrucción de datos pueden abrir la puerta para comprender observaciones cada vez más complejas, especialmente cuando los expertos no saben qué buscar ". En todos estos casos y sin acceso a ningún conocimiento de dominio, demostramos el rendimiento a la par con la precisión lograda por algoritmos especializados y heurística ideados por expertos en dominio. Sugerimos que los principios de destrucción de datos pueden abrir la puerta para comprender observaciones cada vez más complejas, especialmente cuando los expertos no saben qué buscar ". En todos estos casos y sin acceso a ningún conocimiento de dominio, demostramos el rendimiento a la par con la precisión lograda por algoritmos especializados y heurística ideados por expertos en dominio. Sugerimos que los principios de destrucción de datos pueden abrir la puerta para comprender observaciones cada vez más complejas, especialmente cuando los expertos no saben qué buscar ".

Este enfoque va mucho más allá del ajuste curvilíneo. Vale la pena echarle un vistazo.

Mike Hunter
fuente
Gracias, tiene razón en que lo que quiero es encontrar clústeres automáticamente, sin intervención del analista. Para lo que quiero hacer para trabajar, necesitaré dividir conjuntos de datos de 5000-15000 puntos de datos en grupos que se ajusten bien a fórmulas simples (incluidas las repetitivas) sin intervención humana sobre grupos de alrededor de 50000 conjuntos de datos en un marco de tiempo tolerable por humanos en hardware doméstico.
whybird
En cuanto a qué curva se ajusta a cada grupo, una vez que he detectado los límites por cualquier medio, creo que es bastante simple probar diferentes modelos (onda sinusoidal, polinomio, exponencial) y ver cuál da un mejor r ^ 2 ordinario.
Whybird
2
De acuerdo, creo que la falta de comunicación surge de esto: Sax e iSax son formatos de representación para almacenar y procesar series de tiempo, no son algoritmos de agrupación o detección de segmento / patrón (según la publicación de OP). Según su respuesta, Keogh ideó un algoritmo basado en el formato de representación SAX y que aborda el problema del OP. Pero creo que esto no es lo que querías decir?
Zhubarb
2
OK, no es necesario contactar a Keogh, sé sobre iSax y Sax , son formatos de representación para la minería eficiente de series de tiempo. Los enlaces los explican. iSax es la versión más nueva. Me entusiasmó mi malentendido de su respuesta, de ahí las preguntas (sin tratar de ser pedante) :).
Zhubarb
2
no estaba tratando de ocultar nada, interpreté 'rutina isax' como un algoritmo que opera en isax. Sugiero que su respuesta necesite una nueva redacción / modificación después de la aclaración.
Zhubarb
2

La detección de puntos de cambio en una serie temporal requiere la construcción de un modelo ARIMA global robusto (ciertamente defectuoso por los cambios del modelo y los cambios de parámetros con el tiempo en su caso) y luego identificar el punto de cambio más significativo en los parámetros de ese modelo. Usando sus valores 509, el punto de cambio más significativo fue alrededor del período 353. Utilicé algunos algoritmos patentados disponibles en AUTOBOX (que he ayudado a desarrollar) que posiblemente podrían tener licencia para su aplicación personalizada. La idea básica es separar los datos en dos partes y, al encontrar el punto de cambio más importante, volver a analizar cada uno de los dos intervalos de tiempo por separado (1-352; 353-509) para determinar más puntos de cambio dentro de cada uno de los dos conjuntos. Esto se repite hasta que tenga k subconjuntos. He adjuntado el primer paso con este enfoque.ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

IrishStat
fuente
¿Por qué se marca 353 cuando 153 y 173 tienen valores P más bajos?
Nick Cox
@NickCox ¡Buena pregunta! Gran comentario Para fines de pronóstico, toda la idea es separar el subconjunto más reciente (significativo) del subconjunto más antiguo, por lo que ganó 353 ... Para los propósitos aquí, uno realmente seleccionaría 173.
IrishStat
El título de "más significativo Point Break reciente" intentos para contar la historia
IrishStat
¡Gracias! Esto es realmente interesante y muy apreciado. Puedo contactarlo para más detalles.
whybird
Gracias por la explicación: la idea es explícita en la última nota. (por cierto, no he visto tanto CASO SUPERIOR en la producción del programa desde principios de la década de 1990. Recomendaría cambiar el "nivel de confianza del 95%" al "nivel de significancia del 5%", suponiendo que eso sea lo que se quiere decir).
Nick Cox
2

Creo que el título del hilo es engañoso: no está buscando comparar funciones de densidad, pero en realidad está buscando interrupciones estructurales en una serie de tiempo. Sin embargo, no especifica si se supone que estas rupturas estructurales se encuentran en una ventana de tiempo variable o en retrospectiva al observar el historial total de la serie temporal. En este sentido, su pregunta es en realidad un duplicado de esto: ¿Qué método para detectar rupturas estructurales en series temporales?

Como mencionó Rob Hyndman en este enlace, R ofrece el paquete strucchange para este propósito. Jugué con sus datos, pero debo decir que los resultados son decepcionantes [¿el primer punto de datos es realmente 4 o se supone que es 54?]:

raw = c(54,53,53,53,53,58,56,52,49,52,56,51,44,39,39,39,37,33,27,21,18,12,19,30,45,66,92,118,135,148,153,160,168,174,181,187,191,190,191,192,194,194,194,193,193,201,200,199,199,199,197,193,190,187,176,162,157,154,144,126,110,87,74,57,46,44,51,60,65,66,90,106,99,87,84,85,83,91,95,99,101,102,102,103,105,110,107,108,135,171,171,141,120,78,42,44,52,54,103,128,82,103,46,27,73,123,125,77,24,30,27,36,42,49,32,55,20,16,21,31,78,140,116,99,58,139,70,22,44,7,48,32,18,16,25,16,17,35,29,11,13,8,8,18,14,0,10,18,2,1,4,0,61,87,91,2,0,2,9,40,21,2,14,5,9,49,116,100,114,115,62,41,119,191,190,164,156,109,37,15,0,5,1,0,0,2,4,2,0,48,129,168,112,98,95,119,125,191,241,209,229,230,231,246,249,240,99,32,0,0,2,13,28,39,15,15,19,31,47,61,92,91,99,108,114,118,121,125,129,129,125,125,131,135,138,142,147,141,149,153,152,153,159,161,158,158,162,167,171,173,174,176,178,184,190,190,185,190,200,199,189,196,197,197,196,199,200,195,187,191,192,190,186,184,184,179,173,171,170,164,156,155,156,151,141,141,139,143,143,140,146,145,130,126,127,127,125,122,122,127,131,134,140,150,160,166,175,192,208,243,251,255,255,255,249,221,190,181,181,181,181,179,173,165,159,153,162,169,165,154,144,142,145,136,134,131,130,128,124,119,115,103,78,54,40,25,8,2,7,12,25,13,22,15,33,34,57,71,48,16,1,2,0,2,21,112,174,191,190,152,153,161,159,153,71,16,28,3,4,0,14,26,30,26,15,12,19,21,18,53,89,125,139,140,142,141,135,136,140,159,170,173,176,184,180,170,167,168,170,167,161,163,170,164,161,160,163,163,160,160,163,169,166,161,156,155,156,158,160,150,149,149,151,154,156,156,156,151,149,150,153,154,151,146,144,149,150,151,152,151,150,148,147,144,141,137,133,130,128,128,128,136,143,159,180,196,205,212,218,222,225,227,227,225,223,222,222,221,220,220,220,220,221,222,223,221,223,225,226,227,228,232,235,234,236,238,240,241,240,239,237,238,240,240,237,236,239,238,235)
raw = log(raw+1)
d = as.ts(raw,frequency = 12)
dd = ts.intersect(d = d, d1 = lag(d, -1),d2 = lag(d, -2),d3 = lag(d, -3),d4 = lag(d, -4),d5 = lag(d, -5),d6 = lag(d, -6),d7 = lag(d, -7),d8 = lag(d, -8),d9 = lag(d, -9),d10 = lag(d, -10),d11 = lag(d, -11),d12 = lag(d, -12))

(breakpoints(d ~d1 + d2+ d3+ d4+ d5+ d6+ d7+ d8+ d9+ d10+ d11+ d12, data = dd))
>Breakpoints at observation number:
>151 
>Corresponding to breakdates:
>163 

(breakpoints(d ~d1 + d2, data = dd))
>Breakpoints at observation number:
>95 178 
>Corresponding to breakdates:
>107 190 

No soy un usuario habitual del paquete. Como puede ver, depende del modelo que se ajuste a los datos. Puedes experimentar con

library(forecast)
auto.arima(raw)

que le da el mejor modelo ARIMA.

HOSS_JFL
fuente
¡Gracias! He editado la palabra 'histograma' del título; Al principio lo usé incorrectamente, y olvidé editar el título cuando lo eliminé del cuerpo en una edición anterior en respuesta a un comentario.
whybird
Mis datos son en realidad una serie de datos relacionados con el espacio, no están basados ​​en el tiempo y, por lo general, no existirán en línea recta o incluso en un plano con la frecuencia suficiente, pero tiene razón en que en algún nivel fundamental puede considerarse en el mismo camino; Supongo que eso puede ser parte de por qué mis búsquedas anteriores no encontraron las respuestas que esperaba.
whybird
El primer punto de datos en ese ejemplo es realmente un 4, pero bien podría ser que llegamos al final de una estructura anterior o tal vez fue ruido; Me encantaría dejarlo fuera como algo atípico, pero cualquier sistema que se me ocurra tendrá que hacer frente a cosas como esa también.
whybird
Ah, y el análisis es en retrospectiva. Editaré la pregunta para aclarar.
whybird