close Warning: Can't synchronize with repository "(default)" (/var/svn/mms does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 13 years ago

Closed 13 years ago

Last modified 13 years ago

#1051 closed doubt (fixed)

Valores infinitos en previsión

Reported by: imendez Owned by: Pedro Gea
Priority: critical Milestone: Maintenance
Component: Forecast Keywords:
Cc: atorre@…, cfaghloumi@…

Description

Hola, tengo una objeto de tipo @Forecast en el cual ocurre algo extraño con las previsiones del primer submodelo:

  • La media y la sigma de previsión crecen hasta el infinito.
  • La mediana toma valores "razonables".

Dejaré el objeto en la carpeta correspondiente a este ticket en B:\mms\tickets y el código para comprobar lo anterior es:

NameBlock fcst = MMS::Container::GetForecast("AltCon.TfnEspSPMRes.Dia_Ori_fore");
NameBlock fcstResults = fcst::GetModel.Forecast(?);
Set sSubMod = fcstResults ::GetSubmodels(?);
NameBlock subMod = sSubMod[1];
Serie srForMean = subMod::GetObservations.Forecast.Mean(?);
Serie srForMed = subMod::GetObservations.Forecast.Median(?);
Serie srSigma = subMod::GetObservations.Forecast.Sigma(?);

Para tratar de diagnosticarlo, he utilizado la opción "Mostrar previsión media" desde la GUI (en el primer submodelo de los resultados de previsión).

La GUI me muestra una ventana con 7 tipos de resultados, y he seleccionado los 7 con la opción "AndForecast", con lo cual obtengo 14 series.

Las series de previsión (del Noise y del Output) parecen correctas. Para el primer día de previsión, y2012m10d01, ambas toman valor 7.85839573094, cuya transformación inversa BoxCox (0,1) nos da 2586.366213, que coincide con la mediana de previsión (serie srForMed en el código de más arriba). Sin embargo, la previsión de las Observaciones para ese día es 33328.3096807.

¿Por qué la mediana parece razonable y la media se va a infinito?

Nota: he usado las versiones 0.6060 y "v3.1 p014 2012-09-19 09:23:44 i686-win" de MMS y TOL, respectivamente.

Gracias de antemano.
Un saludo.

Change History (8)

comment:1 Changed 13 years ago by Pedro Gea

Status: newaccepted

El fenómeno que observas se debe a dos circunstancias:

  • La varianza de previsión del ruido (noise) del submodelo crece de manera divergente.
  • La previsión de las observaciones se distribuyen log-normalmente.

comment:2 Changed 13 years ago by Pedro Gea

Distribución log-normal

Para modelar una serie con un modelo multiplicativo, tomamos como output (del modelo lineal) el logaritmo de las observaciones:

Output = Log(Observations)

Así lu previsión del output se distribuye normalmente:

Output.Forecast ~ Normal

y la de las observaciones lognormalmente:

Observations.Forecast ~ LogNormal

Aunque la media, moda y mediana de una distribución normal coinciden, las de una distribución log-normal no. Siendo:

Mode = Exp(Normal.Mean - Normal.Variance)
Median = Exp(Normal.Mean)
Mean = Exp(Normal.Mean + Normal.Variance/2)

Véase Log-normal distribution.

Como podemos observar de estas expresiones, si la varianza de previsión del output divergiese, la media de la previsión de las observaciones también lo haría, pues depende de ésta. Pero no le ocurriría lo mismo a la mediana.

comment:3 Changed 13 years ago by Pedro Gea

Varianza de previsión

La varianza de la previsión de un modelo lineal (en ausencia de varianza procedente del filtro) procede de la varianza de previsión del ruido.

Si el modelo no presenta estructura ARIMA, esta varianza coincide con la de los residuos y es constante e igual al parámetro Sigma2 (varianza de las perturbaciones).

Sin embargo, si el ruido (noise) presenta estructura ARIMA, la varianza de la previsión puede aumentar progresivamente a causa de la estructura autorregresiva.

Esto puede entenderse con ejemplos sencillos del siguiente modo:

Consideremos un proceso de medias móviles sencillo, MA(1), en el que la observación depende no sólo de su residuo sino también de un residuo anterior:

Y_t = E_t + phi * E_(t-1)

En este caso es fácil comprender que la incertidumbre de la previsión del ruido será mayor que la del residuo, ya que será suma de la incertidumbre de hoy y una fracción de la incertidumbre de ayer.

Si consideramos ahora un proceso autorregresivo, AR(1), vemos que la observación depende de su residuo y del valor anterior de la observación.

Y_t = theta * Y_(t-1) + E_t

Pero la observación anterior depende de su residuo y de otra observación anterior y así sucesivamente, de modo que podemos describir el proceso autorregresivo AR(1) como un proceso de medias móviles infinito: MA(inf):

Y_t = E_t + theta*E_(t-1) + theta*theta*E_(t-2) + ...

Es fácil de imaginar así que a medida que una previsión sea más futura (dependa de más previsiones) más incierta será y mayor será su varianza.

comment:4 Changed 13 years ago by Pedro Gea

Resolution: fixed
Status: acceptedclosed

La divergencia de la varianza de previsión está causada por las diferencias de la estructura ARIMA.

Para el ejemplo que se adjunta, se recomienda acompañar a cada diferencia de una media móvil que permita al mismo tiempo, especificar esa fuerte relación autorregresiva y frenar la progresión del error de previsión.

Nótese como el último submodelo con una media móvil y una diferencia regular no presenta dicha divergencia.

comment:5 Changed 13 years ago by Pedro Gea

Milestone: Maintenance

comment:6 Changed 13 years ago by imendez

Gracias por la explicación, ya lo conocía pero no había caído en que la sigma de los residuos es 2.26 en términos logarítmicos (un 859% en términos originales...).

Resumiendo, en el caso concreto que he pasado y para la primera fecha de previsión tenemos que:

  • La previsión en logartimos es 7.8584
  • La sigma es 2.2609 y la varianza 5.1116
  • La mediana de la previsión en términos originales es 2586.366 = Exp(7.8584) - 1
  • La media de la previsión en términos originales es 33328.31 = Exp(7.8584 + 5.1116/2) - 1

Hasta aquí todo entendido y correcto.
La única duda que me queda es cómo se calcula la sigma de previsión en términos originales, es decir la que devuelve el método GetObservations.Forecast.Sigma(?)

En este ejemplo, para el día 1 de octubre vale 428037.82. ¿Cómo se calcula ese número?

Gracias de nuevo.
Un saludo

comment:7 Changed 13 years ago by Pedro Gea

La varianza de la previsión de las observaciones corresponde con otro de los resultados de la distribución log-normal:

Variance = (Exp(Normal.Variance) - 1) * Exp(2*Normal.Mean + Normal.Variance)

Véanse los resultados de la distribución en log-normal distribution (en el panel lateral).

En el caso que nos ocupa:

Real obs.variance = (Exp(5.111593456996546 ) - 1) * Exp(2*7.858395730937462  + 5.111593456996546);
Real Sqrt(obs.variance); // -> 428037.8201624177 

comment:8 Changed 13 years ago by imendez

Muchas gracias de nuevo.

Sólo mencionar que todas mis dudas han surgido porque he puesto, por error, modelos ARIMA de periodo 12 (frecuencia mensual) a series diarias de periodo 7...

En fin, espero que el error haya contribuido a repasar y aclarar los cálculos de variables log-normales (al menos en mi caso sí ha servido).

Un saludo.

Note: See TracTickets for help on using tickets.