| | 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 | }}} |