Analiza dziennych szeregów czasowych

25

Próbuję przeprowadzić analizę szeregów czasowych i jestem nowy w tej dziedzinie. Codziennie liczę wydarzenie z lat 2006-2009 i chcę dopasować do niego model szeregów czasowych. Oto postęp, który poczyniłem:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

Otrzymany wykres to:

Wykres szeregów czasowych

Aby sprawdzić, czy dane zawierają sezonowość i trendy, wykonuję kroki wymienione w tym poście :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

oraz na blogu Rob J Hyndman :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Oba przypadki wskazują, że nie ma sezonowości.

Kiedy planuję ACF i PACF z tej serii, otrzymuję:

ACF PACF

Moje pytania to:

  1. Czy to sposób na obsługę danych z szeregów czasowych? Ta strona sugeruje, że powinienem patrzeć zarówno na schematy tygodniowe, jak i roczne, ale podejście to nie jest dla mnie jasne.

  2. Nie wiem, jak postępować, gdy mam już wykresy ACF i PACF.

  3. Czy mogę po prostu użyć funkcji auto.arima?

    fit <- arima (mity, kolejność = c (p, d, q)

***** Zaktualizowano wyniki Auto.Arima ******

Kiedy zmieniam częstotliwość danych na 7 zgodnie z komentarzami Roba Hyndmana tutaj , auto.arima wybiera sezonowy model ARIMA i generuje:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Zaktualizowana kontrola sezonowości ******

Kiedy testuję sezonowość z częstotliwością 7, wyprowadza True, ale z sezonowością 365.25 wyprowadza false. Czy to wystarczy, aby stwierdzić brak sezonowości?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

zwraca:

True

podczas

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

zwraca:

False
statBeginner
źródło
Jaka wydajność daje str(x)?
S. Kolassa - Przywróć Monikę
Daje num [1: 1460] 17 12 12 17 13 14 14 5 12 21 ...
statBeginner
Czy możesz opublikować dane?
prezenter
Niestety nie mogę.
statBeginner
3
OK, oprócz testów statystycznych do wykrywania sezonowości polegałbym na kontroli wizualnej i znajomości dziedzin. Na twoje pytanie, czy arima może poradzić sobie z wieloma sezonami - na pewno ARIMA poradzi sobie z każdym rodzajem sezonowości, Rproste nie ma możliwości, aby sobie z tym poradzić. Poszukiwałbym rozwiązań komercyjnych, jeśli dla produktu, który próbujesz przewidzieć, wiążą się wysokie koszty zapasów / produkcji. Rma poważne ograniczenia w prognozowaniu zadań takich jak twoje. Spójrz na pytania dotyczące codziennego prognozowania, gdzie indziej na tej stronie.
prezenter

Odpowiedzi:

25

Twoje ACF i PACF wskazują, że masz przynajmniej cotygodniową sezonowość, co pokazują szczyty w opóźnieniach 7, 14, 21 i tak dalej.

Możesz mieć również sezonowość, chociaż nie jest to oczywiste z twoich szeregów czasowych.

Twój najlepszy zakład, biorąc pod uwagę potencjalnie wiele sezonowości, może być tbatsmodelem, który wyraźnie modeluje wiele rodzajów sezonowości. Załaduj forecastpaczkę:

library(forecast)

Twoje dane wyjściowe str(x)wskazują, że xnie zawiera jeszcze informacji o potencjalnym występowaniu wielu sezonowości. Spójrz ?tbatsi porównaj wyniki str(taylor). Przypisz sezonowość:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Teraz możesz dopasować tbatsmodel. (Bądź cierpliwy, może to chwilę potrwać).

model <- tbats(x.msts)

Wreszcie możesz prognozować i kreślić:

plot(forecast(model,h=100))

Nie powinieneś używać arima() albo auto.arima(), ponieważ mogą one obsługiwać tylko jeden typ sezonowość: albo raz w tygodniu lub raz w roku. Nie pytaj mnie, co auto.arima()byś zrobił na twoich danych. Może wybrać jedną z sezonowości lub całkowicie ją zignorować.


EDYCJA, aby odpowiedzieć na dodatkowe pytania z komentarza:

  1. Jak mogę sprawdzić, czy dane mają roczną sezonowość, czy nie? Czy mogę utworzyć kolejną serię całkowitej liczby zdarzeń na miesiąc i użyć jej ACF, aby o tym zadecydować?

Możliwe może być obliczenie modelu na podstawie danych miesięcznych. Następnie możesz np. Porównać AIC między modelami z sezonowością i bez sezonowości.

Wolę jednak użyć próby wstrzymania do oceny modeli prognozowania. Przytrzymaj ostatnie 100 punktów danych. Dopasuj model do rocznego i tygodniowym sezonowości do reszty danych (jak wyżej), a następnie napadu jeden z jedynego tygodnika sezonowością, np korzystania auto.arima()na zasadzie tsz frequency=7. Prognozuj używając obu modeli w okresie wstrzymania. Sprawdź, który z nich ma mniejszy błąd, używając MAE, MSE lub czegokolwiek, co jest najbardziej odpowiednie dla twojej funkcji utraty. Jeśli istnieje niewielka różnica między błędami, wybierz prostszy model; w przeciwnym razie użyj tego z niższym błędem.

Dowodem na budynie jest jedzenie, a dowodem modelu szeregów czasowych jest prognozowanie.

Aby poprawić sytuację, nie używaj pojedynczej próby wstrzymania (która może wprowadzać w błąd, biorąc pod uwagę wzrost na końcu serii), ale używaj kroczących prognoz początku, które są również znane jako „walidacja krzyżowa szeregów czasowych” . (Bardzo polecam cały darmowy podręcznik do prognozowania online .

  1. Więc modele sezonowe ARIMA zwykle nie są w stanie poradzić sobie z wieloma sezonami? Czy jest to właściwość samego modelu, czy jest to sposób, w jaki zapisywane są funkcje w języku R?

Standardowe modele ARIMA radzą sobie z sezonowością poprzez różnicowanie sezonowe. W przypadku sezonowych danych miesięcznych nie modelowałbyś nieprzetworzonych szeregów czasowych, ale szereg czasowy różnic między marcem 2015 r. A marcem 2014 r., Między lutym 2015 r. A lutym 2014 r. I tak dalej. (Aby uzyskać prognozy w oryginalnej skali, oczywiście musisz ponownie zmienić zdanie).

Nie ma od razu oczywistego sposobu na rozszerzenie tego pomysłu na wiele sezonowości.

Oczywiście, możesz zrobić coś przy użyciu ARIMAX, np. Włączając miesięczne manekiny do modelowania rocznej sezonowości, a następnie modeluj resztki używając tygodniowego sezonowego ARIMA. Jeśli chcesz to zrobić w R, użyj ts(x,frequency=7), stwórz matrycę miesięcznych manekinów i podaj to do xregparametru auto.arima().

Nie przypominam sobie żadnej publikacji, która szczególnie rozszerza ARIMA na wiele sezonowości, chociaż jestem pewien, że ktoś zrobił coś podobnego do tego w poprzednim akapicie.

S. Kolassa - Przywróć Monikę
źródło
Oto kilka pytań, które mam na podstawie twojej odpowiedzi: 1. Jak mogę sprawdzić, czy dane mają sezonowość, czy nie? Czy mogę utworzyć kolejną serię całkowitej liczby wydarzeń na miesiąc i użyć jej acf, aby podjąć taką decyzję? 2. Czyli modele sezonowe ARIMA zazwyczaj nie radzą sobie z wieloma sezonami? Czy jest to właściwość samego modelu, czy jest to sposób, w jaki zapisywane są funkcje w języku R?
statBeginner
Zaktualizowany post z wynikami Auto.Arima z cotygodniową sezonowością
statBeginner
1
@StephanKolassa, jakiś czas temu znalazłem ten artykuł od AT&T, który używa wielu sezonowych ARIMA. Model taki jak ten w artykule nie jest możliwy R, ponieważ Rnie ma możliwości obsługi wielosezonowego ARIMA.
prezenter
2
@forecaster: cool, dzięki! Wygląda na to, że robią podwójne różnicowanie w równaniu 3.1. Martwię się o utratę dużej ilości danych w ten sposób. Niestety nie porównują swoich wyników z prostym testem porównawczym, np. Wymaganiami z zeszłego tygodnia. Podoba mi się to, jak badają również kombinacje prognoz między DSARIMA a tbatsmodelem podobnym do podobnego.
S. Kolassa - Przywróć Monikę
3
@StephanKolassa Zgadzam się, jestem wielkim zwolennikiem używania naiwnej prognozy jako punktu odniesienia, co jest wspierane w zasadach prognozowania przez Armstronga i tylko komplikuję ją, jeśli poprawi dokładność. W kilku konkursach kaggle znalazłem się w czołówce 2 percentyla, stosując naiwne metody w moich zespołach.
prezenter
4

Najlepszym sposobem dekompozycji danych sezonowych przy użyciu istniejących pakietów R jest ceemdan () w Rlibeemd. Ta technika wydobywa sezonowość wielu okresów. Domyślne działają dobrze. Wykorzystuje transformację Hilberta-Huanga zamiast transformacji Fouriera. Transformacja Fouriera ma poważną wadę polegającą na tym, że może obsłużyć stacjonarne, liniowe dane, gdy większość serii nie jest żadna. Na przykład chodzenie losowe y_t = y_ {t-1} + e_t jest najprostszym i często spotykanym spacerem. Inne metody utrzymują stałą amplitudę wahań sezonowych, gdy często różnią się one w praktyce.

użytkownik162655
źródło
1
Zapoznaj się z podstawowym samouczkiem i odniesieniem do MathJax, aby uzyskać pomoc na temat rozwiązywania matematyki. Proszę również podać uzasadnienie roszczenia „ najlepszego ” (lub rozważyć zmianę oświadczenia) - musiałoby być co najmniej tak dobre, jak każda inna opcja, a nie tylko większość z nich.
Glen_b
2
Warto wspomnieć, że ten pakiet jest w CRAN
Glen_b
3

Pytania, które poruszyłeś, zostały poruszone w Prognozowaniu szeregów czasowych R: Pytania dotyczące moich wyników . Proszę uważnie zapoznać się z moją szczegółową odpowiedzią i wszystkimi komentarzami w dyskusji, w tym tymi dotyczącymi pierwotnego pytania, ponieważ uważam, że odnoszą się one do twojego problemu. Możesz wziąć dane podane w poście i wykorzystać je jako moment dydaktyczny dla siebie. Użyj całej dyskusji jako podkładu do tego, co powinieneś zrobić.

IrishStat
źródło
1
Wielkie dzięki! Użyję danych z tego postu, aby wypróbować różne rzeczy.
statBeginner