Datenaufbereitung für Zeitreihenanalyse

Methoden der Zeitreihenanalyse

Moderator: schubbiaschwilli

Antworten
foena1988
Beiträge: 21
Registriert: Mo Okt 23, 2017 8:30 am

Datenaufbereitung für Zeitreihenanalyse

Beitrag von foena1988 »

Liebes Forum,

Ich bin gerade dabei, Messdaten für eine Zeitreihenanalyse aufzubereiten. Konkret würde ich gerne meine Messdaten (Beschleunigungsmessungen) in Zeitreihen darstellen und daraus eine Verschlechterungsrate ableiten.
pic1.PNG
Bei der Betrachtung der ersten beiden Messsignale ist mir allerdings aufgefallen, dass diese Signale nicht "synchron" sind, d.h. es scheint so, als ob es einen Versatz in X-Richtung gibt.
xxx.PNG
Meine Frage dreht sich nun um Möglichkeiten, wie man diese Verschiebung am Besten in R berechnen kann, sodass die beiden Signale wiederum "synchron" sind und somit innerhalb von Zeitreihen dargestellt werden können. Meine Vorstellung wäre eine Methodik, welcher die beiden Signale übergeben werden (jeweils ein Referenzsignal und ein Signal, welches verschoben werden soll) und welche als Ergebnis die notwendige Verschiebung des einen Signals zurückgibt, damit Synchronität herrscht.

Ich habe auch schon sehr viel re­cher­chie­rt und bin auf folgende Möglichkeiten gestoßen:

- Kreuzkorrelationsfunktion
- Dynamic Time Warping (DTW)

Somit zu meiner Frage: Sind die von mir aufgelisteten Methoden für mein Vorhaben geeignet oder gibt es noch andere Möglichkeiten, einen "Versatz" zwischen zwei Messsignalen zu ermitteln / berechnen bzw. wie können die beiden oben genanntem Methoden in R implementiert werden, damit ich als Ergebnis zwei synchrone Messdatensätze erhalte, welche ich als Zeitreihe darstellen und analysieren kann?

Vielen Dank für eure Unterstützung. Lg
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von jogo »

Hallo foena,

wenn ich die beiden Zeitreihen mal als x und y bezeichne, dann lässt sich das Problem zur Bestimmung von Versatz so formulieren:
Bestimme Versatz so, dass Distanz(x, shift(y, Versatz)) --> min
bzw. Länge(x - shift(y, Versatz))


Gruß, Jörg
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von Athomas »

Der von jogo dargestellte Abstandsminimierungsansatz scheint erstaunlich gut zu funktionieren - zumindest bei meinen simplen Beispielen!
Das unten stehende Programm besteht zum größten Teil aus "Drumherum" (Erzeugung von Spieldaten und Grafiken) - aber vielleicht hilft es ja:

Code: Alles auswählen

Beobachtungen <- 1000
set.seed(4321)
random.walk   <- cumsum(rnorm(Beobachtungen))
plot(random.walk)

Verschiebung <- -73    # Annahme: max. Verschiebung 100 (damit alle Daten da sind)
Anfang       <- 100    # Arbeitsbereich von 100 bis 900 >> "verschobene" Messungen sind sicher vorhanden
Ende         <- 900
Trend        <- -5 - 0.01*1:1000   # Messungen "verschlechtern" sich gegenüber Originalreihe

Störung <- rnorm(1000, 0, 3)
if(Verschiebung >= 0) Messungen <- head(c(rep(NA,Verschiebung), random.walk + Störung), Beobachtungen) else
                      Messungen <- tail(c(random.walk + Störung, rep(NA,-Verschiebung)), Beobachtungen) 

Messungen <- Messungen + Trend
plot(100:900, random.walk[100:900], col="blue")
points(100:900, Messungen[100:900], col="red")

Abstand   <- function(a) sum((random.walk[200:800] - Messungen[(200+a):(800+a)])**2)
vec_Abstand <- Vectorize(Abstand)

GF <- data.frame(Verschiebung = -100:100, Abweichung = vec_Abstand(-100:100))

library(ggplot2)

Grafik <- ggplot(GF) +
  theme_bw() +
  geom_point(aes(Verschiebung, Abweichung), colour="blue")
Grafik

GF$Verschiebung[which.min(GF$Abweichung)]
foena1988
Beiträge: 21
Registriert: Mo Okt 23, 2017 8:30 am

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von foena1988 »

Hallo Jogo & Athomas,

Vielen Dank für eure Hilfe.

Jogo, dein Code funktioniert ziemlich gut - Danke dafür. Mir ist lediglich aufgefallen, dass du eine Verschiebung von -73 vorgiebst und das Ergebnis ist -74. Sollte allerdings nicht so tragisch sein.

Da ich mit der Programmierung in R erst begonnne habe, wollte ich fragen ob es möglich wäre, dass man den Code so adaptiert, dass er auch auf meine Daten anwendbar wäre. ich habe dies versuch, allerdibngs scheitere ich bereits bei den beiden Zeilen

Code: Alles auswählen


Abstand   <- function(a) sum((random.walk[200:800] - Messungen[(200+a):(800+a)])**2)
vec_Abstand <- Vectorize(Abstand)
Ich hänge euch mal zwei testdatensätze an, wie ich diese vorliegen habe. Einer Original , der zweite verschoben . Wäre euch unglaublich dankbar, wenn ihr mir nochmals helfen könntet. Vielen Dank, Lg
MTS_original.csv
(28.81 KiB) 62-mal heruntergeladen
MTS_verschoben.csv
(28.81 KiB) 66-mal heruntergeladen
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von Athomas »

Eieiei, die Werte scheinen ja exakt gleich zu sein - was allerdings nicht zu Deinen Grafiken passt!
Dann hätte man das (noch) einfacher haben können...

Code: Alles auswählen

Original <- read.csv2("D:/R/R Forum/Zeitreihen/Original/MTS_original.csv")
Verschoben <- read.csv2("D:/R/R Forum/Zeitreihen/Original/MTS_verschoben.csv")

plot(Original$X, Original$MTS_501, col="blue")
points(Verschoben$X, Verschoben$MTS_501, col="red")

Abstand     <- function(a) sum((Original$MTS_501[200:1800] - Verschoben$MTS_501[(200+a):(1800+a)])**2)
vec_Abstand <- Vectorize(Abstand)

GF <- data.frame(Verschiebung = -200:200, Abweichung = vec_Abstand(-200:200))

library(ggplot2)

Grafik <- ggplot(GF) +
  theme_bw() +
  geom_point(aes(Verschiebung, Abweichung), colour="blue")
Grafik

GF$Verschiebung[which.min(GF$Abweichung)]
Zu Deiner Frage mit -73 und -74: Du hast Dir nicht angeguckt, wie ich die Reihen erzeuge!?
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von jogo »

foena1988 hat geschrieben: Mo Jan 14, 2019 4:19 pm Hallo Jogo & Athomas,

Vielen Dank für eure Hilfe.

Jogo, dein Code funktioniert ziemlich gut - Danke dafür.
Der Code ist von Athomas :!:
Beim Abstand() kann eine beliebige Norm verwendet werden.
Wenn man nur die Minimierung benötigt und nicht die Werte für den Abstand selber, kann man die Funktion auch modifizieren, z.B. in dem man die Summe von Quadraten nimmt und sich die für die euklidische Norm notwendige sqrt() spart - so hat es Athomas gemacht in seinem Code.

Gruß, Jörg
foena1988
Beiträge: 21
Registriert: Mo Okt 23, 2017 8:30 am

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von foena1988 »

Hallo.

Vielen Dnak euch beiden. Der Code zur Ermittlung der Verschiebung funktioniert perfekt und auch die zusätzlichen Erklärungen waren sehr hilfreich!

DANKE!

Lg
Antworten