Análise diária de séries temporais

24

Estou tentando fazer análise de séries temporais e sou novo nesse campo. Eu tenho contagem diária de um evento de 2006-2009 e quero ajustar um modelo de série temporal a ele. Aqui está o progresso que eu fiz:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

O gráfico resultante que recebo é:

Gráfico de Séries Temporais

Para verificar se há sazonalidade e tendência nos dados ou não, sigo as etapas mencionadas neste post :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

e no blog de Rob J Hyndman :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Ambos os casos indicam que não há sazonalidade.

Quando plogo o ACF & PACF da série, eis o que recebo:

ACF PACF

Minhas perguntas são:

  1. Essa é a maneira de lidar com dados diários de séries temporais? Esta página sugere que eu deveria olhar para os padrões semanais e anuais, mas a abordagem não está clara para mim.

  2. Não sei como proceder depois de ter os gráficos ACF e PACF.

  3. Posso simplesmente usar a função auto.arima?

    ajuste <- arima (myts, order = c (p, d, q)

***** Resultados atualizados do Auto.Arima ******

Quando altero a frequência dos dados para 7, de acordo com os comentários de Rob Hyndman aqui , o auto.arima seleciona um modelo ARIMA sazonal e produz:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Atualização da sazonalidade ******

Quando eu testo a sazonalidade com a frequência 7, ele produz True, mas com a sazonalidade 365.25, ele gera false. Isso é suficiente para concluir a falta de sazonalidade anual?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

retorna:

True

enquanto

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

retorna:

False
statBeginner
fonte
Qual saída str(x)produz?
S. Kolassa - Restabelece Monica
Rende num [1: 1460] 17 12 12 17 13 14 14 5 12 21 ... #
statBeginner 31/03/15
Você pode postar os dados?
meteorologista
Infelizmente eu não posso.
statBeginner
2
OK, eu confiaria na inspeção visual e no conhecimento do domínio, além de testes estatísticos para detectar a sazonalidade. Para sua pergunta sobre se o arima pode lidar com várias sazonalidades - com certeza o ARIMA lidará com qualquer tipo de sazonalidade, o Rsimples não tem a capacidade de lidar com isso. Eu procuraria soluções comerciais se houver um alto custo de estoque / fabricação envolvido no produto que você está tentando prever. Rpossui sérias limitações para prever tarefas como a sua. Veja as perguntas sobre previsões diárias em outro lugar deste site.
previsor

Respostas:

25

Seu ACF e PACF indicam que você tem pelo menos sazonalidade semanal, o que é mostrado pelos picos nas defasagens 7, 14, 21 e assim por diante.

Você também pode ter sazonalidade anual, embora não seja óbvio em suas séries temporais.

Sua melhor aposta, dadas as sazonalidades potencialmente múltiplas, pode ser um tbatsmodelo, que modela explicitamente vários tipos de sazonalidade. Carregue o forecastpacote:

library(forecast)

Sua saída de str(x)indica que xainda não carrega informações sobre potencialmente com várias sazonalidades. Olhe ?tbatse compare a saída de str(taylor). Atribua as sazonalidades:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Agora você pode ajustar um tbatsmodelo. (Seja paciente, isso pode demorar um pouco.)

model <- tbats(x.msts)

Por fim, você pode prever e plotar:

plot(forecast(model,h=100))

Você não deve usar arima()ou auto.arima(), uma vez que estes só pode lidar com um único tipo de sazonalidade: quer semanal ou anual. Não me pergunte o auto.arima()que faria nos seus dados. Pode escolher uma das sazonalidades ou pode desconsiderá-las completamente.


EDIT para responder a perguntas adicionais de um comentário:

  1. Como posso verificar se os dados têm uma sazonalidade anual ou não? Posso criar outra série de número total de eventos por mês e usar o ACF para decidir isso?

O cálculo de um modelo em dados mensais pode ser uma possibilidade. Então, você poderia, por exemplo, comparar os AICs entre modelos com e sem sazonalidade.

No entanto, prefiro usar uma amostra de validação para avaliar os modelos de previsão. Mantenha os últimos 100 pontos de dados. Ajuste um modelo com sazonalidade anual e semanal ao restante dos dados (como acima) e, em seguida, ajuste apenas um com sazonalidade semanal, por exemplo, usando auto.arima()um tscom frequency=7. Previsão usando os dois modelos no período de espera. Verifique qual deles apresenta um erro menor, usando MAE, MSE ou o que for mais relevante para a sua função de perda. Se houver pouca diferença entre os erros, siga o modelo mais simples; caso contrário, use aquele com o erro mais baixo.

A prova do pudim está na alimentação e a prova do modelo de série temporal está na previsão.

Para melhorar, não use uma única amostra de validação (que pode ser enganosa, considerando o aumento no final de sua série), mas use previsões de origem contínuas, também conhecidas como "validação cruzada de séries temporais" . (Eu recomendo muito todo esse livro de previsões on-line gratuito .

  1. Portanto, os modelos ARIMA sazonais geralmente não podem lidar com várias sazonalidades? É uma propriedade do modelo em si ou é apenas a maneira como as funções em R são escritas?

Os modelos ARIMA padrão lidam com a sazonalidade por diferenciação sazonal. Para dados mensais sazonais, você não modelaria as séries temporais brutas, mas as séries temporais de diferenças entre março de 2015 e março de 2014, entre fevereiro de 2015 e fevereiro de 2014 e assim por diante. (Para obter previsões na escala original, é claro que você precisa diferenciar novamente.)

Não existe uma maneira imediatamente óbvia de estender essa idéia a várias sazonalidades.

Obviamente, você pode fazer algo usando o ARIMAX, por exemplo, incluindo manequins mensais para modelar a sazonalidade anual e depois modelar resíduos usando o ARIMA sazonal semanal. Se você quiser fazer isso em R, use ts(x,frequency=7), crie uma matriz de manequins mensais e alimente-a no xregparâmetro de auto.arima().

Não me lembro de nenhuma publicação que estenda especificamente o ARIMA a várias sazonalidades, embora eu tenha certeza de que alguém fez algo parecido no meu parágrafo anterior.

S. Kolassa - Restabelecer Monica
fonte
Aqui estão algumas perguntas que eu baseei na sua resposta: 1. Como posso verificar se os dados têm uma sazonalidade anual ou não? Posso criar outra série de número total de eventos por mês e usar o ACF para decidir isso? 2. Portanto, os modelos sazonais ARIMA geralmente não podem lidar com várias sazonalidades? É uma propriedade do modelo em si ou é apenas a maneira como as funções em R são escritas?
statBeginner
Pós atualizado com os resultados de Auto.Arima com a sazonalidade semanal
statBeginner
1
@StephanKolassa, encontrei este artigo da AT&T há um tempo que usa vários ARIMA sazonais. Modelos como o do artigo não são possíveis R, uma vez Rque não têm a capacidade de lidar com ARIMA multiesazonal.
previsor
2
@ forecaster: legal, obrigado! Parece que eles fazem dupla diferenciação na equação 3.1. Estou meio preocupado com a perda de muitos dados dessa maneira. Infelizmente, eles não comparam seus resultados com uma simples referência, por exemplo, as demandas da semana passada. O que eu gosto é como eles também investigam combinações de previsão entre o DSARIMA e um tbatsmodelo similar.
S. Kolassa - Restabelece Monica
2
@StephanKolassa Concordo, sou um grande defensor do uso de previsões ingênuas como referência, conforme suportado em Princípios de Previsão por Armstrong, e só adiciona complexidade se melhorar a precisão. Eu acabei no top 2 percentil em algumas competições de kaggle usando métodos ingênuos em meus conjuntos.
previsor
3

A melhor maneira de decompor dados sazonais usando pacotes R existentes é ceemdan () no Rlibeemd. Essa técnica extrai a sazonalidade de vários períodos. Os padrões funcionam bem. Ele usa a transformação Hilbert-Huang em vez da transformação de Fourier. A transformação de Fourier tem uma grande desvantagem, pois ela só pode manipular dados estacionários e lineares quando a maioria das séries de interesse não é. Por exemplo, a caminhada aleatória y_t = y_ {t-1} + e_t é a caminhada aleatória mais simples e frequentemente encontrada. Outros métodos mantêm fixa a amplitude da variação sazonal quando ela geralmente varia na prática.

user162655
fonte
1
Consulte o tutorial básico e a referência do MathJax para obter ajuda sobre como colocar a matemática em respostas. Por favor, também ofereça alguma justificativa para a reivindicação de " melhor " (ou considere modificar a reivindicação) - ela teria que ser pelo menos tão boa quanto todas as outras opções, não apenas a maioria delas.
Glen_b -Reinstate Monica
1
Vale ressaltar que este pacote está no CRAN
Glen_b -Reinstate Monica
2

As perguntas que você levantou foram tratadas na Previsão de Séries Temporais R: perguntas sobre meus resultados . Observe atentamente minha resposta detalhada e todos os comentários da discussão, incluindo os da pergunta original, pois acredito que sejam relevantes para o seu problema. Você pode pegar os dados fornecidos na postagem e usá-los como um momento de ensino para si mesmo. Use toda a discussão como uma cartilha para o que você deve fazer.

IrishStat
fonte
1
Muito obrigado! Usarei os dados desse post para experimentar as coisas.
statBeginner