Varför är denna trendande tidsserie stationär?

En studie av Augmented Dickey-Fuller (ADF) testa från ett konstigt exempel

Foto: Jan Huber on Unsplash

Stationaritet är ett av de mest grundläggande begreppen för tidsserieanalys. Generellt sett kommer stationaritet att ge utmärkta egenskaper för att modellera tidsserierna med olika statistiska metoder. Augmented Dickey-Fuller (ADF) test är förmodligen den mest använda metoden för att kontrollera stationaritet.

Det finns massor av artiklar online om detta ämne. Jag kommer inte slösa din tid på det grundläggande introt, såsom definitionen av stationaritet, hur man gör ADF-tester, etc. I det här inlägget kommer jag att dela min resa med att utforska ADF-testet efter att ha stött på ett konstigt fall i en applikation.

Inlärningsvägen jag kommer att visa är typisk för att lära sig datavetenskap. Först tror vi att vi förstår ett verktyg eller ett koncept, men vi erkänner och kommer bara ihåg termen. När vi tillämpar det på faktiska data kan vi hitta oväntade, utmanande problem som driver oss att undersöka mer och förstå ytterligare.

Återigen kommer jag att dela min kod på GitHub; vänligen hitta länken i referensdelen till sist.

Början på en oväntad resa

Jag jobbade med några tidsserier häromdagen. Figur 1 visar en av dem. Det finns inget dubbelt så mycket uppåtgående trend finns, och variansen förändras också över tiden. Med denna tydliga visualisering behövde jag inte testa stationariteten. Av någon anledning som jag inte kommer ihåg så provade jag det ändå med ADF-testet. Överraskande nog är p-värdet nästan 0, vilket innebär att jag borde förkasta nollhypotesen och acceptera att den är stationär.

Figur 1. Tidsserier med en trend (Bild av författaren)

Det är konstigt. Testresultatet verkade fel. Jag ville undersöka vad som händer bakom ADF-testet. Det första steget jag försökte var att replikera det här problemet med syntetiska data. Jag genererade lite testdata med följande kod. Koden efterliknade bara beteendet hos långsam trend men inte säsongsvariationen.

Det finns 20,000 1 observationer i figur 0.0005, vilket tyder på att trenden går upp extremt långsamt. Jag skapar en tidsserie med en liten lutning på 0. Tidsseriens medelvärde går upp från cirka 0.5 till 1000 efter XNUMX observationer. Låt oss sedan testa det med funktionen adfuller() från statsmodels.tsa.stattools med standardparametrarna. P-värdet är 0.01 och "problemet" uppstår igen. Figur 2 visar resultatet. Du kan ignorera titeln och fokusera på den uppåtgående trenden. Jag ska förklara varför vi har p-värden från tre olika ADF-tester senare.

Figur 2. Syntetisk tidsserie med ADF-testresultat (Bild av författaren)

Matematiken bakom DF-testet

Vi måste gå ner djupt för att se exakt vad ADF-testet gör. Det visar sig att dess matematiska bakgrund inte är komplicerad. För det första är ADF-testet bara en avancerad version av Dickey-Fuller test. Det finns tre huvudversioner av DF-testet (från Wikipedia):

Version 1: Testa för en enhetsrot: ∆yᵢ = δyᵢ₋₁ + uᵢ

Version 2: Testa för en enhetsrot med konstant: ∆yᵢ = a₀ + δyᵢ₋₁ + uᵢ

Version 3. Testa för en enhetsrot med konstant och deterministisk trend: ∆yᵢ = a₀ + a₁*t + δyᵢ₋₁ + uᵢ

I varje version, nollhypotesen är att det finns en enhetsrot, δ=0.

Statsmodels-paketet stöder alla tre versionerna med parametern "regression".

För version 1 är regression 'n' (ingen konstant, ingen trend).

För version 2 är regression 'c' (endast konstant); detta är standardinställningen.

För version 3 är regression 'ct' (konstant och trend).

Jag kör om testet med tre olika inställningar, och nedan är de nya resultaten.

För version 1 är p-värdet 0.09. Vi bör inte förkasta nollhypotesen.

För version 2 är p-värdet 0.01. Vi har redan behandlat det som ett problem eftersom detta är standardinställningen.

För version 3 är p-värdet 0.00. Det förväntas eftersom tidsserien verkligen är det stationär med en deterministisk trend.

Så för denna exempeldata, om vi testar den med version 1 (regression='n'), kommer vi inte att säga att den är stationär. Vi borde förmodligen inte använda standardinställningen. Men du kanske också undrar, varför gjorde den konstanta termen så stor skillnad här? Låt oss gräva mer.

Från DF-testet till linjär regression

Baserat på ovanstående definition är DF-testet bara linjär regression. Figur 3 visar alla punkter för den linjära regressionen. Y-axeln är ∆yᵢ, X-axeln är yᵢ₋₁ och uᵢ är residual. Version 1 innebär att vi måste passa en linje utan skärning (ingen konstant). Version 2 innebär att vi måste passa en linje med intercept (konstant).

Figur 3. ∆yᵢ och yᵢ₋₁ (Bild av författaren)

Skitlearn LinearRegression stöder dessa två alternativ väl med parametern fit_intercept. Nedanför figur 4 visas de två inpassade linjerna. Som du kan se passar linjen med skärningen bättre än linjen utan skärningen. R-kvadratpoängen bekräftade det också tydligt. Observera också att den orange linjens lutning är mindre än den blå linjens. Med andra ord är den orange linjens lutning närmare 0.

Figur 4. Linjär regressionsresultat (Bild av författaren)

Vi kan också tänka genom visualisering: punkterna är inte centrerade runt (0,0), så den anpassade regressionslinjen bör inte passera (0,0). Skärningspunkten ska vara större än 0. Eftersom 0 är startmedelvärdet bör ∆y vara större än 0, så det totala medelvärdet kommer att öka. Om vi ​​tvingar regressionslinjen att gå igenom (0,0), kommer den att underpassa data, och lutningen kommer att bli närmare 0 på grund av påverkan från (0,0).

Vi har sett om inkludering av intercepteffekterna passar den linjära regressionen. Varför påverkar hur en linje monteras ADF-testresultaten, och var kommer p-värdet ifrån?

Från linjär regression till p-värde

Nu är det där det blir lite komplicerat. Det slutliga p-värdet för DF-testet är inte från koefficienternas p-värde från den linjära regressionen. I grund och botten har statistiken en specifik fördelning som kallas Dickey-Fuller-tabellen. Sedan använder vi MacKinnons ungefärliga p-värde för teststatistiken. Du kan hitta detaljerna i Statsmodels källkod.

Eftersom nollhypotesen är δ=0, vilket betyder att testa lutningen på den anpassade linjen är 0. Vi behöver inte gå in på detaljer om hur man får p-värdet. Den logiska kedjan för sambandet mellan p-värdet och lutningen (δ i linjär regression, inte den trendande lutningen) är så här:

I allmänhet, om lutningen är långt ifrån 0, bör p-värdet vara mindre, mer sannolikt förkastar nollhypotesen och föreslår ingen enhetsrot och stationär. Om lutningen är 0 eller mycket nära 0, bör p-värdet vara högre, mer sannolikt acceptera nollhypotesen och föreslå enhetsrot och icke-stationär. För det andra scenariot säger Wikipedia, "Testen har låg statistisk kraft eftersom de ofta inte kan skilja mellan sanna enhetsrotprocesser (δ = 0) och processer nära enhetsrot (δ är nära 0)". Det är därför vi har problemet i första hand. Vi har att göra med en process nära enhetsrot. Version 1 hittar en enhetsrot och version 2 kan inte hitta en enhetsrot.

Varför fungerar version 1 för exemplet ovan?

Version 1 fungerar för data i figur 2 eftersom vi gör lutningen närmare 0, så p-värdet är högre.

Vi kan dock inte använda version 1 som standardinställning. Det finns två fall för version 1 (som tvingar linjen att gå igenom (0,0)):

Fall 1: (0,0) är närmare alla datapunkter. Om linjen måste gå igenom (0,0) blir linjen plattare och lutningen kommer närmare 0. Figur 4 visar detta fall. Observera att demonstrationen i figur 4 bara passar en variabel yᵢ₋₁, den faktiska ADF kommer att passa fler fördröjningsvariabler.

Fall 2: (0,0) är långt borta från alla datapunkter. Om linjen måste gå igenom (0,0), kan vi misslyckas med anpassningen; i huvudsak är lutningen 0, vilket betyder att vi inte kan hitta ett linjärt samband mellan ∆yᵢ och yᵢ₋₁ så att en linje passerar (0,0) och täcker de flesta datapunkterna. Därför kommer testresultatet att vara partiskt mot att ha en rotenhet.

Figur 5 nedan visar ett exempel på att version 1-testet misslyckades med att förkasta nollhypotesen (p-värde 0.6), och data är stationära med ett medelvärde av 10. Figur 6 förklarar orsaken. Som du kan se kan vi inte hitta en linje utan skärning (R-kvadrat är 0), så lutningen på den anpassade linjen är 0 (∆yᵢ beror inte på yᵢ₋₁).

Figur 5. Version 1 kunde inte känna igen en stationär tidsserie (Bild av författaren)
Figur 6. Linjär regression lyckas inte hitta en linje utan skärning (passerande (0,0)) (Bild av författaren)

Från DF-testet till ADF-testet

Nu förstår vi att DF-testet är linjär regression och hur man får fram p-värdet från den linjära regressionen, låt oss gå vidare till ADF. Formeln för ADF är:

Återigen, linjär regression. Den "förstärkta" delen är att vi måste passa in fler koefficienter.

Med statsmodels-paketet kan du visa en detaljerad sammanfattning av AFT-testet. Figur 7 är resultatet.

Figur 7. ADF-test med en detaljerad sammanfattning (Bild av författaren)

Vi ser 'OLS-regression' (standardlösningen för linjär regression) och 17 koefficienter. Jag angav inte maxfördröjningen, så testet kommer att försöka upp till ett nummer baserat på tidsseriens längd, vilket är 17.

Const (avskärning) är också monterad. Värdet är 0.0596.

Låt oss försöka implementera ADF-testet genom att använda linjär regression i Scikit-learn. Figur 8 är koden och utdata.

Figur 8. ADF-test (bara den linjära regressionsdelen) med Scikit-learn (bild av författare)

Skärningspunkten är 0.0596, och de andra koefficienterna är desamma som i figur 7. Den linjära regressionen i Scikit-learn är helt enkelt OLS. Vi gör samma sak, så det är ingen överraskning att resultaten är identiska.

Resans slut

Efter att jag kom på hur man ställer in parametern testade jag den ursprungliga tidsserien i figur 1 med version 1 (regression ='n') och fick p-värdet på 0.08, vilket tyder på att den inte är stationär. Observera att data i figur 1 är nollmedelvärde, så du kan föreställa dig att (0,0) är närmare datapunkterna (∆yᵢ, yᵢ₋₁). Att använda version 1-testet kommer att hjälpa oss.

Eftersom trendlutningen i figur 1 är minimal kan vi också sampla om tidsserien med steg, vilket ökar lutningen. Till exempel, om jag testar den med fyra steg (värde[::4]), kommer den inte att klara ADF-testet med standardinställningen (p-värdet är 0.17 för regression='c').

Problemet löst.

takeaways

Lita inte blint på ADF-resultat. Visualisering är din vän.

ADF-test är en enkel linjär regression, och implementeringen av statsmodeller använder OLS för att lösa regressionsproblemet. Sedan använder den Dickey–Fuller-tabellen för att extrahera p-värdet som validerar nollhypotesen att koefficienten för den första fördröjningsvariabeln från den anpassade regressionen är 0.

ADF-test har begränsningar när man testar processerna nära enhetsroten (δ är nära 0).

Vi måste välja rätt ADF-version i enlighet med detta. Till exempel, när du ser en konstant trend och vill testa "trend stationär", måste du välja "ct" som parameter. Om du ska fånga en långsam trend för en signal vars medelvärde är tänkt att vara 0 som i figur 1 och figur 2, kanske du måste välja 'n' som parameter för att undvika påverkan av att passa skärningen. Statsmodeller stöder också kvantisk trend med parametern 'ctt.' Detta avancerade alternativ kan vara ett bra val i vissa fall. Om du vill gräva vidare, vänligen se Hantera osäkerhet om att inkludera intercept och deterministiska tidstrendtermer.

Jag hoppas att du har lärt dig något om ADF-testet.

Ha kul med din tidsserie!

Kontakta mig på LinkedIn.

PS: Jag har erfarenhet och passion för tidsseriedata. Om du gillar den här artikeln kanske du är intresserad av min andra inlägg om tidsserier.

Referensprojekt

Notebook-fil på GitHub

Varför är denna trendande tidsserie stationär? Återpublicerad från källa https://towardsdatascience.com/why-is-this-trending-time-series-stationary-f3fb9447336f?source=rss—-7f60cf5620c9—4 via https://towardsdatascience.com/feed

<!–

->

Tidsstämpel:

Mer från Blockchain-konsulter