Prognozowanie godzinowych szeregów czasowych z częstotliwością dzienną, tygodniową i roczną

12

Ważna edycja: Chciałbym jak dotąd podziękować Dave'owi i Nickowi za ich odpowiedzi. Dobrą wiadomością jest to, że dostałem pętlę do pracy (zasada zapożyczona z postu prof. Hydnmana na temat prognozowania partii). Aby skonsolidować zaległe zapytania:

a) Jak zwiększyć maksymalną liczbę iteracji dla auto.arima - wydaje się, że przy dużej liczbie zmiennych egzogenicznych auto.arima osiąga maksymalne iteracje przed zbiegnięciem się na ostateczny model. Proszę mnie poprawić, jeśli nie rozumiem tego.

b) Jedna odpowiedź od Nicka podkreśla, że ​​moje prognozy dla przedziałów godzinowych pochodzą wyłącznie z tych przedziałów godzinowych i nie mają na nie wpływu wcześniejsze zdarzenia w ciągu dnia. Mój instynkt, od czynienia z tymi danymi, mówi mi, że nie powinno to często powodować znaczącego problemu, ale jestem otwarty na sugestie, jak sobie z tym poradzić.

c) Dave zauważył, że potrzebuję znacznie bardziej wyrafinowanego podejścia do identyfikowania czasów wyprzedzenia / opóźnienia otaczających moje zmienne predykcyjne. Czy ktoś ma jakieś doświadczenie z programowym podejściem do tego w języku R? Oczywiście spodziewam się, że będą pewne ograniczenia, ale chciałbym posunąć ten projekt tak daleko, jak to tylko możliwe i nie mam wątpliwości, że musi on być przydatny także dla innych tutaj.

d) Nowe zapytanie, ale w pełni związane z danym zadaniem - czy auto.arima bierze pod uwagę regresory przy wyborze zamówień?

Staram się prognozować wizyty w sklepie. Potrzebuję umiejętności rozliczania się z przeprowadzkami, latami przestępczymi i sporadycznymi zdarzeniami (zasadniczo wartościami odstającymi); na tej podstawie uznaję, że ARIMAX jest moim najlepszym wyborem, wykorzystując zmienne egzogeniczne do próby modelowania wielokrotności sezonowości, a także wyżej wymienionych czynników.

Dane są rejestrowane 24 godziny w odstępach godzinnych. Jest to problematyczne ze względu na liczbę zer w moich danych, szczególnie w porach dnia, w których liczba odwiedzin jest bardzo mała, czasem żadna wcale po otwarciu sklepu. Ponadto godziny otwarcia są względnie zmienne.

Ponadto czas obliczeniowy jest ogromny w przypadku prognozowania jako jednego pełnego szeregu czasowego zawierającego ponad 3 lata danych historycznych. Doszedłem do wniosku, że przyspieszy to obliczanie każdej godziny dnia jako osobnych szeregów czasowych, a podczas testowania tego w bardziej obciążonych godzinach dnia wydaje się uzyskiwać większą dokładność, ale znów okazuje się, że staje się problemem z wczesnymi / późniejszymi godzinami, które nie powodują konsekwentnie otrzymuj wizyty. Sądzę, że proces skorzystałby z użycia auto.arima, ale wydaje się, że nie jest w stanie zsynchronizować się z modelem przed osiągnięciem maksymalnej liczby iteracji (stąd użycie ręcznego dopasowania i klauzuli maxit).

Próbowałem poradzić sobie z „brakującymi” danymi, tworząc zmienną egzogeniczną, gdy odwiedziny = 0. Ponownie, działa to świetnie w przypadku bardziej obciążonych porach dnia, gdy jedynym czasem braku odwiedzin jest zamknięcie sklepu na dany dzień; w tych przypadkach zmienna egzogeniczna wydaje się z powodzeniem radzić sobie z prognozowaniem naprzód, nie uwzględniając wpływu dnia, który był wcześniej zamknięty. Nie jestem jednak pewien, jak zastosować tę zasadę w odniesieniu do przewidywania spokojniejszych godzin, w których sklep jest otwarty, ale nie zawsze są odwiedzane.

Przy pomocy postu profesora Hyndmana o prognozowaniu wsadowym w R próbuję stworzyć pętlę do prognozowania serii 24, ale wydaje się, że nie chcę przewidywać od 13:00 i nie mogę zrozumieć, dlaczego. Otrzymuję komunikat „Błąd w optimum (init [maska], armafn, method = optim.method, hessian = TRUE,: nieskończona wartość różnicy skończonej [1]”), ale ponieważ wszystkie serie mają równą długość i zasadniczo używam ta sama matryca, nie rozumiem, dlaczego tak się dzieje. Oznacza to, że matryca nie ma pełnej rangi, nie? Jak mogę tego uniknąć w tym podejściu?

https://www.dropbox.com/s/26ov3xp4ayig4ws/Data.zip

date()

#Read input files
INPUT <- read.csv("Input.csv")
XREGFDATA <- read.csv("xreg.csv")

#Subset time series data from the input file
TS <- ts(INPUT[,2:25], f=7)


fcast <- matrix(0, nrow=nrow(XREGFDATA),ncol=ncol(TS))

#Create matrix of exogenous variables for forecasting.
xregf <- (cbind(Weekday=model.matrix(~as.factor(XREGFDATA$WEEKDAY)),
                    Month=model.matrix(~as.factor(XREGFDATA$MONTH)),
                Week=model.matrix(~as.factor(XREGFDATA$WEEK)),
                    Nodata=XREGFDATA$NoData,
                NewYearsDay=XREGFDATA$NewYearsDay,
                    GoodFriday=XREGFDATA$GoodFriday,
                EasterWeekend=XREGFDATA$EasterWeekend,
                    EasterMonday=XREGFDATA$EasterMonday,
                MayDay=XREGFDATA$MayDay,
                    SpringBH=XREGFDATA$SpringBH,
                SummerBH=XREGFDATA$SummerBH,
                    Christmas=XREGFDATA$Christmas,
                BoxingDay=XREGFDATA$BoxingDay))
#Remove intercepts
xregf <- xregf[,c(-1,-8,-20)]

NoFcast <- 0

for(i in 1:24) {

  if(max(INPUT[,i+1])>0) {

  #The exogenous variables used to fit are the same for all series except for the
  #'Nodata' variable. This is to handle missing data for each series
   xreg <- (cbind(Weekday=model.matrix(~as.factor(INPUT$WEEKDAY)),
                     Month=model.matrix(~as.factor(INPUT$MONTH)),
                 Week=model.matrix(~as.factor(INPUT$WEEK)),
                     Nodata=ifelse(INPUT[,i+1] < 1,1,0),
                     NewYearsDay=INPUT$NewYearsDay,
                 GoodFriday=INPUT$GoodFriday,
                     EasterWeekend=INPUT$EasterWeekend,
                 EasterMonday=INPUT$EasterMonday,
                     MayDay=INPUT$MayDay,
                 SpringBH=INPUT$SpringBH,
                     SummerBH=INPUT$SummerBH,
                 Christmas=INPUT$Christmas,
                     BoxingDay=INPUT$BoxingDay))
  xreg <- xreg[,c(-1,-8,-20)]

  ARIMAXfit <- Arima(TS[,i], 
                     order=c(0,1,8), seasonal=c(0,1,0),
                     include.drift=TRUE,
                     xreg=xreg,
                     lambda=BoxCox.lambda(TS[,i])
                     ,optim.control = list(maxit=1500), method="ML")  


  fcast[,i] <- forecast(ARIMAXfit, xreg=xregf)$mean

 } else{
  NoFcast <- NoFcast +1
 }
}

#Save the forecasts to .csv
write(t(fcast),file="fcasts.csv",sep=",",ncol=ncol(fcast))


date()

Byłbym w pełni wdzięczny za konstruktywną krytykę sposobu, w jaki to robię i wszelką pomoc w uruchomieniu tego skryptu. Wiem, że jest dostępne inne oprogramowanie, ale jestem ściśle ograniczony do używania R i / lub SPSS tutaj ...

Ponadto jestem bardzo nowy na tych forach - starałem się przedstawić możliwie pełne wyjaśnienie, zademonstrować wcześniejsze badania, które przeprowadziłem, a także dać powtarzalny przykład; Mam nadzieję, że to wystarczy, ale daj mi znać, jeśli mogę jeszcze coś ulepszyć w swoim poście.

EDYCJA: Nick zasugerował, że najpierw używam sum dziennych. Powinienem dodać, że to przetestowałem, a zmienne egzogeniczne generują prognozy, które uwzględniają dzienną, tygodniową i roczną sezonowość. Był to jeden z innych powodów, dla których myślałem o przewidywaniu każdej godziny jako osobnej serii, jednak, jak wspomniał Nick, na moją prognozę na godzinę 16:00 w danym dniu nie będą miały wpływu wcześniejsze godziny w ciągu dnia.

EDYCJA: 09/08/13, problem z pętlą dotyczył po prostu oryginalnych zamówień, których użyłem do testowania. Powinienem był to zauważyć wcześniej i pilniej próbuję użyć auto.arima do pracy z tymi danymi - patrz punkt a) id) powyżej.

krcooke
źródło
Próbowałem też użyć Fouriera do zadbania o sezonowość, ale zwróciłem ten sam błąd „Błąd w optim (init [maska], armafn, method = optim.method, hessian = TRUE,: nieskończona wartość różnicy skończonej [1]” . nawet kiedy jest stosowany jako matrycy na własną rękę bez innych zmiennych egzogenicznych Proszę może ktoś mi pomóc z wyjaśnieniem, dlaczego byłoby to przypadek?
krcooke
czy możesz ponownie załadować dane?
MyHeadHurts

Odpowiedzi:

4

Niestety twoja misja jest skazana na porażkę, ponieważ jesteś ograniczony do R i SPSS. Musisz zidentyfikować strukturę relacji wyprzedzenia i opóźnienia dla każdego ze zdarzeń / wakacji / zmiennych egzogenicznych, które mogą się pojawić. Musisz wykryć możliwe trendy czasowe, których SPSS nie może wykonać. Musisz włączyć codzienne trendy / prognozy do każdej prognozy godzinowej, aby uzyskać skonsolidowaną. Uzgodnioną prognozę. Musisz się martwić o zmianę parametrów i zmianę wariancji. Mam nadzieję że to pomoże. Modelujemy tego rodzaju dane od lat w sposób automatyczny, oczywiście podlegając opcjonalnym kontrolom określonym przez użytkownika.

EDYCJA: Na prośbę OP przedstawiam tutaj typową analizę. Wziąłem jeden, jeśli zajęte godziny i opracowałem model dzienny. W pełnej analizie opracowane zostaną wszystkie 24 godziny, a także model dzienny w celu uzgodnienia prognoz. Poniżej znajduje się częściowa lista modelu wprowadź opis zdjęcia tutaj. Oprócz znaczących regresorów (należy zauważyć, że rzeczywista struktura odprowadzeń i opóźnień została pominięta) istniały wskaźniki odzwierciedlające sezonowość, zmiany poziomów, efekty dzienne, zmiany efektów dziennych oraz niezwykłe wartości niezgodne z historią. Statystyki modelu są wprowadź opis zdjęcia tutaj. Tutaj pokazany jest wykres prognoz na następne 360 ​​dni wprowadź opis zdjęcia tutaj. Wykres Rzeczywisty / Dopasowanie / Prognoza starannie podsumowuje wynikiwprowadź opis zdjęcia tutajW obliczu niezwykle złożonego problemu (takiego jak ten!) Trzeba wykazać się dużą odwagą, doświadczeniem i pomocą komputerową. Po prostu poinformuj swoje kierownictwo, że problem można rozwiązać, ale niekoniecznie za pomocą prymitywnych narzędzi. Mam nadzieję, że zachęca to do kontynuowania wysiłków, ponieważ poprzednie komentarze były bardzo profesjonalne i nastawione na osobiste wzbogacenie i naukę. Dodam, że trzeba znać oczekiwaną wartość tej analizy i wykorzystać ją jako wskazówkę przy rozważaniu dodatkowego oprogramowania. Być może potrzebujesz głośniejszego głosu, aby pomóc swoim „reżyserom” znaleźć realne rozwiązanie tego trudnego zadania.

Po zapoznaniu się z Daily Totals i każdym z 24-godzinnych modeli zdecydowanie zastanowiłbym się, czy liczba odwiedzin jest poważnie obniżona! Tego rodzaju analiza przeprowadzona przez potencjalnego nabywcę sugerowałaby brak zakupu, podczas gdy sprzedawca rozsądnie podwoiłby wysiłki na rzecz sprzedaży firmy w oparciu o tę bardzo negatywną prognozę.

IrishStat
źródło
Cześć Dave, dziękuję bardzo za poświęcenie czasu na przeczytanie mojego pytania i udzielenie odpowiedzi. Rozumiem, że twoje oprogramowanie wykracza poza wszelkie alternatywy, ale na razie nie jest dla mnie opcją. Znając możliwości R. czy jest jakaś rada, którą możesz mi zaoferować, aby poprawić to, co już zrobiłem? Z pozdrowieniami,
krcooke,
@krcooke Możesz sprawdzić korelację między odwiedzinami a alternatywnymi potencjalnymi szansami / opóźnieniami wokół każdego z twoich regresorów, aby zidentyfikować odpowiednią odpowiedź. Całkowicie zgadzam się z Nickiem, że niektóre regresory mogą być przydatne na niektóre godziny, ale nie na inne. Możesz modelować każdą godzinę osobno. Wykrywanie 4 rodzajów wartości odstających (puls, przesunięcie poziomu, sezonowa puls i trendy czasowe) nie jest dostępne w SAS, gdy masz przyczyny i prawdopodobnie jest niedostępne w SPSS. Pobrałem twoje dane i użyję AUTOBOX Zawsze szukamy takich „twardych danych” jak twoje, aby wzmocnić naszą analizę.
IrishStat
Cześć Dave, zobaczę, co mogę zrobić w związku z analizą regresorów. Czułem, że stosowane przeze mnie regresory były bardzo „standardowe” i prawdopodobnie wpłyną na wszystkie takie sklepy. Wykorzystałem jubileuszowy weekend świąteczny jako przykład w komentarzu Nicka; najprawdopodobniej skorzystałoby to na zastosowaniu regresorów, ale na razie tego nie uwzględniłem. Jestem bardzo zainteresowany, aby zobaczyć, co możesz zrobić z danymi! Dzięki jeszcze raz.
krcooke
7
Niestety twoja misja jest skazana na niepowodzenie, ponieważ jesteś ograniczony do R i SPSS. ” - ten komentarz niestety posuwa się za daleko; każdy język Turinga może zaimplementować dowolny algorytm napisany w dowolnym innym, nawet jeśli jest programowalny tylko w kodzie maszynowym poprzez przełączanie przełączników i jest całkowicie zaimplementowany w Lego. Nie ma obliczeń, które można zaimplementować w jednym, których nie można wykonać w innym. Chyba że twierdzisz magiczne właściwości AUTOBOX, uważam, że to, co prawdopodobnie chcesz powiedzieć, to coś w rodzaju „już dostępne jako funkcje w dystrybucji waniliowej” jako różnicy.
Glen_b
@Glen_b Mogłem powiedzieć, że siła ognia w używanych przez ciebie dystrybucjach wanilii jest niewystarczająca, aby rozwiązać dany problem, chyba że masz dużo czasu na napisanie nowych procedur.
IrishStat,
10

To tylko zestaw komentarzy, ale dla tego formatu będzie za długo. Jestem tylko amatorem serialu czasowego, ale mam kilka prostych sugestii.

  1. Możesz mieć tutaj zamówienia, ale myślę, że wymaga to zaostrzenia w zakresie tego, czego oczekujesz i co jest dla Ciebie najważniejsze. Prognozy odwiedzin są niestety niewyraźnym celem. Załóżmy na przykład, że jest godzina szesnasta i chcesz prognozować wizyty na godzinę do przodu. Czy naprawdę potrzebujesz super-modelu obejmującego całą poprzednią serię? Musi to wynikać z niektórych rozważań na temat rzeczywistych celów praktycznych i / lub naukowych, które mogą być określone przez przełożonych lub klienta lub mogą być własne jako badacza. Podejrzewam, że bardziej prawdopodobne jest, że różne modele są potrzebne do różnych celów.

  2. Wydaje się, że rozdzielenie serii godzinowych wynika z idei ograniczenia obliczeń bez bardzo dużego rozeznania, jaki sens to ma sens. Oznacza to, że nie użyjesz (i nie) informacji z dzisiejszego dnia wcześniej, aby przewidzieć, co się stanie o 16:00, tylko wszystkie wcześniejsze obserwacje o 16:00? Wydaje mi się, że trzeba dużo rozmawiać.

  3. Najwyraźniej jesteś uczniem w szeregach czasowych (a ja stawiam się na równi), ale żaden uczeń nie powinien zaczynać od tak dużego problemu. Naprawdę! Masz dużo danych, masz okresy w kilku skalach, masz nieregularności godzin otwarcia i świąt, masz zmienne egzogeniczne: wybrałeś bardzo trudny problem. (A co z trendami?) Łatwo powiedzieć, ale najwyraźniej do tej pory minęło: być może będziesz musiał najpierw pracować nad bardzo uproszczonymi wersjami problemu i poczuć, jak dopasować prostsze modele. Wrzucenie wszystkiego do dużego, skomplikowanego modelu najwyraźniej nie działa dobrze i wydaje się, że potrzeba czegoś radykalnie prostszego lub uświadomienie sobie, że projekt jest prawdopodobnie zbyt ambitny.

Nick Cox
źródło
Cześć Nick, 1 - Rzeczywiście mam rozkazy! Celem jest próba zbudowania modelu, który nie będzie miał tendencji do znacznego przeszacowywania (skutkującego zmarnowanymi godzinami pracy) lub niedoceniania (aby pracownicy nie byli nadmiernie zawężeni). 2 - Rozważyłem to, ale kopię głębiej, aby zrozumieć, co zyskuję / tracę w ten sposób. Prognozowanie jednej serii wydawało się podobne do „super modelu”. 3- Zdaję sobie sprawę, że jest to niezwykle trudne i że w tej chwili biję się ponad swoją wagę, ale jestem całkowicie otwarty na prostsze rozwiązanie, które również będzie dla mnie odpowiednie. Wielkie dzięki za twoje przemyślenia, Nick.
krcooke,
Mówiąc o prostszych rozwiązaniach, nie mogłem pracować z wykładniczymi technikami wygładzania w taki sposób, że weekendowy weekend jubileuszowy spowodował, że ten rok (ten sam okres) został zawyżony. Ze względu na rodzaj występujących wartości odstających poczułem, że absolutnie muszę użyć zmiennych egzogenicznych. Czy masz jakieś inne pomysły, które mógłbym zbadać?
krcooke,
Mogę tylko powiedzieć, co bym zrobił, gdybym miał rozkazy i posiadał dokładnie te informacje, które tu podajesz. Mój instynkt najpierw skupiłby się na sumach dziennych i pracował z nimi. To wystarczająco trudne. O wiele łatwiej jest tu być krytycznym ....
Nick Cox,
Cześć Nick, Moja wina, powinienem był już powiedzieć, że próbowałem tego. Przy dziennych podsumowaniach wyniki wydawały się rozsądne. Rozsądne jest słowo kluczowe, ponieważ, jak stwierdziliście zarówno ty, jak i Dave, należy wziąć pod uwagę o wiele więcej. Jeśli jest to interesujące, mogę ponownie uruchomić codzienne dane i wykazać, że rejestruje ono tygodniową, miesięczną i roczną sezonowość. Właśnie dlatego postanowiłem prognozować każdą godzinę jako codzienną serię.
krcooke
Jednym z problemów, które miałem, jak wspomniano w pierwszym poście, jest to, że auto.arima osiąga maksymalną liczbę iteracji przed zbieganiem się, dlatego używam dość ogólnych parametrów z Arima (). Wszelkie wskazówki dotyczące tego, jak mogę to przezwyciężyć, byłyby bardzo mile widziane!
krcooke