Por que esta série temporal de tendência é estacionária?

Um estudo do Dickey-Fuller Aumentado (ADF) teste de um exemplo estranho

Foto por Jan Huber on Unsplash

A estacionariedade é um dos conceitos mais fundamentais para análise de séries temporais. Geralmente, a estacionariedade fornecerá excelentes propriedades para modelar séries temporais com vários métodos estatísticos. Dickey-Fuller Aumentado (ADF) test é provavelmente a abordagem mais amplamente utilizada para verificar a estacionariedade.

Existem muitos artigos online sobre esse assunto. Não vou perder seu tempo com introduções básicas, como definição de estacionariedade, como fazer testes ADF, etc. Neste post, compartilharei minha jornada de exploração do teste ADF após encontrar um caso estranho em um aplicativo.

O caminho de aprendizagem que mostrarei é típico do aprendizado de ciência de dados. Primeiro, pensamos que entendemos uma ferramenta ou conceito, mas apenas reconhecemos e lembramos do termo. Quando o aplicamos a dados reais, podemos encontrar problemas inesperados e desafiadores que nos levam a investigar mais e a compreender melhor.

Novamente, compartilharei meu código no GitHub; por favor, encontre o link na seção de referência, finalmente.

O início de uma jornada inesperada

Eu estava trabalhando com algumas séries temporais outro dia. A Figura 1 mostra um deles. Não há duplo que um existe uma tendência ascendente, e os votos de a variação também muda com o tempo. Com esta visualização clara, não precisei testar a estacionariedade. Por algum motivo que não me lembro, ainda tentei com o teste ADF. Surpreendentemente, o valor p é quase 0, o que implica que devo rejeitar a hipótese nula e aceitá-la como estacionária.

Figura 1. Série temporal com tendência (Imagem do Autor)

Isso é estranho. O resultado do teste parecia errado. Eu queria investigar o que está acontecendo por trás do teste ADF. A primeira etapa que tentei foi replicar esse problema com dados sintéticos. Gerei alguns dados de teste com o código a seguir. O código apenas imitou o comportamento de tendências lentas, mas não a sazonalidade.

Existem 20,000 observações na Figura 1, o que implica que a tendência está a subir extremamente lentamente. Eu crio uma série temporal com uma pequena inclinação de 0.0005. O valor médio da série temporal sobe de cerca de 0 a 0.5 após 1000 observações. Então vamos testá-lo com a função adfuller() de statsmodels.tsa.stattools com os parâmetros padrão. O valor p é 0.01 e o “problema” acontece novamente. A Figura 2 mostra o resultado. Você pode ignorar o título e focar na tendência ascendente. Explicarei por que temos valores p de três testes ADF diferentes posteriormente.

Figura 2. Série temporal sintética com resultado do teste ADF (Imagem do Autor)

A matemática por trás do teste DF

Devemos ir fundo para ver o que exatamente o teste ADF está fazendo. Acontece que sua formação matemática não é complicada. Primeiro, o teste ADF é apenas uma versão avançada do Teste Dickey-Fuller. tem três versões principais do teste DF (da Wikipédia):

Versão 1: Teste para uma raiz unitária: ∆yᵢ = δyᵢ₋₁ + uᵢ

Versão 2: Teste para uma raiz unitária com constante: ∆yᵢ = a₀ + δyᵢ₋₁ + uᵢ

Versão 3. Teste para uma raiz unitária com tendência constante e determinística: ∆yᵢ = a₀ + a₁*t + δyᵢ₋₁ + uᵢ

Em cada versão, a hipótese nula é que existe uma raiz unitária, δ=0.

O pacote Statsmodels suporta todas as três versões com o parâmetro "regressão".

Para a versão 1, a regressão é 'n' (sem constante, sem tendência).

Para a versão 2, a regressão é 'c' (somente constante); Esta é a configuração padrão.

Para a versão 3, a regressão é 'ct' (constante e tendência).

Executei novamente o teste com três configurações diferentes e abaixo estão os novos resultados.

Para a versão 1, o valor p é 0.09. Não devemos rejeitar a hipótese nula.

Para a versão 2, o valor p é 0.01. Já tratamos isso como um problema porque esta é a configuração padrão.

Para a versão 3, o valor p é 0.00. Isso é esperado porque a série temporal é de fato estacionário com uma tendência determinística.

Portanto, para os dados deste exemplo, se testarmos com a versão 1 (regressão='n'), não diremos que é estacionário. Provavelmente não deveríamos usar a configuração padrão. Mas você também pode se perguntar: por que o termo constante fez uma diferença tão grande aqui? Vamos cavar mais.

Do teste DF à regressão linear

Com base na definição acima, o teste DF é apenas uma regressão linear. A Figura 3 mostra todos os pontos da regressão linear. O eixo Y é ∆yᵢ, o eixo X é yᵢ₋₁ e uᵢ é o resíduo. A versão 1 significa que devemos ajustar uma linha sem interceptação (sem constante). A versão 2 significa que devemos ajustar uma linha com interceptação (constante).

Figura 3. ∆yᵢ e yᵢ₋₁ (imagem do autor)

Skitlearn Regressão Linear suporta bem essas duas opções com o parâmetro fit_intercept. Abaixo da Figura 4 estão as duas linhas ajustadas. Como você pode ver, a linha com interceptação se ajusta melhor do que a linha sem interceptação. A pontuação R-quadrado também confirmou isso claramente. Além disso, observe que a inclinação da linha laranja é menor que a da linha azul. Em outras palavras, a inclinação da linha laranja está mais próxima de 0.

Figura 4. Resultado da regressão linear (Imagem do Autor)

Também podemos pensar por visualização: os pontos não estão centrados em (0,0), então a linha de regressão ajustada não deve passar por (0,0). A interceptação deve ser maior que 0. Como 0 é a média inicial, ∆y deve ser maior que 0, portanto a média geral aumentará. Se forçarmos a linha de regressão a passar por (0,0), ela não se ajustará aos dados e a inclinação ficará mais próxima de 0 devido à influência de (0,0).

Vimos se a inclusão dos impactos de interceptação se ajusta à regressão linear. Por que o modo como uma linha é ajustada afeta os resultados do teste ADF e de onde vem o valor p?

Da regressão linear ao valor p

Agora é onde fica um pouco complicado. O valor p final do teste DF não é proveniente do valor p dos coeficientes da regressão linear. Basicamente, a estatística possui uma distribuição específica conhecida como tabela Dickey-Fuller. Em seguida, usamos o valor p aproximado de MacKinnon para a estatística de teste. Você pode encontrar os detalhes no Código-fonte dos modelos estatísticos.

Como a hipótese nula é δ = 0, o que significa que o teste da inclinação da linha ajustada é 0. Não precisamos entrar em detalhes sobre como obter o valor p. A cadeia lógica da associação entre o valor p e a inclinação (δ na regressão linear, não a inclinação de tendência) é assim:

Geralmente, se a inclinação estiver longe de 0, o valor p deverá ser menor, rejeitando mais provavelmente a hipótese nula e sugerindo nenhuma raiz unitária e estacionária. Se a inclinação for 0 ou muito próxima de 0, o valor p deverá ser maior, aceitando mais provavelmente a hipótese nula e sugerindo raiz unitária e não estacionária. Para o segundo cenário, a Wikipedia diz: “Os testes têm baixo poder estatístico, pois muitas vezes não conseguem distinguir entre processos de raiz unitária verdadeira (δ = 0) e processos próximos de raiz unitária (δ é próximo de 0)”. É por isso que temos o problema em primeiro lugar. Estamos lidando com um processo de raiz quase unitária. A versão 1 encontra uma raiz unitária e a versão 2 não consegue encontrar uma raiz unitária.

Por que a versão 1 funciona para o exemplo acima?

A versão 1 funciona para os dados da Figura 2 porque tornamos a inclinação mais próxima de 0, então o valor p é maior.

No entanto, não podemos usar a versão 1 como configuração padrão. Existem dois casos para a versão 1 (forçando a passagem da linha (0,0) ):

Caso 1: (0,0) está mais próximo de todos os pontos de dados. Se a reta tiver que passar por (0,0), então a reta será mais plana e a inclinação se aproximará de 0. A Figura 4 demonstra esse caso. Observe que a demonstração na Figura 4 ajusta apenas uma variável yᵢ₋₁, o ADF real ajustará mais variáveis ​​de atraso.

Caso 2: (0,0) está longe de todos os pontos de dados. Se a linha tiver que passar por (0,0), podemos falhar no ajuste; essencialmente, a inclinação é 0, o que significa que não podemos encontrar uma relação linear de ∆yᵢ e yᵢ₋₁ tal que uma linha passe por (0,0) e cubra a maioria dos pontos de dados. Portanto, o resultado do teste será tendencioso no sentido de ter uma unidade raiz.

A Figura 5 abaixo mostra um exemplo de falha do teste da Versão 1 em rejeitar a hipótese Nula (valor p 0.6), e os dados são estacionários com média 10. A Figura 6 explica o motivo. Como você pode ver, não podemos encontrar uma linha sem interceptação (R ​​ao quadrado é 0), então a inclinação da linha ajustada é 0 (∆yᵢ não depende de yᵢ₋₁).

Figura 5. A versão 1 não conseguiu reconhecer uma série temporal estacionária (Imagem do Autor)
Figura 6. A regressão linear não consegue encontrar uma linha sem interceptação (passando (0,0)) (Imagem do Autor)

Do teste DF ao teste ADF

Agora que entendemos que o teste DF é uma regressão linear e como obter o valor p da regressão linear, vamos passar para o ADF. A fórmula do ADF é:

Novamente, regressão linear. A parte “Aumentada” é que temos que ajustar mais coeficientes.

O pacote statsmodels permite mostrar um resumo detalhado do teste AFT. A Figura 7 é o resultado.

Figura 7. Teste ADF com resumo detalhado (Imagem do Autor)

Vemos 'Regressão OLS' (a solução padrão para regressão linear) e 17 coeficientes. Como não especifiquei o atraso máximo, o teste tentará um número baseado na duração da série temporal, que é 17.

O const (interceptação) também está ajustado. O valor é 0.0596.

Vamos tentar implementar o teste ADF usando regressão linear no Scikit-learn. A Figura 8 é o código e a saída.

Figura 8. Teste ADF (apenas a parte da regressão linear) com o Scikit-learn (Imagem do Autor)

A interceptação é 0.0596 e os outros coeficientes são os mesmos da Figura 7. A regressão linear no Scikit-learn é simplesmente OLS. Estamos fazendo a mesma coisa, por isso não é surpresa que os resultados sejam idênticos.

O fim da jornada

Depois de descobrir como definir o parâmetro, testei a série temporal original na Figura 1 usando a versão 1 (regressão ='n') e obtive o valor p de 0.08, sugerindo que não é estacionário. Observe que os dados na Figura 1 têm média zero, então você pode imaginar que (0,0) está mais próximo dos pontos de dados (∆yᵢ, yᵢ₋₁). Usar o teste da versão 1 nos ajudará.

Como a inclinação da tendência na Figura 1 é mínima, também podemos reamostrar a série temporal com etapas, o que aumenta a inclinação. Por exemplo, se eu testá-lo com quatro etapas ( value[::4] ), ele não passará no teste ADF com a configuração padrão (o valor p é 0.17 para regressão = 'c').

Problema resolvido.

Takeaways

Não confie cegamente nos resultados do ADF. A visualização é sua amiga.

O teste ADF é uma regressão linear simples e a implementação de modelos estatísticos usa OLS para resolver o problema de regressão. Em seguida, utiliza a tabela Dickey-Fuller para extrair o valor p que valida a hipótese nula de que o coeficiente da primeira variável de defasagem da regressão ajustada é 0.

O teste ADF tem limitações ao testar processos próximos à raiz unitária (δ é próximo de 0).

Precisamos escolher a versão adequada do ADF de acordo. Por exemplo, quando você vê uma tendência constante e deseja testar a 'tendência estacionária', você precisa selecionar 'ct' como parâmetro. Se você quiser capturar uma tendência lenta para um sinal cuja média deveria ser 0, como na Figura 1 e na Figura 2, talvez seja necessário selecionar 'n' como parâmetro para evitar o impacto do ajuste da interceptação. Os modelos estatísticos também suportam tendências quânticas com o parâmetro 'ctt.' Esta opção avançada pode ser uma boa escolha para alguns casos. Caso você queira se aprofundar mais, consulte Lidando com a incerteza sobre a inclusão dos termos de interceptação e tendência temporal determinística.

Espero que você tenha aprendido algo sobre o teste ADF.

Divirta-se com sua série temporal!

Entre em contato comigo sobre LinkedIn.

PS: Tenho experiência e paixão por dados de séries temporais. Se você gostou deste artigo, pode estar interessado em meus outros postagens sobre séries temporais.

Referências

Arquivo de notebook no GitHub

Por que esta série temporal de tendência é estacionária? Republicado da fonte https://towardsdatascience.com/why-is-this-trending-time-series-stationary-f3fb9447336f?source=rss—-7f60cf5620c9—4 via https://towardsdatascience.com/feed

<!–

->

Carimbo de hora:

Mais de Consultores Blockchain