| 1 | = Ejemplo de uso 02 = |
| 2 | |
| 3 | A continuación se incorpora un ejemplo de uso del paquete DecoTools. |
| 4 | |
| 5 | El código en SVN del ejemplo puede verse en: [source:branches/PRE-1.0/DecoTools/samples/use_decomposition_02.tol use_decomposition_02.tol]. |
| 6 | Puede 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 | |
| 23 | Real PutRandomSeed(2143); |
| 24 | Date begin = y2009; |
| 25 | Date end = y2011m12; |
| 26 | |
| 27 | Serie noise = SubSer(Serie Gaussian(3, 1, Monthly), begin, end); |
| 28 | Serie expTerm1 = SubSer(Serie Gaussian(0, 0.5, Monthly), begin, end); |
| 29 | Serie expTerm2 = SubSer(Serie Rand(-0.25, 0.25, Monthly), begin, end); |
| 30 | Serie expTerm3 = SubSer(Serie Gaussian(0.3, 0.1, Monthly), begin, end); |
| 31 | |
| 32 | Serie output = noise + expTerm1 + expTerm2 + expTerm3; |
| 33 | |
| 34 | // Con estos datos disponemos de la descomposición de partida u original: |
| 35 | Set deco1 = [[ output, noise, expTerm1, expTerm2, expTerm3 ]]; |
| 36 | |
| 37 | // Comprobamos que verifica ser una descomposición aditiva válida: |
| 38 | Real 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 | |
| 67 | Set 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 | |
| 82 | Set 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 | |
| 96 | Set 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 | |
| 126 | Set 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: |
| 130 | Real DecoTools::PermutationsLimit; |
| 131 | // y el número de permutaciones será: |
| 132 | Real Factorial(DecoTools::PermutationsLimit+1); |
| 133 | // o mayor se usará sólo una muestra de las permutaciones de tamaño: |
| 134 | Real 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 | |
| 140 | Set 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 | |
| 155 | Set 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 | |
| 160 | Set 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 | |
| 172 | Set 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 | |
| 190 | Set 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 | |
| 199 | Set 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 | |
| 207 | Set 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 | |
| 231 | Set 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 | |
| 242 | Set 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 | |
| 258 | Set 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 | |
| 272 | Set deco6a = DecoTools::Deco.BaseDefinition(deco1, contributions); |
| 273 | |
| 274 | // (b) GetObservations.Decomposition(contributions) |
| 275 | // Combina: Deco.BaseDefinition y Deco.BaseCanonical |
| 276 | |
| 277 | Set 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 | |
| 288 | Set 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 | }}} |