Previsão de séries temporais com periodicidade diária, semanal e anual

12

Edição principal: Gostaria de agradecer muito a Dave e Nick por suas respostas. A boa notícia é que consegui fazer o loop funcionar (princípio emprestado da publicação do Prof. Hydnman na previsão de lotes). Para consolidar as consultas pendentes:

a) Como aumento o número máximo de iterações para auto.arima - parece que, com um grande número de variáveis ​​exógenas, o auto.arima está atingindo o máximo de iterações antes de convergir para um modelo final. Por favor, corrija-me se estou entendendo errado.

b) Uma resposta, de Nick, destaca que minhas previsões para intervalos horários são derivadas apenas desses intervalos horários e não são influenciadas por ocorrências no início do dia. Meus instintos, ao lidar com esses dados, dizem que isso não costuma causar um problema significativo, mas estou aberto a sugestões sobre como lidar com isso.

c) Dave apontou que eu preciso de uma abordagem muito mais sofisticada para identificar os tempos de lead / lag em torno das minhas variáveis ​​preditoras. Alguém tem alguma experiência com uma abordagem programática para isso em R? É claro que espero que haja limitações, mas gostaria de levar esse projeto o mais longe possível, e não duvido que isso deva ser útil para outras pessoas aqui.

d) Nova consulta, mas totalmente relacionada à tarefa em questão - o auto.arima considera os regressores ao selecionar pedidos?

Estou tentando prever visitas a uma loja. Exijo a capacidade de dar conta de férias em movimento, anos bissextos e eventos esporádicos (essencialmente extremos); com base nisso, entendo que o ARIMAX é minha melhor aposta, usando variáveis ​​exógenas para tentar modelar a sazonalidade múltipla e os fatores mencionados acima.

Os dados são gravados 24 horas em intervalos de hora em hora. Isso está provando ser problemático devido à quantidade de zeros nos meus dados, especialmente em horários do dia que apresentam volumes muito baixos de visitas, às vezes nenhum quando a loja acaba de abrir. Além disso, o horário de funcionamento é relativamente irregular.

Além disso, o tempo computacional é enorme ao prever como uma série temporal completa com mais de 3 anos de dados históricos. Imaginei que seria mais rápido computando cada hora do dia como séries temporais separadas, e ao testá-lo em horários mais movimentados do dia parece produzir uma precisão mais alta, mas novamente prova ser um problema nas primeiras / mais tarde horas que não t receber visitas constantemente. Acredito que o processo se beneficiaria do uso do auto.arima, mas ele não parece convergir para um modelo antes de atingir o número máximo de iterações (portanto, usando um ajuste manual e a cláusula maxit).

Tentei manipular dados 'ausentes' criando uma variável exógena para quando visitas = 0. Novamente, isso funciona muito bem para horários mais movimentados do dia, quando o único momento em que não há visitas é quando a loja está fechada para o dia; nesses casos, a variável exógena parece lidar com isso com êxito na previsão e não inclui o efeito do dia anterior ao fechamento. No entanto, não tenho certeza de como usar esse princípio para prever as horas mais tranquilas em que a loja está aberta, mas nem sempre recebe visitas.

Com a ajuda do post do professor Hyndman sobre a previsão de lotes no R, estou tentando configurar um loop para prever a série 24, mas parece que não quero prever a partir das 13h e não consigo descobrir o porquê. Eu recebo "Erro no otim (init [máscara], armafn, método = optim.method, hessian = TRUE,: valor finito de diferença finita não finita [1]" ", mas como todas as séries são de igual comprimento e eu estou essencialmente usando a mesma matriz, não entendo por que isso está acontecendo, o que significa que a matriz não é de classificação completa, não? Como posso evitar isso nessa abordagem?

https://www.dropbox.com/s/26ov3xp4ayig4ws/Data.zip

date()

#Read input files
INPUT <- read.csv("Input.csv")
XREGFDATA <- read.csv("xreg.csv")

#Subset time series data from the input file
TS <- ts(INPUT[,2:25], f=7)


fcast <- matrix(0, nrow=nrow(XREGFDATA),ncol=ncol(TS))

#Create matrix of exogenous variables for forecasting.
xregf <- (cbind(Weekday=model.matrix(~as.factor(XREGFDATA$WEEKDAY)),
                    Month=model.matrix(~as.factor(XREGFDATA$MONTH)),
                Week=model.matrix(~as.factor(XREGFDATA$WEEK)),
                    Nodata=XREGFDATA$NoData,
                NewYearsDay=XREGFDATA$NewYearsDay,
                    GoodFriday=XREGFDATA$GoodFriday,
                EasterWeekend=XREGFDATA$EasterWeekend,
                    EasterMonday=XREGFDATA$EasterMonday,
                MayDay=XREGFDATA$MayDay,
                    SpringBH=XREGFDATA$SpringBH,
                SummerBH=XREGFDATA$SummerBH,
                    Christmas=XREGFDATA$Christmas,
                BoxingDay=XREGFDATA$BoxingDay))
#Remove intercepts
xregf <- xregf[,c(-1,-8,-20)]

NoFcast <- 0

for(i in 1:24) {

  if(max(INPUT[,i+1])>0) {

  #The exogenous variables used to fit are the same for all series except for the
  #'Nodata' variable. This is to handle missing data for each series
   xreg <- (cbind(Weekday=model.matrix(~as.factor(INPUT$WEEKDAY)),
                     Month=model.matrix(~as.factor(INPUT$MONTH)),
                 Week=model.matrix(~as.factor(INPUT$WEEK)),
                     Nodata=ifelse(INPUT[,i+1] < 1,1,0),
                     NewYearsDay=INPUT$NewYearsDay,
                 GoodFriday=INPUT$GoodFriday,
                     EasterWeekend=INPUT$EasterWeekend,
                 EasterMonday=INPUT$EasterMonday,
                     MayDay=INPUT$MayDay,
                 SpringBH=INPUT$SpringBH,
                     SummerBH=INPUT$SummerBH,
                 Christmas=INPUT$Christmas,
                     BoxingDay=INPUT$BoxingDay))
  xreg <- xreg[,c(-1,-8,-20)]

  ARIMAXfit <- Arima(TS[,i], 
                     order=c(0,1,8), seasonal=c(0,1,0),
                     include.drift=TRUE,
                     xreg=xreg,
                     lambda=BoxCox.lambda(TS[,i])
                     ,optim.control = list(maxit=1500), method="ML")  


  fcast[,i] <- forecast(ARIMAXfit, xreg=xregf)$mean

 } else{
  NoFcast <- NoFcast +1
 }
}

#Save the forecasts to .csv
write(t(fcast),file="fcasts.csv",sep=",",ncol=ncol(fcast))


date()

Eu apreciaria totalmente as críticas construtivas da maneira como estou lidando com isso e qualquer ajuda para fazer esse script funcionar. Estou ciente de que há outro software disponível, mas estou estritamente limitado ao uso de R e / ou SPSS aqui ...

Além disso, sou muito novato nesses fóruns - tentei fornecer uma explicação o mais completa possível, demonstrar as pesquisas anteriores que fiz e também fornecer um exemplo reproduzível; Espero que isso seja suficiente, mas informe-me se houver mais alguma coisa que eu possa fornecer para melhorar minha postagem.

EDIT: Nick sugeriu que eu use totais diários primeiro. Devo acrescentar que testei isso e as variáveis ​​exógenas produzem previsões que capturam sazonalidade diária, semanal e anual. Esse foi um dos outros motivos que pensei em prever a cada hora como uma série separada, mas, como Nick também mencionou, minha previsão para as 16h em um determinado dia não será influenciada pelas horas anteriores.

EDIT: 09/08/13, o problema com o loop estava simplesmente relacionado às ordens originais que eu havia usado para testar. Eu deveria ter percebido isso mais cedo e coloca mais urgência em tentar auto.arima para trabalhar com esses dados - veja os itens a) ed) acima.

krcooke
fonte
Além disso, tentei usar o fourier para cuidar da sazonalidade, mas retornei o mesmo erro "Erro no otim (init [máscara], armafn, método = optim.method, hessian = TRUE,: valor de diferença finita não finita [1]" . mesmo quando usado como uma matriz por conta própria, sem outras variáveis exógenas por favor, alguém poderia me ajudar com uma explicação de por que isso seria o caso?
krcooke
você poderia reenviar os dados?
MyHeadHurts

Respostas:

4

Infelizmente, sua missão está fadada ao fracasso, pois você está restrito ao R e ao SPSS. Você precisa identificar a estrutura de relacionamento de lead e lag para cada um dos eventos / feriados / variáveis ​​exógenas que podem entrar em jogo. Você precisa detectar possíveis tendências de tempo que o SPSS não pode executar. É necessário incorporar tendências / previsões diárias em cada uma das previsões horárias para fornecer uma previsão reconciliada consolidada. Você precisa se preocupar com a alteração de parâmetros e a variação de variação. Espero que isto ajude. Temos modelado esse tipo de dados há anos de maneira automática, sujeita a controles opcionais especificados pelo usuário.

EDIT: Conforme solicitado pelo OP, apresento aqui uma análise típica. Eu levei um se as horas mais ocupadas e desenvolvi um modelo diário. Em uma análise completa, todas as 24 horas seriam desenvolvidas e também um modelo diário para conciliar as previsões. A seguir, é apresentada uma lista parcial do modelo insira a descrição da imagem aqui. Além dos regressores significativos (observe que a estrutura real de avanço e atraso foi omitida), havia indicadores refletindo a sazonalidade, as mudanças de nível, os efeitos diários, as mudanças nos efeitos diários e os valores incomuns que não são consistentes com a história. As estatísticas do modelo são insira a descrição da imagem aqui. Um gráfico das previsões para os próximos 360 dias é mostrado aqui insira a descrição da imagem aqui. O gráfico Real / Ajustado / Previsão resume claramente os resultadosinsira a descrição da imagem aqui.Quando confrontados com um problema tremendamente complexo (como este!), É preciso mostrar com muita coragem, experiência e recursos de produtividade do computador. Apenas informe à gerência que o problema é solucionável, mas não necessariamente, usando ferramentas primitivas. Espero que isso lhe incentive a continuar seus esforços, pois seus comentários anteriores foram muito profissionais, voltados para o enriquecimento pessoal e o aprendizado. Eu acrescentaria que é preciso conhecer o valor esperado dessa análise e usá-lo como orientação ao considerar software adicional. Talvez você precise de uma voz mais alta para ajudar a direcionar seus "diretores" para uma solução viável para essa tarefa desafiadora.

Depois de revisar os totais diários e cada um dos modelos de 24 horas, eu definitivamente refletiria que o número de visitas está em uma séria queda! Esse tipo de análise por um potencial comprador sugeriria uma não compra, enquanto um vendedor seria sábio para redobrar seus esforços para vender o negócio com base nessa projeção muito negativa.

IrishStat
fonte
Oi Dave, muito obrigado por reservar um tempo para ler minha pergunta e responder. Entendo que seu software vai além de qualquer alternativa, mas infelizmente não é uma opção para mim no momento. Conhecendo as capacidades de R, há algum conselho que você possa me oferecer para melhorar o que já fiz? Atenciosamente,
krcooke
@krcooke Você pode examinar a correlação cruzada entre visitas e leads / atrasos alternativos em torno de cada um dos seus regressores, a fim de identificar a resposta apropriada. Concordo totalmente com Nick que alguns regressores podem ser úteis por algumas horas, mas não por outros. Você pode modelar cada hora separadamente. A detecção dos 4 tipos de outliers (Pulso, Deslocamento de Nível, Pulso Sazonal e Tendências de Tempo) não está disponível no SAS quando você possui causais e provavelmente não está disponível no SPSS. . Estamos sempre procurando "dados difíceis" como o seu para fortalecer nossas análises.
IrishStat
Oi Dave, vou ver o que posso fazer em torno da análise dos regressores. Eu senti que os regressores que eu usava eram muito 'padrão' e provavelmente impactariam todas essas lojas. Usei o fim de semana do feriado do jubileu como exemplo no comentário de Nick; isso provavelmente se beneficiaria do uso de regressores, mas não o incluí por enquanto. E estou muito interessado em ver o que você pode fazer com os dados! Obrigado novamente.
krcooke
7
" Infelizmente sua missão está fadada ao fracasso, pois você está restrito ao R e ao SPSS. " - esse comentário, infelizmente, vai longe demais; qualquer linguagem completa de Turing pode implementar qualquer algoritmo escrito em qualquer outra, mesmo que seja programável apenas no código de máquina acionando interruptores e totalmente implementado no Lego. Não há cálculo que possa ser implementado em um que não possa ser feito em outro. A menos que você esteja reivindicando propriedades mágicas para a AUTOBOX, acredito que você provavelmente queira dizer algo como "já disponível como funções na distribuição de baunilha" como a diferença.
Glen_b -Reinstala Monica
@Glen_b O que eu poderia ter dito é que o poder de fogo nas distribuições de baunilha que você está usando é insuficiente para resolver o problema em questão, a menos que você tenha muito tempo disponível para escrever novos procedimentos.
precisa saber é o seguinte
10

Isso não passa de um pacote de comentários, mas será muito longo para esse formato. Não sou mais que um amador de séries temporais, mas tenho algumas sugestões simples.

  1. Você pode estar sob ordens aqui, mas acho que isso precisa ser aprimorado em termos do que você espera alcançar e do que é mais importante para você. A previsão de visitas é, infelizmente, uma meta difusa. Por exemplo, suponha que sejam 16:00 e você deseja prever visitas com uma hora de antecedência. Você realmente precisa de um supermodelo incorporando um tratamento de toda a série anterior? Isso deve resultar de alguma consideração dos objetivos práticos e / ou científicos reais, que podem ser estipulados por seus superiores ou por um cliente ou podem ser seus próprios como pesquisador. Eu suspeito que é mais provável que modelos diferentes sejam necessários para diferentes propósitos.

  2. A separação das séries horárias parece ser motivada pela idéia de reduzir o cálculo sem considerar muito o quanto faz sentido. Portanto, a implicação é que você não (não) usará as informações do início de hoje para prever o que está acontecendo às 16h, apenas todas as observações anteriores às 16h? Parece-me que precisa de muita conversa.

  3. Você é evidentemente um aprendiz de séries temporais (e estou me colocando no mesmo nível), mas nenhum aprendiz deve começar com um problema desse tamanho. Sério! Você tem muitos dados, periodicidade em várias escalas, irregularidades no horário de funcionamento e feriados, variáveis ​​exógenas: escolheu um problema muito difícil. (E também sobre tendências?) É fácil dizer, mas evidentemente já passou por você até agora: talvez você precise trabalhar em versões muito simplificadas do problema primeiro e ter uma ideia de como ajustar modelos mais simples. Jogar tudo para um grande modelo complicado evidentemente não está funcionando bem, e algo radicalmente mais simples parece necessário, ou uma percepção de que o projeto é possivelmente muito ambicioso.

Nick Cox
fonte
Oi Nick, 1- De fato, estou sob ordens! O objetivo é tentar construir um modelo para que ele não tenderá a superestimar significativamente (resultando em desperdício de horas da equipe) ou subestimar (para que o pessoal não fique sobrecarregado). 2 - Eu tinha pensado nisso, mas me aprofundaria para entender o que ganho / perdi dessa maneira. Prever como uma série parecia semelhante a um 'super modelo', como você diz. 3- Estou ciente de que isso é extremamente difícil e estou superando meu peso no momento, mas estou totalmente aberto a uma solução mais simples que também funcionará para mim aqui. Muito obrigado por seus pensamentos, Nick.
krcooke
Em termos de soluções mais simples, eu não poderia trabalhar técnicas de suavização exponencial de tal maneira que o período do fim de semana do jubileu no ano passado fizesse com que este ano (mesmo período) superestimasse. Devido ao tipo de discrepâncias envolvidas, senti que precisava usar variáveis ​​exógenas. Você tem outras idéias que eu possa explorar?
krcooke
Tudo o que posso dizer é o que faria se estivesse sob ordens e tivesse precisamente as informações que você fornece aqui. Meu instinto seria o primeiro a agregar aos totais diários e trabalhar com eles. Já é difícil o suficiente. É muito mais fácil ser crítico aqui ....
Nick Cox
Oi Nick, Minha culpa, eu já deveria ter declarado que tentei isso. Com totais diários, os resultados pareceram razoáveis. Razoável ser a palavra-chave porque, como você e Dave afirmaram, há muito mais a ser considerado aqui. Se for de interesse, posso reexecutar os dados diários e demonstrar que está capturando a sazonalidade semanal, mensal e anual. Por isso, pensei em prever cada hora como uma série diária.
krcooke
Um dos problemas que tive, como mencionado no primeiro post, é que o auto.arima atinge o máximo de iterações antes de convergir, e é por isso que estou usando parâmetros bastante generalizados com o Arima (). Qualquer orientação sobre como eu posso superar isso seria muito apreciada!
krcooke