Waarom is deze trending-tijdreeks stationair?

Een onderzoek naar de Augmented Dickey-Fuller (ADF) test van een raar voorbeeld

Foto door Jan Huber on Unsplash

Stationariteit is een van de meest fundamentele concepten voor tijdreeksanalyse. Over het algemeen zal stationariteit uitstekende eigenschappen bieden voor het modelleren van de tijdreeksen met verschillende statistische methoden. Verbeterde Dickey-Fuller (ADF) test is waarschijnlijk de meest gebruikte benadering voor het controleren van stationariteit.

Er zijn talloze artikelen online over dit onderwerp. Ik zal je tijd niet verspillen aan de basisintro, zoals de definitie van stationariteit, hoe je ADF-tests uitvoert, enz. In dit bericht zal ik mijn reis delen over het verkennen van de ADF-test nadat ik een vreemd geval in een toepassing tegenkwam.

Het leertraject dat ik zal laten zien is typisch voor het leren van data science. Ten eerste denken we dat we een hulpmiddel of een concept begrijpen, maar we erkennen en onthouden alleen de term. Wanneer we het toepassen op feitelijke gegevens, kunnen we onverwachte, uitdagende problemen tegenkomen die ons ertoe aanzetten meer te onderzoeken en verder te begrijpen.

Nogmaals, ik deel mijn code op GitHub; vindt u eindelijk de link in het referentiegedeelte.

Het begin van een onverwachte reis

Ik was laatst bezig met een aantal tijdreeksen. Figuur 1 toont er รฉรฉn. Er is geen dubbel zo er is een opwaartse trend, en variantie verandert ook in de loop van de tijd. Met deze duidelijke visualisatie hoefde ik de stationariteit niet te testen. Om de een of andere reden die ik me niet kan herinneren, heb ik het toch geprobeerd met de ADF-test. Verrassend genoeg is de p-waarde bijna 0, wat impliceert dat ik de nulhypothese moet verwerpen en moet accepteren dat deze stationair is.

Figuur 1. Tijdreeksen met een trend (Afbeelding door de auteur)

Dat is raar. Het testresultaat leek verkeerd. Ik wilde onderzoeken wat er achter de ADF-test aan de hand is. De eerste stap die ik probeerde was dit probleem te repliceren met synthetische gegevens. Ik heb enkele testgegevens gegenereerd met de volgende code. De code bootste alleen het gedrag van langzame trending na, maar niet de seizoensinvloeden.

Er zijn 20,000 waarnemingen in Figuur 1, wat impliceert dat de trend extreem langzaam omhoog gaat. Ik maak een tijdreeks met een kleine helling van 0.0005. De gemiddelde waarde van de tijdreeks stijgt van ongeveer 0 naar 0.5 na 1000 waarnemingen. Laten we het dan testen met de functie adfuller() van statsmodels.tsa.stattools met de standaardparameters. De p-waarde is 0.01 en het โ€˜probleemโ€™ doet zich opnieuw voor. Figuur 2 toont het resultaat. U kunt de titel negeren en u concentreren op de opwaartse trend. Ik zal later uitleggen waarom we p-waarden hebben van drie verschillende ADF-tests.

Figuur 2. Synthetische tijdreeksen met ADF-testresultaat (afbeelding door de auteur)

De wiskunde achter de DF-test

We moeten diep gaan om te zien wat de ADF-test precies doet. Het blijkt dat de wiskundige achtergrond niet ingewikkeld is. Ten eerste is de ADF-test slechts een geavanceerde versie van de Dickey-Fuller-test. Er zijn drie hoofdversies van de DF-test (van Wikipedia):

Versie 1: Test voor een eenheidswortel: โˆ†yแตข = ฮดyแตขโ‚‹โ‚ + uแตข

Versie 2: Test voor een eenheidswortel met constante: โˆ†yแตข = aโ‚€ + ฮดyแตขโ‚‹โ‚ + uแตข

Versie 3. Test voor een eenheidswortel met constante en deterministische trend: โˆ†yแตข = aโ‚€ + aโ‚*t + ฮดyแตขโ‚‹โ‚ + uแตข

In elke versie de nulhypothese is dat er een eenheidswortel is, ฮด=0.

Het Statsmodels-pakket ondersteunt alle drie versies met de parameter โ€œregressieโ€.

Voor versie 1 is de regressie 'n' (geen constante, geen trend).

Voor versie 2 is de regressie 'c' (alleen constant); dit is de standaardinstelling.

Voor versie 3 is de regressie 'ct' (constant en trend).

Ik voer de test opnieuw uit met drie verschillende instellingen en hieronder staan โ€‹โ€‹de nieuwe resultaten.

Voor versie 1 is de p-waarde 0.09. We moeten de nulhypothese niet verwerpen.

Voor versie 2 is de p-waarde 0.01. We hebben het al als een probleem behandeld, omdat dit de standaardinstelling is.

Voor versie 3 is de p-waarde 0.00. Dat wordt verwacht omdat de tijdreeks inderdaad bestaat stationair met een deterministische trend.

Dus als we deze voorbeeldgegevens testen met versie 1 (regressie='n'), zeggen we niet dat ze stationair zijn. We moeten waarschijnlijk niet de standaardinstelling gebruiken. Maar je vraagt โ€‹โ€‹je misschien ook af: waarom maakte de constante term hier zoโ€™n groot verschil? Laten we meer graven.

Van de DF-test tot lineaire regressie

Op basis van de bovenstaande definitie is de DF-test slechts lineaire regressie. Figuur 3 toont alle punten voor de lineaire regressie. De Y-as is โˆ†yแตข, de X-as is yแตขโ‚‹โ‚ en uแตข is het residu. Versie 1 betekent dat we een lijn moeten passen zonder snijpunt (geen constante). Versie 2 betekent dat we een lijn met snijpunt (constant) moeten passen.

Figuur 3. โˆ†yแตข en yแตขโ‚‹โ‚ (Afbeelding door de auteur)

Skileer lineaire regressie ondersteunt deze twee opties goed met de parameter fit_intercept. Onder Figuur 4 staan โ€‹โ€‹de twee passende lijnen. Zoals je ziet past de lijn met het snijpunt beter dan de lijn zonder het snijpunt. De R-kwadraatscore bevestigde dit ook duidelijk. Merk ook op dat de helling van de oranje lijn kleiner is dan die van de blauwe lijn. Met andere woorden: de helling van de oranje lijn ligt dichter bij 0.

Figuur 4. Resultaat van lineaire regressie (afbeelding door de auteur)

We kunnen ook visualiseren: de punten zijn niet gecentreerd rond (0,0), dus de aangepaste regressielijn mag niet voorbij (0,0) gaan. Het snijpunt moet groter zijn dan 0. Omdat 0 het startgemiddelde is, moet โˆ†y groter zijn dan 0, dus het totale gemiddelde zal toenemen. Als we de regressielijn dwingen door (0,0) te gaan, zal deze de gegevens ondermaats maken en zal de helling dichter bij 0 komen vanwege de invloed van (0,0).

We hebben gezien of het opnemen van de intercepteffecten past in de lineaire regressie. Waarom heeft de manier waarop een lijn wordt aangebracht invloed op de ADF-testresultaten, en waar komt de p-waarde vandaan?

Van lineaire regressie naar p-waarde

Nu wordt het een beetje ingewikkeld. De uiteindelijke p-waarde van de DF-test komt niet overeen met de p-waarde van de coรซfficiรซnten uit de lineaire regressie. Kortom, de statistiek heeft een specifieke verdeling die bekend staat als de Dickey-Fuller-tabel. Vervolgens gebruiken we de geschatte p-waarde van MacKinnon voor de teststatistiek. De details vindt u wellicht in de Statsmodels-broncode.

Omdat de nulhypothese ฮด=0 is, wat betekent dat het testen van de helling van de gepaste lijn 0 is. We hoeven niet in details te treden over hoe we de p-waarde kunnen verkrijgen. De logische keten van de associatie tussen de p-waarde en de helling (ฮด bij lineaire regressie, niet de trendhelling) is als volgt:

Als de helling verre van 0 is, zou de p-waarde over het algemeen kleiner moeten zijn, waardoor de nulhypothese waarschijnlijker wordt verworpen en er geen eenheidswortel en stationair wordt gesuggereerd. Als de helling 0 of zeer dicht bij 0 is, zou de p-waarde hoger moeten zijn, waardoor de nulhypothese waarschijnlijker wordt aanvaard en eenheidswortel en niet-stationair wordt gesuggereerd. Voor het tweede scenario zegt Wikipedia: โ€œDe tests hebben een lage statistische kracht, omdat ze vaak geen onderscheid kunnen maken tussen echte unit-root-processen (ฮด = 0) en bijna unit-root-processen (ฮด ligt dicht bij 0)โ€. Daarom hebben we in de eerste plaats het probleem. We hebben te maken met een near-unit-root-proces. Versie 1 vindt een unit root en versie 2 kan geen unit root vinden.

Waarom werkt versie 1 voor het bovenstaande voorbeeld?

Versie 1 werkt voor gegevens in Figuur 2 omdat we de helling dichter bij 0 brengen, dus de p-waarde is hoger.

We kunnen versie 1 echter niet als standaardinstelling gebruiken. Er zijn twee gevallen voor versie 1 (waarbij de regel wordt gedwongen door (0,0) te gaan):

Geval 1: (0,0) ligt dichter bij alle gegevenspunten. Als de lijn door (0,0) moet, wordt de lijn vlakker en komt de helling dichter bij 0. Figuur 4 laat dit geval zien. Houd er rekening mee dat de demonstratie in Figuur 4 slechts op รฉรฉn variabele past yแตขโ‚‹โ‚, de werkelijke ADF past op meer lag-variabelen.

Geval 2: (0,0) ligt ver weg van alle datapunten. Als de lijn door (0,0) moet gaan, mislukt de aanpassing mogelijk; in wezen is de helling 0, wat betekent dat we geen lineaire relatie tussen โˆ†yแตข en yแตขโ‚‹โ‚ kunnen vinden, zodat een lijn (0,0) passeert en de meeste gegevenspunten bedekt. Daarom zal het testresultaat een voorkeur hebben voor een rootunit.

Figuur 5 hieronder toont een voorbeeld van de test van versie 1 die de nulhypothese (p-waarde 0.6) niet verwerpt, en de gegevens zijn stationair met een gemiddelde van 10. Figuur 6 legt de reden uit. Zoals je kunt zien, kunnen we geen lijn vinden zonder snijpunt (R-kwadraat is 0), dus de helling van de gepaste lijn is 0 (โˆ†yแตข is niet afhankelijk van yแตขโ‚‹โ‚).

Figuur 5. Versie 1 herkende geen stationaire tijdreeks (afbeelding door de auteur)
Figuur 6. Lineaire regressie slaagt er niet in een lijn te vinden zonder snijpunt (passeren (0,0)) (Afbeelding door de auteur)

Van de DF-test naar de ADF-test

Nu we begrijpen dat de DF-test lineaire regressie is en hoe we de p-waarde uit de lineaire regressie kunnen halen, gaan we verder met ADF. De formule van ADF is:

Nogmaals, lineaire regressie. Het โ€œAugmentedโ€ gedeelte is dat we meer coรซfficiรซnten moeten passen.

Met het statsmodels-pakket kunt u een gedetailleerd overzicht van de AFT-test weergeven. Figuur 7 is het resultaat.

Figuur 7. ADF-test met een gedetailleerde samenvatting (afbeelding door de auteur)

We zien 'OLS Regressie' (de standaardoplossing voor lineaire regressie) en 17 coรซfficiรซnten. Ik heb de maximale vertraging niet gespecificeerd, dus de test zal een getal proberen op basis van de tijdreekslengte, namelijk 17.

De const (onderschepping) is ook aangebracht. De waarde is 0.0596.

Laten we proberen de ADF-test te implementeren door lineaire regressie te gebruiken in Scikit-learn. Figuur 8 is de code en uitvoer.

Figuur 8. ADF-test (alleen het lineaire regressiegedeelte) met de Scikit-learn (afbeelding door auteur)

Het snijpunt is 0.0596 en de andere coรซfficiรซnten zijn hetzelfde als in figuur 7. De lineaire regressie in Scikit-learn is gewoon OLS. Wij doen hetzelfde, dus het is geen verrassing dat de resultaten identiek zijn.

Het einde van de reis

Nadat ik erachter was gekomen hoe ik de parameter moest instellen, heb ik de oorspronkelijke tijdreeks in Figuur 1 getest met versie 1 (regressie ='n') en kreeg ik de p-waarde van 0.08, wat erop wijst dat deze niet stationair is. Houd er rekening mee dat de gegevens in Figuur 1 nulgemiddelden zijn, dus u kunt zich voorstellen dat (0,0) dichter bij de gegevenspunten (โˆ†yแตข, yแตขโ‚‹โ‚) ligt. Het gebruik van de versie 1-test zal ons helpen.

Omdat de trendhelling in Figuur 1 minimaal is, kunnen we de tijdreeksen ook met stappen herbemonsteren, waardoor de helling groter wordt. Als ik het bijvoorbeeld met vier stappen test ( value[::4] ), zal het de ADF-test met de standaardinstelling niet doorstaan โ€‹โ€‹(p-waarde is 0.17 voor regressie='c').

Probleem opgelost.

Takeaways

Vertrouw de resultaten van ADF niet blindelings. Visualisatie is je vriend.

ADF-test is een eenvoudige lineaire regressie, en de implementatie van statsmodellen maakt gebruik van OLS om het regressieprobleem op te lossen. Vervolgens gebruikt het de Dickey-Fuller-tabel om de p-waarde te extraheren die de nulhypothese valideert dat de coรซfficiรซnt van de eerste lag-variabele uit de aangepaste regressie 0 is.

De ADF-test heeft beperkingen bij het testen van processen die bijna unit-root zijn (ฮด ligt dicht bij 0).

We moeten dienovereenkomstig de juiste ADF-versie kiezen. Als u bijvoorbeeld een constante trend ziet en 'trend stationair' wilt testen, moet u 'ct' als parameter selecteren. Als je een langzame trend wilt zien voor een signaal waarvan het gemiddelde 0 zou moeten zijn, zoals in Figuur 1 en Figuur 2, moet je misschien 'n' als parameter selecteren om de impact van het passen van het snijpunt te vermijden. Statsmodellen ondersteunen ook kwantitatieve trends met de parameter 'ctt.' Deze geavanceerde optie kan in sommige gevallen een goede keuze zijn. Als u verder wilt graven, raadpleeg dan Omgaan met onzekerheid over het opnemen van de intercept- en deterministische tijdtrendtermen.

Ik hoop dat je iets hebt geleerd over de ADF-test.

Veel plezier met je tijdreeks!

Neem contact met me op LinkedIn.

PS: Ik heb ervaring en passie voor tijdreeksgegevens. Als je dit artikel leuk vindt, ben je misschien geรฏnteresseerd in mijn andere berichten over tijdreeksen.

Referenties

Notebook-bestand op GitHub

Waarom is deze trending-tijdreeks stationair? Opnieuw gepubliceerd vanuit bron https://towardsdatascience.com/why-is-this-trending-time-series-stationary-f3fb9447336f?source=rssโ€”-7f60cf5620c9โ€”4 via https://towardsdatascience.com/feed

<!โ€“

->

Tijdstempel:

Meer van Blockchain-adviseurs