Opened 12 years ago
Last modified 12 years ago
#1652 accepted defect
BysMcmc: Fijando la Sigma2 con BSR
Reported by: | Pedro Gea | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | Kernel | Version: | 3.1 |
Severity: | normal | Keywords: | |
Cc: |
Description
Se encuentra un comportamiento inesperado al intentar fijar la Sigma2 de un nodo en BSR.
Para ello los métodos del import Get.Sigma2
y Get.SigmaPrior
devuelven respectivamente el real <Sigma2>
con el que se desea fijar y una cadena vacía (""
).
Con esto, la declaración en archivos .bsr (indicando una matriz de covarianza diagonal) queda como:
~ Normal(0,<Sigma2> * Cov = {$ VMatrix Eye(<N>); $});
pero el valor de esta <Sigma2>
se ignora, tomándose 1 en cualquier caso.
La especificación equivalente que fija la sigma con un prior:
~ Normal(0,SigmaBlk::<Node>::sigma2 ~ @Bsr.Sigma.Prior.InverseGamma(<Sigma2>,1) * Cov = {$ VMatrix Eye(<N>); $});
sí permite la estimación deseada, aunque añade un nuevo parámetro que permanece fijo durante toda la estimación.
Al tener una vía alternativa no supone un problema insavable, pero sería conveniente solucionar el comportamiento de BSR en el primer caso.
Attachments (2)
Change History (6)
comment:1 Changed 12 years ago by
Status: | new → accepted |
---|
comment:2 Changed 12 years ago by
comment:3 Changed 12 years ago by
Adjunto los archivos .bsr para reproducir un ejemplo muy sencillo: una regresión de una matriz de 100 datos (con una sigma de 0.2) y un input (con parámetro 0.2).
Si en la declaración del modelo (ejemplo: Test__2.bsr.rar
archivo primary.bsr
) se indica:
Submodel::Noise[100] ~ Normal(0,0.04 * Cov = {$ VMatrix Eye(100); $});
el resultado de la estimación del parámetro es:
1.97376791158 | 0.165202795771 |
Sin embargo (ejemplo: Test__2.bsr_2.rar
archivo primary.bsr
) si se indica:
Submodel::Noise[100] ~ Normal(0,SigmaBlk::Submodel::sigma2 ~ @Bsr.Sigma.Prior.InverseGamma(0.2,1) * Cov = {$ VMatrix Eye(100); $});
el coda.summary de los parámetros es:
1.97771475514 | 0.0724041984373 |
0.2 | 0.0 |
Para comprobar que el primer caso se está asumiendo erróneamente sigma = 1
podemos indicar:
Submodel::Noise[100] ~ Normal(0,SigmaBlk::Submodel::sigma2 ~ @Bsr.Sigma.Prior.InverseGamma(1,1) * Cov = {$ VMatrix Eye(100); $});
cuyos resultados son:
1.97260624419 | 0.162033674175 |
1.0 | 0.0 |
Changed 12 years ago by
Attachment: | Test__2.bsr.rar added |
---|
Changed 12 years ago by
Attachment: | Test__2.bsr_2.rar added |
---|
comment:4 Changed 12 years ago by
Aunque no afecta al hecho explicado en el ticket, quiero puntualizar que si lo que se quiere poner es un prior de sigma=0.2
, con el peso que se quiera, hay que tener en cuenta que el parámetro de escala de la estructura @Bsr.Sigma.Prior.InverseGamma
se refiere a la varianza y no a la desviación típica por lo que hay que pasarle 0.04
y no 0.02
Submodel::Noise[100] ~ Normal(0,SigmaBlk::Submodel::sigma2 ~ @Bsr.Sigma.Prior.InverseGamma(0.04,1) * Cov = {$ VMatrix Eye(100); $});
El resultado es entonces
varName | mean_ | sd_ |
Submodel__ExpTerm1__Linear.0 | 1.97364491913 | 0.0322626334469 |
SigmaBlk::Submodel::sigma2 | 0.04 | 0.0 |
que efectivamente incluye un parámetro sigma2 extra con cadena constante.
Mientras veo cómo solucionar el problema, el caso determinista o de sigma fija, se puede escribir alternativamente como
Submodel::Noise[100] ~ Normal(0,1 * Cov = {$ VMatrix Eye(100)*0.04; $});
cuyo resultado es congruente con el prior determinista anterior pero sin el absurdo parámetro sobrante
varName | mean_ | sd_ |
Submodel__ExpTerm1__Linear.0 | 1.97374398935 | 0.0327935176045 |
Necesitaría un ejemplo para poder replicar y arreglar este problema.