Comment puis-je détecter par programmation des segments d'une série de données pour les adapter à différentes courbes?

14

Existe-t-il des algorithmes documentés pour séparer les sections d'un ensemble de données donné en différentes courbes de meilleur ajustement?

Par exemple, la plupart des humains qui regardent ce tableau de données le diviseraient facilement en 3 parties: un segment sinusoïdal, un segment linéaire et le segment exponentiel inverse. En fait, j'ai fait celui-ci en particulier avec une onde sinusoïdale, une ligne et une formule exponentielle simple.

Graphique des données avec trois parties distinctes visibles

Existe-t-il des algorithmes existants pour trouver des parties comme celle-ci, qui peuvent ensuite être ajustés séparément à diverses courbes / lignes pour créer une sorte de série composée de meilleurs ajustements de sous-ensembles de données?

Notez que bien que l'exemple ait à peu près la fin des segments, ce ne sera pas nécessairement le cas; il peut également y avoir une secousse soudaine des valeurs à une coupure de segment. Ces cas seront peut-être plus faciles à détecter.

Mise à jour: Voici une image d'un petit peu de données du monde réel: Carte du monde réel

Mise à jour 2: voici un ensemble de données du monde réel exceptionnellement petit (seulement 509 points de données):

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

Le voici, cartographié, avec la position approximative de certains bords d'éléments du monde réel connus marqués de lignes pointillées, un luxe que nous n'aurons normalement pas:

entrez la description de l'image ici

Un luxe que nous avons, cependant, est le recul: les données dans mon cas ne sont pas une série chronologique, mais sont plutôt spatialement liées; il est logique d'analyser un ensemble de données entier (généralement 5000 - 15000 points de données) à la fois, pas de manière continue.

pourquoi oiseau
la source
1
ps premier post au CV; Je suis un développeur de logiciels et je passe plus de temps sur SO. Toutes mes excuses si j'ai violé des tabous locaux. Beaucoup de mes recherches de réponses ont abouti ici, alors j'ai pensé que ce serait le meilleur endroit pour demander.
whybird
Pourquoi ne postez-vous pas les données et je vais essayer de répondre à votre question par l'exemple.
IrishStat
Une possibilité serait d'adapter la famille entière de courbes à la fois, en utilisant un méta-modèle. Pour rendre les choses plus précises, supposons que votre objectif ultime soit de lisser cet histogramme, par exemple en utilisant un KDE. Ensuite, votre estimation lisse à partir du KDE sera plus précise si vous utilisez un modèle dans lequel la largeur du noyau peut varier sur la plage de valeurs de comme dans le modèle utilisé ici, équations (2) - (3)X
user603
1
Vous avez construit l'exemple pour que l'idée ait du sens: jusqu'à présent, tout va bien. Avec de vrais histogrammes, il est beaucoup plus courant qu'une forme compliquée reflète un mélange de distributions qui se chevauchent: l'intérêt n'est pas alors dans les points de changement sur l'histogramme observé qui n'existent généralement pas de manière convaincante ou ne sont pas la bonne façon de penser aux mélanges. Il est possible, cependant, que vous utilisiez "l'histogramme" d'une manière beaucoup plus large que la norme en science statistique où cela signifie un graphique à barres de la fréquence ou de la distribution de probabilité (uniquement).
Nick Cox
@IrishStat - les jeux de données habituels ont 5 000 à 15 000 entrées. J'essayais de préparer un vrai résumé pour ici, mais cela s'est avéré être un mauvais exemple, et j'ai dû recommencer. D'un autre côté, cela m'a suggéré une réponse partielle en termes de simple lissage et de moyenne des groupes de données pour rechercher initialement des modèles, à affiner plus tard, merci pour cela :) J'en ai un vrai qui ne fait que 509 de large qui on dirait que ça pourrait être bon; J'ajouterai cela à la question dès que possible.
whybird

Réponses:

2

Mon interprétation de la question est que le PO recherche des méthodologies qui correspondent à la ou aux formes des exemples fournis, et non aux résidus HAC. De plus, des routines automatisées qui ne nécessitent pas d'intervention humaine ou d'analyste importante sont souhaitées. Box-Jenkins peut ne pas être approprié, malgré leur importance dans ce fil, car ils nécessitent une implication substantielle des analystes.

Il existe des modules R pour ce type de correspondance de modèle sans moment. Le clustering de distribution de permutation est une telle technique de mise en correspondance de modèles développée par un scientifique de l'Institut Max Planck qui répond aux critères que vous avez définis. Son application est aux données de séries chronologiques, mais ce n'est pas limité à cela. Voici une citation pour le module R qui a été développé:

pdc: un package R pour le clustering basé sur la complexité des séries chronologiques par Andreas Brandmaier

En plus du PDC, il y a l'apprentissage automatique, la routine iSax développée par Eamon Keogh chez UC Irvine qui vaut également la peine d'être comparée.

Enfin, il y a cet article sur Data Smashing: Uncovering Lurking Order in Datapar Chattopadhyay et Lipson. Au-delà du titre intelligent, il y a un objectif sérieux au travail. Voici le résumé: "De la reconnaissance automatique de la parole à la découverte d'étoiles inhabituelles, presque toutes les tâches de découverte automatisées sous-tendent la capacité de comparer et de contraster les flux de données les uns avec les autres, d'identifier les connexions et de repérer les valeurs aberrantes. Malgré la prévalence des données, cependant, les méthodes automatisées Un des principaux goulots d'étranglement est que la plupart des algorithmes de comparaison de données s'appuient aujourd'hui sur un expert humain pour spécifier les «caractéristiques» des données qui sont pertinentes pour la comparaison. Ici, nous proposons un nouveau principe pour estimer la similitude entre les sources d'arbitraire flux de données, n'utilisant ni connaissance du domaine ni apprentissage. Nous démontrons l'application de ce principe à l'analyse des données d'un certain nombre de problèmes difficiles du monde réel, y compris la désambiguïsation des modèles d'électro-encéphalographie concernant les crises d'épilepsie, la détection de l'activité cardiaque anormale à partir d'enregistrements sonores de cœur et la classification des objets astronomiques à partir de la photométrie brute. Dans tous ces cas et sans accès à aucune connaissance du domaine, nous démontrons des performances à la hauteur de la précision obtenue par des algorithmes spécialisés et des heuristiques conçus par des experts du domaine. Nous suggérons que les principes d'écrasement des données peuvent ouvrir la porte à la compréhension d'observations de plus en plus complexes, en particulier lorsque les experts ne savent pas quoi rechercher. " Dans tous ces cas et sans accès à aucune connaissance du domaine, nous démontrons des performances à la hauteur de la précision obtenue par des algorithmes spécialisés et des heuristiques conçus par des experts du domaine. Nous suggérons que les principes d'écrasement des données peuvent ouvrir la porte à la compréhension d'observations de plus en plus complexes, en particulier lorsque les experts ne savent pas quoi rechercher. " Dans tous ces cas et sans accès à aucune connaissance du domaine, nous démontrons des performances à la hauteur de la précision obtenue par des algorithmes spécialisés et des heuristiques conçus par des experts du domaine. Nous suggérons que les principes d'écrasement des données peuvent ouvrir la porte à la compréhension d'observations de plus en plus complexes, en particulier lorsque les experts ne savent pas quoi rechercher. "

Cette approche va bien au-delà de l'ajustement curviligne. Cela vaut la peine de vérifier.

Mike Hunter
la source
Merci - vous avez raison de dire que ce que je veux, c'est trouver des clusters automatiquement, sans intervention d'analyste. Pour ce que je veux faire, je vais devoir diviser les ensembles de données de 5000 à 15 000 points de données en grappes qui se conforment bien à des formules simples (y compris répétitives) sans intervention humaine sur des groupes d'environ 50000 de ces ensembles de données dans un délai tolérable par des humains sur du matériel informatique domestique.
whybird
Quant à la courbe à adapter à chaque cluster, une fois que j'ai détecté les limites par quelque moyen que ce soit, je pense qu'il est assez simple d'essayer différents modèles (onde sinusoïdale, polynomiale, exponentielle) et de voir ce qui donne un meilleur r ^ 2 ordinaire.
whybird
2
OK, je pense que la mauvaise communication vient de ceci: Sax et iSax sont des formats de représentation pour le stockage et le traitement des séries temporelles, ils ne sont pas des algorithmes de clustering ou de détection de segment / modèle (par poste OP). D'après ce que j'ai compris de votre réponse, Keogh avait mis au point un algorithme basé sur le format de représentation SAX et qui résout le problème du PO. Mais je pense que ce n'est pas ce que tu voulais dire?
Zhubarb
2
OK, pas besoin de tendre la main à Keogh, je connais iSax et Sax , ce sont des formats de représentation pour une exploration efficace des séries chronologiques. Les liens les expliquent. iSax est la nouvelle version. J'étais excité par ma mauvaise compréhension de votre réponse, d'où les questions (n'essayant pas d'être pédant) :).
Zhubarb
2
je n'essayais pas de cacher quoi que ce soit, j'ai interprété la «routine isax» comme un algorithme fonctionnant sur isax. Je suggère que votre réponse doive être reformulée / modifiée après la clarification.
Zhubarb
2

La détection des points de changement dans une série chronologique nécessite la construction d'un modèle ARIMA global robuste (certainement imparfait par les changements de modèle et les changements de paramètres dans le temps dans votre cas), puis en identifiant le point de changement le plus significatif dans les paramètres de ce modèle. En utilisant vos valeurs 509, le point de changement le plus significatif a été autour de la période 353. J'ai utilisé certains algorithmes propriétaires disponibles dans AUTOBOX (que j'ai aidé à développer) qui pourraient éventuellement être concédés sous licence pour votre application personnalisée. L'idée de base est de séparer les données en deux parties et une fois le point de changement le plus important analysé séparément, chacune des deux plages de temps (1-352; 353-509) pour déterminer d'autres points de changement dans chacun des deux ensembles. Ceci est répété jusqu'à ce que vous ayez k sous-ensembles. J'ai attaché la première étape en utilisant cette approche.entrez la description de l'image ici

entrez la description de l'image ici

IrishStat
la source
Pourquoi 353 est-il signalé lorsque 153 et 173 ont des valeurs P inférieures?
Nick Cox
@NickCox Bonne question! Grand commentaire À des fins de prévision, l'idée est de séparer le sous-ensemble le plus récent (significatif) du sous-ensemble plus ancien, c'est pourquoi 353 a gagné ...
IrishStat
Le titre "POINT DE
RUPTURE SIGNIFICATIF LE
Je vous remercie! C'est vraiment intéressant et très apprécié. Je peux vous contacter pour plus de détails.
whybird
Merci pour l'explication: l'idée est en effet explicite dans la dernière note. (incidemment, je n'ai pas vu autant de CAS SUPÉRIEURS dans la production du programme depuis le début des années 1990. Je recommanderais de changer le "niveau de confiance de 95%" en "le niveau de signification de 5%" en supposant que c'est ce que l'on veut dire.)
Nick Cox
2

Je pense que le titre du fil est trompeur: vous ne cherchez pas à comparer les fonctions de densité mais vous cherchez en fait des ruptures structurelles dans une série chronologique. Cependant, vous ne spécifiez pas si ces ruptures structurelles sont censées se trouver dans une fenêtre temporelle glissante ou avec le recul en examinant l'historique total de la série chronologique. En ce sens, votre question est en fait en double: quelle méthode pour détecter les ruptures structurelles sur les séries chronologiques?

Comme mentionné par Rob Hyndman dans ce lien, R propose le package strucchange à cet effet. J'ai joué avec vos données mais je dois dire que les résultats sont décevants [le premier point de données est-il vraiment 4 ou censé être 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 

Je ne suis pas un utilisateur régulier du package. Comme vous pouvez le voir, cela dépend du modèle que vous ajustez sur les données. Vous pouvez expérimenter avec

library(forecast)
auto.arima(raw)

qui vous donne le modèle ARIMA le mieux adapté.

HOSS_JFL
la source
Je vous remercie! J'ai supprimé le mot «histogramme» du titre; Je l'avais mal utilisé au départ et j'ai oublié de modifier le titre lorsque je l'ai supprimé du corps lors d'une modification précédente en réponse à un commentaire.
whybird
Mes données sont en fait une série de données spatialement liées, elles ne sont pas basées sur le temps et n'existent généralement pas en ligne droite ni même dans un plan assez souvent - mais vous avez raison de dire qu'à un certain niveau fondamental, elles peuvent être considérées de la même manière. façon; Je suppose que cela peut être une des raisons pour lesquelles mes recherches précédentes n'ont pas trouvé les réponses que j'attendais.
whybird
Le premier point de données dans cet exemple est vraiment un 4, mais il se pourrait bien que nous ayons touché la fin d'une structure précédente ou que ce soit du bruit; Je serais heureux de laisser cela comme une valeur aberrante, mais quel que soit le système que je proposerai, il devra aussi faire face à des choses comme ça.
whybird
Oh, et l'analyse est avec du recul. Je vais modifier la question pour clarifier.
whybird