Modele dynamiczne 1 Laboratoria komputerowe Proszę uruchomić Statę i standardowo wykonać: set mat 800 set mem 200m Zbiór danych, którym się zajmiemy w pierwszej kolejności, to synt.dta. Proszę go otworzyć i zobaczyć w edytorze danych jak wyglądają poszczególne zmienne. Mamy w zbiorze danych kilka szeregów czasowych oraz zmienną okres, która wskazuje na okres pochodzenia poszczególnych obserwacji (łatwo się zorientować, że są to dane miesięczne: od stycznia 1980 do sierpnia 1996). Po wykonaniu komendy: describe okazuje się, że o ile wartości zmiennych szereg1 - szereg4 traktowane są jako wartości liczbowe, o tyle zmienna okres jest traktowana jako tekstowa. Innymi słowy, my patrząc na jej wartości widzimy jaką datę reprezentują, nie widzi jednak tego Stata. Żeby nauczyć Statę odkodowywać datę zapisaną za pomocą zmiennej string, możemy posłużyć się jednym z poleceń z rodziny komend dlyfcns. Wpiszmy najpierw: help dlyfcns Wyświetla się pomoc Staty, po której analizie (pamiętając, że nasze dane są danymi miesięcznymi) wykonamy: gen data=monthly(okres,"ym") Po podejrzeniu w edytorze danych wyniku działania tej komendy, widać, że format w jakim Stata zapisuje datę jest wygodny dla komputera (kolejne cyfry oznaczają kolejne miesiące; licznik Staty rozpoczyna się w styczniu 1960), ale niespecjalnie komfortowy dla osoby pracującej z tymi danymi. Format, w jakim Stata wyświetla datę może być łatwo zmieniony na przyjemniejszy w użyciu za pomocą komendy: format data %tm Zanim przystąpimy do analizowania szeregów czasowych, pozostaje do ustalenia jeszcze jedna kwestia. Otóż znowu tylko my wiemy, że zbiór danych jest szeregiem czasowym, gdzie kolejne okresy wyznaczane są przez zmienną data. Stata cały czas widzi zbiór danych jako próbę przekrojową. Zdefiniowanie zmiennej wskazującej na kolejne okresy czasu, a tym samym nauczenie Staty, że zbiór danych jest zbiorem szeregów czasowych odbywa się przy użyciu komendy: tsset data
Narysujmy szereg1 : scatter szereg1 data scatter szereg1 data, c(l) s(i) Widzimy, że jedną z charakterystyk tego szeregu jest tendencja rozwojowa (trend). Spróbujmy zdetrendyzować ten szereg obliczając jego pierwsze różnice. W Stacie operatorów opóźnień i operatorów różnicowych używa się następująco: 1. operator l opóźnia zmienną, czyli: la. zmiennat = zmiennat a, czyli jeśli chcemy wygenerować zmienną l1szereg1, która stanowić ma pierwsze opóźnienie zmiennej szereg1, to użyjemy komendy: gen l1szereg1=l1.szereg1 lub w przypadku pierwszego opóźnienia, po prostu: gen l1szereg1=l.szereg1 Odpowiednio, komenda: gen l3szereg1=l3.szereg1 stworzy zmienną l3szereg1, która stanowiła będzie 3 opóźnienie zmiennej szereg1. 2. operator s operator różnic sezonowych: sa. zmiennat = zmiennat zmiennat a, czyli jeśli znamy okresowość danych, to w razie potrzeby, możemy je odsezonować właśnie przy użyciu tego operatora. Na przykład, sezonowe różnice zmiennej szereg1 (których wyznaczanie w jej przypadku nie jest specjalnie zasadne, gdyż zmienna ta nie posiada wyraźnych wzorców sezonowych) można uzyskać: gen s12szereg1=s12.szereg1 3. operator d operator różnicowy: a da. zmienna = ( zmienna ) t t 2 t t t [ t t 1 ] [ ] [ ] 2 d 2. zmienna = ( zmienna ) = ( zmienna ) = zmienna zmienna = = zmienna zmienna zmienna zmienna = zmienna zmienna + zmienna t t 1 t 1 t 2 t t 1 t 2 Przykładowo, pierwsze różnice (szukane zresztą przez nas) zmiennej szereg1 uzyskamy: gen d1szereg1=d1.szereg1 Oczywiście wiele zmiennych możemy uzyskać na różne sposoby, przykładowo: x l. x s1. x d1. x Operatory można również zagnieżdżać, czy jak przykładowo potrzebna jest nam pierwsza różnica sezonowej różnicy zmiennej szereg1, to możemy ją uzyskać poprzez komendę:
gen ds12szereg1=d1.s12.szereg1 Wracając do analizy naszego szeregu1, chcieliśmy go zdetrendyzować poprzez obliczenie pierwszych różnic. Wynikiem jest zmienna d1szereg1 narysujmy jej wykres: scatter d1szereg1 data, c(l) s(i) Zajmijmy się teraz szeregiem3 : scatter szereg3 data, c(l) s(i) Widać, że oprócz trendu (który wygląda na liniowy), charakteryzuje się on również dość wyraźną sezonowością w cykliczny sposób wartości szeregu są determinowane przez jeden z okresów. Spróbujmy odsezonować i zdetrendyzować szereg. Operacja obliczenia pierwszych różnic: gen d1szereg3=d1.szereg3 scatter d1szereg3 data, c(l) s(i) scatter d1szereg3 data in 1/36, c(l) s(i) co prawda usuwa trend, ale zupełnie nie radzi sobie z sezonowością. Okazuje się, że przy liniowym trendzie i sezonowości, wystarczające do oczyszczenia szeregu jest wyznaczenie różnic sezonowych: gen s12szereg3=s12.szereg3 scatter s12szereg3 data, c(l) s(i) Proszę spojrzeć na szereg2. Czym różni się on od szeregu3? Proszę postarać się go oczyścić. Ostatnim szeregiem jest szereg4. Po narysowaniu jest wykresu: scatter szereg4 data, c(l) s(i) widać, że na jego wartości wpływa zarówno tendencja rozwojowa, jak i wahania sezonowe. Można by więc próbować oczyścić ten szereg wyznaczając różnice sezonowe: gen s12szereg4=s12.szereg4 scatter s12szereg4 data, c(l) s(i) Daje to jednak połowiczny sukces. Dlaczego? Otóż zaobserwowany trend nie był liniowy należy dodatkowo zróżnicować szereg: gen d1s12szereg4=d1.s12szereg4 albo za pomocą jednej, zagnieżdżonej komendy: gen d1s12szereg4_2=d1.s12.szereg4
Wykres: scatter d1s12szereg4 data, c(l) s(i) Warto jeszcze wspomnieć, że nie trzeba koniecznie generować dodatkowych zmiennych, żeby narysować ich wykres. Przykładowo, ostatni wykres mogliśmy uzyskać od razu przy użyciu operatorów różnicowych bezpośrednio w komendzie scatter : scatter d.s12.szereg4 data, c(l) s(i) Warto również wspomnieć, że jest wiele metod na detrendyzację i odsezonowanie szeregu. Przykładowo James Hamilton, jeden ze światowych autorytetów w dziedzinie analizy szeregów czasowych, do oczyszczenia szeregu proponuje (tam gdzie to możliwe, oczywiście) używać formuły: szereg1_ 2t = 100(ln( szereg1 t ) ln( szereg1 t a )) gdzie a wynika z sezonowości szeregu (w przypadku jej braku (lub szeregów wcześniej odsezonowanych), a=1). W Stacie formuła ta, przykładowo dla szeregu2 wyglądałaby: gen szereg2_2=100*(ln(szereg2)-ln(l12.szereg2)) scatter szereg2_2 data, c(l) s(i) Z materiałów do modeli ADL (autorstwa M. Kurcewicza): Mamy oszacować model długookresowego popytu na pieniądz, na niemieckich odsezonowanych kwartalnych danych z okresów: 1975:01-1994:4. Plik z danymi to adl_mk. Proszę posługując się komendą z rodziny dlyfcns (help dlyfcns) nauczyć Statę rozumienia dat zakodowanych przez tekstową zmienną obs. Proszę również zadeklarować, że typem danych są szeregi czasowe. Zmienne, którymi dysponujemy, to: Szacowany będzie model postaci: k k k k k mr = µ + α mr + β y + β rl + β rs + β infl + ε t i t i yi t i rli t i rsi t i infli t i t i= 1 i= 0 i= 0 i= 0 i= 0
gdzie dodatkowo: mr logarytm realnej podaży pieniądza infl inflacja Zobaczmy jak wyglądają poszczególne szeregi czasowe: scatter y data, c(l) s(i) scatter p data, c(l) s(i) scatter rs data, c(l) s(i) scatter rl data, c(l) s(i) scatter m data, c(l) s(i) Z wykresów tych dość jasno wynika, że część zmiennych nie jest stacjonarna, co (jak się już na wykładach okazało, albo okaże się niebawem) utrudnia naszą analizę, jako że rozkłady niektórych statystyk testowych będą się różniły od spodziewanych. Póki co jednak, podążając za przykładem z materiałów, zapomnimy chwilowo o tym problemie, ale przypomnimy sobie o nim już wkrótce. (Alternatywą jest doprowadzenie niestacjonarnych zmiennych do stacjonarności stosując operatory różnicowe). Zmienne zerojedynkowe dla szeregów czasowych Niektórych zmian kształtowania się zmiennej objaśnianej modelu nie można wyjaśniać zmiennością zmiennych objaśniających. Szoki, których nie są uwzględniane przez zmienne objaśniające można do modelu inkorporować przy użyciu zmiennych zerojedynkowych. Użycie takich zmiennych musi być dobrze uzasadnione teorią lub znajomością historii szeregu! W naszym przypadku, wyróżnione są dwa okresy: a. pierwszy kwartał 1990 roku, w którym nastąpił bardzo szybki wzrost stóp procentowych (po upadku muru berlińskiego pod koniec 1989 roku) oraz b. pierwszy kwartał 1991 roku od tego momentu szeregi podaży pieniądza (m) oraz GDP (y) obejmują Niemcy wschodnie i zachodnie. Zasady wprowadzania zmiennych zerojedynkowych dla okresów: Wprowadzając do modelu zerojedynkową zmienną wskazującą na konkretny okres ( moment szoku, niewytłumaczalnego w ramach modelu), dobrze uzasadnioną przez historię szeregu powinno się kierować przesłankami literaturowymi: 1. jeśli zmienna objaśniana jest stacjonarna, to zerojedynkowa zmienna dla okresu szoku powinna przyjmować wartości 0 przed nim oraz 1 w nim i we wszystkich kolejnych okresach. 2. dla zróżnicowanej zmiennej objaśnianej, zmienna zerojedynkowa powinna przyjmować wartości 0 we wszystkich innych okresach, niż ten, na który wskazuje (no i oczywiści wartość 1 w tym, na który wskazuje). 3. jeśli zmienna objaśniana jest niestacjonarna, to aplikuje się do niej podejście analogiczne jak do zmiennych zróżnicowanych. W bazie danych są zmienne d19901 i d19911, wskazujące na odpowiednie okresy zgodnie z przyjętymi zasadami. Gdybyśmy tych zmiennych nie mieli w bazie oraz chcieli wygenerować je sami, można by użyć do tego komendy:
gen d19901_a=(obs=="1990p1") gen d19911_a=(obs=="1991p1") Gdyby, z kolei zmienna objaśniana była stacjonarna i chcielibyśmy wygenerować adekwatne zmienne zerojedynkowe, to można by to zrobić w sposób następujący: gen d19901_b = 0 gen d19911_b = 0 replace d19901_b=1 if quarterly(obs,"yq")>=quarterly("1990p1","yq") replace d19911_b=1 if quarterly(obs,"yq")>=quarterly("1991p1","yq") Model popytu na pieniądz wykorzystuje realną podaż pieniądza. Żeby taką uzyskać, należy podzielić podaż nominalną przez poziom cen. Jednak w naszym przypadku zmienne są zlogarytmowane, więc żeby uzyskać realną podaż pieniądza, wystarczy odjąć od zmiennej m zmienną p (różnica logarytmów (o tych samych podstawach) = logarytm ilorazu). Wygenerujmy więc realną podaż: gen mr = m-p scatter mr data, c(l) s(i) Zobaczmy jeszcze jak na moglibyśmy się pozbyć trendu w tym szeregu: gen dmr=d.mr scatter dmr data, c(l) s(i) W modelu tym jedną ze zmiennych objaśniających jest też inflacja. Przyjmując standardową definicję, że inflacja to stosunek poziomu cen w jednym okresie do poziomu cen w analogicznym okresie poprzedniego roku oraz pamiętając, że dysponujemy danymi kwartalnymi, mamy: gen infl = p-l4.p gen infl1 = s4.p gen infl2 = d4.p edit infl infl1 infl2 Pokazane są tu trzy formuły na stworzenie zmiennej infl. Jedna z nich, w oczywisty sposób, nie jest formułą poprawną i pokazana tu jest dla kontrastu (a przede wszystkim dlatego, że w materiałach na sieci jest błąd polegający na niepoprawnym użyciu właśnie tej formuły do stworzenia inflacji!) Szacowanie modelu ADL Oszacujmy więc model ADL postaci: k k k k k mr = µ + α mr + β y + β rl + β rs + β infl + ε t i t i yi t i rli t i rsi t i infli t i t i= 1 i= 0 i= 0 i= 0 i= 0 Dobrze jest znać jeszcze jedną małą sztuczkę w Stacie, która pozwala ułatwić sobie trochę pracę w programie. Wyrażenie l( a / b). zmienna t produkuje zestaw zmiennych które są opóźnieniami zmiennej zmienna od opóźnienia a do b. A więc:
l( a / b). zmienna = [ zmienna zmienna... zmienna ] t t a t ( a+ 1) t b Załóżmy, że ogólna postać modelu będzie uwzględniała 5 opóźnienia (k=5). Do oszacowania tego modelu możemy więc posłużyć się komendą: reg mr l(1/5).mr l(0/5).y l(0/5).rl l(0/5).rs l(0/5).infl Wygenerujmy reszty dla tego modelu: predict reszty, r scatter reszty data Na podstawie wykresu czystych reszt czasami trudno jest wnioskować. Wygenerujmy reszty standaryzowane, które jeśli wyraźnie przekraczają wartość 2 (co do wartości bezwzględnej), to mogą wskazywać na obserwacje odstające. predict resztysd, rstudent scatter resztysd data Widać, że jedna z obserwacji wyraźnie odstaje. Uwzględnijmy więc w modelu opisywane zmienne zerojedynkowe: reg mr l(1/5).mr l(0/5).y l(0/5).rl l(0/5).rs l(0/5).infl d19901 d19911 predict resztysd1, rstudent scatter resztysd1 data Analiza składnika losowego Sporo już było mówione (również na ćwiczeniach), jak ważną jest rzeczą, żeby składnik losowy modelu ADL był nieskorelowany. Jeśli ma on taką własność, to oszacowania modelu, pomimo występowania jego części AR są zgodne. Są jednak niezgodne w przeciwnym przypadku, co sprawia, że sensowna interpretacja wyników modelu jest niemożliwa. Testem, którego możemy użyć do sprawdzenie, czy składnik losowy charakteryzuje się autokorelacją, jest test Breuscha-Godfreya: bgodfrey, lags(1/4) Okazuje się, że nasza postać modelu nie zapewnia braku autokorelacji składnika losowego, co czyni estymatory niezgodnymi! Przyczyną tego może być, przykładowo, zbyt krótka część AR modelu. Smutna prawda jest taka, że często chcą dopasować model do teorii ekonomii, dostajemy niezadowalające własności składnika losowego. Modelowanie od ogólnego do szczegółowego Gdyby własności składnika losowego były zadowalające, moglibyśmy spróbować uszczegółowić nasz model. Modelowanie od ogólnego do szczegółowego polega na rekurencyjnej procedurze testowania łącznej istotności najwyższych opóźnień zmiennych modelu. Jeśli okazują się one być łącznie istotne, to procedura się kończy, gdyż oznacza to, że nie można ich z modelu usunąć i to one stanowią prawidłowy rząd opóźnienia zmiennych.
Jeśli jednak okaże się, że są one łącznie nieistotne, to możemy oszacować nowy model bez nich i przejść do testowania łącznej istotności najwyższych opóźnień w kolejnym modelu. Każdorazowo powinniśmy badać własności składnika losowego, gdyż ich poprawność pozwala nam ufać wynikom testów. W naszym przypadku, testowalibyśmy istotność 5-tych opóźnień, a więc: test l5.mr l5.y l5.rl l5.rs l5.infl Opóźnienia te można usunąć (choć nie powinniśmy zbyt optymistycznie podchodzić do wyniku tego testu ze względu na wykazaną wcześniej autokorelację składnika losowego). Szczegółowszym modelem, do którego moglibyśmy przejść od modelu ogólnego byłby: reg mr l(1/4).mr l(0/4).y l(0/4).rl l(0/4).rs l(0/4).infl d19901 d19911 Trzeba by się jednak zastanowić, czy model ogólny można uprościć jeszcze bardziej. W tym celu, na model ogólny narzucamy poprzednie ograniczenia oraz ograniczenia nowe (o nieistotności 4-tych opóźnień). Nowy zestaw ograniczeń (dla modelu ogólnego) można więc przetestować w następujący sposób: test l5.mr l5.y l5.rl l5.rs l5.infl l4.mr l4.y l4.rl l4.rs l4.infl Równowaga długookresowa Po ustaleniu odpowiedniej liczby opóźnień, nikt nie powinien mieć trudności z wyznaczeniem rozwiązania długookresowego. Przyczynowość w sensie Grangera Przypomnijmy definicję: Zmienna x jest przyczyną w sensie Grangera zmiennej y, jeśli bieżące wartości zmiennej y możemy lepiej prognozować przy użyciu przeszłych wartości zmiennej x, niż bez ich użycia. Testowanie przyczynowości w sensie Grangera sprowadza się więc do zbudowania odpowiedniego modelu, np.: 5 5 5 5 5 mr = µ + α mr + β y + β rl + β rs + β infl + ε t i t i yi t i rli t i rsi t i infli t i t i= 1 i= 1 i= 1 i= 1 i= 1 i przetestowaniu, czy opóźnienia którejś ze zmiennych objaśnijących (którą podejrzewamy o bycie przyczyną w sensie Grangera popytu na pieniądz) są w nim łącznie istotne. Sprawdźmy, czy inflacja jest przyczyną w sensie Grangera popytu na pieniądz: reg mr l(1/5).mr l(1/5).y l(1/5).rl l(1/5).rs l(1/5).infl d19901 d19911 test l1.infl l2.infl l3.infl l4.infl l5.infl Jaki jest wynik tego testu?
UWAGA (o istotności zmiennych w modelach ADL) Ogólnie na zmienną w modelach ADL patrzymy blokowo na wszystkie jej opóźnienia oraz bieżącą wartość (jeśli taka występuje). Jeśli więc chcemy ocenić istotność zmiennej w modelu, to nie robimy tego patrząc na poszczególne jej opóźnienia i wyrzucając te, które zgodnie ze standardowym testem okazują się być nieistotne. Zmienna jest w modelu istotna, jeśli jej bieżąca i przeszłe wartości są w modelu łącznie istotne. ZADANIE Wykorzystując dane adl_konsumpcja (kwartalne dane dla Kanady), zbuduj model konsumpcji w zależności od dochodu. Przyjmij, że model ogólny ma 4 opóźnienia: 4 4 konsum = µ + α konsum + β dochod + ε t i t i i t i i i= 1 i= 0 O ile to możliwe (własności składnika losowego), zastosuj metodologię od ogólnego do szczegółowego, wyznacz rozwiązanie długookresowe oraz zbadaj, czy dochód jest przyczyną konsumpcji w sensie Grangera. Procesy ARIMA O tych procesach dość dużo mówiliśmy na zajęciach, dlatego przykład empiryczny będzie w minimalnym stopniu przypominał teorię bardziej będzie skupiał się na praktycznym jej wykorzystaniu. Problem, który przed sobą stawiamy, to próba wyprognozowania kolejnej wartości zmiennej, którą jest stosunek wielkości pożyczki hipotecznej do wartości domu (dane l2p_r.dta wycinek Federal Housing Finance Board (mortgages)). Zakładamy, że wartości zmiennej t15c09 podążają za jakimś teoretycznym procesem generującym dane z rodziny ARMA. Nasze zadanie to ustalenie parametrów tego procesu (czyli rzędu autoregresji i średniej ruchomej). Po ustaleniu struktury danych: gen t=monthly(czas,"ym") format t %tm tsset t i obejrzeniu wykresu zmiennej: scatter t15c09 t, c(l) s(i) przechodzimy do analizy wykresów funkcji ACF i PACF dla badanej zmiennej: ac t15c09 pac t15c09 Z wykresów wynika, że o ile możemy przyjąć, że rząd AR nie będzie większy niż 3, to nie mamy jasnych przesłanek odnośnie rzędu MA. Załóżmy, że rząd ten będzie nie większy niż 8.
Przeprowadźmy więc modelowanie procesu ARMA od ogólnego (ARMA(3,8)=ARIMA(3,0,8)) do szczegółowego. Kryteriami wyboru odpowiedniego procesu niech będą równolegle kryteria informacyjne oraz test LR. UWAGA! W celu możliwości wykorzystania kryteriów informacyjnych, do Staty powinna być doinstalowana komenda arimafit. Można to zrobić np. tak: w oknie Staty naciskamy Crtl+3 Search (zaznaczamy Search net resources ) (wpisujemy arimafit w Keyword) OK. Teraz należy wybrać odpowiedni plik i go zainstalować (z tym już sobie Stata poradzi sama). Prawidłowo zainstalowana komenda powinna wyświetlić opis jej składni po wpisaniu komendy help arimafit. Może się zdarzyć, że w czasie doinstalowywania komponentów do Staty będą się pojawiały drobne problemy, ale łatwo sobie z nimi poradzić, odpowiednio reagując na komentarze Staty o błędach. Zaczynamy modelowanie: quietly arima t15c09, ar(1 2 3) ma(1 2 3 4 5 6 7 8) lrtest, saving(0) arimafit Opcja quietly nie wyświetli wyników oszacowania parametrów oraz procesu znajdowania maksimum funkcji wiarogodności. saving(0) po lrtest ustali, że modelem ogólnym będzie ostatnio oszacowany, a więc ARMA(3,8). W końcu arimafit wyświetli wartości kryteriów informacyjnych i maksimum logarytmu funkcji wiarogodności. Będziemy teraz wprowadzać do modelu ogólnego kolejne ograniczenia, patrząc czy pozwala na nie wynik testu LR oraz patrząc jak reagują na nie kryteria informacyjne. quietly arima t15c09, ar(1 2 3) ma(1 2 3 4 5 6 7) lrtest arimafit quietly arima t15c09, ar(1 2 3) ma(1 2 3 4 5 6) lrtest arimafit (itd.) Postępując w ten sposób, dochodzimy do ARMA(3,3), potem do ARMA(3,2), ARMA(2,2), ARMA(2,1), ARMA(1,1) i okazuje się, że nie jesteśmy w stanie już bardziej ograniczyć wyjściowego modelu, gdyż zarówno wartości kryteriów informacyjnych, jak i wynik testu LR na to nie pozwalają. Prawidłowym modelem jest więc ARMA(1,1). Przypomnijmy sobie jeszcze co model taki musiał spełniać otóż wymagało się, żeby dla prawidłowych wartości p i q nie zachodziła autokorelacja błędu losowego badana testem Ljunga-Boxa. Sprawdźmy: arima t15c09, ar(1) ma(1) predict reszty, re
wntestq reszty, l(13) Jeśli kogoś dziwi, że analizowany przez nas szereg czasowy nalepiej naśladuje proces ARMA(1,1), to obejrzyjmy raz jeszcze wykres tego szeregu oraz wykresy jego ACF i PACF:
I przypomnijmy sobie jak wyglądały te wykresy dla przykładowego, wygenerowanego przy użyciu komputera procesu ARMA(1,1) (te wykresy widzieliśmy na zajęciach): Wykres szeregu czasowego: ACF i PACF:
O możliwościach prognostycznych procesów ARMA proszę doczytać w materiałach przygotowanych przez G. Ogonka, które znaleźć można w zakładce Materiały znajdującej się na wydziałowej stronie przedmiotu ekonometria (a konkretnie tu: http://www.ekonometria.wne.uw.edu.pl/index.php?n=main.materialy).