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 Version 1 and Version 2 of OfficialTolArchiveNetworkMWG


Ignore:
Timestamp:
Jul 5, 2011, 7:19:48 PM (14 years ago)
Author:
Víctor de Buen Remiro
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OfficialTolArchiveNetworkMWG

    v1 v2  
    156156=== Variables aleatorias derivadas algebraicamente ===
    157157
    158 A los bloques derivados algebraicamente los llamaremos Algebraic Derived Random Variable (ADRV) y
     158A los bloques derivados algebraicamente los llamaremos Algebraic Derived Random Variable (RVOS) y
    159159permiten generar variables aleatorias que pueden ser muy complicadas de generar directamente, pero
    160160en cambio es trivial generarlas aplicando las operaciones sobre las generaciones de los argumentos.
     
    166166
    167167 * ''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)}}}
    171171 * ''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)}}}
    175175 * ''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)}}}
    179179 * ''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)}}}
    183183 * ''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)}}}
    187187 * ''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)}}}
    189189 * ''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)}}}
    193193 * ''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)}}}
    195195
    196196En este tipo de operaciones resulta trivial simular llamando al simulador de las variables aleatorias
     
    212212
    213213 * ''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)}}}
    216216 * ''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)}}}
    219219 * ''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)}}}
    223223 * ''Cholesky'':
    224   * {{{@ADRV.Chol.Prod::Create(VMatrix X, Text mode, @RandVar a)}}}: Aplica el factor de Cholesky de la matriz
     224  * {{{@RVOV.Chol.Prod::Create(VMatrix X, Text mode, @RandVar a)}}}: Aplica el factor de Cholesky de la matriz
    225225    dada a una v.a. El argumento mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz simétrica o de
    226226    un factor suyo.
    227   * {{{@ADRV.Chol.Solve.L::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*b=a }}} siendo L el
     227  * {{{@RVOV.Chol.Solve.L::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*b=a }}} siendo L el
    228228    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
    229229    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
     230  * {{{@RVOV.Chol.Solve.Lt::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L'*b=a }}} siendo L el
    231231    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
    232232    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
     233  * {{{@RVOV.Chol.Solve.LtL::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L'*L*b=a }}} siendo L el
    234234    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
    235235    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
     236  * {{{@RVOV.Chol.Solve.LLt::Create(VMatrix X, Text mode, @RandVar a)}}}: Resuelve el sistema {{{ L*L'*b=a }}} siendo L el
    237237    factor de Cholesky de la matriz dada. El argumento  mode puede ser "X","XtX" ó "XXt" según se disponga de la matriz
    238238    simétrica o de un factor suyo.
    239239 * ''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)}}}
     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)}}}
    242242    Es útil cuando X es regular y constante y los residuos son normales de media 0, independientes y homocedásticos
    243243    pues resulta muy eficaz en esos casos, especialmente si X es además sparse. Internamente se utiliza la descomposición
     
    555555=== Modelo de regresión normal con prior conjugado para la varianza ===
    556556
     557[[Image(source:tolp/OfficialTolArchiveNetwork/MWG/doc/esquema.01.dib)]]
     558
    557559{{{
    558560#!java
     
    565567{
    566568  @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);
    569572  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)" ]]) };
    581610  model
    582611};