close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Changes between Initial Version and Version 1 of OfficialTolArchiveNetworkMWG


Ignore:
Timestamp:
Jul 4, 2011, 11:32:30 PM (14 years ago)
Author:
Víctor de Buen Remiro
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OfficialTolArchiveNetworkMWG

    v1 v1  
     1[[PageOutline]]
     2= Simulación bayesiana con ''Metropolis within Gibbs'' =
     3
     4== Introducción ==
     5
     6Supongamos que queremos simular una variable aleatoria vectorial [[LatexEquation( \Omega\in\mathbb{R}^{n} )]]
     7cuya función de log-verosimilitud salvo constante es
     8
     9[[LatexEquation( \ln\pi\left(\Omega\right) )]]
     10
     11Si es posible evaluar esta función de forma eficiente el método Metropolis-Hastings o cualqueira de sus
     12derivados nos permite simular una cadena de Markov de la distribución de [[LatexEquation( \Omega )]].
     13
     14Si es demasiado compleja como para expresarse de forma analítica o bien es demasiado pesada de calcular
     15entonces hay que tratar de dividir esta variable en bloques
     16
     17[[LatexEquation( \Omega=\left(\begin{array}{ccc}\Omega_{1} & \cdots & \Omega_{B}\end{array}\right)\quad\wedge\;\Omega_{i}\in\mathbb{R}^{n_{i}}\quad\wedge\;\underset{i=1}{\overset{B}{\sum}}n_{i}=n )]]
     18
     19Si se conoce un método eficaz para simular cada bloque condicionado al resto entonces es aplicable
     20el método de simulación de Gibbs. Si no es el caso pero sí es posible evaluar la función de
     21log-verosimilitud salvo constante condicionada al resto de bloques
     22
     23[[LatexEquation( \ln\pi_{i}\left(\left.\Omega_{i}\right|\Omega_{j\neq i}\right) )]]
     24
     25entonces el método a aplicar se llama ''Metropolis within Gibbs'', que consiste en simular
     26alternativamente los distintos bloques con el método de Metropolis-Hastigs (MH) o alguno similar
     27como el Multiple Try Metroplis (MTM), dejando invariantes todos aquellos de los que depende. En cada
     28simulación es necesario evaluar la log-verosimilitud un número de veces dependiente del método usado.
     29
     30== Arquitectura del sistema ==
     31
     32Definiremos modelo de forma abstracta como un conjunto de bloques de variables aleatorias relacionados
     33entre sí por mecanismos de condicionamiento que se ejecutan tras cada simulación de uno de ellos, para
     34forzar así que la función de log-verosimilitud devuelva siempre los valores condicionados al resto de
     35bloques.
     36
     37El esquema planteado supondría la existencia de un objeto '''master''' que tuviera un listado de
     38objetos '''bloque''' del modelo, que se irían añadiendo con mecanismos de ensamblaje que indicarían
     39cómo un bloque condiciona a los ya existentes y cómo es condicionado por ellos según corresponda.
     40
     41En lugar de tratar de programar un mini-lenguaje ad-hoc como se hizo en BSR, la idea es que se dote al
     42sistema de una familia de clases en TOL que permitan crear declarativamente bloques primarios que implementen
     43las distribuciones básicas más usuales, y de otra familia que permita relacionar bloques entre sí de forma
     44algebraica para que queden perfectamente definidos los condicionamientos correspondientes.
     45
     46Cuando un modelo es muy complejo, tiene demasiados bloques, o éstos tienen muchas variables, o de una
     47u otra forma involucran el manejo de grandes cantidades de información, los modelos se hacen inmanejables
     48si se pretende hacerlo en una computadora individual. Puede ser que no haya memoria suficiente o que aún
     49habiéndola la velocidad de cálculo sea muy inferior a la requerida, con lo que es necesario paralelizar
     50los procesos en diferentes máquinas para acomoter el problema.
     51
     52Merece la pena puntualizar que se puede simular simultáneamente en paralelo aquellos bloques que no
     53dependen entre sí, pero los que son interdependientes deben simularse secuencialmente para que las
     54reglas de condicionamiento sean válidas. Para ello el máster del simulador debe conocer qué bloques
     55condicionan a qué otros para establecer un grafo topológico de la red que forman y determinar en qué
     56partes es posible paralelizar. No necesita saber cómo se relacionan los bloques entre sí ni cómo se
     57implementan los condicionamientos, sino sólo entre qué bloques se dan y en qué sentido o sentidos,
     58pues el condicionamiento puede ser unidireccional o bidireccional.
     59
     60Existen muchas formas de relación entre bloques. La acción a llevar a cabo para condicionar
     61puede suponer desde modificar simplemente un valor escalar (como la sigma de un bloque de regresión
     62lineal normal), hasta modificar total o parcialmente un valor vectorial o matricial, (como ocurre en
     63el caso de los omitidos que deben trasladarse a un subconjunto arbitrariamente salteado de entre las
     64celdas de la matriz de input o de output). Además, los valores con los que hay que sustituir los
     65valores a condicionar no tienen porqué ser directamente los valores condicionadores, sino que en
     66general serán el resultado de una función dependiente de los mismos. Por estos motivos no resulta ni
     67mucho menos trivial condicionar de una forma genérica y eficiente.
     68
     69Existen pues tres entidades en el sistema, cada una de las cuales dará lugar a una jerarquía de clases
     70que permita adaptarse a todas las situaciones con una API mínima.
     71
     72 * {{{@RandVar}}}: Variable aleatoria generable mediante log-verosimilitud, sin perjuicio de que pueda haber
     73   otro método de generación alternativo más eficaz en alguna clase heredada.
     74 * {{{@Relation}}}: Relación entre un bloque condicionante y otro condicionado que especifica sin ambigüedad
     75   posible todas las acciones a realizar.
     76 * {{{@Model}}}: Conjunto de variables aleatorias y de relaciones de condicioanmiento. Es un tipo especial
     77   de variale aleatoria, por lo que hereda de {{{@RandVar}}}.
     78
     79== Clase {{{@RandVar}}} ==
     80A la clase base de la que derivan todos los bloques la llamaremos {{{Class @RandVar}}}, pues lo que
     81se está planteando no es otra cosa que un mecanismo de gestión de variables aleatorias.
     82
     83En este nivel raíz estará disponible una batería de algoritmos de generación MCMC basados en la
     84log-verosimilitud exclusivamente y que sean capaces de autocalibrarse sin intervención del usuario, pues
     85deben adecuarse a cualquier distribución que se quiera generar:
     86{{{
     87#!java 
     88  //Generates a single sample by means of Metropolis-Hastings algorithm
     89  VMatrix draw.MH(Real numSim) { ... }
     90  //Generates a single sample by means of Multiple Try Metropolis algorithm
     91  VMatrix draw.MTM(Real numSim) { ... }
     92  ...
     93}}}
     94El argumento {{{numSim}}} indica el número de simulación actual y es meramente informativo, para
     95generación de errores y para posibles actuaciones dependientes de ese valor, por ejemplo durante
     96el periodo de burning.
     97{{{
     98#!java 
     99  //Generates a single sample
     100  VMatrix draw(Real numSim) { draw.MH(numSim) }
     101}}}
     102
     103El método por defecto será Metropolis-Hastings y podrá ser cambiado en las clases heredadas para las
     104que exista otro método directo más eficaz de muestreo.
     105
     106Cuando no existe dicho método directo la clase derivada final debe implementar obligatoriamente el
     107método que devuelve el logaritmo de la verosimilitud para poder aplicar alguno de los métodos MCMC
     108{{{
     109#!java 
     110  //Returns log-likelihood except a constant for a given a vector as defined by inherited class
     111  Real _log_likelihood(VMatrix x);
     112}}}
     113Se trata de un método privado porque en la clase raíz se implementará el método público
     114{{{
     115#!java 
     116  //Returns log-likelihood except a constant for a given a vector
     117  Real log_likelihood(VMatrix x) { ... }
     118}}}
     119que hará las comprobaciones básicas pertinentes, llamará al método privado y efectuará otro tipo de
     120tareas internas que se irán explicando más adelante.
     121
     122El método toma siempre un vector definido como un objeto de tipo VMatrix aunque se espere un escalar,
     123para simplificar la API. Las dimensiones del argumento tienen que ser compatibles con lo que espera el
     124bloque y de lo contrario se mostrará un error y se devolverá omitido. Si se quiere pasar un escalar y
     125tiene sentido hacerlo se puede llamar al método
     126{{{
     127#!java 
     128  //Returns log-likelihood except a constant for a given a sample
     129  Real log_likelihood.S(Real x) { log_likelihood(Constant(1,1,x) };
     130}}}
     131Si el argumento está fuera del dominio la verosimilitud es cero y su logaritmo es [[LatexEquation(-\infty)]].
     132Todas las restricciones de igualdad o desigualdad, lineales o no, estarán reflejadas en el hecho de que se
     133devolverá [[LatexEquation(-\infty)]] cuando no se cumplan.
     134
     135=== Variables aleatorias primarias ===
     136
     137A los bloques primarios los llamaremos Primary Random Variable (PRV) y permiten tratar con variables
     138aleatorias correspondientes a las distribuciones básicas que se requieran:
     139
     140 * Distribución determinista: {{{@PRV.Cte::Create.V(VMatrix cte) }}}
     141 * Distribución uniforme continua: {{{@PRV.UniCon::Create(Real size, Real from, Real until) }}}
     142 * Distribución uniforme discreta: {{{@PRV.UniDis::Create(Real size, Real from, Real until) }}}
     143 * Distribución normal: {{{@PRV.Normal::Create(Real size, Real nu, Real sigma) }}}
     144 * Distribución logística: {{{@PRV.Logistic::Create(Real size, ) }}}
     145 * Distribución de Bernouilli: {{{@PRV.Bernouilli::Create(Real size, Real p) }}}
     146 * Distribución binomial: {{{@PRV.Binomial::Create(Real size, Real p, Real k) }}}
     147 * Distribución de Poisson: {{{@PRV.Poisson::Create(Real size, Real nu) }}}
     148 * Distribución t-student: {{{@PRV.TStudent::Create(Real size, Real freDeg) }}}
     149 * Distribución chi-square: {{{@PRV.ChiSquare::Create(Real size, Real freDeg) }}}
     150 * Distribución scaled inverse chi-square: {{{@PRV.InvScaChiSquare::Create(Real size, Real freDeg, Real scale) }}}
     151 * ...
     152
     153En todas aquellas para las que sea posible, que serán prácticamente todas, se dispondrá de un método
     154especializado de generación directa de muestras sobrecargando el método {{{draw}}}
     155
     156=== Variables aleatorias derivadas algebraicamente ===
     157
     158A los bloques derivados algebraicamente los llamaremos Algebraic Derived Random Variable (ADRV) y
     159permiten generar variables aleatorias que pueden ser muy complicadas de generar directamente, pero
     160en cambio es trivial generarlas aplicando las operaciones sobre las generaciones de los argumentos.
     161
     162==== Operaciones escalares ====
     163
     164En este tipo de clases heredadas de {{{@RandVar}}} se puede aplicar operaciones aritméticas sobre instancias de
     165{{{@RandVar}}} previamente creadas o bien sobre dichas instancias y valores escalares deterministas
     166
     167 * ''Suma'':
     168  * {{{@ADRV.Sum::Create(@RandVar a, @RandVar b)}}},
     169  * {{{@ADRV.Sum::Create.RV.S(@RandVar a, Real b)}}},
     170  * {{{@ADRV.Sum::Create.S.RV(Real a, @RandVar b)}}}
     171 * ''Resta'':
     172  * {{{@ADRV.Dif::Create(@RandVar a, @RandVar b)}}},
     173  * {{{@ADRV.Dif::Create.RV.S(@RandVar a, Real b)}}},
     174  * {{{@ADRV.Dif::Create.S.RV(Real a, @RandVar b)}}}
     175 * ''Producto'':
     176  * {{{@ADRV.Prod::Create(@RandVar a, @RandVar b)}}},
     177  * {{{@ADRV.Prod::Create.RV.S(@RandVar a, Real b)}}},
     178  * {{{@ADRV.Prod::Create.S.RV(Real a, @RandVar b)}}}
     179 * ''Cociente'':
     180  * {{{@ADRV.Div::Create(@RandVar a, @RandVar b)}}},
     181  * {{{@ADRV.Div::Create.RV.S(@RandVar a, Real b)}}},
     182  * {{{@ADRV.Div::Create.S.RV(Real a, @RandVar b)}}}
     183 * ''Potencia'':
     184  * {{{@ADRV.Power::Create(@RandVar a, @RandVar b)}}},
     185  * {{{@ADRV.Power::Create.RV.S(@RandVar a, Real b)}}},
     186  * {{{@ADRV.Power::Create.S.RV(Real a, @RandVar b)}}}
     187 * ''Transformación monaria'': Aplica una función de R en R
     188  * {{{@ADRV.Monary::Create(Code f, @RandVar a)}}}
     189 * ''Transformación binaria'': Aplica una función de R^2 en R
     190  * {{{@ADRV.Binary::Create(Code f, @RandVar a, @RandVar b)}}}
     191  * {{{@ADRV.Binary::Create.RV.S(Code f, @RandVar a, Real b)}}},
     192  * {{{@ADRV.Binary::Create.S.RV(Code f, Real a, @RandVar b)}}}
     193 * ''Transformación n-aria'': Aplica una función de R^n en R
     194  * {{{@ADRV.N_ary::Create(Code f, Set a)}}}
     195
     196En este tipo de operaciones resulta trivial simular llamando al simulador de las variables aleatorias
     197involucradas y aplicando la operación sobre ellas. En cambio, si hay más de una variable aleatoria
     198incvolucrada, el cálculo de la verosimilitud conlleva una integral numérica de alto coste computacional,
     199por lo que el método devolverá omitido y no debe usarse.
     200{{{
     201#!java
     202Real _log_likelihood(VMatrix x) { ? }
     203}}}
     204Si se trata de una operación monaria o todos los argumentos son deterministas salvo uno entonces no hay
     205ningún problema en calcular la verosimilitud aplicando primero la transformación inversa y llamando al
     206método de la única v.a. propiamente dicha.
     207
     208==== Operaciones matriciales ====
     209
     210En este tipo de clases heredadas de {{{@RandVar}}} se puede aplicar operaciones aritméticas sobre instancias de
     211{{{@RandVar}}} previamente creadas o bien sobre dichas instancias y valores vectoriales o matriciales deterministas
     212
     213 * ''Extracción'':
     214  * Por índice: {{{@ADRV.Extract.Cell::Create(@RandVar a, Set ij)}}}
     215  * Por rango: {{{@ADRV.Extract.Range::Create(@RandVar a, Real ini, Real num)}}}
     216 * ''Suma'':
     217  * Post-Matricial: {{{@ADRV.Sum.M.Post::Create(@RandVar a, VMatrix b)}}},
     218  * Pre-Matricial: {{{@ADRV.Sum.M.Pre::Create(VMatrix a, @RandVar b)}}}
     219 * ''Producto'':
     220  * Post-Matricial: {{{@ADRV.Prod.M.Post::Create(@RandVar a, VMatrix b)}}},
     221  * Pre-Matricial: {{{@ADRV.Prod.M.Pre::Create(VMatrix a, @RandVar b)}}},
     222  * Celda a celda: {{{@ADRV.Prod.M.Weighted::Create(@RandVar a, VMatrix b)}}}
     223 * ''Cholesky'':
     224  * {{{@ADRV.Chol.Prod::Create(VMatrix X, Text mode, @RandVar a)}}}: Aplica el factor de Cholesky de la matriz
     225    dada a una v.a. El argumento mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz simétrica o de
     226    un factor suyo.
     227  * {{{@ADRV.Chol.Solve.L::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*b=a }}} siendo L el
     228    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
     229    simétrica o de un factor suyo.
     230  * {{{@ADRV.Chol.Solve.Lt::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L'*b=a }}} siendo L el
     231    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
     232    simétrica o de un factor suyo.
     233  * {{{@ADRV.Chol.Solve.LtL::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L'*L*b=a }}} siendo L el
     234    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
     235    simétrica o de un factor suyo.
     236  * {{{@ADRV.Chol.Solve.LLt::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*L'*b=a }}} siendo L el
     237    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
     238    simétrica o de un factor suyo.
     239 * ''Regresor lineal'': {{{Y=X*b+e}}}
     240  * {{{@ADRV.LinReg::Create(VMatrix Y, VMatrix X, @RandVar e)}}}: Llama al log_likelihood de e con el resultado de Y-X*b
     241  * {{{@ADRV.LinReg.Chol::Create(VMatrix Y, VMatrix X, @RandVar e)}}} : Calcula directamente {{{b = (X'X)^-1 X' (Y-e)}}}
     242    Es útil cuando X es regular y constante y los residuos son normales de media 0, independientes y homocedásticos
     243    pues resulta muy eficaz en esos casos, especialmente si X es además sparse. Internamente se utiliza la descomposición
     244    de Cholesky.
     245
     246== Clase {{{@Relation}}} ==
     247
     248Como ya se ha dicho la clase {{{@Relation}}} implementa una relación de condicionamiento entre un bloque de
     249origen o condicionador y otro de destino o condicionado.
     250
     251=== Relaciones de condicionamiento por asignación ===
     252
     253En estos casos, cada bloque tiene su propia función de log-verosimilitud en la que alguno de sus
     254elementos es una variable del otro, por lo que el condicionamiento se limita a que un bloque
     255modifica en el otro lo que toque.
     256
     257=== Relaciones de condicionamiento parasitario ===
     258
     259Existe una amplia gama de filtros no lineales que modifican elementos como el output o el input de
     260una regresión lineal. En todos ellos el bloque no lineal se limita a cambiar lo que toque
     261del bloque de regresión, y su función de log-verosimilitud puede implementarse de forma parasitaria
     262respecto a la de su anfitrión, llamándola cambiando no sus argumentos sino los miembros adecuados
     263de la instancia.
     264
     265Este tipo de relación entre bloques es extensible formalmente a todas las situaciones en las que
     266hay un bloque anfitrión y otro parásito, cuya función de log-verosimilitud consistiría en modificar
     267lo que toque dentro del bloque anfitrión y llamar a su función de log-verosimilitud
     268sin modificar los argumentos. De esta forma el bloque anfitrión no tiene que realizar
     269ninguna acción de condicionamiento específica sobre el bloque parásito, pues es inherente a la
     270forma de cálculo. En este tipo de relación, las acciones necesarias para el condicionamiento y para
     271la evaluación de la log-verosimilitud son exactamente las mismas.
     272
     273En la clase raíz {{{@RandVar}}} se dispondrá de un miembro
     274{{{
     275#!java
     276  Set _.hosts = Copy(Empty);
     277}}}
     278para que los bloques parasitarios referencien a sus anfitriones
     279
     280== Clase {{{@Model}}} ==
     281
     282Como ya se ha dicho un modelo es un conjunto de bloques y de relaciones de condicionamiento y es un caso
     283paricular de variable aleatoria. Por lo tanto, un modelo puede ser un bloque de otro modelo y tener
     284relaciones de condicionamiento con otros bloques que a su vez podrían ser modelos o bloques simples.
     285
     286Llamaremos '''master''' al modelo raíz que no actúa como bloque de ningún otro y es el encargado de
     287manejar todo el sisteam de simulación.
     288
     289Un modelo se declara siempre vacío en primera instancia y después se le van añadiendo sus componentes
     290de forma coherente, es decir, para poder añadir una relación entre dos bloques, estos deben haber sido
     291incluidos previamente en el modelo.
     292
     293No todas las variables aleatorias empleadas en la definción de un modelo son de interés para el analista
     294y a veces puede ser muy pesado almacenarlas físicamente en el disco, por lo que no hay necesidad de
     295hacerlo, pues en una cadena de Markov sólo es necesario conocer el último valor generado. Por este motivo
     296el método con el que se añade una variable aleatoria incluye otro argumento que indique si se quiere
     297o no almcenarla en la MCMC.
     298
     299{{{
     300  //Adds a random variable to the model. If argument <storedInMcmc> is true it will be stored at Markov
     301  //chain matrix into a disk binary file.
     302  Real model::AddRandVar(@RandVar a, Real storedInMcmc);
     303}}}
     304
     305El método para añadir una relación será el siguiente
     306{{{
     307#!java
     308  //Adds a conditioning relation
     309  Real model::AddRelation(@Relation r);
     310}}}
     311
     312== Casos particulares y ejemplos ==
     313
     314A continuación se describen conceptualmente los elementos utilizados habitualmente en modelos de
     315regresión bayesiana, clasificados funcionalmente según la metodología a emplear en cada uno.
     316
     317=== La varianza de una regresión lineal normal ===
     318
     319El bloque de varianzas, con distribución ''chi-cuadrado inversa'' condiciona al bloque normal
     320modificando directamente el valor de la varianza mientras que el bloque lineal condiciona al de varianzas
     321modificando el parámetro de escala poniendo el valor de la suma de cuadrados de los residuos
     322homocedásticos. Este sería un caso que podríamos llamar condicionamiento simétrico pues cada uno
     323condiciona al otro y suele aparecer cuando se aplica un
     324[http://en.wikipedia.org/wiki/Conjugate_prior prior conjugado].
     325
     326=== Datos omitidos en una regresión lineal ===
     327
     328Cuando hay omitidos la regresión es en realidad bilineal y es complicado simular conjuntamente
     329pero es muy sencillo hacerlo condicionalmente en dos bloques, el principal (anfitrión) y el
     330de omitidos (parásito).
     331
     332Obsérvese que el bloque anfitrión no tendría porqué ser una regresión, sino que podría ser
     333cualquier tipo de bloque que contenga una matriz de datos. El bloque de omitidos sólo tiene
     334que tener la referencia del bloque principal, un identificador del miembro a modificar, y
     335una lista con ubicación de los omitidos dentro del mismo.
     336
     337Este esquema es ampliable al caso en el que varios bloques compartan uno o más omitidos,
     338siempre y cuando se trate de bloques independientes entre sí. Simplemente habría que sumar las
     339log-verosimilitudes de cada uno de ellos. Esta situación sucede con naturalidad en modelos
     340jerárquicos en los que distintos nodos comparten un input y en modelos encadenados en los
     341que el output de un nodo es input de otro.
     342
     343=== Efectos aditivos en términos originales ===
     344
     345Es muy habitual que haya que aplicar cierta transformación instantánea al output de una regresión lineal
     346para conseguir residuos homocedásticos. Pero luego puede ocurrir que existan efectos que ocurren en
     347términos originales y otros en términos transformados
     348
     349[[LatexEquation( T\left(Y - X_0 \beta_0 \right) = X_1 \beta_1 + e )]]
     350
     351Lo único que tiene que hacer el filtro parásito es modificar el output completo del bloque anfitrión.
     352
     353=== Ecuación en diferencias ===
     354
     355En modelos de series temporales, tanto en el caso de la función de transferencia con deltas como el
     356caso ARIMA hay que resolver una ecuación en diferencias
     357
     358[[LatexEquation( P\left(B\right) u_t = Q\left(B\right) v_t )]]
     359
     360por lo que sería lógico plantear un bloque genérico que diera servicio a ambos casos.
     361
     362Los parámetros de este bloque se clasifican en:
     363 * [[LatexEquation( P\left(B\right) )]] : coeficientes del numerador
     364 * [[LatexEquation( Q\left(B\right) )]] : coeficientes del denominador
     365 * [[LatexEquation( u_0 )]] : valores iniciales del numerador
     366 * [[LatexEquation( v_0 )]] : valores iniciales del denominador
     367
     368Hay que tener en cuenta que ambos polinomios podrían venir factorizados en varias estacionalidades,
     369pero al fin y al cabo todo se reduce a coeficientes y a una estructura que rellenar con ellos y que
     370contendría también las diferencias si las hubiere.
     371
     372El denominador ha de ser siempre estacionario, pero el numerador de una función de transferencia
     373puede ser completamente arbitrario mientras que el de un ARIMA debe ser estacionario siempre.
     374
     375En el caso ARIMA caso el bloque de regresión sería el bloque parasitario y tendría que modificar la
     376serie de ruido ARIMA (denominador) tomada de la regresión para construir los residuos (denominador).
     377El bloque ARIMA sería a su vez parasitario de un bloque de resiudos normales.
     378
     379En cambio, en el caso de función de transferencia, el bloque parasitario sería el de la ecuación en
     380diferencias que tendría que modificar una columna de la matriz de inputs del bloque de regresión
     381utilizando la serie del denominador, mientras que el numerador sería el input original.
     382
     383=== Relaciones jerárquicas lineales ===
     384
     385Sea una relación jerárquica lineal extendida
     386
     387[[LatexEquation( H \beta \sim N\left(G \alpha, \Sigma\right) )]]
     388
     389en la que [[LatexEquation( \alpha )]] son las variables latentes del nivel superior y
     390[[LatexEquation( \beta)]] las de nivel inferior definidas en uno o varios bloques, y que pueden ser a
     391su vez latentes o primarias.
     392
     393El bloque de nivel inferior condiciona a todos sus superiores modificando valor actual de las
     394[[LatexEquation( \beta)]]. De esta forma nos quedaría en el superior una regresión lineal en la que
     395el output sería [[LatexEquation( H \beta )]], es decir, que iría cambiando en cada iteración.
     396
     397La función de log-verosimilitud del nivel inferior debe llamar aditivamente a todas las de los
     398de nivel superior en las que interviene y sumarse a su propia log-verosimilitud.
     399
     400=== Información a priori ===
     401
     402En el caso de haber información a priori sobre los parámetros de un bloque cualquiera habría que sumar
     403la log-verosimilitud correspondiente a su distribución. Lo ideal es usar un
     404[http://en.wikipedia.org/wiki/Conjugate_prior prior conjugado] siempre que sea posible.
     405
     406Habría que estudiar la posibilidad de utilizar esta información en la generación de candidatos para
     407evitar atascos en la cadena de Markov.
     408
     409==== Prior normal ====
     410
     411Es el más habitual de los prior pues es aplicable en muchos ambientes pues la distribución normal es
     412autoconjugada y el grueso de los parámetros de un modelo suele ser normal. Cuando no se conoce la
     413forma analítica de la distribución o es complicado deducir el prior conjugado, pero se puede considerar
     414razonable que ha de ser simétrica, entonces el prior normal es sin duda la mejor opción.
     415
     416==== Prior inverse scaled chi-square ====
     417
     418Esta es la opción para indicar el conocimiento adquirido sobre la varianza de una distribución normal.
     419
     420==== Restricciones deterministas ====
     421
     422Las restricciones deterministas se implementan como una uniforme en la región factible. Para evitar
     423problemas numéricos se utiliza el [http://en.wikipedia.org/wiki/Penalty_method método de las penalizaciones]
     424de forma análoga a su empleo en las técnicas de optimización.
     425
     426La log-verosimilitud en la región factible es cero pero fuera de ella en lugar de ser
     427[[LatexEquation(-\infty)]] será un número negativo proporcional a la distancia a la frontera, que irá
     428creciendo durante la etapa inicial de '''burning''' hasta  alcanzar un valor de penalización suficientemente
     429grande como para que a partir de ese momento resulte altamente improbable que se genere una muestra
     430no factible.
     431
     432No debe usarse una restricción determinista si no hay un motivo que lo justifique plenamente. Por ejemplo,
     433si un coeficiente del modelo es una probabilidad está claro que debe estar entre 0 y 1, si es una temperatura
     434en grados kelvin o unaa velocidad entonces debe ser mayor o igual que 0, etc. Si lo que se quiere expresar
     435es algo subjetivo o impreciso, como que que es muy improbable que una variable este fuera de un rango,
     436entonces se debe utilizar un prior aleatorio, como una normal con una media y una desviación que se adapte
     437a esa intuición.
     438
     439{{{
     440#!java
     441////////////////////////////////////////////////////////////////////////////////
     442Class @Constraint : @RandomVar
     443////////////////////////////////////////////////////////////////////////////////
     444{
     445  Static Real _.penalty.initial = 1;
     446  Static Real _.penalty.factor = 1.1;
     447  Real _.penalty = ?;
     448
     449  //////////////////////////////////////////////////////////////////////////////
     450  Real _penalty_update(Real numSim)
     451  //////////////////////////////////////////////////////////////////////////////
     452  {
     453    Real _.penalty := If(numSim==1,
     454      _.penalty.initial,
     455      _.penalty.factor * _.penalty)
     456  };
     457
     458  //////////////////////////////////////////////////////////////////////////////
     459  Real _penalty_eval(VMatrix g)
     460  //////////////////////////////////////////////////////////////////////////////
     461  {
     462    VMatrix out = GE(g,0);
     463    Real G.out = VMatSum(g$*out);
     464    If(G.out<=0, 0, -_.penalty*G.out)
     465  }
     466
     467  Real _penalty_log_likelihood(VMatrix g)
     468};
     469
     470////////////////////////////////////////////////////////////////////////////////
     471Class @Eq : @Constraint
     472////////////////////////////////////////////////////////////////////////////////
     473{
     474  //////////////////////////////////////////////////////////////////////////////
     475  // Returns 0 if g==0 and a huge negative value in other case
     476  Real _penalty_log_likelihood(VMatrix g)
     477  //////////////////////////////////////////////////////////////////////////////
     478  {
     479    _penalty_eval(g^2)
     480  }
     481};
     482
     483////////////////////////////////////////////////////////////////////////////////
     484// Restricciones deterministas de punto fijo
     485// x = cte
     486Class @Eq.Fixed : @Eq
     487////////////////////////////////////////////////////////////////////////////////
     488{
     489  VMatrix _.point;
     490  Real _log_likelihood(VMatrix x)
     491  {
     492    _penalty_log_likelihood(x-_.point)
     493  }
     494};
     495
     496////////////////////////////////////////////////////////////////////////////////
     497// Restricciones deterministas de punto fijo
     498// A*x = a
     499Class @Eq.Linear : @Eq
     500////////////////////////////////////////////////////////////////////////////////
     501{
     502  VMatrix _.A;
     503  VMatrix _.a;         
     504  Real _log_likelihood(VMatrix x)
     505  {
     506    _penalty_log_likelihood(_.A*x-_.a)
     507  }
     508};
     509
     510////////////////////////////////////////////////////////////////////////////////
     511Class @Ineq : @Constraint
     512////////////////////////////////////////////////////////////////////////////////
     513{
     514  //////////////////////////////////////////////////////////////////////////////
     515  // Returns 0 if g<=0 and a huge negative value in other case
     516  Real _penalty_log_likelihood(VMatrix g)
     517  //////////////////////////////////////////////////////////////////////////////
     518  {
     519    _penalty_eval(g)
     520  }
     521};
     522
     523////////////////////////////////////////////////////////////////////////////////
     524// Restricciones deterministas de dominio (intervalo o rango)
     525// _.lower <= x <= _.upper
     526Class @Ineq.Domain : @Ineq
     527////////////////////////////////////////////////////////////////////////////////
     528{
     529  VMatrix _.lower;
     530  VMatrix _.upper;         
     531  Real _log_likelihood(VMatrix x)
     532  {
     533    VMatrix g1 = x - _.upper;
     534    VMatrix g2 = _.lower - x;
     535    _penalty_log_likelihood(g1<<g2)
     536  }
     537};
     538
     539////////////////////////////////////////////////////////////////////////////////
     540// Restricciones deterministas de desigualdad lineal
     541// _.A x <= _.a
     542Class @Ineq.Linear : @Ineq
     543////////////////////////////////////////////////////////////////////////////////
     544{
     545  VMatrix _.A;
     546  VMatrix _.a;         
     547  Real _log_likelihood(VMatrix x)
     548  {
     549    _penalty_log_likelihood(_.A*x-_.a)
     550  }
     551};
     552
     553}}}
     554
     555=== Modelo de regresión normal con prior conjugado para la varianza ===
     556
     557{{{
     558#!java
     559////////////////////////////////////////////////////////////////////////////////
     560// Modelo de regresión normal con prior conjugado para la varianza
     561@Model Create.LinReg.Normal(
     562  VMatrix Y, //Output
     563  VMatrix X  //Input     )
     564////////////////////////////////////////////////////////////////////////////////
     565{
     566  @Model model = @Model::New(?);
     567  //Auxiliar objects
     568  Real N = VRows(Y);
     569  Real n = VColumns(X);
     570  //Random variables
     571  @RandomVar s2=@PRV.InvScaChiSquare::Create(1, N, ?);
     572  @RandomVar e=@PRV.Normal::Create(N, 0, ?);
     573  @RandomVar b=@ADRV.LinReg.Chol::Create(Y, X, e);
     574  Real model::AddRandVar(s2, True);
     575  Real model::AddRandVar(e, False);
     576  Real model::AddRandVar(b, True);
     577  //Conditioning relations
     578  Real model::AddRelation(@Relation.Assign("s2","_.drawn","e","_.sigma2"));
     579  Real model::AddRelation(@Relation.AssignTransf("e","_.drawn","s2","_.sumSqr","VMatDat(MtMSqr(#X#),1,1)"));
     580  Real model::AddRelation(@Relation.Assign("b","_.e","e","_.drawn",Empty));
     581  model
     582};
     583}}}