Seite 1 von 1

Datenaufbereitung für Zeitreihenanalyse

Verfasst: Do Jan 10, 2019 3:55 pm
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

Re: Datenaufbereitung für Zeitreihenanalyse

Verfasst: Fr Jan 11, 2019 8:37 am
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

Re: Datenaufbereitung für Zeitreihenanalyse

Verfasst: Fr Jan 11, 2019 5:15 pm
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)]

Re: Datenaufbereitung für Zeitreihenanalyse

Verfasst: Mo Jan 14, 2019 4:19 pm
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) 63-mal heruntergeladen
MTS_verschoben.csv
(28.81 KiB) 69-mal heruntergeladen

Re: Datenaufbereitung für Zeitreihenanalyse

Verfasst: Mo Jan 14, 2019 4:58 pm
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!?

Re: Datenaufbereitung für Zeitreihenanalyse

Verfasst: Di Jan 15, 2019 11:18 pm
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

Re: Datenaufbereitung für Zeitreihenanalyse

Verfasst: Mi Jan 16, 2019 1:40 pm
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