Próbuję wyodrębnić interesujące statystyki dla nieregularnego zestawu danych szeregów czasowych, ale nie można znaleźć odpowiednich narzędzi do pracy. Narzędzia do manipulowania regularnie próbowanymi seriami czasowymi lub seriami opartymi na indeksach w dowolnym czasie są dość łatwe do znalezienia, chociaż nie mam dużo szczęścia z problemami, które próbuję rozwiązać.Przesunięcie przedziałów czasowych dla danych szeregów czasowych w R
pierwsze powtarzalne zbiór danych
library(zoo)
set.seed(0)
nSamples <- 5000
vecDT <- rexp(nSamples, 3)
vecTimes <- cumsum(c(0,vecDT))
vecDrift <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01))
vecVals <- cumsum(vecDrift)
vecZ <- zoo(vecVals, order.by = vecTimes)
rm(vecDT, vecDrift)
Załóżmy Czasy podane w sekundach. W serii vecZ
jest prawie 1700 sekund (tylko niecałe 30 minut) i 5001 wpisów w tym czasie. (NB:. Chciałbym spróbować użyć xts
, ale xts
wydaje się potrzebne informacje o dacie i Wolałbym nie używać konkretnej daty, kiedy to nie jest istotne)
moje cele są następujące:
Wskaż indeksy wartości 3 minuty przed i 3 minuty po każdym punkcie. Ponieważ czas jest ciągły, wątpię, aby jakiekolwiek dwa punkty znajdowały się dokładnie w odległości 3 minut. Co chciałbym znaleźć to punkty, które są co najwyżej 3 minuty przed i co najmniej 3 minuty później, dany punkt, czyli coś podobnego do poniższego (w Pseudokod):
backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta}
forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}
Tak więc przez 3 minuty
tDelta = 180
. Jeślit=2500
, wówczas wynik dlaforwardIX()
będzie wynosił 3012 (tj. Czas (vecZ) [2500] wynosi 860.1462, a czas (vecZ) [3012] wynosi 1040,403, lub nieco ponad 180 sekund później), a wyjście z rokubackwardIX()
to rok 2020 (odpowiada czasowi 680,7162 sekundy).Idealnie chciałbym użyć funkcji, która nie wymaga
t
, ponieważ będzie wymagać wywołanialength(vecZ)
funkcji, która ignoruje fakt, że przesuwne okna czasu mogą być obliczane bardziej efektywnie.Zastosuj funkcję do wszystkich wartości w ruchomym oknie czasu. Widziałem
rollapply
, która przyjmuje stały rozmiar okna (to znaczy stałą liczbę indeksów, ale nie jest ustalonym okienkiem czasu). Mogę to rozwiązać naiwnie, z pętlą (lubforeach
;-)), która jest obliczana dla indeksut
, ale zastanawiałem się, czy istnieją pewne proste funkcje już zaimplementowane, np. funkcja do obliczania średniej wszystkich wartości w danym przedziale czasowym. Ponieważ można to zrobić skutecznie za pomocą prostych statystyk podsumowujących, które przesuwają się po oknie, powinno być ono obliczeniowo tańsze niż funkcja, która uzyskuje dostęp do wszystkich danych wiele razy w celu obliczenia każdej statystyki. Niektóre dość naturalne funkcje: średnia, min., Maks. I mediana.Nawet jeśli okno nie zmienia się w zależności od czasu, możliwość zmiany wielkości okna będzie wystarczająca i mogę znaleźć rozmiar okna, korzystając z wyniku powyższego pytania. Jednak nadal wydaje się, że wymaga to nadmiernych obliczeń, dlatego możliwość określania interwałów czasowych wydaje się bardziej skuteczna.
Czy są jakieś pakiety w R, które ułatwiają takie manipulowanie danymi w oknach czasowych, czy też mam pecha i powinienem napisać własne funkcje?
Uwaga 1: This question stara się zrobić coś podobnego, z wyjątkiem nad rozłącznych przedziałów, zamiast toczenia okna czasu, na przykładMógłbym to zaadaptować, aby przeprowadzić analizę na każdym kolejnym 3-minutowym bloku, ale nie widzę sposobu, aby to zaadaptować na 3-minutowe interwały.
Uwaga 2: Stwierdziłem, że przejście z obiektu zoo
do wektora numerycznego (dla czasów) znacznie przyspieszyło kwestię identyfikacji/identyfikacji punktu końcowego okna dla pierwszego celu. To wciąż jest naiwny algorytm, ale warto wspomnieć, że praca z obiektami zoo
może nie być optymalna dla podejścia naiwnego.
myślę 'xts' jest prawdopodobnie droga. Zobacz '? Endpoints','? To.period', '? Period.apply' oraz'? Split.xts'. Przymusuj swój obiekt do XTS w następujący sposób: 'x <-. Xts (vecVals, vecTimes)' – GSee
@GSee Dzięki, choć wydaje mi się, że te funkcje dzielą dane na kolejne, rozłączne interwały (jak wspomniano w notatce dołączonej do pytanie). Jeśli istnieje sposób na przesuwanie/zwijanie okien w czasie, nie wiem jeszcze, jak zrobić "xts". – Iterator
można łączyć ze zwykłym obiektem xts o zerowej szerokości i 'na.locf', aby uzyskać ścisłe regularne dane. Następnie użyj 'rollapply' – GSee