2012-05-08 16 views
6

Wykonuję analizę opadów godzinowych na pliku, który jest zdezorganizowany. Jednak udało mi się go oczyścić i przechowywać je w dataframe (zwany CA1), która ma postać, jak następuje:Szeregi czasowe i STL w R: dozwolone są tylko jednowymiarowe serie z błędami

Station_ID Guage_Type Lat Long  Date Time_Zone Time_Frame H0 H1 H2 H3 H4 H5  H6  H7  H8  H9  H10  H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 
1 4457700   HI 41.52 124.03 1948-07-01   8  LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
2 4457700   HI 41.52 124.03 1948-07-05   8  LST 0 1 1 1 1 1 2.0000000 2.0000000 2.0000000 4.0000000 5.0000000 5.0000000 4 7 1 1 0 0 10 13 5 1 1 3 
3 4457700   HI 41.52 124.03 1948-07-06   8  LST 1 1 1 0 1 1 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
4 4457700   HI 41.52 124.03 1948-07-27   8  LST 3 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
5 4457700   HI 41.52 124.03 1948-08-01   8  LST 0 0 0 0 0 0 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0 0 0 0 0 0 0 0 0 0 0 0 
6 4457700   HI 41.52 124.03 1948-08-17   8  LST 0 0 0 0 0 0 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 0.3888889 6 1 0 0 0 0 0 0 0 0 0 0 

przypadku H0 przez H23 reprezentują 24 godzin dziennie (wiersz)

Stosując tylko CA1 (The dataframe powyżej), że ma co dzień (rzędu) 24 punktów i przeniesienia go w pionie i łączenia pozostałych dni (wiersze) jedną zmienną, którą nazywamy DAT1:

> dat1[1:48,] 
    H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23 
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 2 2 2 4 5 5 4 7 1 1 0 0 10 13 5 1 1 3 

pomocą zmiennej DAT1 , Wprowadzam go jako argument, aby uzyskać dane szeregów czasowych:

> rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    frequency = 24) 

kilka rzeczy Uwaga:

>dim(CA1) 
    [1] 5636 31 
>length(dat1) 
    [1] 135264 

Zatem 5636 * 24 (suma punktów danych [24] w rzędzie) = 135264 sumę punktów. Długość (rainCA1) zgadza się z powyższymi punktami. Jednakże, jeśli położyć kres w funkcji ts, jak

>rainCA1 <- ts(dat1, start = c(1900+as.POSIXlt(CA1[1,5])$year, 1+as.POSIXlt(CA1[1,5])$mon), 
    end = c(1900+as.POSIXlt(CA1[5636,5])$year, 1+as.POSIXlt(CA1[5636,5])$mon), 
    frequency = 24) 

uzyskać całkowitą długość 1134 punktów, gdzie brakuje mi dużo danych. Zakładam, że wynika to z tego, że daty nie są następujące po sobie, a jako argument za punktem wyjścia stosuję tylko miesiąc i rok.

Ustawicznego, w co myślę jest poprawna ścieżka, używając pierwszego ts obliczenia bez argumentu końcowego, I dostarczyć go jako wkład do STL:

>rainCA1_2 <-stl(rainCA1, "periodic") 

Niestety, pojawia się błąd:

Error in stl(rainCA1, "periodic") : only univariate series are allowed 

Którego nie rozumiem i jak do tego zabrać. Jeśli jednak powrócę do funkcji ts i podam argument końcowy, stl działa poprawnie bez żadnych błędów.

Mam zbadane na wielu forach, ale nikt (lub do mojego zrozumienia) nie zapewnia dobrze rozwiązania, aby uzyskać atrybuty danych godzinowych danych. Jeśli ktokolwiek mógłby mi pomóc, bardzo to doceniam. Dziękuję Ci!

Odpowiedz

7

Ten błąd wynika z kształtu danych. Wypróbuj > dim(rainCA1); Podejrzewam, że daje coś w rodzaju > [1] 135264 1. Wymień rainCA1 <- ts(dat1 ... przez rainCA1 <- ts(dat1[[1]] ... i powinno działać.

Niezależnie od tego, czy robi to poprawnie, zastanawiam się ... Wydaje mi się, że pierwszym zleceniem firmy jest uzyskanie danych o jednolitym formacie. Upewnij się, że ts() otrzymuje właściwe wejście. Sprawdź dokładną specyfikację ts.

ts() nie interpretuje formatów daty i czasu. ts() wymaga kolejnych punktów danych o ustalonym przedziale. Wykorzystuje licznik główny i licznik mniejszy (z których frequency pasuje do jednego licznika głównego). Na przykład, jeśli twoje dane są godzinowe i oczekujesz sezonowości na poziomie dziennym, frequency równa się 24.start i end, w związku z tym są głównie kosmetyczne: start oznacza jedynie t (0) dla głównego licznika, natomiast end oznacza t (koniec).

0

Jednym rozwiązaniem znalazłem jest time_series_var <- ts(data[, c("var_of_interest")]) a następnie time_series_var <- ts(as.vector(time_series_var)) a następnie błąd związany z jednowymiarową znika, ponieważ wymiary są teraz poprawne.