wiki:DecoTools/Use02
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.

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