Ich habe diese Frage bei StackOverflow gestellt und wurde empfohlen, sie hier zu stellen.
Ich habe zwei Zeitreihen von 3D-Beschleunigungsmesserdaten, die unterschiedliche Zeitbasen haben (Uhren wurden zu unterschiedlichen Zeiten gestartet, mit einem sehr geringen Kriechen während der Abtastzeit) sowie viele Lücken unterschiedlicher Größe (aufgrund von Verzögerungen beim Schreiben zum Trennen) Flash-Geräte).
Die Beschleunigungsmesser, die ich benutze, sind die preiswerten GCDC X250-2 . Ich betreibe die Beschleunigungsmesser mit der höchsten Verstärkung, sodass die Daten ein erhebliches Grundrauschen aufweisen.
Die Zeitreihen haben jeweils ungefähr 2 Millionen Datenpunkte (über eine Stunde bei 512 Abtastungen / s) und enthalten ungefähr 500 interessierende Ereignisse, wobei ein typisches Ereignis 100-150 Abtastwerte (jeweils 200-300 ms) umfasst. Viele dieser Ereignisse sind von Datenausfällen während Flash-Schreibvorgängen betroffen.
Die Daten sind also nicht makellos und auch nicht sehr hübsch. Meine Augapfelinspektion zeigt jedoch, dass sie eindeutig die Informationen enthält, an denen ich interessiert bin. (Ich kann bei Bedarf Diagramme veröffentlichen.)
Die Beschleunigungsmesser befinden sich in ähnlichen Umgebungen, sind jedoch nur mäßig gekoppelt, was bedeutet, dass ich anhand des Auges erkennen kann, welche Ereignisse mit den einzelnen Beschleunigungsmessern übereinstimmen. Bisher war dies in der Software jedoch nicht erfolgreich. Aufgrund physikalischer Einschränkungen sind die Geräte auch in unterschiedlichen Ausrichtungen montiert, wobei die Achsen nicht übereinstimmen, aber sie sind so nah an der Orthogonalität, wie ich sie herstellen könnte. So werden beispielsweise für 3-Achsen-Beschleunigungsmesser A und B + Ax auf -By (oben-unten), + Az auf -Bx (links-rechts) und + Ay auf -Bz (vorne-hinten) abgebildet. .
Mein ursprüngliches Ziel ist es, Schockereignisse auf der vertikalen Achse zu korrelieren, obwohl ich schließlich a) die Achsenabbildung automatisch ermitteln, b) die Aktivität auf den abgebildeten Assen korrelieren und c) Verhaltensunterschiede zwischen den beiden Beschleunigungsmessern (z. B. Verdrehen) extrahieren möchte oder biegen).
Die Art der Zeitreihendaten macht Pythons numpy.correlate () unbrauchbar. Ich habe mir auch R's Zoo-Paket angesehen, bin aber damit nicht weitergekommen. Ich habe in verschiedenen Bereichen der Signalanalyse nach Hilfe gesucht, aber keine Fortschritte erzielt.
Hat jemand eine Ahnung, was ich tun kann oder welche Ansätze ich erforschen sollte?
Update 28. Februar 2011: Hier wurden einige Diagramme hinzugefügt , die Beispiele für die Daten zeigen.
Antworten:
Die Frage betrifft die Berechnung der Korrelation zwischen zwei unregelmäßig abgetasteten Zeitreihen (eindimensionale stochastische Prozesse) und deren Verwendung, um den Zeitversatz zu finden, bei dem sie maximal korreliert sind (ihre "Phasendifferenz").
Dieses Problem wird in der Zeitreihenanalyse normalerweise nicht behandelt, da davon ausgegangen wird, dass Zeitreihendaten systematisch (in regelmäßigen Zeitabständen) erfasst werden. Es ist eher die Provinz der Geostatistik , die sich mit den mehrdimensionalen Verallgemeinerungen von Zeitreihen befasst. Der archetypische geostatistische Datensatz besteht aus Messungen geologischer Proben an unregelmäßig verteilten Orten.
Bei unregelmäßigen Abständen variieren die Abstände zwischen Standortpaaren: Es dürfen keine zwei Abstände gleich sein. Die Geostatistik überwindet dies mit dem empirischen Variogramm . Dies berechnet einen "typischen" (oft den Mittelwert oder Median) Wert von 2/2 - die "Semivarianz" - wobei einen gemessenen Wert am Punkt und der Abstand zwischen und ist darauf beschränkt, innerhalb eines Intervalls zu liegen, das als "Verzögerung" bezeichnet wird. Wenn wir annehmen, dass der Prozess stationär ist und eine Kovarianz aufweist, entspricht die Erwartung der Semivarianz der maximalen Kovarianz (gleich für jedes ) abzüglich der Kovarianz zwischen(z(p)−z(q))2/2 z(p) p p q Z Var(Z(p)) p Z(p) und . Dieses Binning in Verzögerungen bewältigt das Problem des unregelmäßigen Abstands.Z(q)
Wenn an jedem Punkt ein geordnetes Messpaar wird, kann man auf ähnliche Weise das empirische Kreuzvariogramm zwischen den und berechnen und dadurch die Kovarianz bei jeder Verzögerung abschätzen . Sie möchten die eindimensionale Version des Kreuzvariogramms. Die R- Pakete gstat und sgeostat schätzen unter anderem Kreuzvariogramme . Machen Sie sich keine Sorgen, dass Ihre Daten eindimensional sind. Wenn die Software nicht direkt mit ihnen arbeitet, geben Sie einfach eine konstante zweite Koordinate ein, damit sie zweidimensional erscheinen.(z(p),w(p)) z w
Mit zwei Millionen Punkten sollten Sie kleine Abweichungen von der Stationarität erkennen können. Es ist möglich, dass die Phasendifferenz zwischen den beiden Zeitreihen auch über die Zeit variiert. Bewältigen Sie dies, indem Sie das Kreuzvariogramm für verschiedene Fenster, die über den Zeitraum verteilt sind, separat berechnen.
@cardinal hat die meisten dieser Punkte bereits in Kommentaren angesprochen. Der Hauptbeitrag dieser Antwort besteht darin, auf die Verwendung von Paketen für räumliche Statistiken hinzuweisen, um Ihre Arbeit für Sie zu erledigen, und Techniken der Geostatistik zu verwenden, um diese Daten zu analysieren. Beachten Sie hinsichtlich der Recheneffizienz, dass die vollständige Faltung (Kreuzvariogramm) nicht benötigt wird: Sie benötigen nur ihre Werte in der Nähe der Phasendifferenz. Dies macht den Aufwand , nicht , wobei die Anzahl der zu berechnenden Verzögerungen ist, so dass dies möglicherweise auch mit sofort einsatzbereiter Software möglich ist. Wenn nicht, ist der direkte Faltungsalgorithmus einfach zu implementieren.O ( n 2 ) kO(nk) O(n2) k
quelle