Datenaufbereitung für Zeitreihenanalyse
Moderator: schubbiaschwilli
Datenaufbereitung für Zeitreihenanalyse
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.
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.
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 recherchiert 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
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.
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.
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 recherchiert 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
Re: Datenaufbereitung für Zeitreihenanalyse
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
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
Re: Datenaufbereitung für Zeitreihenanalyse
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:
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)]
Re: Datenaufbereitung für Zeitreihenanalyse
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
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
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)
Re: Datenaufbereitung für Zeitreihenanalyse
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...
Zu Deiner Frage mit -73 und -74: Du hast Dir nicht angeguckt, wie ich die Reihen erzeuge!?
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)]
Re: Datenaufbereitung für Zeitreihenanalyse
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
Re: Datenaufbereitung für Zeitreihenanalyse
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
Vielen Dnak euch beiden. Der Code zur Ermittlung der Verschiebung funktioniert perfekt und auch die zusätzlichen Erklärungen waren sehr hilfreich!
DANKE!
Lg