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.

Opened 21 years ago

Closed 19 years ago

Last modified 18 years ago

#62 closed enhancement (later)

Problema de la funci� GibbsSampler

Reported by: jcaballero Owned by: Jorge
Priority: normal Milestone:
Component: Math Version: head
Severity: minor Keywords:
Cc:

Description

Hola a todos. Programando una distribución multivariante con GibsSampler hemos
apreciado una posible carencia en la función. A saber:

  • No permite introducir condiciones iniciales.
  • No permite introducir un contador para generar la función

Nos explicamos mejor con el siguiente ejemplo:

/
NormalMultivariate.TOL

PORPUSE: Generacion por muestreo de una Multinormal utilizando el método
de Gibs Sampler
/
Set Include("../sample/fun/funstat.tol");
/
1º Introduccion de datos
/
Struct multinormal_data
{

Matrix mean,
Matrix vars

};

Real dim = 2; dimensión de la normal
/
2º Creación del vector de medias y matriz varianzas covarianzas
/

Vector de medias
Set nu_ = For(1,dim,Set(Real k)
{

Round(Rand(0,20))?

});
Matrix nu = SetMat(nu_);
Set var_ = For(1,dim,Set(Real k)
{

Set filasup = For(1,k,Real(Real j)
{

Round(Rand(1,5))

});
Set filainf = For(k+1,dim,Real(Real m)
{

0

});
filasup << filainf

});
Matrix var = SetMat(Traspose(var_))*SetMat(var_);

Set medias = For(2,dim,Set(Real i)
{

Matrix mu2 = Sub(nu,i,1,1,1);
Matrix mu1 = Sub(nu,1,1,i-1,1);
SetOfMatrix(mu1,mu2)

});

Set mydata = multinormal_data(nu,var);
Set indice = SetOfReal(1);
/
3º Fórmulas condicionadas.
/

Set NormalConds = BinGroup("<<",For(1,dim,Set(Real k)
{

Real NormalCond(Real X, Matrix par, Real prev, Set data)
{

Matrix media = data->mean;
Matrix varia = data->vars;


/ AQUÍ ESTÁ EL PROBLEMA ¿CÓMO SE PUEDE HACER QUE indice SE MUEVA

CON EL BUCLE?

Set momentos = MomtCondMultNormal(par,indice,media,varia);


Real meanY = MatSet(momentos[1])[1][1];
Real varY = MatSet(momentos[2])[1][1];

-0.5 * Pow((X-meanY)/varY,2)

};
NormalCond?

}));

Set FullCondSpec1 = For(1,dim,Set(Real j)
{

NormalConds[j],mydata,-100,100,1?

});

WriteLn ("-------------------");
WriteLn (" Metodo1 :Sample1 " );
WriteLn ("-------------------");
Matrix Sample1 = GibbsSampler(FullCondSpec1, 100, 100);


Obsérvese que al ir generando las diversas normales multivariantes no es factible
declarárselas una a una, ya que se busca generalidad, para cualquier n. Por eso la
idea de crear una variable índice que vaya generando las distintas condicionadas.
Pero desafortunadamente la función:

Real NormalCond(Real X, Matrix par, Real prev, Set data)

del código del ejemplo, no permite introducirle un 5º parámetro que sea el índice
para controlar las normales(definido en el código como global con valor 1) ya que
GibsSampler es estricto en el sentido que sólo admite estos 4 parámetros.

Tampoco sirve mover el índice en el bucle pues la función no lo "recuerda" por ser
variable local.

¿Qué opinais? Una posible solución que se me ocurre es permitir que GibsSampler
admita la posibilidad de un quinto valor real.

Un saludo a todos.

Change History (3)

comment:1 Changed 21 years ago by Jorge

Severity: normalenhancement
Status: newassigned
Summary: Problema de la función GibbsSamplerProblema de la funci� GibbsSampler
Version: undefinedcvs

this is an enhancement and will be implemented.

comment:2 Changed 19 years ago by Jorge

Resolution: later
Status: assignedclosed

marked as LATER because the new function MetropolisHastings solve this problem.
May be GibbsSampler could be declared DEPRECATED.

comment:3 Changed 18 years ago by Víctor de Buen Remiro

bug_file_loc: http://www.tol-project.org
Note: See TracTickets for help on using tickets.