Détection des étapes dans les séries temporelles

8

J'ai joint une photo de la série chronologique dont je parle. Le haut est la série originale, le bas est la série différenciée.

Chaque point de données est une lecture moyenne de 5 minutes à partir d'une jauge de contrainte. Cette jauge de contrainte est placée sur une machine. Les zones bruyantes correspondent aux zones où la machine est allumée, les zones propres le sont lorsque la machine est éteinte. Si vous regardez la zone entourée de rouge, il y a des étapes anormales dans la lecture que j'aimerais pouvoir détecter automatiquement.

Je suis complètement perplexe sur la façon dont je pourrais y arriver - des idées?

entrez la description de l'image ici

mohamedmoussa
la source
Quelles sont les étapes anormales? est-ce que la machine est éteinte? Je pouvais voir un motif similaire dans un cercle rouge dans l'autre partie de la série? Ai-je raté quelque chose à voir dans l'intrigue?
vinux
Cela semble difficile. Ma première pensée: modéliser l'état marche / arrêt (caché) par une chaîne de Markov. Le phénomène que vous souhaitez détecter est l'occurrence de quelques valeurs importantes dans la série différenciée lorsque la machine est éteinte, donc si vous pouvez calculer à chaque instant la probabilité que la machine soit éteinte, vous pourrez peut-être la détecter comme " valeurs importantes lorsque la probabilité d'arrêt est élevée ".
Elvis
J'avais une seconde pensée. Je vais le poster ...
Elvis

Réponses:

14

Il semble que vous recherchiez des pointes dans des intervalles de calme relatif . "Relatif" signifie par rapport aux valeurs voisines typiques, ce qui suggère de lisser la série. Un lisse robuste est souhaitable précisément parce qu'il ne doit pas être influencé par quelques pointes locales. "Silencieux" signifie que la variation autour de cette douceur est faible. Encore une fois, une estimation robuste de la variation locale est souhaitable. Enfin, un «pic» serait un grand résidu en tant que multiple de la variation locale.

Pour mettre en œuvre cette recette , nous devons choisir (a) à quelle distance "proche" signifie, (b) une recette pour le lissage, et (c) une recette pour trouver la variation locale. Vous devrez peut-être expérimenter avec (a), alors faisons-en un paramètre facilement contrôlable. De bons choix facilement disponibles pour (b) et (c) sont respectivement Lowess et IQR . Voici une Rimplémentation:

library(zoo)                      # For the local (moving window) IQR
f <- function(x, width=7) {       # width = size of moving window in time steps
    w <- width / length(x)
    y <- lowess(x, f=w)           # The smooth
    r <- zoo(x - y$y)             # Its residuals, structured for the next step
    z <- rollapply(r, width, IQR) # The running estimate of variability
    r/z                           # The diagnostic series: residuals scaled by IQRs
}

À titre d'exemple de son utilisation, considérons ces données simulées où deux pointes successives sont ajoutées à une période de silence (deux de suite devraient être plus difficiles à détecter qu'une seule pointe isolée):

> x <- c(rnorm(192, mean=0, sd=1), rnorm(96, mean=0, sd=0.1), rnorm(192, mean=0, sd=1))
> x[240:241] <- c(1,-1) # Add a local spike
> plot(x)

Données simulées

Voici l'intrigue diagnostique:

> u <- f(x)
> plot(u)

Tracé de diagnostic

Malgré tout le bruit dans les données d'origine, ce tracé détecte magnifiquement les pointes (relativement petites) au centre. Automatisez la détection en balayant les f(x)valeurs les plus grandes (supérieures à environ 5 en valeur absolue: expérimentez pour voir ce qui fonctionne le mieux avec les données d'échantillon).

> spikes <- u[abs(u) >= 5]
      240       241       273 
 9.274959 -9.586756  6.319956

La détection parasite à l'instant 273 était une valeur aberrante locale aléatoire. Vous pouvez affiner le test pour exclure (la plupart) de telles valeurs parasites en modifiant fpour rechercher simultanément des valeurs élevées du diagnostic r/zet des valeurs faibles de l'IQR en cours d'exécution z. Cependant, bien que le diagnostic ait une échelle et une interprétation universelles (sans unité), la signification d'un IQR «faible» dépend des unités des données et doit être déterminée par l'expérience.

whuber
la source
Le dernier paragraphe était basé sur des données simulées similaires, mais pas exactement les mêmes que celles présentées ici. Dans ce diagramme de diagnostic, il est clair qu'il existe d'autres valeurs parasites jusqu'à une taille d'environ 7,5 et les deux pointes ont des valeurs autour de 14.
whuber
Belle réponse - cela semble prometteur. Merci beaucoup. Je vous reviendrai plus tard avec mes résultats.
mohamedmoussa
Juste un suivi rapide - j'ai fait quelque chose de similaire à ce que vous avez fait, mais j'ai eu accès à l'écart type des données dans chaque point de données (c'est-à-dire dans chaque période de 5 minutes). J'ai divisé par le STD lissé et j'ai obtenu de très bons résultats.
mohamedmoussa
wow, j'ai raté ça! (+1!)
Elvis
3

Voici une suggestion de deux cents.

Dénoter Xtla série différenciée. DonnéΔ>0 et un point t, définir

a(Δ,t)=12Δ+1|Xt|.

Car disons Δ=50, la valeur de a(Δ,t) caractérise les zones off / on par des valeurs basses / hautes.

Une étape anormale est un point t|Xt|>αa(Δ,t) - vous aurez besoin de faire quelques réglages α,Δpour détecter ce que vous voulez et éviter les faux positifs lorsque la machine s'allume. J'essaierais d'abord avecΔ=50 et α=4.

Alternativement, vous pouvez regarder les points ta(δ,t)>αa(Δ,t) pour un δΔ (par exemple δ=10, Δ=100), cela peut aider au réglage fin (dans ce cas, vous prendriez une valeur plus petite pour α).

Elvis
la source
est-il possible d'écrire un code R pour l'implémenter? Merci!
user9292