Datenaufbereitung für Zeitreihenanalyse

Methoden der Zeitreihenanalyse
Antworten
foena1988
Beiträge: 6
Registriert: Mo Okt 23, 2017 8:30 am

Datenaufbereitung für Zeitreihenanalyse

Beitrag von foena1988 » Do Jan 10, 2019 3:55 pm

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: 1051
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von jogo » Fr Jan 11, 2019 8:37 am

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: 127
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von Athomas » Fr Jan 11, 2019 5:15 pm

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)]
Glaube nicht alles, was im Internet geschrieben wird - bloss weil da ein Name und ein Zitat stehen! (Immanuel Kant)

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

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von foena1988 » 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. 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) 5-mal heruntergeladen
MTS_verschoben.csv
(28.81 KiB) 5-mal heruntergeladen

Athomas
Beiträge: 127
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von Athomas » Mo Jan 14, 2019 4:58 pm

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!?
Glaube nicht alles, was im Internet geschrieben wird - bloss weil da ein Name und ein Zitat stehen! (Immanuel Kant)

jogo
Beiträge: 1051
Registriert: Fr Okt 07, 2016 8:25 am

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von jogo » Di Jan 15, 2019 11:18 pm

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: 6
Registriert: Mo Okt 23, 2017 8:30 am

Re: Datenaufbereitung für Zeitreihenanalyse

Beitrag von foena1988 » Mi Jan 16, 2019 1:40 pm

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

Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 1 Gast