| | 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 | }}} |