Ejemplo de uso 02
A continuación se incorpora un ejemplo de uso del paquete DecoTools.
El código en SVN del ejemplo puede verse en: use_decomposition_02.tol. Puede descargarsedesde allí, yendo al final de la página y haciendo clic en el enlace: Download in other formats: Original Format.
Definición
#Require DecoTools; ////////////////////////////////////////////////////////////////////////////// // [1] Definición // // Sea un modelo multiplicativa que linealizamos mediante un logaritmo // de la forma: // Log(Observations) = Output = Sum(ExpTerms) + Noise // Admitamos que son tres términos explicativos y generamos los siguientes // datos ficticios a modo de ejemplo: Real PutRandomSeed(2143); Date begin = y2009; Date end = y2011m12; Serie noise = SubSer(Serie Gaussian(3, 1, Monthly), begin, end); Serie expTerm1 = SubSer(Serie Gaussian(0, 0.5, Monthly), begin, end); Serie expTerm2 = SubSer(Serie Rand(-0.25, 0.25, Monthly), begin, end); Serie expTerm3 = SubSer(Serie Gaussian(0.3, 0.1, Monthly), begin, end); Serie output = noise + expTerm1 + expTerm2 + expTerm3; // Con estos datos disponemos de la descomposición de partida u original: Set deco1 = [[ output, noise, expTerm1, expTerm2, expTerm3 ]]; // Comprobamos que verifica ser una descomposición aditiva válida: Real ok1 = DecoTools::Test(deco1);
Reagrupar una descomposición
//////////////////////////////////////////////////////////////////////////////
// [2] Reagrupar una descomposición
// Es bastante común querer reagrupar los términos de una descomposición
// sumando varios términos explicativos que tienen algo en común e incluso
// restándoles un valor de referencia.
// Para ello usaremos la función:
// * DecoTools::Deco.BaseDefinition
// y las estructuras:
// * DecoTools::@Contribution.Def
// * DecoTools::@Contribution.Ref
// Al usar esta función la primera contribución resultante (denominada base)
// asumirá la diferencia que pudiera haber entre el total y la suma del resto
// de contribuciones.
// Pongamos algunos ejemplos:
// (a) Se desea unir el primer término explicativo con el noise
// y denominarlo base
Set deco2a = DecoTools::Deco.BaseDefinition(deco1, [[
DecoTools::@Contribution.Def("base", Copy(Empty)),
DecoTools::@Contribution.Def("expTerm2", [[
DecoTools::@Contribution.Ref("expTerm2", 0)
]]),
DecoTools::@Contribution.Def("expTerm3", [[
DecoTools::@Contribution.Ref("expTerm3", 0)
]])
]]);
// Esto se interpreta como: el término expTerm2 queda tal cual, lo mismo para
// el expTerm3 y el resto (noise y expTerm1) se suman creando la base.
// (b) Se desea dejar el noise como término base y sumar los términos 1 y 3
Set deco2b = DecoTools::Deco.BaseDefinition(deco1, [[
DecoTools::@Contribution.Def("noise", Copy(Empty)),
DecoTools::@Contribution.Def("expTerm13", [[
DecoTools::@Contribution.Ref("expTerm1", 0),
DecoTools::@Contribution.Ref("expTerm3", 0)
]]),
DecoTools::@Contribution.Def("expTerm2", [[
DecoTools::@Contribution.Ref("expTerm2", 0)
]])
]]);
// (c) Se desea sumar los términos 1 y 2 y restar al término 3 su media,
// dejándola junto con le noise como contribución base.
Set deco2c = DecoTools::Deco.BaseDefinition(deco1, [[
DecoTools::@Contribution.Def("noise", Copy(Empty)),
DecoTools::@Contribution.Def("expTerm12", [[
DecoTools::@Contribution.Ref(2, 0), // 2 -> expTerm1
DecoTools::@Contribution.Ref(3, 0) // 3 -> expTerm2
]]),
DecoTools::@Contribution.Def("expTerm3_mean0", [[
DecoTools::@Contribution.Ref(4, Code AvrS) // 4 -> expTerm3
]])
]]);
// En este ejemplo nos referimos a las contribuciones de referencia con sus
// índices y no con sus nombres.
// Nótese que la contribución 1 es el segundo elemento (el noise).
Descomposición canónica
//////////////////////////////////////////////////////////////////////////////
// [3] Descomposición canónica
// La descomposición canónica habitual es la que podríamos denominar
// descomposición canónica con contribución base, en la que la primera
// contribución se mantiene fija (habitualmente el noise) y se permutan
// el resto de contribuciones.
// La descomposición base-canónica de deco1, considerando que ésta se obtuvo
// linealizando con el logaritmo es:
Set deco3 = DecoTools::Deco.BaseCanonical(deco1, FindCode("Real", "Exp"));
// Esta descomposición se hace recorriendo todas las permutaciones de las
// contribuciones. Cuando el número de contribuciones es mayor de:
Real DecoTools::PermutationsLimit;
// y el número de permutaciones será:
Real Factorial(DecoTools::PermutationsLimit+1);
// o mayor se usará sólo una muestra de las permutaciones de tamaño:
Real DecoTools::SampleSize;
// Afortunadamente para la transformación exponenecial (modelos
// multiplicativos) disponemos de un algoritmo eficiente con el que obtener
// la descomposición exacta, sin tener que muestrear:
Set deco3_2 = DecoTools::Deco.Exponential.BaseCanonical(deco1); // == deco3
DueTo
//////////////////////////////////////////////////////////////////////////////
// [4] DueTo
// Básicamente un dueto es una descomposición propia de series temporales
// donde cada instante del total se explica repecto a un instante anterior
// como la suma de éste y las diferencias debidas a las contribuciones.
// (a) Por ejemplo, el dueto respecto al mes anterior de deco1 sería:
Set deco4a = DecoTools::DueTo.Period(deco1, 1);
// (b) También podemos hacer el dueto de la descomposición de las
// observaciones (Exp(output)) a partir de deco3
Set deco4b = DecoTools::DueTo.Period(deco3, 1);
// Hay un mecanismo de obtener una descomposición de tipo due-to para las
// observaciones (en términos originales, no lienalizados) sin pasar por una
// descomposición previa (como la descomposición canónica).
// A este mecanismo podríamos denominarlo dueto generalizado y construyen el
// dueto de manera proporcional al dueto que obtendríamos sin aplicar la
// transformación.
// (c) Obtengamos el dueto generalizado de deco1.
// El resultado es comparable, pero distinto al anterior deco4b.
Set deco4c = DecoTools::GeneralizedDueTo.Period(deco1,
FindCode("Serie", "Exp"), 1);
// A menudo el dueto de interés es en un fechado distinto, en el que las
// series presenta periodicidad.
// En el ejemplo que nos ocupa podría ser el fechado anual (Yearly).
// Para calcular este dueto periódico es necesario hacer el cálculo
// en fechado mensual con un periodo 12 y luego agregar los resultados
// haciendo un cambio de fechado.
// Nótese que en el caso de los dueto generalizados NO es lo mismo que
// agregar primero y hacer el dueto después.
// (d) Al dueto generalizado y periódico se le conoce en general como dueto
// o dueto secuencial sin más calificativos.
// Calculemos este 'dueto' para deco1
Set deco4d = {
Set aux = DecoTools::GeneralizedDueTo.Period(deco1,
FindCode("Serie", "Exp"), 12);
Set DecoTools::Deco.Serie.DatCh(aux, Yearly, SumS)
};
// (e) Un dueto periodico como el anterior (pero distinto) puede
// obtenerse también desde la descomposición canónica deco3
Set deco4e = {
Set aux = DecoTools::DueTo.Period(deco3, 12);
Set DecoTools::Deco.Serie.DatCh(aux, Yearly, SumS)
};
// Nótese que en este caso (sin usar dueto generalizado) los dos pasos
// se pueden conmutar ya que son operaciones lineales.
Set deco4e_2 = {
Set aux = DecoTools::Deco.Serie.DatCh(deco3, Yearly, SumS);
DecoTools::DueTo.Period(aux, 1)
}; // == deco4e
Representaciones relativas
//////////////////////////////////////////////////////////////////////////////
// [5] Representaciones relativas
// En ocasiones, sobre todo en el caso de los dueto, es interesante
// disponer de las descomposiciones en unidades relativas.
// A continuación presentamos dos posibilidades.
// (a) Representar la diferencia entre el total y la base (primera
// contribución) de una descomposición (normalmente un dueto) en
// unidades relativas a la base.
// Así de:
// {total, base, contrib1, contrib2, ....}
// obtenemos:
// {total/base-1, contrib1/base, contrib2/base, ...}
Set deco5a = DecoTools::Deco.BaseRelative(deco4d);
// Esta representación (pero ordenada) se utiliza para los gráficos de dueto
// o gráficos en cascada.
// (b) Representar una descomposición en unidades relativas al total.
// Así de:
// {total, contrib1, contrib2, ....}
// obtenemos:
// {1, contrib1/total, contrib2/total, ...}
Set deco5b = DecoTools::Deco.TotalRelative(deco4d);
Uso en MMS
//////////////////////////////////////////////////////////////////////////////
// [6] Uso en MMS
// MMS incorpora algunos mecanismos de descomposición implementados
// sobre la descomposición de partida:
// mmsDeco0 = {output, noise, expTerm1, expTerm2, ...}
// Tomamos deco1 como la decomposición de partida de MMS y
// la siguiente reagrupación de las contribuciones:
Set contributions = [[
DecoTools::@Contribution.Def("noise", Copy(Empty)),
DecoTools::@Contribution.Def("expTerm13", [[
DecoTools::@Contribution.Ref("expTerm1", 0),
DecoTools::@Contribution.Ref("expTerm3", 0)
]]),
DecoTools::@Contribution.Def("expTerm2", [[
DecoTools::@Contribution.Ref("expTerm2", 0)
]])
]];
// (a) GetOutput.Decomposition(contributions)
// Simplemente usa: Deco.BaseDefinition
Set deco6a = DecoTools::Deco.BaseDefinition(deco1, contributions);
// (b) GetObservations.Decomposition(contributions)
// Combina: Deco.BaseDefinition y Deco.BaseCanonical
Set deco6b = {
Set aux = DecoTools::Deco.BaseDefinition(deco1, contributions);
DecoTools::Deco.BaseCanonical(deco1, FindCode("Real", "Exp"))
};
// La transformación la obtiene MMS del submodelo correspondiente
// (c) GetObservations.SequentialDueTo(contributions)
// Combina: Deco.BaseDefinition, DecoTools::GeneralizedDueTo.Period,
// DecoTools::Deco.Serie.DatCh y DecoTools::Deco.BaseRelative
Set deco6C = {
Set aux = DecoTools::Deco.BaseDefinition(deco1, contributions);
Set aux2 = DecoTools::GeneralizedDueTo.Period(deco1,
FindCode("Serie", "Exp"), 12);
Set aux3 = DecoTools::Deco.Serie.DatCh(aux2, Yearly, SumS);
DecoTools::Deco.BaseRelative(aux3)
};
// El periodo 12 y el fechado armónico los obtiene MMS a partir de la
// estructura ARIMA del submodelo correspondiente
//////////////////////////////////////////////////////////////////////////////
Last modified 14 years ago
Last modified on May 20, 2011, 11:55:00 AM
![(please configure the [header_logo] section in trac.ini)](/mms/chrome/site/logomms.png)