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.
źródło
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.
źródło
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.
źródło