| 1 | [[PageOutline]] |
| 2 | = Simulación bayesiana con ''Metropolis within Gibbs'' = |
| 3 | |
| 4 | == Introducción == |
| 5 | |
| 6 | Supongamos que queremos simular una variable aleatoria vectorial [[LatexEquation( \Omega\in\mathbb{R}^{n} )]] |
| 7 | cuya función de log-verosimilitud salvo constante es |
| 8 | |
| 9 | [[LatexEquation( \ln\pi\left(\Omega\right) )]] |
| 10 | |
| 11 | Si es posible evaluar esta función de forma eficiente el método Metropolis-Hastings o cualqueira de sus |
| 12 | derivados nos permite simular una cadena de Markov de la distribución de [[LatexEquation( \Omega )]]. |
| 13 | |
| 14 | Si es demasiado compleja como para expresarse de forma analítica o bien es demasiado pesada de calcular |
| 15 | entonces 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 | |
| 19 | Si se conoce un método eficaz para simular cada bloque condicionado al resto entonces es aplicable |
| 20 | el método de simulación de Gibbs. Si no es el caso pero sí es posible evaluar la función de |
| 21 | log-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 | |
| 25 | entonces el método a aplicar se llama ''Metropolis within Gibbs'', que consiste en simular |
| 26 | alternativamente los distintos bloques con el método de Metropolis-Hastigs (MH) o alguno similar |
| 27 | como el Multiple Try Metroplis (MTM), dejando invariantes todos aquellos de los que depende. En cada |
| 28 | simulación es necesario evaluar la log-verosimilitud un número de veces dependiente del método usado. |
| 29 | |
| 30 | == Arquitectura del sistema == |
| 31 | |
| 32 | Definiremos modelo de forma abstracta como un conjunto de bloques de variables aleatorias relacionados |
| 33 | entre sí por mecanismos de condicionamiento que se ejecutan tras cada simulación de uno de ellos, para |
| 34 | forzar así que la función de log-verosimilitud devuelva siempre los valores condicionados al resto de |
| 35 | bloques. |
| 36 | |
| 37 | El esquema planteado supondría la existencia de un objeto '''master''' que tuviera un listado de |
| 38 | objetos '''bloque''' del modelo, que se irían añadiendo con mecanismos de ensamblaje que indicarían |
| 39 | cómo un bloque condiciona a los ya existentes y cómo es condicionado por ellos según corresponda. |
| 40 | |
| 41 | En lugar de tratar de programar un mini-lenguaje ad-hoc como se hizo en BSR, la idea es que se dote al |
| 42 | sistema de una familia de clases en TOL que permitan crear declarativamente bloques primarios que implementen |
| 43 | las distribuciones básicas más usuales, y de otra familia que permita relacionar bloques entre sí de forma |
| 44 | algebraica para que queden perfectamente definidos los condicionamientos correspondientes. |
| 45 | |
| 46 | Cuando un modelo es muy complejo, tiene demasiados bloques, o éstos tienen muchas variables, o de una |
| 47 | u otra forma involucran el manejo de grandes cantidades de información, los modelos se hacen inmanejables |
| 48 | si se pretende hacerlo en una computadora individual. Puede ser que no haya memoria suficiente o que aún |
| 49 | habiéndola la velocidad de cálculo sea muy inferior a la requerida, con lo que es necesario paralelizar |
| 50 | los procesos en diferentes máquinas para acomoter el problema. |
| 51 | |
| 52 | Merece la pena puntualizar que se puede simular simultáneamente en paralelo aquellos bloques que no |
| 53 | dependen entre sí, pero los que son interdependientes deben simularse secuencialmente para que las |
| 54 | reglas de condicionamiento sean válidas. Para ello el máster del simulador debe conocer qué bloques |
| 55 | condicionan a qué otros para establecer un grafo topológico de la red que forman y determinar en qué |
| 56 | partes es posible paralelizar. No necesita saber cómo se relacionan los bloques entre sí ni cómo se |
| 57 | implementan los condicionamientos, sino sólo entre qué bloques se dan y en qué sentido o sentidos, |
| 58 | pues el condicionamiento puede ser unidireccional o bidireccional. |
| 59 | |
| 60 | Existen muchas formas de relación entre bloques. La acción a llevar a cabo para condicionar |
| 61 | puede suponer desde modificar simplemente un valor escalar (como la sigma de un bloque de regresión |
| 62 | lineal normal), hasta modificar total o parcialmente un valor vectorial o matricial, (como ocurre en |
| 63 | el caso de los omitidos que deben trasladarse a un subconjunto arbitrariamente salteado de entre las |
| 64 | celdas de la matriz de input o de output). Además, los valores con los que hay que sustituir los |
| 65 | valores a condicionar no tienen porqué ser directamente los valores condicionadores, sino que en |
| 66 | general serán el resultado de una función dependiente de los mismos. Por estos motivos no resulta ni |
| 67 | mucho menos trivial condicionar de una forma genérica y eficiente. |
| 68 | |
| 69 | Existen pues tres entidades en el sistema, cada una de las cuales dará lugar a una jerarquía de clases |
| 70 | que 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}}} == |
| 80 | A la clase base de la que derivan todos los bloques la llamaremos {{{Class @RandVar}}}, pues lo que |
| 81 | se está planteando no es otra cosa que un mecanismo de gestión de variables aleatorias. |
| 82 | |
| 83 | En este nivel raíz estará disponible una batería de algoritmos de generación MCMC basados en la |
| 84 | log-verosimilitud exclusivamente y que sean capaces de autocalibrarse sin intervención del usuario, pues |
| 85 | deben 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 | }}} |
| 94 | El argumento {{{numSim}}} indica el número de simulación actual y es meramente informativo, para |
| 95 | generación de errores y para posibles actuaciones dependientes de ese valor, por ejemplo durante |
| 96 | el periodo de burning. |
| 97 | {{{ |
| 98 | #!java |
| 99 | //Generates a single sample |
| 100 | VMatrix draw(Real numSim) { draw.MH(numSim) } |
| 101 | }}} |
| 102 | |
| 103 | El método por defecto será Metropolis-Hastings y podrá ser cambiado en las clases heredadas para las |
| 104 | que exista otro método directo más eficaz de muestreo. |
| 105 | |
| 106 | Cuando no existe dicho método directo la clase derivada final debe implementar obligatoriamente el |
| 107 | mé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 | }}} |
| 113 | Se 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 | }}} |
| 119 | que hará las comprobaciones básicas pertinentes, llamará al método privado y efectuará otro tipo de |
| 120 | tareas internas que se irán explicando más adelante. |
| 121 | |
| 122 | El método toma siempre un vector definido como un objeto de tipo VMatrix aunque se espere un escalar, |
| 123 | para simplificar la API. Las dimensiones del argumento tienen que ser compatibles con lo que espera el |
| 124 | bloque y de lo contrario se mostrará un error y se devolverá omitido. Si se quiere pasar un escalar y |
| 125 | tiene 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 | }}} |
| 131 | Si el argumento está fuera del dominio la verosimilitud es cero y su logaritmo es [[LatexEquation(-\infty)]]. |
| 132 | Todas las restricciones de igualdad o desigualdad, lineales o no, estarán reflejadas en el hecho de que se |
| 133 | devolverá [[LatexEquation(-\infty)]] cuando no se cumplan. |
| 134 | |
| 135 | === Variables aleatorias primarias === |
| 136 | |
| 137 | A los bloques primarios los llamaremos Primary Random Variable (PRV) y permiten tratar con variables |
| 138 | aleatorias 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 | |
| 153 | En todas aquellas para las que sea posible, que serán prácticamente todas, se dispondrá de un método |
| 154 | especializado de generación directa de muestras sobrecargando el método {{{draw}}} |
| 155 | |
| 156 | === Variables aleatorias derivadas algebraicamente === |
| 157 | |
| 158 | A los bloques derivados algebraicamente los llamaremos Algebraic Derived Random Variable (ADRV) y |
| 159 | permiten generar variables aleatorias que pueden ser muy complicadas de generar directamente, pero |
| 160 | en cambio es trivial generarlas aplicando las operaciones sobre las generaciones de los argumentos. |
| 161 | |
| 162 | ==== Operaciones escalares ==== |
| 163 | |
| 164 | En 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 | |
| 196 | En este tipo de operaciones resulta trivial simular llamando al simulador de las variables aleatorias |
| 197 | involucradas y aplicando la operación sobre ellas. En cambio, si hay más de una variable aleatoria |
| 198 | incvolucrada, el cálculo de la verosimilitud conlleva una integral numérica de alto coste computacional, |
| 199 | por lo que el método devolverá omitido y no debe usarse. |
| 200 | {{{ |
| 201 | #!java |
| 202 | Real _log_likelihood(VMatrix x) { ? } |
| 203 | }}} |
| 204 | Si se trata de una operación monaria o todos los argumentos son deterministas salvo uno entonces no hay |
| 205 | ningún problema en calcular la verosimilitud aplicando primero la transformación inversa y llamando al |
| 206 | método de la única v.a. propiamente dicha. |
| 207 | |
| 208 | ==== Operaciones matriciales ==== |
| 209 | |
| 210 | En 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 | |
| 248 | Como ya se ha dicho la clase {{{@Relation}}} implementa una relación de condicionamiento entre un bloque de |
| 249 | origen o condicionador y otro de destino o condicionado. |
| 250 | |
| 251 | === Relaciones de condicionamiento por asignación === |
| 252 | |
| 253 | En estos casos, cada bloque tiene su propia función de log-verosimilitud en la que alguno de sus |
| 254 | elementos es una variable del otro, por lo que el condicionamiento se limita a que un bloque |
| 255 | modifica en el otro lo que toque. |
| 256 | |
| 257 | === Relaciones de condicionamiento parasitario === |
| 258 | |
| 259 | Existe una amplia gama de filtros no lineales que modifican elementos como el output o el input de |
| 260 | una regresión lineal. En todos ellos el bloque no lineal se limita a cambiar lo que toque |
| 261 | del bloque de regresión, y su función de log-verosimilitud puede implementarse de forma parasitaria |
| 262 | respecto a la de su anfitrión, llamándola cambiando no sus argumentos sino los miembros adecuados |
| 263 | de la instancia. |
| 264 | |
| 265 | Este tipo de relación entre bloques es extensible formalmente a todas las situaciones en las que |
| 266 | hay un bloque anfitrión y otro parásito, cuya función de log-verosimilitud consistiría en modificar |
| 267 | lo que toque dentro del bloque anfitrión y llamar a su función de log-verosimilitud |
| 268 | sin modificar los argumentos. De esta forma el bloque anfitrión no tiene que realizar |
| 269 | ninguna acción de condicionamiento específica sobre el bloque parásito, pues es inherente a la |
| 270 | forma de cálculo. En este tipo de relación, las acciones necesarias para el condicionamiento y para |
| 271 | la evaluación de la log-verosimilitud son exactamente las mismas. |
| 272 | |
| 273 | En la clase raíz {{{@RandVar}}} se dispondrá de un miembro |
| 274 | {{{ |
| 275 | #!java |
| 276 | Set _.hosts = Copy(Empty); |
| 277 | }}} |
| 278 | para que los bloques parasitarios referencien a sus anfitriones |
| 279 | |
| 280 | == Clase {{{@Model}}} == |
| 281 | |
| 282 | Como ya se ha dicho un modelo es un conjunto de bloques y de relaciones de condicionamiento y es un caso |
| 283 | paricular de variable aleatoria. Por lo tanto, un modelo puede ser un bloque de otro modelo y tener |
| 284 | relaciones de condicionamiento con otros bloques que a su vez podrían ser modelos o bloques simples. |
| 285 | |
| 286 | Llamaremos '''master''' al modelo raíz que no actúa como bloque de ningún otro y es el encargado de |
| 287 | manejar todo el sisteam de simulación. |
| 288 | |
| 289 | Un modelo se declara siempre vacío en primera instancia y después se le van añadiendo sus componentes |
| 290 | de forma coherente, es decir, para poder añadir una relación entre dos bloques, estos deben haber sido |
| 291 | incluidos previamente en el modelo. |
| 292 | |
| 293 | No todas las variables aleatorias empleadas en la definción de un modelo son de interés para el analista |
| 294 | y a veces puede ser muy pesado almacenarlas físicamente en el disco, por lo que no hay necesidad de |
| 295 | hacerlo, pues en una cadena de Markov sólo es necesario conocer el último valor generado. Por este motivo |
| 296 | el método con el que se añade una variable aleatoria incluye otro argumento que indique si se quiere |
| 297 | o 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 | |
| 305 | El 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 | |
| 314 | A continuación se describen conceptualmente los elementos utilizados habitualmente en modelos de |
| 315 | regresió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 | |
| 319 | El bloque de varianzas, con distribución ''chi-cuadrado inversa'' condiciona al bloque normal |
| 320 | modificando directamente el valor de la varianza mientras que el bloque lineal condiciona al de varianzas |
| 321 | modificando el parámetro de escala poniendo el valor de la suma de cuadrados de los residuos |
| 322 | homocedásticos. Este sería un caso que podríamos llamar condicionamiento simétrico pues cada uno |
| 323 | condiciona 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 | |
| 328 | Cuando hay omitidos la regresión es en realidad bilineal y es complicado simular conjuntamente |
| 329 | pero es muy sencillo hacerlo condicionalmente en dos bloques, el principal (anfitrión) y el |
| 330 | de omitidos (parásito). |
| 331 | |
| 332 | Obsérvese que el bloque anfitrión no tendría porqué ser una regresión, sino que podría ser |
| 333 | cualquier tipo de bloque que contenga una matriz de datos. El bloque de omitidos sólo tiene |
| 334 | que tener la referencia del bloque principal, un identificador del miembro a modificar, y |
| 335 | una lista con ubicación de los omitidos dentro del mismo. |
| 336 | |
| 337 | Este esquema es ampliable al caso en el que varios bloques compartan uno o más omitidos, |
| 338 | siempre y cuando se trate de bloques independientes entre sí. Simplemente habría que sumar las |
| 339 | log-verosimilitudes de cada uno de ellos. Esta situación sucede con naturalidad en modelos |
| 340 | jerárquicos en los que distintos nodos comparten un input y en modelos encadenados en los |
| 341 | que el output de un nodo es input de otro. |
| 342 | |
| 343 | === Efectos aditivos en términos originales === |
| 344 | |
| 345 | Es muy habitual que haya que aplicar cierta transformación instantánea al output de una regresión lineal |
| 346 | para conseguir residuos homocedásticos. Pero luego puede ocurrir que existan efectos que ocurren en |
| 347 | té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 | |
| 351 | Lo ú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 | |
| 355 | En modelos de series temporales, tanto en el caso de la función de transferencia con deltas como el |
| 356 | caso 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 | |
| 360 | por lo que sería lógico plantear un bloque genérico que diera servicio a ambos casos. |
| 361 | |
| 362 | Los 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 | |
| 368 | Hay que tener en cuenta que ambos polinomios podrían venir factorizados en varias estacionalidades, |
| 369 | pero al fin y al cabo todo se reduce a coeficientes y a una estructura que rellenar con ellos y que |
| 370 | contendría también las diferencias si las hubiere. |
| 371 | |
| 372 | El denominador ha de ser siempre estacionario, pero el numerador de una función de transferencia |
| 373 | puede ser completamente arbitrario mientras que el de un ARIMA debe ser estacionario siempre. |
| 374 | |
| 375 | En el caso ARIMA caso el bloque de regresión sería el bloque parasitario y tendría que modificar la |
| 376 | serie de ruido ARIMA (denominador) tomada de la regresión para construir los residuos (denominador). |
| 377 | El bloque ARIMA sería a su vez parasitario de un bloque de resiudos normales. |
| 378 | |
| 379 | En cambio, en el caso de función de transferencia, el bloque parasitario sería el de la ecuación en |
| 380 | diferencias que tendría que modificar una columna de la matriz de inputs del bloque de regresión |
| 381 | utilizando la serie del denominador, mientras que el numerador sería el input original. |
| 382 | |
| 383 | === Relaciones jerárquicas lineales === |
| 384 | |
| 385 | Sea una relación jerárquica lineal extendida |
| 386 | |
| 387 | [[LatexEquation( H \beta \sim N\left(G \alpha, \Sigma\right) )]] |
| 388 | |
| 389 | en 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 |
| 391 | su vez latentes o primarias. |
| 392 | |
| 393 | El 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 |
| 395 | el output sería [[LatexEquation( H \beta )]], es decir, que iría cambiando en cada iteración. |
| 396 | |
| 397 | La función de log-verosimilitud del nivel inferior debe llamar aditivamente a todas las de los |
| 398 | de nivel superior en las que interviene y sumarse a su propia log-verosimilitud. |
| 399 | |
| 400 | === Información a priori === |
| 401 | |
| 402 | En el caso de haber información a priori sobre los parámetros de un bloque cualquiera habría que sumar |
| 403 | la 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 | |
| 406 | Habría que estudiar la posibilidad de utilizar esta información en la generación de candidatos para |
| 407 | evitar atascos en la cadena de Markov. |
| 408 | |
| 409 | ==== Prior normal ==== |
| 410 | |
| 411 | Es el más habitual de los prior pues es aplicable en muchos ambientes pues la distribución normal es |
| 412 | autoconjugada y el grueso de los parámetros de un modelo suele ser normal. Cuando no se conoce la |
| 413 | forma analítica de la distribución o es complicado deducir el prior conjugado, pero se puede considerar |
| 414 | razonable 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 | |
| 418 | Esta es la opción para indicar el conocimiento adquirido sobre la varianza de una distribución normal. |
| 419 | |
| 420 | ==== Restricciones deterministas ==== |
| 421 | |
| 422 | Las restricciones deterministas se implementan como una uniforme en la región factible. Para evitar |
| 423 | problemas numéricos se utiliza el [http://en.wikipedia.org/wiki/Penalty_method método de las penalizaciones] |
| 424 | de forma análoga a su empleo en las técnicas de optimización. |
| 425 | |
| 426 | La 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á |
| 428 | creciendo durante la etapa inicial de '''burning''' hasta alcanzar un valor de penalización suficientemente |
| 429 | grande como para que a partir de ese momento resulte altamente improbable que se genere una muestra |
| 430 | no factible. |
| 431 | |
| 432 | No debe usarse una restricción determinista si no hay un motivo que lo justifique plenamente. Por ejemplo, |
| 433 | si un coeficiente del modelo es una probabilidad está claro que debe estar entre 0 y 1, si es una temperatura |
| 434 | en grados kelvin o unaa velocidad entonces debe ser mayor o igual que 0, etc. Si lo que se quiere expresar |
| 435 | es algo subjetivo o impreciso, como que que es muy improbable que una variable este fuera de un rango, |
| 436 | entonces se debe utilizar un prior aleatorio, como una normal con una media y una desviación que se adapte |
| 437 | a esa intuición. |
| 438 | |
| 439 | {{{ |
| 440 | #!java |
| 441 | //////////////////////////////////////////////////////////////////////////////// |
| 442 | Class @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 | //////////////////////////////////////////////////////////////////////////////// |
| 471 | Class @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 |
| 486 | Class @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 |
| 499 | Class @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 | //////////////////////////////////////////////////////////////////////////////// |
| 511 | Class @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 |
| 526 | Class @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 |
| 542 | Class @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 | }}} |