Como encaixar um modelo ARIMAX com R?

Tenho quatro séries temporais diferentes de medições horárias:

  1. O consumo de calor dentro de uma casa
  2. A temperatura fora de casa
  3. A radiação solar
  4. A velocidade do vento

Quero ser capaz de prever o consumo de calor dentro de casa . Há uma tendência sazonal clara, tanto em uma base anual, quanto em uma base diária. Como há uma correlação clara entre as diferentes séries, quero ajustá-las usando um modelo ARIMAX. Isso pode ser feito em R, usando a função arimax do pacote TSA.

Eu tentei ler a documentação sobre esta função e sobre as funções de transferência, mas até agora, meu código:

regParams = ts.union(ts(dayy)) transferParams = ts.union(ts(temp)) model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams,xtransf=transferParams,transfer=list(c(1,1)) pred10 = predict(model10, newxreg=regParams) 

me dá: insira a descrição da imagem aqui

onde a linha preta é o real dados medidos, e a linha verde é meu modelo ajustado em comparação. Não apenas não é um bom modelo, mas claramente algo está errado.

Admito que meu conhecimento de modelos ARIMAX e funções de transferência é limitado. Na função arimax (), (até onde entendi), xtransf é a série temporal exógena que desejo usar (usando funções de transferência) para prever minha série temporal principal. Mas qual é realmente a diferença entre xreg e xtransf?

De modo mais geral, o que eu fiz de errado? Gostaria de conseguir um ajuste melhor do que o obtido com lm (calor ~ temperatura radi vento * tempo).

Edições: Com base em alguns dos comentários, removi a transferência e adicionei xreg em seu lugar:

regParams = ts.union(ts(dayy), ts(temp), ts(time)) model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams) 

onde dayy é o “número do dia do ano” e time é a hora do dia. Temp é novamente a temperatura externa. Isso me dá o seguinte resultado:

insira a descrição da imagem aqui

que é melhor, mas não quase o que eu esperava ver.

Resposta

Você terá alguns problemas para modelar uma série com 2 níveis de sazonalidade usando um modelo ARIMA . Fazer isso da maneira certa depende muito da configuração correta. Você já considerou um modelo linear simples? Eles são muito mais rápidos e fáceis de ajustar do que os modelos ARIMA e, se você usar variáveis fictícias para seus diferentes níveis de sazonalidade, elas serão frequentemente bastante preciso.

  1. Suponho que você tenha dados por hora, então certifique-se de que seu objeto TS esteja configurado com uma frequência de 24.
  2. Você pode modelar outros níveis de sazonalidade usando variáveis fictícias. Por exemplo, você pode querer um conjunto de 0/1 dummies representando o mês do ano.
  3. Inclua as variáveis fictícias no xreg argumento, junto com quaisquer covariáveis (como temperatu re).
  4. Ajuste o modelo com a função arima na base R. Esta função pode lidar com modelos ARMAX por meio do uso do argumento xreg.
  5. Experimente as funções Arima e auto.arima no pacote de previsão. auto.arima é bom porque ele encontrará automaticamente bons parâmetros para o seu modelo arima. No entanto, vai demorar uma eternidade para caber em seu conjunto de dados.
  6. Tente a função tslm no pacote arima, usando variáveis fictícias para cada nível de sazonalidade. Isso vai caber muito mais rápido do que o modelo Arima e pode até funcionar melhor na sua situação.
  7. Se 4/5/6 não funcionar, ENTÃO comece a se preocupar com as funções de transferência. Você precisa rastrear antes você pode andar.
  8. Se você está planejando fazer uma previsão para o futuro, primeiro você precisará prever suas variáveis xreg. Isso é fácil para manequins sazonais, mas você terá que pensar em como fazer um boas previsões meteorológicas. Talvez use a mediana dos dados históricos?

Aqui está um exemplo de como eu abordaria isso:

#Setup a fake time series set.seed(1) library(lubridate) index <- ISOdatetime(2010,1,1,0,0,0)+1:8759*60*60 month <- month(index) hour <- hour(index) usage <- 1000+10*rnorm(length(index))-25*(month-6)^2-(hour-12)^2 usage <- ts(usage,frequency=24) #Create monthly dummies. Add other xvars to this matrix xreg <- model.matrix(~as.factor(month))[,2:12] colnames(xreg) <- c("Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec") #Fit a model library(forecast) model <- Arima(usage, order=c(0,0,0), seasonal=list(order=c(1,0,0), period=24), xreg=xreg) plot(usage) lines(fitted(model),col=2) #Benchmark against other models model2 <- tslm(usage~as.factor(month)+as.factor(hour)) model3 <- tslm(usage~as.factor(month)) model4 <- rep(mean(usage),length(usage)) #Compare the 4 models library(plyr) #for rbind.fill ACC <- rbind.fill( data.frame(t(accuracy(model))), data.frame(t(accuracy(model2))), data.frame(t(accuracy(model3))), data.frame(t(accuracy(model4,usage))) ) ACC <- round(ACC,2) ACC <- cbind(Type=c("Arima","LM1","Monthly Mean","Mean"),ACC) ACC[order(ACC$MAE),] 

Comentários

  • O que é função fit (). Se eu usar isso, obtenho resultados muito melhores do que prever (model10, newxreg = regParams).
  • @utdiscant: predict() é usado para previsões, enquanto fitted() retorna o ajuste do modelo ao período histórico. Se você quiser uma ajuda mais específica, você deve postar um exemplo reproduzível com algum código.
  • @utdiscant: também, se você usar dayy como um xreg, você corre o risco de overfitting, já que você só tem 24 observações por dia. Você pode obter melhores resultados de previsão se usar o mês do ano.
  • @utdiscant: Além disso, seus xregs baseados no tempo precisam ser variáveis fictícias . A forma como você modelou agora é que você espera que heat aumente linearmente com a hora do dia e, em seguida, volte para baixo quando a hora retornar a 1. Se você usar variáveis fictícias, cada hora do dia terá o efeito do próprio '. Execute meu código de exemplo e preste muita atenção em como construo meu objeto xreg.
  • Uma desvantagem das funções ARIMA nos pacotes stats e forecast é que eles não se encaixam nas funções de transferência de sondagem . A documentação da função stats::arima afirma o seguinte: Se um termo xreg for incluído, uma regressão linear (com um termo constante se include.mean for true e não houver diferenciação ) está equipado com um modelo ARMA para o termo de erro. Portanto, se você realmente precisa ajustar as funções de transferência, parece que a função TSA::arimax é o caminho a seguir R.

Resposta

Tenho usado R para faça a previsão de carga por um tempo e posso sugerir que você use o pacote forecast e suas funções inestimáveis (como auto.arima).

Você pode construir um modelo ARIMA com o seguinte comando:

model = arima(y, order, xreg = exogenous_data) 

com y sua previsão (I suponha dayy), order a ordem do seu modelo (considerando a sazonalidade) e exogenous_data seu temperatura, radiação solar, etc. A função auto.arima ajuda você a encontrar a ordem ideal do modelo. Você pode encontrar um breve tutorial sobre o pacote `forecast” aqui .

Comentários

  • O que deve ser previsto é o calor (o consumo de calor da casa).

Resposta

I pessoalmente não entendo as funções de transferência, mas acho que você reverteu xtransf e xreg. Pelo menos na base de R arima é xreg que contém suas variáveis exógenas. Tenho a impressão de que uma função de transferência descreve como (dados defasados afetam valores futuros) em vez de o quê .

Eu tentaria usar xreg para suas variáveis exógenas, talvez usando arima se arimax exigir uma função de transferência. O problema é que seu modelo é diário, mas seus dados têm ambos sazonalidade diária e anual, e não tenho certeza agora se uma primeira diferença (o order=(*, 1, *)) cuidará disso ou não. (Você certamente não obterá previsões mágicas para o ano todo com um modelo que considera apenas a sazonalidade diária.)

PS Qual é o time que você usa no seu lm? Hora do relógio literal ou um número de observação 1 em 1? Acho que você poderia conseguir algo usando um modelo de efeitos mistos (lmer no pacote lme4), embora eu não tenha descoberto se fazer isso corretamente é responsável pela autocorrelação que ocorrerá em uma série temporal. Se não for considerado, o que um lm não faz, você pode obter um ajuste interessante, mas seu conceito de quão precisa é sua previsão será muito otimista.

Comentários

  • Eu tenho a hora da medição e o " dia do ano " da medição.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *