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 submodelosMMS::@Submodel
formados por una mvariableMMMS::@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ámetrosMMS::@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 = <nombre>; Text _.description = "..."; Text _.variableName = <variable>; Date _.modelBegin = ...; Date _.modelEnd = ...; @MMS.Transformation _.transformation = BoxCox(0,0); Text _.labelARIMA = "P<period>DIF<difference>AR<ar>MA<ma>" ]])
Código en MMS_0.6
MMS::@Submodel submodel = model::CreateSubmodel([[ Text _.name = <nombre>; Text _.description = "..."; NameBlock _.output = [[ Text _.name = <nombre_output>; Text _.variableIdentifier = <variable>; MMS::@Transformation _.transformation = MMS::@Transformation.BoxCox::Default(0,0) ]]; Date _.begin = ...; Date _.end = ...; NameBlock _.noise = [[ Text _.type = "ARIMA"; Text _.arimaLabel = "P<period>DIF<difference>AR<ar>MA<ma>"; Real _.sigma = 1 // opcional, valor inicial de la sigma muestreada ]]
Véase el apartado de 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 = <nombre>; Text _.description = "..."; Polyn _.transferFunction = <transfer>; @MMS.Transformation _.transformation = <transformation>; Text _.variableName = <variable> ]]); Real model::CreateExpTerm([[ Text _.baseExpTermName = <nombre>; Set _.outputNames = [[ <submodelo> ]] ]]);
Código en MMS_0.6
MMS::@ExpTerm expTerm = submodel::CreateExpTerm_TransferFunction([[ Text _.name = <nombre>; Text _.description = "..."; NameBlock _.input = [[ Text _.name = <nombre_input>; Text _.variableIdentifier = <variable> ]]; Polyn _.transferFunction = <transfer> ]]);
Nótese que el uso de las transformaciones ha cambiado. Véase el apartado de 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 = <nombre>; 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 = <parameterInfo>; Real _.average = <mean>; Real _.sigma = <sigma> ]])
Código en MMS_0.6
MMS::@Parameter parameter = model::GetParameter(<parameterInfo>); Real parameter::SetPrior([[ Real _.mean = <mean>; Real _.sigma = <sigma> ]]);
Restricciones (Constraints)
Código en MMS_0.5
Real model::CreateConstraint([[ Anything _.element = <parameterInfo>; Real _.inferiorValue = <min>; Real _.superiorValue = <max> ]])
Código en MMS_0.6
MMS::@Parameter parameter = model::GetParameter(<parameterInfo>); Real parameter::SetConstraint([[ Real _.inferiorValue = <min>; Real _.superiorValue = <max> ]]);
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 = <nombre>; Real _.sigma = [<sigmaFija> | ?]; Real _.sigma0 = [? | <sigmaInicial>]; Real _.sigmaWeight = [? | <pesoSigmaInicial>]; Set _.elements = <mElements>; Set _.hierarchyTerms = [[ [[ <HierarchyTermName>, <coefficients> ]], ... ]]; Set _.sigmas = <relativeSigmas> ]])
Código en MMS_0.6
MMS::@Hierarchy hierarchy = model::CreateHierarchy([[ Text _.name = <nombre>; Set _.mElements = <mElements>; NameBlock _.noise = [[ Text _.type = "Normal"; Set _.relativeSigmas = <relativeSigmas>; Real _.sigma = [<sigmaInicial> | <sigmaFija>]; Real _.sigmaFixed = [<pesoSigmaInicial | 1] ]] ]]); Anything hierarchy::CreateHierarchyTerm([[ Text _.name = <HierarchyTermName>; Set _.coefficients = <coefficients> ]]); Anything hierarchy::CreateHierarchyTerm([[ ... ]]);