Jestem pod wrażeniem forecast
pakietu R , a także np. zoo
Pakietu dla nieregularnych szeregów czasowych i interpolacji brakujących wartości.
Moja aplikacja jest w zakresie prognozowania ruchu w call center, więc danych w weekendy (prawie) zawsze brakuje (prawie), co można ładnie obsłużyć zoo
. Ponadto może brakować niektórych dyskretnych punktów, po prostu używam NA
do tego R.
Rzecz w tym: cała ładna magia pakietu prognozy, taka jak eta()
, auto.arima()
etc, zdają się oczekiwać zwykłe ts
przedmioty, czyli równo rozmieszczone szeregi czasowe nie zawierające żadnych brakujących danych. Wydaje mi się, że zastosowania w świecie rzeczywistym dla szeregów czasowych tylko zrównowaŜonych istnieją zdecydowanie, ale - moim zdaniem - bardzo ograniczone.
Problem kilku dyskretnych NA
wartości można łatwo rozwiązać za pomocą dowolnej z oferowanych funkcji interpolacji, zoo
jak również przez forecast::interp
. Następnie uruchamiam prognozę.
Moje pytania:
- Czy ktoś sugeruje lepsze rozwiązanie?
(moje główne pytanie) Przynajmniej w mojej domenie aplikacji, prognozowaniu ruchu w call center (i, o ile mogę sobie wyobrazić większość innych domen problemowych), szeregi czasowe nie są równe. Przynajmniej mamy powtarzający się program „dni roboczych” czy coś takiego. Jaki jest najlepszy sposób, aby sobie z tym poradzić i nadal używać całej fajnej magii pakietu prognozy?
Czy powinienem po prostu „skompresować” szeregi czasowe, aby wypełnić weekendy, wykonać prognozę, a następnie „napompować” dane ponownie, aby ponownie wprowadzić wartości NA w weekendy? (Myślę, że to wstyd?)
Czy są jakieś plany, aby pakiet prognozy był w pełni kompatybilny z pakietami o nieregularnych seriach czasowych, takimi jak zoo lub jego? Jeśli tak, kiedy i jeśli nie, dlaczego nie?
Jestem całkiem nowy w prognozowaniu (i statystykach w ogóle), więc mogę przeoczyć coś ważnego.
źródło
auto.arima
radzi sobie z brakującymi wartościami.Odpowiedzi:
Nie jestem ekspertem od R, więc może jest prostszy sposób, ale już wcześniej się z tym spotkałem. To, co zrobiłem wcześniej, to wdrożenie funkcji, która mierzy odległość (w jednostkach czasu) między faktycznymi datami i zapisuje ją w nowej kolumnie w istniejących szeregach czasowych. Mamy więc coś takiego:
W ten sposób, jeśli twoja seria czasowa nie jest jeszcze powiązana z rzeczywistą serią punktów w czasie (lub w niewłaściwym formacie lub czymkolwiek), możesz nadal z nią pracować.
Następnie piszesz funkcję, która tworzy dla ciebie nową serię czasową:
Najpierw obliczysz, ile jednostek czasu faktycznie miałaby seria czasowa między datami wyboru i utworzysz tę oś czasu w zoo, ts lub cokolwiek innego z pustymi wartościami.
Po drugie, bierzemy niepełną tablicę szeregów czasowych i, używając pętli, wypełniamy wartości we właściwej osi czasu, zgodnie z wybranymi limitami. Gdy natrafisz na wiersz, w którym odległość jednostki nie jest równa jeden (brakuje dni (jednostek)), wypełniasz interpolowane wartości.
Teraz, ponieważ jest to twoja funkcja, możesz właściwie wybrać sposób interpolacji. Na przykład decydujesz, że jeśli odległość jest mniejsza niż dwie jednostki, używasz standardowej interpolacji liniowej. Jeśli brakuje tygodnia, robisz coś innego, a jeśli osiągniesz określony próg brakujących dat, ostrzegasz o danych - naprawdę cokolwiek chcesz sobie wyobrazić.
Jeśli pętla osiągnie datę zakończenia, zwrócisz nowe ts.
Zaletą takiej funkcji jest to, że można stosować różne interpolacje lub procedury obsługi w zależności od długości odstępu i zwrócić czysto tworzy serię w wybranym przez ciebie formacie. Raz napisany, pozwala uzyskać czyste i ładne ts z dowolnego rodzaju danych tabelarycznych. Mam nadzieję, że to ci jakoś pomoże.
źródło
Należy zachować szczególną ostrożność, stosując interpolację przed dalszym traktowaniem statystycznym. Wybór dokonany dla interpolacji wprowadza błąd w danych. Jest to coś, czego zdecydowanie chcesz uniknąć, ponieważ może to zmienić jakość twoich prognoz. Moim zdaniem w przypadku brakujących wartości, takich jak te, o których wspomniałeś, które są regularnie rozmieszczone w czasie i które odpowiadają przerwom w działaniach, bardziej poprawne może być pozostawienie tych dni poza modelem. W małym świecie swojego call center (model, który budujesz na jego temat), lepiej byłoby wziąć pod uwagę, że czas po prostu zatrzymuje się, gdy jest zamknięty, zamiast wymyślać pomiary nieistniejącej działalności. Z drugiej strony model ARIMA został zbudowany statystycznie przy założeniu, że dane są równo rozmieszczone. O ile mi wiadomo, nie ma dostosowania ARIMA do twojej sprawy. Jeśli brakuje Ci tylko kilku pomiarów w rzeczywistych dniach roboczych, być może będziesz zmuszony użyć interpolacji.
źródło
Jak zauważył @Remi, nie interpolowałbym danych przed oszacowaniem modelu na tych danych. To zły pomysł. Skrajny przykład: wyobraź sobie, że masz dwa punkty danych: styczeń 2013 r. I styczeń 2014 r. Teraz interpoluj 10 punktów miesięcznych między: od lutego do grudnia 2013 r. I uruchom regresję w dniu miesięcznym. W rzeczywistości nie będzie tak źle, ale to ten sam pomysł: w najlepszym razie będziesz pompować statystyki.
Najlepszym sposobem jest użycie metod szeregów czasowych, które obsługują brakujące dane. Na przykład metody przestrzeni stanów. Spójrz na astsa pakietu R. Pochodzi z doskonałą książką na temat analizy szeregów czasowych. To ładnie poradzi sobie z brakującymi danymi. Matlab ma teraz podobną funkcjonalność w pakiecie ssm . Musisz nauczyć się przekształcania modeli w formę przestrzeni stanu, ale musisz się tego nauczyć, jeśli chcesz odejść od
auto.arima
„magii”.źródło