Auto.arima z danymi dziennymi: jak uchwycić sezonowość / okresowość?

21

Dopasowuję model ARIMA do codziennych szeregów czasowych. Dane są gromadzone codziennie od 02-01-2010 do 30-07-2011 i dotyczą sprzedaży gazet. Ponieważ można znaleźć tygodniowy wzorzec sprzedaży (średnia dzienna liczba sprzedanych egzemplarzy jest zwykle taka sama od poniedziałku do piątku, a następnie wzrasta w sobotę i niedzielę), staram się uchwycić tę „sezonowość”. Biorąc pod uwagę „dane” danych sprzedaży, tworzę szeregi czasowe w następujący sposób:

salests<-ts(data,start=c(2010,1),frequency=365)

a następnie używam funkcji auto.arima (.), aby wybrać najlepszy model ARIMA według kryterium AIC. Wynikiem jest zawsze niesezonowy model ARIMA, ale jeśli wypróbuję jakiś model SARIMA z następującą składnią jako przykładem:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Mogę uzyskać lepsze wyniki. Czy coś jest nie tak ze specyfikacją polecenia ts / arima? Cotygodniowy schemat jest bardzo silny, więc nie spodziewałbym się tylu trudności w uchwyceniu go. Każda pomoc byłaby bardzo przydatna. Dziękuję Giulia Deppieri

Aktualizacja:

Zmieniłem już niektóre argumenty. Mówiąc dokładniej, procedura wybiera ARIMA (4,1,3) jako najlepszy model, kiedy ustawiam D=7, ale AIC i inne dobre wskaźniki dopasowania i prognozy również się nie poprawiają. Sądzę, że są jakieś błędy z powodu pomyłki między sezonowością a okresowością ..?!

Użyto wywołania Auto.arima i uzyskano wynik:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Zakładam więc, że funkcja arima powinna być używana jako:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

bez parametrów sezonowych i specyfikacji okresu. Dane i analiza eksploracyjna pokazują, że ten sam tygodniowy wzorzec można rozważać w przybliżeniu dla każdego tygodnia, z jedynym wyjątkiem z sierpnia 2010 r. (Kiedy rejestrowany jest stały wzrost sprzedaży). Niestety nie mam żadnej wiedzy specjalistycznej w zakresie modelowania szeregów czasowych, w rzeczywistości próbuję tego podejścia, aby znaleźć alternatywne rozwiązanie dla innych modeli parametrycznych i nieparametrycznych, które próbowałem dopasować do tych problematycznych danych. Mam również wiele zależnych zmiennych numerycznych, ale wykazały one małą moc w wyjaśnianiu zmiennej odpowiedzi: niewątpliwie najtrudniejszą częścią do modelowania jest składnik czasu. Co więcej, konstrukcja zmiennych zastępczych do reprezentowania miesięcy i dni tygodnia nie okazała się solidnym rozwiązaniem.

Giulia
źródło

Odpowiedzi:

28

Jeśli występuje cotygodniowa sezonowość, ustaw okres sezonowy na 7.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Zauważ, że wybór różnicowania sezonowego nie był zbyt dobry auto.arima()do niedawna. Jeśli używasz v2.xx forecastpakietu, ustaw D=1w wezwaniu, auto.arima()aby wymusić różnicowanie sezonowe. Jeśli używasz v3.xx forecastpakietu, automatyczny wybór Ddziała znacznie lepiej (przy użyciu testu OCSB zamiast testu CH).

Nie próbuj porównywać AIC dla modeli o różnych poziomach różnicowania. Nie są bezpośrednio porównywalne. Można tylko wiarygodnie porównać AIC z modelami mającymi te same rzędy różnicowania.

Po wywołaniu nie trzeba ponownie dopasowywać modelu auto.arima(). Zwróci obiekt Arima, tak jakbyś wywołał arima()go w wybranej kolejności modeli.

Rob Hyndman
źródło
dzięki za zwrócenie uwagi na mój głupi błąd. Cofam swoją odpowiedź.
mpiktas
1
Dziękuję bardzo za bardzo pomocne sugestie. Korzystam z wersji 2.19 pakietu prognozy, więc zastosowałem się do twojej rady i ustawiłem parametr D równy 1 w wywołaniu auto.arima (). Teraz najlepszym modelem wybranym do serii sprzedaży jest ARIMA (1,0,0) ze średnią niezerową. Czy powinienem oczekiwać specyfikacji części sezonowości dla najlepszego zwróconego modelu, mam na myśli wartości P, D, Q, a przynajmniej dla D?
Giulia,
2
Tak długo, jak twoje dane mają częstotliwość inną niż 1, będą brane pod uwagę sezonowe modele ARIMA. Jeśli nie sezonowe model zawraca, a następnie albo sezonowych jest bardzo słaby lub dane nie są TS obiekt o częstotliwości> 1
Rob Hyndman
15

Problem z dopasowaniem sezonowego ARIMA do danych dziennych polega na tym, że „składnik sezonowy” może działać tylko w weekendy, a może tylko w dni powszednie, dlatego ogólnie rzecz biorąc, nie ma znaczenia „składnik sezonowy”. Teraz musisz rozszerzyć swój zestaw danych o 6 manekinów reprezentujących dni tygodnia i być może miesięczne wskaźniki reprezentujące roczne efekty. Teraz zastanów się nad włączeniem wydarzeń, takich jak święta, i włącz dowolny efekt wyprzedzenia, współczucia lub opóźnienia wokół tych znanych zmiennych. Nie, w danych mogą występować nietypowe wartości (impulsy), przesunięcia poziomów lub lokalne trendy czasowe. Ponadto efekty dnia tygodnia mogły się zmieniać z czasem, np. Nie było efektu sobotniego przez pierwsze 20 tygodni, ale efekt sobotni przez ostatnie 50 tygodni.

IrishStat
źródło
W takim przypadku (IrishStat) nie byłoby to Techniki Mieszanego Modelowania zamiast ARIMA. Opóźnienia nie są nigdzie pobierane w ARIMA, z wyjątkiem testu Box Jlung. Auto.arima (najnowsze) naprawia wszystko, w tym skalowanie danych, wahania sezonowości (dlatego znajduję najlepsze parametry p, d, q).
wackyanil
Nazywa się to funkcją przenoszenia i odzwierciedla podejście synergiczne, patrz autobox.com/pdfs/capable.pd, zaczynając od slajdu 42. Auto.arima może działać w prostych przypadkach, ale moim zdaniem nie jest wystarczająco ogólna. Jeśli masz na myśli zestaw danych, zrób nowe pytanie i dołącz je.
IrishStat
@IrishStat miałeś na myśli ARIMA z interwencją? dzień tygodnia jest zmiennymi obojętnymi? i podobne zmienne obojętne na wakacje?
Entuzjasta
Tak ... takie byłoby moje podejście do codziennych danych
IrishStat
0

Aby ustalić kolejność sezonowości w moim ts (dane dzienne wzdłuż 3 lat) użyłem tego kodu w Matlabie:

s = 0; min = 1e + 07; n = długość (x); dla i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = suma (abs (diff)); jeśli (s)

Daje mi 365, co jest logiczne.

nkabouche
źródło
1
Witamy na stronie. Nie jest dla mnie jasne, jak to odpowiada na pierwotne pytanie, i nie jest dla mnie jasne, co kod, który napisałeś, po prostu na to patrzy. Może mógłbyś nieco rozszerzyć odpowiedź?
einar
1
W jaki sposób Twoje rozwiązanie radzi sobie z ustalonymi efektami dnia tygodnia, ustalonymi efektami dnia miesiąca, efektami tygodnia, efektami dnia miesiąca, wyprzedzeniem i opóźnieniami dni świątecznych , poniedziałek po piątku, piątek przed poniedziałkiem, efekty miesięczne, efekty tygodniowe, zmiany efektów dnia wolnego w czasie, pulsacje, zmiany poziomów / kroków?
IrishStat
kod Matlaba s = 0; min = 1e + 07; n = długość (x); dla i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = suma (abs (diff)); if (s (i) <min) min = s (i); i koniec końca
nkabouche