De ce este staționară această serie de timp în tendințe?

Un studiu al Augmented Dickey-Fuller (ADF) testează dintr-un exemplu ciudat

Fotografie de Jan Huber on Unsplash

Staționaritatea este unul dintre cele mai fundamentale concepte pentru analiza seriilor temporale. În general, staționaritatea va oferi proprietăți excelente pentru modelarea seriilor de timp cu diverse metode statistice. Dickey-Fuller crescut (ADF) testul este probabil cea mai utilizată abordare pentru verificarea staționarității.

Există o mulțime de articole online pe acest subiect. Nu vă voi pierde timpul cu introducerea de bază, cum ar fi definiția staționarității, cum să faceți teste ADF etc. În această postare, vă voi împărtăși călătoria mea de explorare a testului ADF după ce am întâlnit un caz ciudat într-o aplicație.

Calea de învățare pe care o voi prezenta este tipică pentru învățarea științei datelor. În primul rând, credem că înțelegem un instrument sau un concept, dar doar recunoaștem și ne amintim termenul. Când o aplicăm datelor reale, este posibil să găsim probleme neașteptate, provocatoare, care ne împing să investigăm mai mult și să înțelegem mai departe.

Din nou, îmi voi împărtăși codul pe GitHub; Vă rugăm să găsiți linkul în secțiunea de referință în sfârșit.

Începutul unei călătorii neașteptate

Am lucrat cu niște serii cronologice zilele trecute. Figura 1 prezintă una dintre ele. Nu există dublu ca an există tendință ascendentă, si varianța se modifică și în timp. Cu această vizualizare clară, nu aveam nevoie să testez staționaritatea. Dintr-un motiv oarecare nu-mi amintesc, am încercat totuși cu testul ADF. În mod surprinzător, valoarea p este aproape 0, ceea ce implică că ar trebui să resping ipoteza nulă și să accept că este staționară.

Figura 1. Serii temporale cu tendință (Imaginea autorului)

E ciudat. Rezultatul testului părea greșit. Am vrut să investighez ce se întâmplă în spatele testului ADF. Primul pas pe care l-am încercat a fost să reproduc această problemă cu date sintetice. Am generat câteva date de testare cu următorul cod. Codul a imitat doar comportamentul de tendință lentă, dar nu și sezonalitatea.

Există 20,000 de observații în Figura 1, ceea ce înseamnă că tendința crește extrem de lent. Creez o serie temporală cu o mică pantă de 0.0005. Valoarea medie a seriei de timp crește de la aproximativ 0 la 0.5 după 1000 de observații. Apoi să-l testăm cu funcția adfuller() de la statsmodels.tsa.stattools cu parametrii impliciti. Valoarea p este 0.01, iar „problema” apare din nou. Figura 2 arată rezultatul. Puteți ignora titlul și vă concentrați pe tendința ascendentă. Voi explica mai târziu de ce avem valori p de la trei teste ADF diferite.

Figura 2. Serii cronologice sintetice cu rezultatul testului ADF (Imaginea autorului)

Matematica din spatele testului DF

Trebuie să coborâm adânc pentru a vedea ce face exact testul ADF. Se pare că fondul său de matematică nu este complicat. În primul rând, testul ADF este doar o versiune avansată a Testul Dickey-Fuller. Sunt trei versiuni principale ale testului DF (de pe Wikipedia):

Versiune 1: Test pentru o rădăcină unitară: ∆yᵢ = δyᵢ₋₁ + uᵢ

Versiune 2: Test pentru o rădăcină unitară cu constantă: ∆yᵢ = a₀ + δyᵢ₋₁ + uᵢ

Versiunea 3. Test pentru o rădăcină unitară cu tendință constantă și deterministă: ∆yᵢ = a₀ + a₁*t + δyᵢ₋₁ + uᵢ

În fiecare versiune, ipoteza nulă este că există o rădăcină unitară, δ=0.

Pachetul Statsmodels acceptă toate cele trei versiuni cu parametrul „regresie”.

Pentru versiunea 1, regresia este „n” (fără constantă, fără tendință).

Pentru versiunea 2, regresia este „c” (numai constantă); aceasta este setarea implicită.

Pentru versiunea 3, regresia este „ct” (constantă și tendință).

Reluez testul cu trei setări diferite, iar mai jos sunt noile rezultate.

Pentru versiunea 1, valoarea p este 0.09. Nu ar trebui să respingem ipoteza nulă.

Pentru versiunea 2, valoarea p este 0.01. Am tratat-o ​​deja ca pe o problemă, deoarece aceasta este setarea implicită.

Pentru versiunea 3, valoarea p este 0.00. Este de așteptat, deoarece seria temporală este într-adevăr staționar cu tendință deterministă.

Deci, pentru acest exemplu de date, dacă le testăm cu versiunea 1 (regression='n'), nu vom spune că este staționară. Probabil că nu ar trebui să folosim setarea implicită. Dar s-ar putea să vă întrebați și de ce termenul constant a făcut o diferență atât de mare aici? Să săpăm mai mult.

De la testul DF la regresia liniară

Pe baza definiției de mai sus, testul DF este doar o regresie liniară. Figura 3 prezintă toate punctele pentru regresia liniară. Axa Y este ∆yᵢ, axa X este yᵢ₋₁ și uᵢ este rezidual. Versiunea 1 înseamnă că trebuie să potrivim o linie fără interceptare (fără constantă). Versiunea 2 înseamnă că trebuie să potrivim o linie cu interceptare (constant).

Figura 3. ∆yᵢ și yᵢ₋₁ (Imaginea autorului)

Skitlearn LinearRegression acceptă bine aceste două opțiuni cu parametrul fit_intercept. Sub Figura 4 sunt cele două linii montate. După cum puteți vedea, linia cu interceptarea se potrivește mai bine decât linia fără interceptare. Scorul R-pătrat a confirmat, de asemenea, clar. De asemenea, rețineți că panta liniei portocalii este mai mică decât a liniei albastre. Cu alte cuvinte, panta liniei portocalii este mai aproape de 0.

Figura 4. Rezultatul regresiei liniare (Imaginea autorului)

Putem gândi și prin vizualizare: punctele nu sunt centrate în jurul (0,0), deci linia de regresie ajustată nu trebuie să treacă (0,0). Interceptul ar trebui să fie mai mare decât 0. Deoarece 0 este media inițială, ∆y ar trebui să fie mai mare decât 0, deci media generală va crește. Dacă forțăm linia de regresie să treacă prin (0,0), aceasta se va adapta sub datele, iar panta va deveni mai aproape de 0 din cauza influenței de la (0,0).

Am văzut dacă includerea impactului de interceptare se potrivește cu regresia liniară. De ce modul în care este montată o linie influențează rezultatele testului ADF și de unde provine valoarea p?

De la regresia liniară la valoarea p

Acum devine un pic complicat. Valoarea p finală a testului DF nu este din valoarea p a coeficienților din regresia liniară. Practic, statistica are o distribuție specifică cunoscută sub numele de tabel Dickey-Fuller. Apoi folosim valoarea p aproximativă a lui MacKinnon pentru statistica de test. Puteți găsi detalii în Cod sursă Statmodels.

Deoarece ipoteza nulă este δ=0, ceea ce înseamnă că testarea pantei dreptei ajustate este 0. Nu trebuie să intrăm în detalii despre cum să obținem valoarea p. Lanțul logic al asocierii dintre valoarea p și panta (δ în regresie liniară, nu panta de tendință) este astfel:

În general, dacă panta este departe de 0, valoarea p ar trebui să fie mai mică, mai probabil respingând ipoteza nulă și sugerând nicio rădăcină unitară și staționară. Dacă panta este 0 sau foarte apropiată de 0, valoarea p ar trebui să fie mai mare, mai probabil acceptând ipoteza nulă și sugerând rădăcina unitară și non-staționară. Pentru cel de-al doilea scenariu, Wikipedia spune: „Testele au o putere statistică scăzută, deoarece adesea nu pot face distincția între procesele rădăcină unității adevărate (δ = 0) și procesele rădăcină unității aproape (δ este aproape de 0)”. De aceea avem problema în primul rând. Avem de-a face cu un proces aproape de rădăcină unită. Versiunea 1 găsește o rădăcină de unitate, iar versiunea 2 nu găsește o rădăcină de unitate.

De ce funcționează versiunea 1 pentru exemplul de mai sus?

Versiunea 1 funcționează pentru datele din Figura 2, deoarece facem panta mai aproape de 0, astfel încât valoarea p este mai mare.

Cu toate acestea, nu putem folosi versiunea 1 ca setare implicită. Există două cazuri pentru versiunea 1 (forțarea liniei să treacă prin (0,0) ):

Cazul 1: (0,0) este mai aproape de toate punctele de date. Dacă linia trebuie să treacă prin (0,0), atunci linia va fi mai plată, iar panta se va apropia de 0. Figura 4 demonstrează acest caz. Vă rugăm să rețineți că demonstrația din Figura 4 se potrivește doar cu o variabilă yᵢ₋₁, ADF-ul real se va potrivi cu mai multe variabile de întârziere.

Cazul 2: (0,0) este departe de toate punctele de date. Dacă linia trebuie să treacă prin (0,0), putem eșua potrivirea; în esență, panta este 0, ceea ce înseamnă că nu putem găsi o relație liniară a ∆yᵢ și yᵢ₋₁ astfel încât o linie să treacă de (0,0) și să acopere majoritatea punctelor de date. Prin urmare, rezultatul testului va fi orientat spre a avea o unitate rădăcină.

Figura 5 de mai jos prezintă un exemplu de test din versiunea 1 care nu a respins ipoteza nulă (valoarea p 0.6), iar datele sunt staționare cu o medie de 10. Figura 6 explică motivul. După cum puteți vedea, nu putem găsi o dreaptă fără interceptare (R-pătrat este 0), deci panta dreptei ajustate este 0 (∆yᵢ nu depinde de yᵢ₋₁).

Figura 5. Versiunea 1 nu a recunoscut o serie temporală staționară (Imaginea autorului)
Figura 6. Regresia liniară nu reușește să găsească o linie fără interceptare (trecerea (0,0)) (Imaginea autorului)

De la testul DF la testul ADF

Acum înțelegem că testul DF este regresia liniară și cum să obținem valoarea p din regresia liniară, să trecem la ADF. Formula ADF este:

Din nou, regresie liniară. Partea „Augmentată” este că trebuie să ne potrivim mai mulți coeficienți.

Pachetul statsmodels permite afișarea unui rezumat detaliat al testului AFT. Figura 7 este rezultatul.

Figura 7. Testul ADF cu un rezumat detaliat (Imaginea autorului)

Vedem „Regresia OLS” (soluția implicită pentru regresia liniară) și 17 coeficienți. Nu am specificat decalajul maxim, așa că testul va încerca până la un număr bazat pe lungimea seriei temporale, care este 17.

Const (interceptarea) este de asemenea montată. Valoarea este 0.0596.

Să încercăm să implementăm testul ADF utilizând regresia liniară în Scikit-learn. Figura 8 este codul și ieșirea.

Figura 8. Testul ADF (doar partea de regresie liniară) cu Scikit-learn (Imagine după autor)

Interceptarea este 0.0596, iar ceilalți coeficienți sunt la fel ca în Figura 7. Regresia liniară în Scikit-learn este pur și simplu MOL. Facem același lucru, așa că nu este de mirare că rezultatele sunt identice.

Sfârșitul călătoriei

După ce mi-am dat seama cum să setez parametrul, am testat seria temporală inițială din Figura 1 folosind versiunea 1 (regresie = 'n') și am obținut valoarea p de 0.08, sugerând că nu este staționară. Vă rugăm să rețineți că datele din Figura 1 sunt medii zero, așa că vă puteți imagina că (0,0) este mai aproape de punctele de date (∆yᵢ, yᵢ₋₁). Utilizarea testului versiunii 1 ne va ajuta.

Deoarece panta de tendință din Figura 1 este minimă, putem și reeșantiona seria de timp cu pași, ceea ce crește panta. De exemplu, dacă îl testez în patru pași ( value[::4] ), nu va trece testul ADF cu setarea implicită (valoarea p este 0.17 pentru regresie='c').

Problema rezolvata.

Takeaways

Nu aveți încredere în rezultatele ADF orbește. Vizualizarea este prietenul tău.

Testul ADF este o regresie liniară simplă, iar implementarea modelelor statistice utilizează OLS pentru a rezolva problema de regresie. Apoi folosește tabelul Dickey-Fuller pentru a extrage valoarea p care validează ipoteza nulă conform căreia coeficientul primei variabile de întârziere din regresia ajustată este 0.

Testul ADF are limitări atunci când se testează procesele aproape de rădăcină unită (δ este aproape de 0).

Trebuie să alegem în consecință versiunea ADF adecvată. De exemplu, când vedeți o tendință constantă și doriți să testați „tendința staționară”, trebuie să selectați „ct” ca parametru. Dacă veți găsi o tendință lentă pentru un semnal a cărui medie ar trebui să fie 0, ca în Figura 1 și Figura 2, poate că trebuie să selectați „n” ca parametru pentru a evita impactul ajustării interceptării. Statmodelele suportă, de asemenea, tendința cuantică cu parametrul „ctt”. Această opțiune avansată ar putea fi o alegere bună pentru unele cazuri. În cazul în care doriți să săpați mai departe, vă rugăm să consultați Confruntarea cu incertitudinea cu privire la includerea termenilor de interceptare și de tendință temporală deterministă.

Sper că ați învățat ceva despre testul ADF.

Distreaza-te cu seria ta de timp!

Contactați-mă pe LinkedIn.

PS: Am experiență și pasiune pentru datele serii cronologice. Dacă îți place acest articol, s-ar putea să fii interesat de celălalt al meu postări despre serii de timp.

Referinte

Fișier blocnotes pe GitHub

De ce este staționară această serie de timp în tendințe? Republicat din sursa https://towardsdatascience.com/why-is-this-trending-time-series-stationary-f3fb9447336f?source=rss—-7f60cf5620c9—4 prin https://towardsdatascience.com/feed

<!–

->

Timestamp-ul:

Mai mult de la Consultanți Blockchain