Estou impressionado com o forecast
pacote R , bem como, por exemplo, o zoo
pacote para séries temporais irregulares e interpolação de valores ausentes.
Meu aplicativo é na área de previsão de tráfego de call center; portanto, os dados nos finais de semana estão (quase) sempre ausentes, o que pode ser bem tratado zoo
. Além disso, alguns pontos discretos podem estar faltando, eu apenas uso R NA
para isso.
A coisa é: todo o bom magia do pacote de previsão, tais como eta()
, auto.arima()
etc, parecem esperar simples ts
objetos, ou seja equidistantes série de tempo que não contenham quaisquer dados em falta. Penso que as aplicações do mundo real para séries temporais equidistantes são definitivamente existentes, mas - na minha opinião - muito limitadas.
O problema de algumas discretas NA
valores podem ser facilmente resolvidos utilizando qualquer das funções de interpolação oferecidos no zoo
, bem como pelo forecast::interp
. Depois disso, eu corro a previsão.
Minhas perguntas:
- Alguém sugere uma solução melhor?
(minha pergunta principal) Pelo menos no domínio do aplicativo, na previsão de tráfego do call center (e até onde eu possa imaginar na maioria dos outros domínios problemáticos), as séries temporais não são equidistantes. Pelo menos, temos um esquema recorrente de "dias úteis" ou algo assim. Qual é a melhor maneira de lidar com isso e ainda usar toda a magia legal do pacote de previsão?
Devo apenas "compactar" a série cronológica para preencher os fins de semana, fazer a previsão e "inflar" os dados novamente para reinserir os valores de NA nos fins de semana? (Isso seria uma pena, eu acho?)
Existem planos para tornar o pacote de previsão totalmente compatível com pacotes de séries temporais irregulares, como o zoo ou o seu? Se sim, quando e se não, por que não?
Eu sou bastante novo em previsões (e estatísticas em geral), portanto posso ignorar algo importante.
fonte
auto.arima
pode lidar com valores ausentes.Respostas:
Eu não sou um especialista em R, então talvez exista uma maneira mais simples, mas já me deparei com isso antes. O que eu fiz antes é implementar uma função que mede a distância (em unidades de tempo) entre as datas reais e a salva em uma nova coluna na série temporal existente. Então, temos algo como:
Dessa forma, se sua série temporal ainda não estiver associada a uma série real de pontos no tempo (ou formato incorreto ou o que for), você ainda poderá trabalhar com ela.
Em seguida, você escreve uma função que cria uma nova série temporal para você, assim:
Primeiro, você calcula quantas unidades de tempo a série cronológica realmente teria entre as datas de sua escolha e cria essa linha do tempo no zoológico ou ts ou qualquer que seja a opção com valores vazios.
Segundo, você pega sua matriz de séries temporais incompletas e, usando um loop, preenche os valores na linha do tempo correta, de acordo com os limites de sua escolha. Quando você se depara com uma linha em que a distância da unidade não é uma (faltam dias (unidades)), preenche valores interpolados.
Agora, como essa é sua função, você pode realmente escolher como interpolar. Por exemplo, você decide que, se a distância for menor que duas unidades, use uma interpolação linear padrão. Se falta uma semana, você faz outra coisa e se um certo limite de datas ausentes é atingido, você emite um aviso sobre os dados - realmente o que você deseja imaginar.
Se o loop atingir a data final, você retornará seus novos st.
A vantagem dessa função é que você pode usar diferentes interpolações ou procedimentos de manipulação, dependendo dos comprimentos da lacuna e retornar uma série criada de forma limpa no formato de sua escolha. Uma vez escrito, permite obter ts limpos e agradáveis a partir de qualquer tipo de dados tabulares. Espero que isso ajude você de alguma forma.
fonte
Você deve ter muito cuidado ao aplicar a interpolação antes de mais tratamento estatístico. A escolha que você faz para sua interpolação introduz um viés em seus dados. Isso é algo que você definitivamente deseja evitar, pois pode alterar a qualidade de suas previsões. Na minha opinião, para valores ausentes, como os que você mencionou, que são regularmente espaçados no tempo e que correspondem a uma parada nas atividades, pode ser mais correto deixar esses dias de fora do seu modelo. No pequeno mundo do seu call center (o modelo que você está construindo sobre ele), talvez seja melhor considerar que o tempo simplesmente parou quando ele é fechado, em vez de inventar medidas de uma atividade inexistente. Por outro lado, o modelo ARIMA foi estatisticamente construído com base no pressuposto de que os dados são igualmente espaçados. Tanto quanto sei, não há adaptação do ARIMA ao seu caso. Se você estiver faltando apenas algumas medidas nos dias úteis, poderá ser forçado a usar a interpolação.
fonte
Eu não interpolaria os dados antes de estimar o modelo nesses dados, como observou @Remi. É uma má idéia. Um exemplo extremo: imagine que você tem dois pontos de dados em janeiro de 2013 e janeiro de 2014. Agora interpole 10 pontos mensais entre: fevereiro e dezembro de 2013 e execute a regressão na data mensal. Na realidade, não será tão ruim, mas é a mesma idéia: você estará inflando suas estatísticas na melhor das hipóteses.
O caminho a seguir é usar métodos de séries temporais que lidam com dados ausentes. Por exemplo, métodos de espaço de estado. Dê uma olhada no pacote astsa R. Ele vem com um excelente livro sobre análise de séries temporais. Isso manipulará bem os dados ausentes. O Matlab agora tem uma funcionalidade semelhante no pacote ssm . Você precisa aprender a converter seus modelos em forma de espaço de estado, mas precisa aprender isso de qualquer maneira, se quiser se afastar da
auto.arima
"mágica".fonte