= Actualización a MMS_0.6 = == Combinación de Previsiones == MMS permite definir de una forma cómoda restricciones lineales entre previsiones obtenidas. Es decir, las previsiones pueden modificarse en virtud de su incertidumbre para satisfacer una determinada combinación lineal entre ellas. Desde el punto de vista formal se recurre a la noción de [http://es.wikipedia.org/wiki/Distancia_de_Mahalanobis Distancia de Mahalanobis] para determinar cuanto han de modificarse las previsiones. El tratamiento de la combinación de previsión en MMS parte de la existencia de una propia clase para ellas: {{{ MMS::@Combination }}}. Esta clase define los objetos {{{ }}} sobre los que especificaremos las contraints que queremos que se satisfagan. Asimismo dichos objetos {{{ }}} formarán parte del Container de MMS: {{{ MMS::Container::_.combinations }}}. Antes de explicar como definir y usar los objetos {{{ combination }}} es importante que tengamos a mano la información necesaria y en su forma correcta para la creación de los mismos. Para ello contamos con el método {{{ CreateForecastDataSet }}} de la clase {{{ MMS::@Forecast }}}. Este método lo usamos con aquella/s previsión/es para las que queramos hacer combinación. Simplemente haríamos: {{{ Anything forecast::CreateForecastDataSet(?); }}}, con esto creamos un {{{ dataset }}} que reúne la información necesaria. Ese dataset lo podremos guardar en el repositorio (usando {{{ Save_Repository }}}) para un posterior uso. Comenzamos creando un objeto {{{ combination }}} {{{ MMS::@Combination combination = MMS::Container::ReplaceCombination([[ Text _.name = ; Set _.dataSets = [[ "", "", .... ]] ]]); }}} Notemos que en el conjunto _.dataSets pondremos los nombres de los datasets que vamos a usar. Lo siguiente será crear las {{{ C-variables }}}, éstas definen en abstracto las variables que serán susceptibles de modificarse para satisfacer las restricciones de combinación lineal deseadas. Cada {{{ C-variable }}} tendrá que asociarse a una variable de las que existan en {{{ _.dataSets }}}. Por lo general tendremos que crear una {{{ C-variable }}} por cada serie de previsión que entre en la combinación. Se crean de la forma siguiente: {{{ Anything combination::CreateCVariable([[ Text _.name = ; Text _.variableIdentifier = ]]) }}} Como vemos la {{{ C-variable }}} necesita llamarse con un nombre {{{ _.name }}} y dar el nombre de la variable sobre la que está asociada {{{ _.variableIdentifier }}}. Una vez creadas las {{{ C-variables }}} es el momento de crear las restricciones entre ellas, mediante el método {{{ CreateCConstraint }}}, para que la restricción quede definida tenemos que darle un nombre, el conjunto de {{{ C-variables }}} y los coeficientes {{{ a1, a2, ..., aN }}} que entran en la combinación lineal. Estos están especificados de la forma siguiente: {{{ a1*C-var1 + a2*C-var2 + a3*C-var3 + .... + aN*C-varN = 0 }}} Así creamos las restricciones: {{{ Anything combination::CreateCConstraint([[ Text _.name = ; Set _.cVariables = ; Set _.coefficients = [[a1,a2,....,aN]] ]]); }}} Es importante notar que el orden de las variables debe corresponderse con el de los coeficientes. Una vez tenemos las restricciones deseadas tenemos que crear la estrategia con la que se realizará la modificación de las previsiones, es lo que llamamos el "Fit". Esta estrategia pertenece a la clase {{{ MMS::@Fit }}} y la creamos de la forma siguiente: {{{ MMS::@Fit fit = MMS::Container::CreateFit([[ Text _.name = ; MMS::@Combination _.combination = ; MMS::@SettingsBSR _.settings = / Text _.settings ]]); }}} Como vemos necesitamos un nombre {{{ _.name }}}, la combinación sobre la que queremos el ajuste de previsiones {{{ _.combination }}} y una setting para espcificar la estrategia con la que se modificarán las previsiones para satisfacer las restricciones. Esta setting puede ser de la clase {{{ MMS::@SettingsBSR }}} si queremos que se llame a la estrategia BSR o bien puede ser simplemente {{{ Text _.settings = "SVD" }}} si queremos que el cálculo sea máximo verosimil. Por último para ejecutar el fit y obtener las previsiones que cumplen las restricciones: {{{ Real fit::Execute(?); }}} Los resultados los tenemos dentro del propio objeto fit. EN CONSTRUCCION