Tengo una serie temporal horaria de la ocupación media del aparcamiento con datos disponibles desde septiembre de 2017 hasta junio de 2018. Me gustaría utilizar el modelo ARIMA con regresores externos para elaborar una previsión para las próximas 24 horas. Los datos están disponibles aquí .
Los regresores externos que utilizo son: los días de la semana (1=lunes a 7=domingos), el tráfico medio y los términos de Fourier.
Esto es lo que he hecho hasta ahora:
1) He comprobado la frecuencia o frecuencias dominantes en mis datos utilizando el periodograma. El resultado fue 24 (como se esperaba) .
> library(forecast)
> out=periodogram(Parking$AvgOccupied)
> wmax=which.max(out$spec)
> freq=1/out$freq[wmax]
> 1/out$freq[wmax]
[1] 24.02402402
2) Dividir mis datos en datos de prueba y de entrenamiento. Aunque ya tengo los datos de la ocupación media de los aparcamientos para el mes de junio de 2018, los estoy utilizando como datos de prueba, ya que me gustaría comprobar la precisión de mi modelo con estos datos.
> Parking.Train=Parking[1:6552,] # From 01 Sep 2017 to 31 May 2018
> Parking.Test=Parking[6553:7272,] # From 01 Jun 2018 to 30 Jun 2018
3) Convertir los datos de entrenamiento en un ts
objeto.
ParkingTS=ts(Parking.Train$AvgOccupied,
frequency=24,
start=c(as.Date("2017-09-01")))
ParkingTS1=ts(Parking.Test$AvgOccupied,
frequency=24,
start=c(as.Date("2018-06-01")))
4) Ajustar el modelo con los regresores externos ( este código es cortesía del Dr. Rob Hyndman ( https://robjhyndman.com/hyndsight/forecasting-weekly-data/ )
> bestfit=list(aicc=Inf)
> for(i in 1:11) {
ParkingARIMA=auto.arima(ParkingTS,xreg=cbind(model.matrix(~Parking.Train$WeekDay)[,-1],
Parking.Train$AvgTrafficFlow,
forecast::fourier(ParkingTS, K=i)),seasonal=F)
if(ParkingARIMA$aicc < bestfit$aicc)
{
bestfit = ParkingARIMA
} else break;
}
El modelo resultante es ARIMA(0,1,5)
con 4 términos de Fourier.
5) Ahora quiero prever la media de ocupación de los aparcamientos para las próximas 24 horas utilizando los regresores de los datos de prueba. Utilizo el modelo obtenido en el paso 4 y los regresores de los datos de prueba (WeekDays y Traffic Flow) + Términos de Fourier de los datos de prueba y utilizarlos como entradas en el forecast()
con la función h=24
. A continuación, calcule la precisión de la previsión utilizando la media de ocupación del aparcamiento en los datos de prueba.
> ParkingForecast=forecast(bestfit,xreg=cbind(model.matrix(~Parking.Test$WeekDay)[,-1],
Parking.Test$AvgTrafficFlow,
forecast::fourier(ParkingTS1, K=4)))
> acc=accuracy(ParkingForecast,Parking.Test$AvgOccupied)
> acc
ME RMSE MAE MPE MAPE MASE ACF1
Training set -0.005673853141 48.64258868 31.94747327 -1.531875066 8.176109728 0.5851921293 0.02495856147
Test set -6.410339968260 95.59476132 66.83084303 -5.812664624 17.743429782 1.2241620176 NA
PREGUNTAS:
i) ¿Es correcta esta estrategia de previsión? ¿O me he equivocado por completo?
ii) ¿Es correcto volver a estimar los términos de Fourier para los datos de prueba?
NB: Estoy haciendo lo anterior sólo como un experimento. Ya he modelado mis datos utilizando el auto.arima()
con los regresores externos como los días de la semana y el flujo de tráfico (sin los términos de Fourier) para obtener un modelo arima estacional : ARIMA(3,0,3)(2,1,0)[24]
con las siguientes medidas de precisión
> acc1
ME RMSE MAE MPE MAPE MASE ACF1
Training set 0.01681395761 52.63164320 32.35382066 -1.284216761 8.012784474 0.592635325 -0.0009199141052
Test set -2.47801257238 98.98536617 61.30672355 -3.091655364 15.528942136 1.122974947 NA