Jak skorelować dwie serie czasowe z lukami i różnymi podstawami czasowymi?

10

Zadałem to pytanie na StackOverflow i polecono mi zadać je tutaj.


Mam dwie serie czasowe danych akcelerometru 3D, które mają różne podstawy czasu (zegary uruchamiane w różnych momentach, z bardzo niewielkim pełzaniem w czasie próbkowania), a także zawierające wiele przerw o różnych rozmiarach (z powodu opóźnień związanych z pisaniem do oddzielenia urządzenia flash).

Akcelerometry, których używam, to niedrogie GCDC X250-2 . Korzystam z przyspieszeniomierzy przy ich największym wzmocnieniu, więc dane mają znaczny poziom szumu.

Szeregi czasowe zawierają około 2 miliony punktów danych (ponad godzinę przy 512 próbkach / s) i zawierają około 500 interesujących zdarzeń, przy czym typowe zdarzenie obejmuje 100-150 próbek (każda 200–300 ms). Na wiele z tych zdarzeń mają wpływ awarie danych podczas zapisywania w trybie flash.

Tak więc dane nie są nieskazitelne i nawet nie są bardzo ładne. Ale moja inspekcja gałki ocznej pokazuje, że wyraźnie zawiera informacje, którymi jestem zainteresowany. (W razie potrzeby mogę publikować wykresy).

Akcelerometry znajdują się w podobnych środowiskach, ale są tylko w niewielkim stopniu sprzężone, co oznacza, że ​​mogę wzrokowo stwierdzić, które zdarzenia pasują do każdego akcelerometru, ale jak dotąd nie udało mi się tego zrobić w oprogramowaniu. Ze względu na ograniczenia fizyczne urządzenia są również montowane w różnych orientacjach, w których osie nie pasują, ale są tak blisko ortogonalne, jak to tylko możliwe. Na przykład dla 3-osiowych akcelerometrów A i B, mapy + Ax do -By (góra-dół), mapy + Az do -Bx (lewa strona prawa), a mapy + Ay do -Bz (przód-tył) .

Moim początkowym celem jest skorelowanie zdarzeń uderzenia na osi pionowej, chociaż w końcu chciałbym a) automatycznie odkryć mapowanie osi, b) skorelować aktywność na mapowanych asach, c) wyodrębnić różnice w zachowaniu między dwoma akcelerometrami (takie jak skręcanie lub zginanie).

Charakter danych szeregów czasowych sprawia, że ​​numpy.correlate () Pythona nie nadaje się do użytku. Przyjrzałem się również pakietowi R Zoo, ale nie zrobiłem z nim żadnych postępów. Szukałem pomocy w różnych obszarach analizy sygnałów, ale nie zrobiłem żadnego postępu.

Czy ktoś ma jakieś wskazówki na temat tego, co mogę zrobić, lub podejść, które powinienem zbadać?

Aktualizacja 28 lutego 2011 r .: Dodano tutaj kilka wykresów pokazujących przykłady danych.

BobC
źródło
1
@BobC, być może jeden z moderatorów może zmigrować Twój post na tę stronę. To byłoby najbardziej rozsądne. Co do twoich pytań technicznych, po pierwsze, czy używasz FFT do korelacji? Powinno to być wykonalne w przypadku 2 milionów punktów danych na pół przyzwoitym komputerze. Twój stosunek sygnału do szumu wygląda na dość wysoki, więc powinieneś być w biznesie. Szybkim i brudnym cięciem byłoby uzupełnienie brakujących danych ostatnią dostępną próbką lub zerami. Pełzanie po różnicach między okresami próbkowania może być najtrudniejszą „cechą” danych, z którą trzeba sobie poradzić.
kardynał
@cardinal: Rzeczywiście próbowałem FFT, ale w wyniku tego zyskałem śmieci. „Interesujące” cechy dobrze widoczne w danych są nie do odróżnienia od szumów w FFT. Jednak zrobiłem FFT tylko dla całego zestawu danych: być może ruchome okno FFT zapewni lepsze wyniki, ale nie byłem jeszcze w stanie znaleźć wydajnego obliczeniowo sposobu na jego wdrożenie. Podejrzewam, że transformacja Wavelet mogłaby pomóc, ale nie jestem z nią zaznajomiony (ale powoli się o tym uczę).
BobC
1
@BobC, co miałem na myśli, czy rozważałeś implementację FFT do obliczania korelacji? Bezpośrednim splotem jest , ale implementacja oparta na FFT zmniejszyłaby to O ( n log n ) , czyniąc to wykonalnym. Jeśli chodzi o samo FFT, z 2 milionami punktów danych, rozdzielczość częstotliwości będzie bardzo wysoka. Każde pełzanie próbkowania i inne rzeczy muszą zmyć sygnał na podstawie częstotliwości. Ale powinieneś być w stanie agregować wiele pojemników, aby wydobyć sygnał z szumu. Coś jak podejście Welcha lub niestandardowa technika okienkowania. O(n2)O(nlogn)
kardynał
@ BobC, z czubka mojej głowy, wygląda na to, że można użyć jakiegoś wariantu algorytmu nakładania się i dodawania lub nakładania się i zapisywania do wykonywania przesuwnego okna FFT. Przesuwanie próbek w oknie jest równoznaczne z przesunięciem fazowym, więc wszystko, co musisz zrobić, to zrekompensować próbki, które „spadają” z lewego końca i te, które „wchodzą” z prawego końca.
kardynał
Cześć, mam podobne pytanie. Mam 2 szeregi czasowe, każdy reprezentowany przez macierz z pierwszą kolumną odpowiadającą wartościom i drugą kolumną odpowiadającą różnicy czasu (od poprzedniej wartości) Jak znaleźć korelację między tymi 2 macierzami? Próbowałem wykonać xcorr2 (), ale wydaje się to niewłaściwe, a wykonanie xcorr prawdopodobnie obliczy korelację z uwzględnieniem tylko wartości, ale chcę też uwzględnić czas. Jestem naprawdę zdezorientowany, czy FFT pomoże? Jak sugerowałbyś, żebym się tym zajął?

Odpowiedzi:

12

Pytanie dotyczy obliczenia korelacji między dwoma szeregami nieregularnymi próbkami czasowymi (jednowymiarowe procesy stochastyczne) i wykorzystania tego do znalezienia przesunięcia czasowego tam, gdzie są one maksymalnie skorelowane (ich „różnica faz”).

Problem ten zwykle nie jest rozwiązany w analizie szeregów czasowych, ponieważ zakłada się, że dane szeregów czasowych są systematycznie gromadzone (w regularnych odstępach czasu). Jest to raczej prowincja geostatystyki , która dotyczy wielowymiarowych uogólnień szeregów czasowych. Archetypowy zbiór danych geostatystycznych obejmuje pomiary próbek geologicznych w nieregularnie rozmieszczonych miejscach.

(z(p)z(q))2/2z(p)ppqZVar(Z(p))pZ(p)Z(q)

(z(p),w(p))zwChcesz jednowymiarowej wersji wariogramu krzyżowego. W R pakiety gstat i sgeostat m.in. oszacuje cross-semiwariogram. Nie martw się, że Twoje dane są jednowymiarowe; jeśli oprogramowanie nie będzie z nimi bezpośrednio współpracować, wystarczy wprowadzić stałą drugą współrzędną: dzięki temu będą wyglądać na dwuwymiarowe.

Z dwoma milionami punktów powinieneś być w stanie wykryć małe odchylenia od stacjonarności. Możliwe, że różnica faz między dwiema seriami czasowymi może się zmieniać w czasie. Poradzić sobie z tym, obliczając osobno wariogram krzyżowy dla różnych okien rozmieszczonych w danym okresie.

O(nk)O(n2)k

Whuber
źródło
ntn=nttnτn=tn+α+βnαβ
ββ
@whuber, @BobC, na wpół wykształconych zgaduję na podstawie wcześniejszych doświadczeń dotyczących podobnych problemów i problemów. Większość podejść, które widziałem, są intensywne obliczeniowo i nie robią wrażenia. Jedną próbą może być coś takiego jak dynamiczne dopasowanie czasu lub rejestracja krzywej nazywanej przez Ramsaya i Silvermana . Nie jest dla mnie jasne, czy którykolwiek z nich byłby wykonalny w zestawie danych o tym rozmiarze.
kardynał
Zajmie mi to trochę czasu, aby owinąć mój mózg wokół tego. Zacznę od przykładów w wymienionych pakietach R.
BobC
@ BobC, czy szorstki model, który podałem dla asynchroniczności czasowej jest zbliżony do tego, co masz? Myślę, że to „losowe przesunięcie początkowe” + „błąd liniowy”, przy czym ten ostatni wynika z małej stałej różnicy w interwale próbkowania między dwoma urządzeniami. Następnie pojawia się dodatkowy mały błąd losowy, powiedzmy, z powodu przerwania przetwarzania dwóch różnych uC.
kardynał