Changes between Version 1 and Version 2 of OfficialTolArchiveNetworkMWG
- Timestamp:
- Jul 5, 2011, 7:19:48 PM (14 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
OfficialTolArchiveNetworkMWG
v1 v2 156 156 === Variables aleatorias derivadas algebraicamente === 157 157 158 A los bloques derivados algebraicamente los llamaremos Algebraic Derived Random Variable ( ADRV) y158 A los bloques derivados algebraicamente los llamaremos Algebraic Derived Random Variable (RVOS) y 159 159 permiten generar variables aleatorias que pueden ser muy complicadas de generar directamente, pero 160 160 en cambio es trivial generarlas aplicando las operaciones sobre las generaciones de los argumentos. … … 166 166 167 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)}}}168 * {{{@RVOS.Sum::Create(@RandVar a, @RandVar b)}}}, 169 * {{{@RVOS.Sum::Create.RV.S(@RandVar a, Real b)}}}, 170 * {{{@RVOS.Sum::Create.S.RV(Real a, @RandVar b)}}} 171 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)}}}172 * {{{@RVOS.Dif::Create(@RandVar a, @RandVar b)}}}, 173 * {{{@RVOS.Dif::Create.RV.S(@RandVar a, Real b)}}}, 174 * {{{@RVOS.Dif::Create.S.RV(Real a, @RandVar b)}}} 175 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)}}}176 * {{{@RVOS.Prod::Create(@RandVar a, @RandVar b)}}}, 177 * {{{@RVOS.Prod::Create.RV.S(@RandVar a, Real b)}}}, 178 * {{{@RVOS.Prod::Create.S.RV(Real a, @RandVar b)}}} 179 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)}}}180 * {{{@RVOS.Div::Create(@RandVar a, @RandVar b)}}}, 181 * {{{@RVOS.Div::Create.RV.S(@RandVar a, Real b)}}}, 182 * {{{@RVOS.Div::Create.S.RV(Real a, @RandVar b)}}} 183 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)}}}184 * {{{@RVOS.Power::Create(@RandVar a, @RandVar b)}}}, 185 * {{{@RVOS.Power::Create.RV.S(@RandVar a, Real b)}}}, 186 * {{{@RVOS.Power::Create.S.RV(Real a, @RandVar b)}}} 187 187 * ''Transformación monaria'': Aplica una función de R en R 188 * {{{@ ADRV.Monary::Create(Code f, @RandVar a)}}}188 * {{{@RVOS.Monary::Create(Code f, @RandVar a)}}} 189 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)}}}190 * {{{@RVOS.Binary::Create(Code f, @RandVar a, @RandVar b)}}} 191 * {{{@RVOS.Binary::Create.RV.S(Code f, @RandVar a, Real b)}}}, 192 * {{{@RVOS.Binary::Create.S.RV(Code f, Real a, @RandVar b)}}} 193 193 * ''Transformación n-aria'': Aplica una función de R^n en R 194 * {{{@ ADRV.N_ary::Create(Code f, Set a)}}}194 * {{{@RVOS.N_ary::Create(Code f, Set a)}}} 195 195 196 196 En este tipo de operaciones resulta trivial simular llamando al simulador de las variables aleatorias … … 212 212 213 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)}}}214 * Por índice: {{{@RVOV.Extract.Cell::Create(@RandVar a, Set ij)}}} 215 * Por rango: {{{@RVOV.Extract.Range::Create(@RandVar a, Real ini, Real num)}}} 216 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)}}}217 * Post-Matricial: {{{@RVOV.Sum.M.Post::Create(@RandVar a, VMatrix b)}}}, 218 * Pre-Matricial: {{{@RVOV.Sum.M.Pre::Create(VMatrix a, @RandVar b)}}} 219 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)}}}220 * Post-Matricial: {{{@RVOV.Prod.M.Post::Create(@RandVar a, VMatrix b)}}}, 221 * Pre-Matricial: {{{@RVOV.Prod.M.Pre::Create(VMatrix a, @RandVar b)}}}, 222 * Celda a celda: {{{@RVOV.Prod.M.Weighted::Create(@RandVar a, VMatrix b)}}} 223 223 * ''Cholesky'': 224 * {{{@ ADRV.Chol.Prod::Create(VMatrix X, Text mode, @RandVar a)}}}: Aplica el factor de Cholesky de la matriz224 * {{{@RVOV.Chol.Prod::Create(VMatrix X, Text mode, @RandVar a)}}}: Aplica el factor de Cholesky de la matriz 225 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 226 un factor suyo. 227 * {{{@ ADRV.Chol.Solve.L::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*b=a }}} siendo L el227 * {{{@RVOV.Chol.Solve.L::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*b=a }}} siendo L el 228 228 factor de Cholesky de la matriz dada. El argumento mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz 229 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 el230 * {{{@RVOV.Chol.Solve.Lt::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L'*b=a }}} siendo L el 231 231 factor de Cholesky de la matriz dada. El argumento mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz 232 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 el233 * {{{@RVOV.Chol.Solve.LtL::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L'*L*b=a }}} siendo L el 234 234 factor de Cholesky de la matriz dada. El argumento mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz 235 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 el236 * {{{@RVOV.Chol.Solve.LLt::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*L'*b=a }}} siendo L el 237 237 factor de Cholesky de la matriz dada. El argumento mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz 238 238 simétrica o de un factor suyo. 239 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*b241 * {{{@ ADRV.LinReg.Chol::Create(VMatrix Y, VMatrix X, @RandVar e)}}} : Calcula directamente {{{b = (X'X)^-1 X' (Y-e)}}}240 * {{{@RVOV.LinReg::Create(VMatrix Y, VMatrix X, @RandVar e)}}}: Llama al log_likelihood de e con el resultado de Y-X*b 241 * {{{@RVOV.LinReg.Chol::Create(VMatrix Y, VMatrix X, @RandVar e)}}} : Calcula directamente {{{b = (X'X)^-1 X' (Y-e)}}} 242 242 Es útil cuando X es regular y constante y los residuos son normales de media 0, independientes y homocedásticos 243 243 pues resulta muy eficaz en esos casos, especialmente si X es además sparse. Internamente se utiliza la descomposición … … 555 555 === Modelo de regresión normal con prior conjugado para la varianza === 556 556 557 [[Image(source:tolp/OfficialTolArchiveNetwork/MWG/doc/esquema.01.dib)]] 558 557 559 {{{ 558 560 #!java … … 565 567 { 566 568 @Model model = @Model::New(?); 567 //Auxiliar objects 568 Real N = VRows(Y); 569 MWG::@Model model = MWG::@Model::New(?); 570 571 Real m = VRows(Y); 569 572 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)); 573 574 VMatrix beta.0 = Constant(n,1,0); 575 VMatrix residuals.0 = Y-X*beta.0; 576 Real sigma2.0 = VMatDat(MtMSqr(residuals.0),1,1)/VRows(residuals.0); 577 578 MWG::@PRI.InvScaChiSquare sigma2 = [[ 579 Set _.names = [["Variance"]]; 580 VMatrix _.drawn = Mat2VMat(Col(sigma2.0)); 581 Real _.freeDeg = m; 582 Real _.scale = sigma2.0 ]]; 583 584 MWG::@PRI.Normal residuals = [[ 585 VMatrix _.drawn = residuals.0; 586 Real _.nu = 0; 587 Real _.sigma = Sqrt(sigma2.0) ]]; 588 589 MWG::@RVOV.LinReg beta = [[ 590 Set _.names = trueModel::LinBlk.names; 591 VMatrix _.drawn = beta.0; 592 Set _.Y = [[Y]]; 593 Set _.X = [[X]]; 594 Set _.e = [[residuals]] ]]; 595 596 Real model::addRandVar(beta, True); 597 Real model::addRandVar(sigma2, True); 598 599 Real { model::addRelation(MWG::@Relation.Assign rel = [[ 600 Text _.type = "Real"; 601 Text _.from = "sigma2"; 602 Text _.to = "beta"; 603 Text _.expr = "((beta::_.e)[1])::_.sigma := Sqrt(VMatDat(sigma2::_.drawn,1,1))" ]]) }; 604 605 Real { model::addRelation(MWG::@Relation.Assign rel = [[ 606 Text _.type = "Real"; 607 Text _.from = "beta"; 608 Text _.to = "sigma2"; 609 Text _.expr = "sigma2::_.scale := VMatSum((beta::filter(beta::_.drawn))^2)" ]]) }; 581 610 model 582 611 };