Een onderzoek naar de Augmented Dickey-Fuller (ADF) test van een raar voorbeeld
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.
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.
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.
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.
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แตขโโ).
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.
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.
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
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
<!โ
->
- Bitcoin
- bizbouwermike
- blockchain
- blockchain-naleving
- blockchain-conferentie
- Blockchain-adviseurs
- coinbase
- vindingrijk
- Overeenstemming
- cryptoconferentie
- crypto mijnbouw
- cryptogeld
- gedecentraliseerde
- Defi
- Digitale activa
- ethereum
- machine learning
- niet-vervangbare token
- Plato
- plato ai
- Plato gegevensintelligentie
- Platoblockchain
- PlatoData
- platogamen
- Veelhoek
- Bewijs van het belang
- W3
- zephyrnet