Opened 15 years ago
Last modified 14 years ago
#888 closed defect
La función SliceSampler1D falla con dominios inconexos — at Version 1
Reported by: | Víctor de Buen Remiro | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | highest | Milestone: | Numerical methods |
Component: | BSR | Version: | 2.0.1 |
Severity: | blocker | Keywords: | |
Cc: |
Description (last modified by )
Tal y como se puede ver en el siguiente código TOL, la función SliceSampler1D falla a veces con dominios inconexos, es decir, cuando en parte del intervalo la densidad vale 0, o lo que es lo mismo su logaritmo es -Inf
.
Como no sucede de forma determinista hay que usar una semilla de geración distinta para reproducir cada caso posible.
Por lo que he podido ver, devuelve el último valor generado, por lo que si éste tiene densidad 0 el valor devuelto está fuera del dominio.
El ejemplo reproduce la simulación del coeficiente de grado 1 de un modelos AR puro de grado 6, tal y como lo hace internamente BSR.
////////////////////////////////////////////////////////////////////////////// // Semilla de generación aleatoria fijada para reproducir el comportamiento // exacto // // 3 de 8 no estacionarias incluida la última: devuelve el valor inicial // Real PutRandomSeed(1836343167); // // ninguna no estacionaria: devuelve una simulación válida // Real PutRandomSeed(1664310743); // // 2 de 8 no estacionarias, pero no la última: devuelve una simulación válida // Real PutRandomSeed(440791623); ////////////////////////////////////////////////////////////////////////////// Real PutRandomSeed(440791623); Real rndSeed = GetRandomSeed(0); WriteLn("TRACE rndSeed:"<<rndSeed); //Se define un modelo AR con un polinomio que tiene un dominio //inconexo de estacionariedad para el coeficiente de grado 1 Polyn ar = 1-0.09944049062890037*B +0.4208976407813203*B^2 -0.07979027150930651*B^3 -0.524509273364506*B^4 +0.1794384784972413*B^5 +0.01042162544590616*B^6; Polyn ma = 1; //Se copia el polinomio ma para evitar efectos secundarios en la evaluación Polyn p = Copy(ar); Real d = 1; //Esta función evalúa la estacionariedad de un polinomio pol con respecto al //coeficiente de grado d en el intervalo [-d,d] con longitud de paso h Matrix get.stationary.map(Polyn pol, Real d, Real h) { SetMat(EvalSet(Range(-d,d,h), Set(Real c) { Polyn p = Copy(pol); Real c_ = If(c, c, 1.E-10); Real PutCoef(p,d,c_); [[c,IsStationary(p)]] })) }; Matrix map = get.stationary.map(p,d,0.001); //Se debe comenzar por un polinomio que sea estacionario Real isStationary = IsStationary(ar); //Se generan aleatoriamente los residuos VMatrix res = Gaussian(1000,1,0,1); //Para ilustrar mejor como el dominio de estacioanriedad no es conexo //construimos series de ruidos en tres valores Real c1 = -0.5; VMatrix z1 = { Real PutCoef(p,d,c1); DifEq(ma/p,res) }; Real c2 = +0.3; VMatrix z2 = { Real PutCoef(p,d,c2); DifEq(ma/p,res) }; Real c3 = +0.7; VMatrix z3 = { Real PutCoef(p,d,c3); DifEq(ma/p,res) }; //Para las pruebas nos sirve cualquiera estacionario: tomamos el original //Retomamos el valor inicial VMatrix z = DifEq(ma/ar,res); Polyn p := Copy(ar); //Se genera el evaluador de la verosimilitud ARMA NameBlock almagro = ARMAProcess::Eval.Almagro(ar,ma,z,1); //Se calculan los valores iniciales condicionados VMatrix u0 = almagro::Draw.U_cond_Z(0); VMatrix z0 = almagro::Get.Z0(u0); VMatrix a0 = almagro::Get.A0(u0); //Se toma el coeficiente de grado 1 Real x0 = Coef(ar,d); Real L = -1; //Mínimo valor para el que se da estacionariedad Real U = 0.807; //Máximo valor para el que se da estacionariedad //Función de actualización del polinomio AR que devuelve cierto si es //estacionario con el nuevo coeficiente Real SetValue(Real x0) { //Se asegura de que no pone coeficiete 0 porque destruye la forma del //polinomio como vector de monomios. Es algo que habría que arreglar. Real x = If(1+x==1, 0.000001, x); Real PutCoef(p, d, x); Real isStationary = IsStationary(p); WriteLn("TRACE SetValue("<<x+") isStationary:"<<isStationary); isStationary }; //Función de evaluación del logaritmo de la densidad Real LogDens.Almagro.Z_cond_U(Real x) { Real llh = If(!SetValue(x), -1/0, { Copy(almagro::LogLH.Z_cond_U(p,ma,z0,a0)) }) ; WriteLn("TRACE LogDens.Almagro.Z_cond_U("<<x+") :"<<llh); llh }; //Llamada al método de simulación escalar slice Real x = MatDat(SliceSampler1D(LogDens.Almagro.Z_cond_U, L, U, x0),1,1); WriteLn("TRACE x="<<x);
Estas son las salidas que da el programa anterior para cada una de las semillas elegidas:
// 3 de 8 no estacionarias incluida la última: devuelve el valor inicial TRACE rndSeed:1836343167 TRACE SetValue(-0.09944049062890037) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09944049062890037) :-1387.086986834382 TRACE SetValue(-0.9900840071843289) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.9900840071843289) :-23313.37238721964 TRACE SetValue(0.009915992815671126) isStationary:0 TRACE LogDens.Almagro.Z_cond_U(0.009915992815671126) :-1.#INF TRACE SetValue(-0.9900840071843289) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.9900840071843289) :-23313.37238721964 TRACE SetValue(0.009915992815671126) isStationary:0 TRACE LogDens.Almagro.Z_cond_U(0.009915992815671126) :-1.#INF TRACE SetValue(-0.8559963063218914) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.8559963063218914) :-17243.20337303151 TRACE SetValue(-0.6656894964087795) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.6656894964087795) :-10313.15043543136 TRACE SetValue(-0.02358345558353336) isStationary:0 TRACE LogDens.Almagro.Z_cond_U(-0.02358345558353336) :-1.#INF TRACE x=-0.09944049062890037
//ninguna no estacionaria: devuelve una simulación válida TRACE rndSeed:1664310743 TRACE SetValue(-0.09944049062890037) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09944049062890037) :-1400.100045170432 TRACE SetValue(-0.09271461170849427) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09271461170849427) :-1400.667034074515 TRACE SetValue(-0.09271461170849427) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09271461170849427) :-1400.667034074515 TRACE SetValue(-0.2891919542795427) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.2891919542795427) :-2378.702930021611 TRACE SetValue(-0.2776974464241599) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.2776974464241599) :-2264.760232978221 TRACE SetValue(-0.1911206362276727) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.1911206362276727) :-1633.055504809866 TRACE SetValue(-0.1249158202167721) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.1249158202167721) :-1419.837272288265 TRACE SetValue(-0.1183620014027887) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.1183620014027887) :-1411.451378464228 TRACE SetValue(-0.1146000550613002) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.1146000550613002) :-1407.673101525984 TRACE SetValue(-0.1112400614714343) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.1112400614714343) :-1404.936913722732 TRACE SetValue(-0.1101893541977121) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.1101893541977121) :-1404.204911943004 TRACE SetValue(-0.1040738663446942) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.1040738663446942) :-1401.113552350067 TRACE SetValue(-0.09290987134805526) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09290987134805526) :-1400.616555105531 TRACE SetValue(-0.09519783142933348) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09519783142933348) :-1400.176636667713 TRACE SetValue(-0.09717720524250692) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09717720524250692) :-1400.021389962531 TRACE x=-0.09717720524250692
//2 de 8 no estacionarias, pero no la última: devuelve una simulación válida TRACE rndSeed:440791623 TRACE SetValue(-0.09944049062890037) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09944049062890037) :-1414.620951115607 TRACE SetValue(-0.8534963953190766) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.8534963953190766) :-15809.41847702517 TRACE SetValue(0.1465036046809234) isStationary:0 TRACE LogDens.Almagro.Z_cond_U(0.1465036046809234) :-1.#INF TRACE SetValue(-0.8534963953190766) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.8534963953190766) :-15809.41847702517 TRACE SetValue(0.1465036046809234) isStationary:0 TRACE LogDens.Almagro.Z_cond_U(0.1465036046809234) :-1.#INF TRACE SetValue(-0.407688048935803) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.407688048935803) :-3840.162568990362 TRACE SetValue(-0.2629580672722903) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.2629580672722903) :-2105.638034846308 TRACE SetValue(-0.09840860067143334) isStationary:1 TRACE LogDens.Almagro.Z_cond_U(-0.09840860067143334) :-1414.534033071261 TRACE x=-0.09840860067143334