¿Cómo encajar un modelo ARIMAX con R?

Tengo cuatro series de tiempo diferentes de mediciones por hora:

  1. El consumo de calor dentro de una casa
  2. La temperatura exterior de la casa
  3. La radiación solar
  4. La velocidad del viento

Quiero poder predecir el consumo de calor dentro de la casa . Existe una clara tendencia estacional, tanto anual como diaria. Dado que existe una clara correlación entre las diferentes series, quiero ajustarlas usando un modelo ARIMAX. Esto se puede hacer en R, usando la función arimax del paquete TSA.

Intenté leer la documentación sobre esta función y leer sobre las funciones de transferencia, pero hasta ahora, mi 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 da: ingrese la descripción de la imagen aquí

donde la línea negra es la real datos medidos, y la línea verde es mi modelo ajustado en comparación. No solo no es un buen modelo, sino que claramente algo anda mal.

Debo admitir que mi conocimiento de los modelos ARIMAX y las funciones de transferencia es limitado. En la función arimax (), (hasta donde he entendido), xtransf es la serie de tiempo exógena que quiero usar (usando funciones de transferencia) para predecir mi serie de tiempo principal. Pero, ¿cuál es realmente la diferencia entre xreg y xtransf?

Más en general, ¿qué he hecho mal? Me gustaría poder obtener un ajuste mejor que el logrado con lm (calor ~ temp radi viento * tiempo).

Edits: Basado en algunos de los comentarios, eliminé la transferencia y agregué xreg en su 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) 

donde dayy es el «número de días del año» y time es la hora del día. La temperatura es nuevamente la temperatura exterior. Esto me da el siguiente resultado:

ingrese la descripción de la imagen aquí

que es mejor, pero no se acerca a lo que esperaba ver.

Respuesta

Vas a tener algunos problemas para modelar una serie con 2 niveles de estacionalidad usando un modelo ARIMA . Hacer esto bien depende en gran medida de configurar las cosas correctamente. ¿Ya consideró un modelo lineal simple? Son mucho más rápidos y fáciles de ajustar que los modelos ARIMA, y si usa variables ficticias para sus diferentes niveles de estacionalidad, son a menudo bastante precisos.

  1. Supongo que tiene datos por hora, así que asegúrese de que su objeto TS esté configurado con una frecuencia de 24.
  2. Puede modelar otros niveles de estacionalidad mediante variables ficticias. Por ejemplo, es posible que desee un conjunto de variables ficticias 0/1 que representen el mes del año.
  3. Incluya las variables ficticias en el xreg argumento, junto con cualquier covariable (como temperatura re).
  4. Ajustar el modelo con la función arima en base R. Esta función puede manejar modelos ARMAX mediante el uso del argumento xreg.
  5. Pruebe las funciones Arima y auto.arima en el paquete de pronóstico. auto.arima es bueno porque automáticamente encontrará buenos parámetros para su modelo arima. Sin embargo, tomará SIEMPRE encajar en su conjunto de datos.
  6. Pruebe la función tslm en el paquete arima, usando variables ficticias para cada nivel de estacionalidad. Esto se ajustará mucho más rápido que el modelo Arima, e incluso puede funcionar mejor en su situación.
  7. Si 4/5/6 no funciona, ENTONCES comience a preocuparse por las funciones de transferencia. Tiene que rastrear antes puede caminar.
  8. Si planea pronosticar en el futuro, primero deberá pronosticar sus variables xreg. Esto es fácil para los maniquíes estacionales, pero tendrá que pensar en cómo hacer un buenas previsiones meteorológicas. ¿Quizás usar la mediana de los datos históricos?

Aquí hay un ejemplo de cómo abordaría esto:

#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),] 

Comentarios

  • ¿Qué es la función equipada ()? Si utilizo eso, obtengo resultados mucho mejores que con predict (model10, newxreg = regParams).
  • @utdiscant: predict() se usa para pronosticar, mientras que fitted() devuelve el ajuste del modelo durante el período histórico. Si desea ayuda más específica, debe publicar un ejemplo reproducible con algún código.
  • @utdiscant: además, si usa dayy como un xreg, corre el riesgo de sobreajuste, ya que solo tiene 24 observaciones por día. Es posible que obtenga mejores resultados de pronóstico si usa el mes del año.
  • @utdiscant: Además, sus xregs basados en el tiempo deben ser variables ficticias . La forma en que lo tiene modelado ahora es que espera que heat aumente linealmente con la hora del día y luego vuelva a bajar cuando la hora vuelva a 1. Si usa variables ficticias, cada hora del día obtendrá su propio efecto '. Ejecute mi código de ejemplo y preste especial atención a cómo construyo mi objeto xreg.
  • Una desventaja de las funciones ARIMA en los paquetes stats y forecast es que no se ajustan a las funciones de transferencia de sonda . La documentación de la función stats::arima establece lo siguiente: Si se incluye un término xreg, una regresión lineal (con un término constante si include.mean es verdadero y no hay diferenciación ) está equipado con un modelo ARMA para el término de error. Por lo tanto, si realmente necesita ajustar las funciones de transferencia, parece que la función TSA::arimax es el camino a seguir en R.

Responder

He estado usando R para Cargue el pronóstico por un tiempo y puedo sugerirle que use el paquete forecast y sus funciones invaluables (como auto.arima).

Puede crear un modelo ARIMA con el siguiente comando:

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

con y su predictand (I Supongamos dayy), order el orden de su modelo (considerando la estacionalidad) y exogenous_data su temperatura, radiación solar, etc. La función auto.arima le ayuda a encontrar el orden de modelo óptimo. Puede encontrar un breve tutorial sobre el paquete `Forecast» aquí .

Comentarios

  • Lo que se predice es el calor (el consumo de calor de la casa).

Respuesta

I personalmente, no entiendo las funciones de transferencia, pero creo que has invertido las xtransf y xreg. Al menos en la base de R arima es xreg el que contiene sus variables exógenas. Tengo la impresión de que una función de transferencia describe cómo (los datos retrasados afectan los valores futuros) en lugar de qué .

Intentaría usar xreg para sus variables exógenas, tal vez usando arima si arimax exige una función de transferencia. El problema es que su modelo es diario, pero sus datos tienen ambas estacionalidad diaria y anual, y no estoy seguro en este momento si una primera diferencia (la order=(*, 1, *)) se encargará de eso o no. (Ciertamente no obtendrá pronósticos mágicos durante todo el año con un modelo que solo considera la estacionalidad diaria).

PD ¿Qué es el time que usa en ¿Tu lm? ¿Hora de reloj literal o un número de observación de 1 en 1? Creo que podrías obtener algo usando un modelo de efectos mixtos (lmer en el paquete lme4), aunque no he descubierto si hacerlo correctamente da cuenta de la autocorrelación que se producirá en una serie de tiempo. Si no se tiene en cuenta, cosa que no ocurre con lm, es posible que obtenga un ajuste interesante, pero su concepto de la precisión de su predicción será demasiado optimista.

Comentarios

  • Tengo tanto la hora de la medición como el " día del año " de la medida.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *