= Actualización a MMS_0.6 = == Modelos == Los modelos en MMS_0.6 tienen una estructura ligeramente distinta a los de los modelos en MMS_0.5. Los cambios más llamativos son: * Los outputs de MMS_0.5 {{{MMS.Output}}} pasan a ser submodelos {{{MMS::@Submodel}}} formados por una mvariable {{{MMMS::@MVariable}}} que hace de output un conjunto de términos explicativos y un noise. * Los términos explicativos se construyen sobre cada submodelo {{{MMS::@ExpTerm}}} desapareciendo así los términos base y los términos explicativos multi-output. Para conseguir parámetros internodales (pertenecientes a varios submodelos) aparece una nueva clase para definir equivalencias entre parámetros {{{MMS::@MEquivalence}}}, es decir indicar que dos parámetros han de ser estimados como el mismo a ser posible. * El ruido o noise dispone de una clase propia destinada a gestionar la sigma2 del submodelo (o jerarquía) y también los parámetros relativos a su estructura como en el caso de los modelos ARIMA. * La información a priori para parámetros (distribución a priori y restricciones) está contenida en el parámetro y se gestiona desde él. === Creación de modelos === Los modelos se crean con argumentos similares a los encontrados en MMS_0.5. La diferencia más importante es que aparece un nuevo argumento {{{_.dataSets}}} destinado a recoger los datasets que desean ser utilizados. Téngase también en cuenta el nuevo nombre del contenedor de MMS. '''Código en MMS_0.5''' {{{ Real MMS::CreateModel([[ Text _.name = "modelo"; Text _.description = "..." ]]); @MMS.Model model = MMS::GetModel2("Mat.Veh","1.0"); }}} Nótese que los modelos en MMS no son de ningún tipo. Argumentos como _.type: {{{ Text _.type = "ARIMAX"; }}} llevan obsoletos ya un tiempo. Este rol lo desempeñan los submodelos (o outputs en MMS_0.5). '''Código en MMS_0.6''' {{{ MMS::@Model model = MMS::Container::CreateModel([[ Text _.name = "modelo"; Text _.version = "test.1"; // continua siendo opcional Text _.description = "..."; Set _.dataSets = [[ "dataset1_identifier", .. ]] ]]); }}} Nótese que en MMS_0.6 la versión de los modelos recupera su verdadero significado e itera a partir de un modelo guardado al hacer cambios. El texto que representa a la versión del modelo ha de acabar en un número entero (que es el que se iterará) precedido por un '.'. == Creación de submodelos == Como se adelantaba la estructura que en MMS_0.5 recogían los outputs {{{MMS.Output}}}, ahora está representada por los submodelos {{{MMS::@Submodel}}}. === Submodelos ARIMAX === Un submodelo de tipo ARIMAX se crea de manera semejante a en MMS_0.5. Prestemos un poco más de atención a sus argumentos: '''Código en MMS_0.5''' {{{ Real model::CreateOutputARIMA([[ Text _.name = ; Text _.description = "..."; Text _.variableName = ; Date _.modelBegin = ...; Date _.modelEnd = ...; @MMS.Transformation _.transformation = BoxCox(0,0); Text _.labelARIMA = "PDIFARMA" ]]) }}} '''Código en MMS_0.6''' {{{ MMS::@Submodel submodel = model::CreateSubmodel([[ Text _.name = ; Text _.description = "..."; NameBlock _.output = [[ Text _.name = ; Text _.variableIdentifier = ; MMS::@Transformation _.transformation = MMS::@Transformation.BoxCox::Default(0,0) ]]; Date _.begin = ...; Date _.end = ...; NameBlock _.noise = [[ Text _.type = "ARIMA"; Text _.arimaLabel = "PDIFARMA"; Real _.sigma = 1 // opcional, valor inicial de la sigma muestreada ]] }}} Véase el apartado de [wiki:upgrade/transformations transformaciones]. == Las m-variables == Las variables del modelo ({{{@MMS.ModelVariable}}} en MMS_0.5 y {{{MMS::@MVariable}}} en MMS_0.6) son los objetos encargados de representar a una variable (del módulo de variables) en un modelo (concretamente en un submodelo). Son los outputs y los inputs. Aunque en MMS_0.5 outputs ({{{@MMS.Output}}}) e inputs ({{{@MMS.Input}}}) derivaban de la misma clase {{{@MMS.ModelVariable}}} presentaban características muy distintas, y los primeros asumían todas las características del submodelo gracias a la relación uno-uno que hay entre submodelos y outputs. En MMS_0.6 esta diferencia no se observa y tanto outputs como inputs son instancias de la clase {{{MMS::@MVariable}}}. Las instancias se crean cuando es necesario automáticamente a través de los constructores de los submodelos y los términos explicativos. En MMS_0.6 todas las m-variables forman un conjunto gestionable desde el modelo {{{MMS::@Model}}} a través de sus métodos correspondientes. == Creación de términos explicativos == En MMS_0.6 desaperece el mecanismo de (i) crear términos explicativos base, y luego (ii) crear términos epxlicativos asociando los primeros a un output. Los términos explicativos se crean directamente sobre el submodelo en el que van a participar. '''Código en MMS_0.5''' {{{ Real model::CreateBaseExpTermOmega([[ Text _.name = ; Text _.description = "..."; Polyn _.transferFunction = ; @MMS.Transformation _.transformation = ; Text _.variableName = ]]); Real model::CreateExpTerm([[ Text _.baseExpTermName = ; Set _.outputNames = [[ ]] ]]); }}} '''Código en MMS_0.6''' {{{ MMS::@ExpTerm expTerm = submodel::CreateExpTerm_TransferFunction([[ Text _.name = ; Text _.description = "..."; NameBlock _.input = [[ Text _.name = ; Text _.variableIdentifier = ]]; Polyn _.transferFunction = ]]); }}} Nótese que el uso de las transformaciones ha cambiado. Véase el apartado de [wiki:upgrade/transformations transformaciones]. === Creación de términos explicativos multioutput. Equivalencias === Para la creación de términos explicativos multioutput, simplemente hay que (i) crear las términos explicativos en cada submodelo y después (ii) crear una equivalencia entre los parámetros que se deseen considerar el mismo. '''Código en MMS_0.6''' {{{ MMS::@MEquivalence mEquivalence = model::CreateMEquivalence([[ Text _.name = ; Set _.parameters = [[ ... // información de los parámetros ]] ]]); }}} Nótese que la información para localizar un parámetro puede ser: * el identificador del parámetro (atributo Identifier en MMS_0.6 o Index en MMS_0.5), que para un parámetro de término explicativo tiene la forma: {{{ Text identifier = "SubmodelName__ExpTermName__ParameterSubclass.ParameterDegree"; @MMS.Parameter parameter = model::GetParameter(identifier); }}} * o un conjunto con los nombres de la estructura jerárquica del parámetro, con la forma: {{{ Set information = [[ "SubmodelName", "ExpTermName", [[ "ParameterSubclass", ParameterDegree ]] ]]; @MMS.Parameter parameter = model::GetParameter(identifier); }}} == Distribución a priori y restricciones == A diferencia de MMS_0.5 la información a priori (ditribución a priori y restricciones) en MMS_0.6 se ubica en los parámetros o elementos para los que se define. Esto no supone una gran dificultad en su creación como podemos ver: === Distribución a priori (Priors) === '''Código en MMS_0.5''' {{{ Real model::CreatePrior([[ Anything _.element = ; Real _.average = ; Real _.sigma = ]]) }}} '''Código en MMS_0.6''' {{{ MMS::@Parameter parameter = model::GetParameter(); Real parameter::SetPrior([[ Real _.mean = ; Real _.sigma = ]]); }}} === Restricciones (Constraints) === '''Código en MMS_0.5''' {{{ Real model::CreateConstraint([[ Anything _.element = ; Real _.inferiorValue = ; Real _.superiorValue = ]]) }}} '''Código en MMS_0.6''' {{{ MMS::@Parameter parameter = model::GetParameter(); Real parameter::SetConstraint([[ Real _.inferiorValue = ; Real _.superiorValue = ]]); }}} == Jerarquías == Las jerarquías en MMS_0.6 (como ecuaciones de parámetros que son) se construyen de una manera similar a los submodelos. Cabe destacar la declaración más explicita del noise o la declaración separada de sus términos explicativos ({{{MMS::@HierarchyTerm}}}). '''Código en MMS_0.5''' {{{ Real model::CreateHierarchy([[ Text _.name = ; Real _.sigma = [ | ?]; Real _.sigma0 = [? | ]; Real _.sigmaWeight = [? | ]; Set _.elements = ; Set _.hierarchyTerms = [[ [[ , ]], ... ]]; Set _.sigmas = ]]) }}} '''Código en MMS_0.6''' {{{ MMS::@Hierarchy hierarchy = model::CreateHierarchy([[ Text _.name = ; Set _.mElements = ; NameBlock _.noise = [[ Text _.type = "Normal"; Set _.relativeSigmas = ; Real _.sigma = [ | ]; Real _.sigmaFixed = [; Set _.coefficients = ]]); Anything hierarchy::CreateHierarchyTerm([[ ... ]]); }}} == Notas == === Intervalos en los submodelos === Hay tres intervalos en los submodelos: * El intervalo en el que está definida la variable del output: '''En 0.6''' {{{ Date vBegin = submodelo::GetOutput(?)::GetBegin(?); Date vEnd = submodelo::GetOutput(?)::GetEnd(?); /* Nótese que: vBegin == submodelo::GetOutput(?)::GetVariable(?)::GetBegin(?); vEnd == submodelo::GetOutput(?)::GetVariable(?)::GetEnd(?); */ }}} '''En 0.5''' {{{ Date vBegin = output::GetBegin(?); Date vEnd = output::GetEnd(?); }}} * El intervalo en el que se quiere acotar el output para su estimación: '''En 0.6''' {{{ Date sBegin = submodelo::GetBegin(?); Date sEnd = submodelo::GetEnd(?); // Nótese que en caso de no definirse en la creación, estos serían // TheBegin y TheEnd }}} '''En 0.5''' {{{ Date sBegin = output::GetModelBegin(?); Date sEnd = output::GetModelEnd(?); }}} * El intervalo en el que se estimará el output, obtenido acotando el intervalo de la variable [vBegin,vEnd] con el intervalo del submodelo [sBegin,sEnd]: '''En 0.6''' {{{ Date eBegin = submodelo::GetFirst(?); Date eEnd = submodelo::GetLast(?); // Nótese que en caso de no definirse intervalo del submodelo coincidirán // con el intervalor de la variable }}} '''En 0.5''' {{{ Date eBegin = output::GetFirst(?); Date eEnd = output::GetLast(?); }}}