Hvorfor er denne trendende tidsserien stasjonær?

En studie av Augmented Dickey-Fuller (ADF) test fra et merkelig eksempel

Photo by Jan Huber on Unsplash

Stasjonaritet er et av de mest grunnleggende konseptene for tidsserieanalyse. Generelt vil stasjonaritet gi utmerkede egenskaper for modellering av tidsserien med ulike statistiske metoder. Augmented Dickey-Fuller (ADF) test er sannsynligvis den mest brukte metoden for å sjekke stasjonaritet.

Det er tonnevis av artikler på nettet om dette emnet. Jeg vil ikke kaste bort tiden din på den grunnleggende introen, som definisjonen av stasjonaritet, hvordan du gjør ADF-tester, osv. I dette innlegget vil jeg dele min reise med å utforske ADF-testen etter å ha møtt en merkelig sak i en applikasjon.

Læringsveien jeg skal vise er typisk for læring av datavitenskap. For det første tror vi at vi forstår et verktøy eller et konsept, men vi erkjenner og husker bare begrepet. Når vi bruker det på faktiske data, kan vi finne uventede, utfordrende problemer som presser oss til å undersøke mer og forstå videre.

Igjen, jeg deler koden min på GitHub; finn endelig lenken i referansedelen.

Starten på en uventet reise

Jeg jobbet med noen tidsserier her om dagen. Figur 1 viser en av dem. Det er ingen dobbelt så an en oppadgående trend eksisterer, og variansen endres også over tid. Med denne klare visualiseringen trengte jeg ikke å teste stasjonariteten. Av en eller annen grunn jeg ikke husker, prøvde jeg det likevel med ADF-testen. Overraskende nok er p-verdien nesten 0, noe som betyr at jeg bør avvise nullhypotesen og akseptere at den er stasjonær.

Figur 1. Tidsserie med en trend (Bilde av forfatteren)

Det er rart. Testresultatet virket feil. Jeg ønsket å undersøke hva som skjer bak ADF-testen. Det første trinnet jeg prøvde var å replikere dette problemet med syntetiske data. Jeg genererte noen testdata med følgende kode. Koden etterlignet bare oppførselen til langsom trend, men ikke sesongvariasjonen.

Det er 20,000 1 observasjoner i figur 0.0005, noe som tyder på at trenden går ekstremt sakte opp. Jeg lager en tidsserie med en liten helning på 0. Tidsseriens middelverdi går opp fra rundt 0.5 til 1000 etter XNUMX observasjoner. La oss så teste det med adfuller()-funksjonen fra statsmodels.tsa.stattools med standardparametrene. P-verdien er 0.01, og "problemet" skjer igjen. Figur 2 viser resultatet. Du kan ignorere tittelen og fokusere på den oppadgående trenden. Jeg skal forklare hvorfor vi har p-verdier fra tre forskjellige ADF-tester senere.

Figur 2. Syntetisk tidsserie med ADF-testresultat (Bilde av forfatteren)

Matematikken bak DF-testen

Vi må gå dypt ned for å se nøyaktig hva ADF-testen gjør. Det viser seg at den matematiske bakgrunnen ikke er komplisert. For det første er ADF-testen bare en avansert versjon av Dickey-Fuller-test. Det er tre hovedversjoner av DF-testen (fra Wikipedia):

Versjon 1: Test for en enhetsrot: ∆yᵢ = δyᵢ₋₁ + uᵢ

Versjon 2: Test for en enhetsrot med konstant: ∆yᵢ = a₀ + δyᵢ₋₁ + uᵢ

Versjon 3. Test for en enhetsrot med konstant og deterministisk trend: ∆yᵢ = a₀ + a₁*t + δyᵢ₋₁ + uᵢ

I hver versjon, nullhypotesen er at det er en enhetsrot, δ=0.

Statsmodels-pakken støtter alle tre versjonene med parameteren "regresjon".

For versjon 1 er regresjon 'n' (ingen konstant, ingen trend).

For versjon 2 er regresjon 'c' (kun konstant); dette er standardinnstillingen.

For versjon 3 er regresjon 'ct' (konstant og trend).

Jeg kjører testen på nytt med tre forskjellige innstillinger, og nedenfor er de nye resultatene.

For versjon 1 er p-verdien 0.09. Vi bør ikke forkaste nullhypotesen.

For versjon 2 er p-verdien 0.01. Vi har allerede behandlet det som et problem fordi dette er standardinnstillingen.

For versjon 3 er p-verdien 0.00. Det er forventet fordi tidsserien faktisk er det stasjonær med en deterministisk trend.

Så for disse eksempeldataene, hvis vi tester dem med versjon 1 (regresjon='n'), vil vi ikke si at de er stasjonære. Vi bør sannsynligvis ikke bruke standardinnstillingen. Men du kan også lure på hvorfor det konstante uttrykket gjorde så stor forskjell her? La oss grave mer.

Fra DF-testen til lineær regresjon

Basert på definisjonen ovenfor er DF-testen bare lineær regresjon. Figur 3 viser alle punktene for den lineære regresjonen. Y-aksen er ∆yᵢ, X-aksen er yᵢ₋₁, og uᵢ er residual. Versjon 1 betyr at vi må passe en linje uten avskjæring (ingen konstant). Versjon 2 betyr at vi må passe en linje med avskjæring (konstant).

Figur 3. ∆yᵢ og yᵢ₋₁ (Bilde av forfatteren)

Skitlearn Lineær Regresjon støtter disse to alternativene godt med parameteren fit_intercept. Under figur 4 er de to tilpassede linjene. Som du kan se passer linjen med skjæringen bedre enn linjen uten skjæringen. R-skåringen bekreftet det også tydelig. Vær også oppmerksom på at hellingen til den oransje linjen er mindre enn den blå linjens. Med andre ord er helningen til den oransje linjen nærmere 0.

Figur 4. Lineært regresjonsresultat (Bilde av forfatteren)

Vi kan også tenke ved visualisering: punktene er ikke sentrert rundt (0,0), så den tilpassede regresjonslinjen bør ikke passere (0,0). Skjæringspunktet skal være større enn 0. Fordi 0 er startmiddelverdien, bør ∆y være større enn 0, så det totale gjennomsnittet vil øke. Hvis vi tvinger regresjonslinjen til å gå gjennom (0,0), vil den underpasse dataene, og helningen vil bli nærmere 0 på grunn av påvirkningen fra (0,0).

Vi har sett om inkludert avskjæringseffektene passer til den lineære regresjonen. Hvorfor påvirker hvordan en linje monteres ADF-testresultatene, og hvor kommer p-verdien fra?

Fra lineær regresjon til p-verdi

Nå blir det litt komplisert. Den endelige p-verdien til DF-testen er ikke fra koeffisientenes p-verdi fra den lineære regresjonen. I utgangspunktet har statistikken en spesifikk fordeling kjent som Dickey-Fuller-tabellen. Da bruker vi MacKinnons omtrentlige p-verdi for teststatistikken. Du kan finne detaljene i Statsmodels kildekode.

Fordi nullhypotesen er δ=0, betyr det å teste helningen til den tilpassede linjen er 0. Vi trenger ikke gå inn på detaljer om hvordan man får p-verdien. Den logiske kjeden for assosiasjonen mellom p-verdien og helningen (δ i lineær regresjon, ikke trendhellingen) er slik:

Generelt, hvis helningen er langt fra 0, bør p-verdien være mindre, mer sannsynlig å avvise nullhypotesen og antyde ingen enhetsrot og stasjonær. Hvis helningen er 0 eller veldig nær 0, bør p-verdien være høyere, mer sannsynlig akseptere nullhypotesen og foreslå enhetsrot og ikke-stasjonær. For det andre scenariet sier Wikipedia: "Testene har lav statistisk kraft ved at de ofte ikke kan skille mellom sanne enhet-rot-prosesser (δ = 0) og nær-enhet-rot-prosesser (δ er nær 0)". Det er derfor vi har problemet i utgangspunktet. Vi har å gjøre med en nær-enhet-root-prosess. Versjon 1 finner en enhetsrot og versjon 2 finner ikke en enhetsrot.

Hvorfor fungerer versjon 1 for eksempelet ovenfor?

Versjon 1 fungerer for data i figur 2 fordi vi gjør skråningen nærmere 0, så p-verdien er høyere.

Vi kan imidlertid ikke bruke versjon 1 som standardinnstilling. Det er to tilfeller for versjon 1 (som tvinger linjen til å gå gjennom (0,0)):

Tilfelle 1: (0,0) er nærmere alle datapunktene. Hvis linjen må gå gjennom (0,0), vil linjen være flatere, og helningen vil komme nærmere 0. Figur 4 viser dette tilfellet. Vær oppmerksom på at demonstrasjonen i figur 4 bare passer til én variabel yᵢ₋₁, den faktiske ADF vil passe til flere lagvariabler.

Tilfelle 2: (0,0) er langt unna alle datapunktene. Hvis linjen må gå gjennom (0,0), kan vi mislykkes i tilpasningen; i hovedsak er helningen 0, noe som betyr at vi ikke kan finne en lineær sammenheng mellom ∆yᵢ og yᵢ₋₁ slik at en linje vil passere (0,0) og dekke de fleste datapunktene. Derfor vil testresultatet være partisk mot å ha en rotenhet.

Figur 5 nedenfor viser et eksempel på at versjon 1-testen ikke klarte å avvise nullhypotesen (p-verdi 0.6), og dataene er stasjonære med et gjennomsnitt på 10. Figur 6 forklarer årsaken. Som du kan se, kan vi ikke finne en linje uten avskjæring (R-kvadrat er 0), så helningen til den tilpassede linjen er 0 (∆yᵢ avhenger ikke av yᵢ₋₁).

Figur 5. Versjon 1 klarte ikke å gjenkjenne en stasjonær tidsserie (bilde av forfatteren)
Figur 6. Lineær regresjon klarer ikke å finne en linje uten avskjæring (bestått (0,0)) (Bilde av forfatteren)

Fra DF-testen til ADF-testen

Nå forstår vi at DF-testen er lineær regresjon og hvordan man får p-verdien fra den lineære regresjonen, la oss gå videre til ADF. Formelen til ADF er:

Igjen, lineær regresjon. Den "utvidede" delen er at vi må sette inn flere koeffisienter.

Statsmodels-pakken lar deg vise et detaljert sammendrag av AFT-testen. Figur 7 er resultatet.

Figur 7. ADF-test med et detaljert sammendrag (bilde av forfatteren)

Vi ser 'OLS-regresjon' (standardløsningen for lineær regresjon) og 17 koeffisienter. Jeg spesifiserte ikke maksimal forsinkelse, så testen vil prøve opp til et tall basert på tidsserielengden, som er 17.

Const (avskjæring) er også montert. Verdien er 0.0596.

La oss prøve å implementere ADF-testen ved å bruke lineær regresjon i Scikit-learn. Figur 8 er koden og utgangen.

Figur 8. ADF-test (bare den lineære regresjonsdelen) med Scikit-learn (bilde etter forfatter)

Skjæringspunktet er 0.0596, og de andre koeffisientene er de samme som i figur 7. Den lineære regresjonen i Scikit-learn er bare ren OLS. Vi gjør det samme, så det er ingen overraskelse at resultatene er identiske.

Slutten på reisen

Etter at jeg fant ut hvordan jeg skulle sette parameteren, testet jeg den opprinnelige tidsserien i figur 1 ved å bruke versjon 1 (regresjon ='n') og fikk p-verdien på 0.08, noe som tyder på at den ikke er stasjonær. Vær oppmerksom på at dataene i figur 1 er null-gjennomsnitt, så du kan forestille deg at (0,0) er nærmere datapunktene (∆yᵢ, yᵢ₋₁). Å bruke versjon 1-testen vil hjelpe oss.

Fordi trendhellingen i figur 1 er minimal, kan vi også resample tidsserien med trinn, noe som øker helningen. For eksempel, hvis jeg tester den med fire trinn (verdi[::4]), vil den ikke bestå ADF-testen med standardinnstillingen (p-verdi er 0.17 for regresjon='c').

Problemet løst.

Takeaways

Ikke stol blindt på ADF-resultater. Visualisering er din venn.

ADF-test er en enkel lineær regresjon, og implementeringen av statsmodeller bruker OLS for å løse regresjonsproblemet. Deretter bruker den Dickey–Fuller-tabellen for å trekke ut p-verdien som validerer nullhypotesen om at koeffisienten til den første etterslepvariabelen fra den tilpassede regresjonen er 0.

ADF-test har begrensninger ved testing av nær-enhet-rot-prosesser (δ er nær 0).

Vi må velge riktig ADF-versjon tilsvarende. For eksempel, når du ser en konstant trend og ønsker å teste 'trend stasjonær', må du velge 'ct' som parameter. Hvis du skal fange en langsom trend for et signal hvis gjennomsnitt er ment å være 0 som i figur 1 og figur 2, må du kanskje velge 'n' som parameter for å unngå virkningen av å tilpasse avskjæringen. Statsmodeller støtter også kvantisk trend med parameteren 'ctt.' Dette avanserte alternativet kan være et godt valg for noen tilfeller. I tilfelle du ønsker å grave videre, vennligst se Håndtere usikkerhet om å inkludere avskjærings- og deterministiske tidstrendtermer.

Jeg håper du har lært noe om ADF-testen.

Ha det gøy med tidsserien din!

Kontakt meg på Linkedin.

PS: Jeg har erfaring og lidenskap for tidsseriedata. Hvis du liker denne artikkelen, kan du være interessert i min andre innlegg om tidsserier.

Referanser

Notebook-fil på GitHub

Hvorfor er denne trendende tidsserien stasjonær? Republisert fra kilde https://towardsdatascience.com/why-is-this-trending-time-series-stationary-f3fb9447336f?source=rss—-7f60cf5620c9—4 via https://towardsdatascience.com/feed

<!–

->

Tidstempel:

Mer fra Blockchain-konsulenter