Tenho quatro séries temporais diferentes de medições horárias:
- O consumo de calor dentro de uma casa
- A temperatura fora de casa
- A radiação solar
- 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á:
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:
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.
- Suponho que você tenha dados por hora, então certifique-se de que seu objeto TS esteja configurado com uma frequência de 24.
- 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.
- Inclua as variáveis fictícias no
xreg
argumento, junto com quaisquer covariáveis (como temperatu re). - 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
. - 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.
- 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.
- 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.
- 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
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.
predict()
é usado para previsões, enquantofitted()
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.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.stats
eforecast
é que eles não se encaixam nas funções de transferência de sondagem . A documentação da funçãostats::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çãoTSA::arimax
é o caminho a seguirR
.