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.

Changes between Initial Version and Version 1 of DecoTools/Use02


Ignore:
Timestamp:
May 20, 2011, 11:26:41 AM (14 years ago)
Author:
Pedro Gea
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DecoTools/Use02

    v1 v1  
     1= Ejemplo de uso 02 =
     2
     3A continuación se incorpora un ejemplo de uso del paquete DecoTools.
     4
     5El código en SVN del ejemplo puede verse en: [source:branches/PRE-1.0/DecoTools/samples/use_decomposition_02.tol use_decomposition_02.tol].
     6Puede descargarsedesde allí, yendo al final de la página y haciendo clic en el enlace: Download in other formats: Original Format.
     7
     8== Definición ==
     9{{{
     10#!java
     11#Require DecoTools;
     12
     13//////////////////////////////////////////////////////////////////////////////
     14// [1] Definición
     15//
     16// Sea un modelo multiplicativa que linealizamos mediante un logaritmo
     17// de la forma:
     18//   Log(Observations) = Output = Sum(ExpTerms) + Noise
     19
     20// Admitamos que son tres términos explicativos y generamos los siguientes
     21// datos ficticios a modo de ejemplo:
     22
     23Real PutRandomSeed(2143);
     24Date begin = y2009;
     25Date end = y2011m12;
     26
     27Serie noise = SubSer(Serie Gaussian(3, 1, Monthly), begin, end);
     28Serie expTerm1 = SubSer(Serie Gaussian(0, 0.5, Monthly), begin, end);
     29Serie expTerm2 = SubSer(Serie Rand(-0.25, 0.25, Monthly), begin, end);
     30Serie expTerm3 = SubSer(Serie Gaussian(0.3, 0.1, Monthly), begin, end);
     31
     32Serie output = noise + expTerm1 + expTerm2 + expTerm3;
     33
     34// Con estos datos disponemos de la descomposición de partida u original:
     35Set deco1 = [[ output, noise, expTerm1, expTerm2, expTerm3 ]];
     36
     37// Comprobamos que verifica ser una descomposición aditiva válida:
     38Real ok1 = DecoTools::Test(deco1);
     39}}}
     40
     41== Reagrupar una descomposición ==
     42
     43{{{
     44#!java
     45//////////////////////////////////////////////////////////////////////////////
     46// [2] Reagrupar una descomposición
     47
     48// Es bastante común querer reagrupar los términos de una descomposición
     49// sumando varios términos explicativos que tienen algo en común e incluso
     50// restándoles un valor de referencia.
     51
     52// Para ello usaremos la función:
     53//  * DecoTools::Deco.BaseDefinition
     54// y las estructuras:
     55//  * DecoTools::@Contribution.Def
     56//  * DecoTools::@Contribution.Ref
     57
     58// Al usar esta función la primera contribución resultante (denominada base)
     59// asumirá la diferencia que pudiera haber entre el total y la suma del resto
     60// de contribuciones.
     61
     62// Pongamos algunos ejemplos:
     63
     64// (a) Se desea unir  el primer término explicativo con el noise
     65//     y denominarlo base
     66
     67Set deco2a = DecoTools::Deco.BaseDefinition(deco1, [[
     68  DecoTools::@Contribution.Def("base", Copy(Empty)),
     69  DecoTools::@Contribution.Def("expTerm2", [[
     70    DecoTools::@Contribution.Ref("expTerm2", 0)
     71  ]]),
     72  DecoTools::@Contribution.Def("expTerm3", [[
     73    DecoTools::@Contribution.Ref("expTerm3", 0)
     74  ]])
     75]]);
     76
     77// Esto se interpreta como: el término expTerm2 queda tal cual, lo mismo para
     78// el expTerm3 y el resto (noise y expTerm1) se suman creando la base.
     79
     80// (b) Se desea dejar el noise como término base y sumar los términos 1 y 3
     81
     82Set deco2b = DecoTools::Deco.BaseDefinition(deco1, [[
     83  DecoTools::@Contribution.Def("noise", Copy(Empty)),
     84  DecoTools::@Contribution.Def("expTerm13", [[
     85    DecoTools::@Contribution.Ref("expTerm1", 0),
     86    DecoTools::@Contribution.Ref("expTerm3", 0)
     87  ]]),
     88  DecoTools::@Contribution.Def("expTerm2", [[
     89    DecoTools::@Contribution.Ref("expTerm2", 0)
     90  ]])
     91]]);
     92
     93// (c) Se desea sumar los términos 1 y 2 y restar al término 3 su media,
     94//     dejándola junto con le noise como contribución base.
     95
     96Set deco2c = DecoTools::Deco.BaseDefinition(deco1, [[
     97  DecoTools::@Contribution.Def("noise", Copy(Empty)),
     98  DecoTools::@Contribution.Def("expTerm12", [[
     99    DecoTools::@Contribution.Ref(2, 0), // 2 -> expTerm1
     100    DecoTools::@Contribution.Ref(3, 0)  // 3 -> expTerm2
     101  ]]),
     102  DecoTools::@Contribution.Def("expTerm3_mean0", [[
     103    DecoTools::@Contribution.Ref(4, Code AvrS) // 4 -> expTerm3
     104  ]])
     105]]);
     106
     107// En este ejemplo nos referimos a las contribuciones de referencia con sus
     108// índices y no con sus nombres.
     109// Nótese que la contribución 1 es el segundo elemento (el noise).
     110}}}
     111
     112== Descomposición canónica ==
     113{{{
     114#!java
     115//////////////////////////////////////////////////////////////////////////////
     116// [3] Descomposición canónica
     117
     118// La descomposición canónica habitual es la que podríamos denominar
     119// descomposición canónica con contribución base, en la que la primera
     120// contribución se mantiene fija (habitualmente el noise) y se permutan
     121// el resto de contribuciones.
     122
     123// La descomposición base-canónica de deco1, considerando que ésta se obtuvo
     124// linealizando con el logaritmo es:
     125
     126Set deco3 = DecoTools::Deco.BaseCanonical(deco1, FindCode("Real", "Exp"));
     127
     128// Esta descomposición se hace recorriendo todas las permutaciones de las
     129// contribuciones. Cuando el número de contribuciones es mayor de:
     130Real DecoTools::PermutationsLimit;
     131// y el número de permutaciones será:
     132Real Factorial(DecoTools::PermutationsLimit+1);
     133// o mayor se usará sólo una muestra de las permutaciones de tamaño:
     134Real DecoTools::SampleSize;
     135
     136// Afortunadamente para la transformación exponenecial (modelos
     137// multiplicativos) disponemos de un algoritmo eficiente con el que obtener
     138// la descomposición exacta, sin tener que muestrear:
     139
     140Set deco3_2 = DecoTools::Deco.Exponential.BaseCanonical(deco1); // == deco3
     141}}}
     142
     143== DueTo ==
     144{{{
     145#!java
     146//////////////////////////////////////////////////////////////////////////////
     147// [4] DueTo
     148
     149// Básicamente un dueto es una descomposición propia de series temporales
     150// donde cada instante del total se explica repecto a un instante anterior
     151// como la suma de éste y las diferencias debidas a las contribuciones.
     152
     153// (a) Por ejemplo, el dueto respecto al mes anterior de deco1 sería:
     154
     155Set deco4a = DecoTools::DueTo.Period(deco1, 1);
     156
     157// (b) También podemos hacer el dueto de la descomposición de las
     158//     observaciones (Exp(output)) a partir de deco3
     159
     160Set deco4b = DecoTools::DueTo.Period(deco3, 1);
     161
     162// Hay un mecanismo de obtener una descomposición de tipo due-to para las
     163// observaciones (en términos originales, no lienalizados) sin pasar por una
     164// descomposición previa (como la descomposición canónica).
     165// A este mecanismo podríamos denominarlo dueto generalizado y construyen el
     166// dueto de manera proporcional al dueto que obtendríamos sin aplicar la
     167// transformación.
     168
     169// (c) Obtengamos el dueto generalizado de deco1.
     170// El resultado es comparable, pero distinto al anterior deco4b.
     171
     172Set deco4c = DecoTools::GeneralizedDueTo.Period(deco1,
     173  FindCode("Serie", "Exp"), 1);
     174
     175// A menudo el dueto de interés es en un fechado distinto, en el que las
     176// series presenta periodicidad.
     177// En el ejemplo que nos ocupa podría ser el fechado anual (Yearly).
     178
     179// Para calcular este dueto periódico es necesario hacer el cálculo
     180// en fechado mensual con un periodo 12 y luego agregar los resultados
     181// haciendo un cambio de fechado.
     182
     183// Nótese que en el caso de los dueto generalizados NO es lo mismo que
     184// agregar primero y hacer el dueto después.
     185
     186// (d) Al dueto generalizado y periódico se le conoce en general como dueto
     187//     o dueto secuencial sin más calificativos.
     188//     Calculemos este 'dueto' para deco1
     189
     190Set deco4d = {
     191  Set aux = DecoTools::GeneralizedDueTo.Period(deco1,
     192    FindCode("Serie", "Exp"), 12);
     193  Set DecoTools::Deco.Serie.DatCh(aux, Yearly, SumS)
     194};
     195
     196// (e) Un dueto periodico como el anterior (pero distinto) puede
     197//     obtenerse también desde la descomposición canónica deco3
     198
     199Set deco4e = {
     200  Set aux = DecoTools::DueTo.Period(deco3, 12);
     201  Set DecoTools::Deco.Serie.DatCh(aux, Yearly, SumS)
     202};
     203
     204// Nótese que en este caso (sin usar dueto generalizado) los dos pasos
     205// se pueden conmutar ya que son operaciones lineales.
     206
     207Set deco4e_2 = {
     208  Set aux = DecoTools::Deco.Serie.DatCh(deco3, Yearly, SumS);
     209  DecoTools::DueTo.Period(aux, 1)
     210}; // == deco4e
     211}}}
     212
     213== Representaciones relativas ==
     214{{{
     215#!java
     216//////////////////////////////////////////////////////////////////////////////
     217// [5] Representaciones relativas
     218
     219// En ocasiones, sobre todo en el caso de los dueto, es interesante
     220// disponer de las descomposiciones en unidades relativas.
     221// A continuación presentamos dos posibilidades.
     222
     223// (a) Representar la diferencia entre el total y la base (primera
     224//     contribución) de una descomposición (normalmente un dueto) en
     225//     unidades relativas a la base.
     226//     Así de:
     227//       {total, base, contrib1, contrib2, ....}
     228//     obtenemos:
     229//       {total/base-1, contrib1/base, contrib2/base, ...}
     230
     231Set deco5a = DecoTools::Deco.BaseRelative(deco4d);
     232
     233// Esta representación (pero ordenada) se utiliza para los gráficos de dueto
     234// o gráficos en cascada.
     235
     236// (b) Representar una descomposición en unidades relativas al total.
     237//     Así de:
     238//       {total, contrib1, contrib2, ....}
     239//     obtenemos:
     240//       {1, contrib1/total, contrib2/total, ...}
     241
     242Set deco5b = DecoTools::Deco.TotalRelative(deco4d);
     243}}}
     244
     245== Uso en MMS ==
     246{{{
     247#!java
     248//////////////////////////////////////////////////////////////////////////////
     249// [6] Uso en MMS
     250
     251// MMS incorpora algunos mecanismos de descomposición implementados
     252// sobre la descomposición de partida:
     253//   mmsDeco0 = {output, noise, expTerm1, expTerm2, ...}
     254
     255// Tomamos deco1 como la decomposición de partida de MMS y
     256// la siguiente reagrupación de las contribuciones:
     257
     258Set contributions = [[
     259  DecoTools::@Contribution.Def("noise", Copy(Empty)),
     260  DecoTools::@Contribution.Def("expTerm13", [[
     261    DecoTools::@Contribution.Ref("expTerm1", 0),
     262    DecoTools::@Contribution.Ref("expTerm3", 0)
     263  ]]),
     264  DecoTools::@Contribution.Def("expTerm2", [[
     265    DecoTools::@Contribution.Ref("expTerm2", 0)
     266  ]])
     267]];
     268
     269// (a) GetOutput.Decomposition(contributions)
     270//     Simplemente usa: Deco.BaseDefinition
     271
     272Set deco6a = DecoTools::Deco.BaseDefinition(deco1, contributions);
     273
     274// (b) GetObservations.Decomposition(contributions)
     275//     Combina: Deco.BaseDefinition y Deco.BaseCanonical
     276
     277Set deco6b = {
     278  Set aux = DecoTools::Deco.BaseDefinition(deco1, contributions);
     279  DecoTools::Deco.BaseCanonical(deco1, FindCode("Real", "Exp"))
     280};
     281
     282// La transformación la obtiene MMS del submodelo correspondiente
     283
     284// (c) GetOutput.SequentialDueTo(contributions)
     285//     Combina: Deco.BaseDefinition,  DecoTools::GeneralizedDueTo.Period,
     286//              DecoTools::Deco.Serie.DatCh y DecoTools::Deco.BaseRelative
     287
     288Set deco6C = {
     289  Set aux = DecoTools::Deco.BaseDefinition(deco1, contributions);
     290  Set aux2 = DecoTools::GeneralizedDueTo.Period(deco1,
     291    FindCode("Serie", "Exp"), 12);
     292  Set aux3 = DecoTools::Deco.Serie.DatCh(aux2, Yearly, SumS);
     293  DecoTools::Deco.BaseRelative(aux3)
     294};
     295
     296// El periodo 12 y el fechado armónico los obtiene MMS a partir de la
     297// estructura ARIMA del submodelo correspondiente
     298
     299//////////////////////////////////////////////////////////////////////////////
     300}}}