Próbowałem nauczyć się i stosować modele ARIMA. Czytałem doskonały tekst na temat ARIMA autorstwa Pankratza - Prognozowanie przy użyciu Univariate Box - Jenkins Models: Concepts and Cases . W tekście autor podkreśla przede wszystkim oszczędność w wyborze modeli ARIMA.
Zacząłem grać z auto.arima()
funkcji w R pakietu prognozy . Oto, co zrobiłem, przeprowadziłem symulację ARIMA, a następnie zastosowałem auto.arima()
. Poniżej znajdują się 2 przykłady. Jak widać w obu przykładach, auto.arima()
wyraźnie zidentyfikowano model, który wielu uważa za niepodatni. Zwłaszcza w przykładzie 2, w którym auto.arima()
zidentyfikowano ARIMA (3,0,3), podczas gdy w rzeczywistości ARIMA (1,0,1) byłoby wystarczające i oszczędne.
Poniżej znajdują się moje pytania. Byłbym wdzięczny za wszelkie sugestie i rekomendacje.
- Czy istnieją jakieś wskazówki dotyczące tego, kiedy używać / modyfikować modele zidentyfikowane za pomocą automatycznych algorytmów, takich jak
auto.arima()
? - Czy są jakieś spadki w użyciu tylko AIC (co moim zdaniem
auto.arima()
wykorzystuje) do identyfikacji modeli? - Czy można zbudować automatyczny algorytm, który jest oszczędny?
Nawiasem mówiąc, użyłem auto.arima()
tylko jako przykładu. Dotyczy to każdego automatycznego algorytmu.
Poniżej znajduje się przykład nr 1:
set.seed(182)
y <- arima.sim(n=500,list(ar=0.2,ma=0.6),mean = 10)
auto.arima(y)
qa <- arima(y,order=c(1,0,1))
qa
Poniżej znajdują się wyniki z auto.arima()
. Należy pamiętać, że wszystkie współczynniki są nieznaczne. tj. wartość <2.
ARIMA(1,0,2) with non-zero mean
Coefficients:
ar1 ma1 ma2 intercept
0.5395 0.2109 -0.3385 19.9850
s.e. 0.4062 0.4160 0.3049 0.0878
sigma^2 estimated as 1.076: log likelihood=-728.14
AIC=1466.28 AICc=1466.41 BIC=1487.36
Poniżej znajdują się wyniki regularnego uruchamiania arima()
z zamówieniem ARIMA (1,0,1)
Series: y
ARIMA(1,0,1) with non-zero mean
Coefficients:
ar1 ma1 intercept
0.2398 0.6478 20.0323
s.e. 0.0531 0.0376 0.1002
sigma^2 estimated as 1.071: log likelihood=-727.1
AIC=1462.2 AICc=1462.28 BIC=1479.06
Przykład 2:
set.seed(453)
y <- arima.sim(n=500,list(ar=0.2,ma=0.6),mean = 10)
auto.arima(y)
qa <- arima(y,order=c(1,0,1))
qa
Poniżej znajdują się wyniki z auto.arima()
:
ARIMA(3,0,3) with non-zero mean
Coefficients:
ar1 ar2 ar3 ma1 ma2 ma3 intercept
0.7541 -1.0606 0.2072 0.1391 0.5912 0.5491 20.0326
s.e. 0.0811 0.0666 0.0647 0.0725 0.0598 0.0636 0.0939
sigma^2 estimated as 1.027: log likelihood=-716.84
AIC=1449.67 AICc=1449.97 BIC=1483.39
Poniżej znajdują się wyniki wyświetlane regularnie arima()
z zamówieniem ARIMA (1,0,1)
Series: y
ARIMA(1,0,1) with non-zero mean
Coefficients:
ar1 ma1 intercept
0.2398 0.6478 20.0323
s.e. 0.0531 0.0376 0.1002
sigma^2 estimated as 1.071: log likelihood=-727.1
AIC=1462.2 AICc=1462.28 BIC=1479.06
źródło
Odpowiedzi:
Jest tu kilka problemów. Po pierwsze, nie zakładaj, że symulowana ARIMA jest naprawdę w określonej kolejności; pobierasz próbkę z określonego modelu, a ze względu na losowość najlepiej dopasowanym modelem dla konkretnej losowanej próbki może nie być ten, z którego pobrano symulacje.
Wspominam o tym z powodu drugiego i ważniejszego problemu:
auto.arima()
funkcja może oszacować modele za pomocą bardziej wydajnego algorytmu dopasowania, wykorzystując warunkowe sumy kwadratów, aby uniknąć nadmiernego czasu obliczeniowego dla długich serii lub złożonych modeli sezonowych. Gdy ten proces szacowania jest używany,auto.arima()
aproksymuje kryteria informacyjne dla modelu (ponieważ prawdopodobieństwo obliczenia logarytmu modelu nie zostało obliczone). Prosta heurystyka służy do ustalenia, czy warunkowe sumy oszacowań kwadratów są aktywne, jeśli użytkownik nie wskazuje, które podejście należy zastosować .approximation
(length(x)>100 | frequency(x)>12)
approximation
TRUE
approximation
auto.arima()
approximation = TRUE
arima()
W twoim przykładzie 1 powinniśmy
Dlatego
auto.arima()
wybrał model bardziej oszczędny niż prawdziwy; wybrano ARIMA (0, 0, 1). Ale opiera się to na kryteriach informacyjnych i teraz są one zgodne; wybrany model ma niższe AIC, AICc i BIC, chociaż różnice dla AIC i AICc są niewielkie. Przynajmniej teraz wybór jest zgodny z normami wyboru modeli na podstawie kryteriów informacyjnych.Powód wyboru IZ (1), jak sądzę, dotyczy pierwszego wymienionego przeze mnie problemu; mianowicie, że najlepiej dopasowany model do próbki pobranej z podanego ARIMA (p, d, q) może nie być tego samego rzędu co prawdziwy model. Wynika to z losowego próbkowania. Biorąc dłuższą serię lub dłuższy okres wypalania, możesz zwiększyć szansę na wybór prawdziwego modelu, ale nie polegaj na nim.
Niezależnie od tego, morał tutaj jest taki, że gdy coś wygląda oczywiście źle, tak jak w twoim pytaniu, przeczytaj odpowiednią stronę podręcznika lub dokumentację, aby upewnić się, że rozumiesz, jak działa oprogramowanie.
źródło
auto.arima()
ustalony model , więc gdyby były to jedyne dwa modele kandydujące, najprostszy zostałby wybrany ...)Dziękuję bardzo @ Gavin, @Irishstat i @Rob za odpowiedź na moje pytanie. Oczywiste jest, że jeśli potrzebuję oszczędnego modelu z automatycznych algorytmów, takich jak auto.arima, należy zastosować kryterium informacji BIC, w przeciwieństwie do AIC, szczególnie po przejrzeniu tego postu i postu @ Gavina powyżej.
Bardzo zgadzam się również z @Irishstat, że wybór modelu opartego na kryterium IC ma ograniczenia, ponieważ nie wybiera lepszego modelu pasującego do danych z wartościami odstającymi i przesunięciami poziomu. Moim zdaniem wartości odstające + przesunięcia poziomów + niechlujne dane = prawdziwe dane biznesowe , wszystko inne to zestawy danych z podręczników. Każdy model automatyczny, który nie uwzględnia wartości odstających + przesunięć poziomów, ponownie moim zdaniem powinien być używany ostrożnie.
Przechodząc do kodu - auto.arima ma opcję wyboru między AIC lub BIC. Zobacz poniżej kod został zmodyfikowany z powyższych pytań.
Ogromne podziękowania Społeczność zweryfikowana. Codziennie uczę się nowych i interesujących rzeczy.
BIC IC wybiera model MA (2).
źródło
Wziąłem 500 wartości w AUTOBOX (oprogramowanie komercyjne, które pomogłem opracować) i otrzymałem następujące porady oparte na teście Chow dla stałości parametrów. Bardzo podstawowym błędem popełnianym podczas badania szeregów czasowych jest założenie, że dane są napędzane przez określony model o stałych parametrach. AUTOBOX wykrył punkt przerwania w okresie 246, który może odzwierciedlać symulację, która nie została „rozgrzana”. Podczas symulacji danych dobrą praktyką jest usuwanie pierwszych „n” wartości, a następnie badanie pozostałych. Zebrałem dane i podzieliłem je na dwie części; pierwsze 245 i pozostałe 255. Oto dwa bardzo odmienne wykresy acf .
Wracając do analizy: Oto model, który został zidentyfikowany dla ostatnich 246 wartości i tutaj z następującymi statystykami . Aktualna / Dopasowanie i prognoza jest tutaj z resztkową działką tutaj . ACF pozostałości wskazuje na wystarczalność. Zauważ, że 5 zidentyfikowanych impulsów miało bardzo mały efekt i można je łatwo zignorować (w tym przypadku!). Podsumowując, wyciągnięto z tego lekcję, że czasami mamy za dużo danych i musimy rozważyć współczynniki zmiany czasu. W tym przypadku identyfikujemy zmianę parametrów, która (najwyraźniej) nie ma większego wpływu na wynikowy model / parametry, ale wskazuje na ogólnie potrzebną poprawę procesu w analizie szeregów czasowych. Moje doświadczenie z auto.arima sugeruje, że ponieważ wyraźnie nie traktuje / nie naprawia naruszeń gaussowskich, ma tendencję do nadmiernego modelowania poprzez zbytnie opieranie się na wartościach historycznych, zamiast wydobywania struktury z danych. W tym przypadku, ponieważ była to ściśle kontrolowana symulacja bez naruszeń gaussowskich, zadziałała, ale ogólnie byłbym podejrzany o takie pasmo z ograniczonym i jednostopniowym podejściem do identyfikacji modelu ARIMA. Ufaj ale sprawdzaj !
źródło
Jeśli tak jest, to pomóc użytkownikom, aby zobaczyć te względnych prawdopodobieństw, wraz z PTK (?) Z
auto.arima( ... trace=TRUE )
. Na przykład dane dotyczące jaj są uruchamiane zgodnie z tym, co podaje to pytanieźródło