Loading [MathJax]/jax/element/mml/optable/BasicLatin.js

1 votos

¿Por qué este algoritmo MCMC para estimar los parámetros de una ecuación lineal no converge a la distribución posterior?

Como una especie de prueba de principio estoy tratando de estimar los parámetros de una ecuación lineal (antes de pasar a las EDOs) utilizando el muestreo de Monte Carlo de cadenas de Markov. El post que estoy siguiendo se puede encontrar en este enlace https://sciencehouse.wordpress.com/2010/06/23/mcmc-and-fitting-models-to-data/

Esencialmente, lo que estoy haciendo no funciona y me pregunto si alguien puede detectar el motivo.

El modelo y=mx+c evaluado en m=2 y c=4 como un modelo lineal simple:

El algoritmo

  1. Inicializar m0 y c0 para que sean valores aleatorios (elegí arbitrariamente 25 para ambos) y evalúo una función que mide la discrepancia entre los datos experimentales y los simulados (donde, por supuesto, en este caso los datos experimentales también se simulan con los parámetros correctos). Utilizo la suma de cuadrados SSR :

SSR=(SimulatedDataExperimentalData)22sigma2

Dado que no hay error experimental en este modelo, se eligió arbitrariamente que sigma fuera 0,0001 en todos los casos.

  1. A continuación, comienzo un bucle y muestreo de anteriores m y c , produciendo mprop y cprop respectivamente, que se distribuyen uniformemente entre 0 y 100.
  2. Calcule el SSR con los parámetros muestreados
  3. Calcular el cociente de probabilidades LR : LR=exp[(ln(SSRproposed)+ln(SSRcurrent)2sigma2]
  4. Aceptar aleatoriamente los nuevos parámetros mediante un nuevo muestreo de la distribución uniforme entre 0 y 1 (lo llamamos r ). Si LR>r se aceptan los nuevos parámetros y mprop se convierte en m0 y cprop se convierte en c0

Como pregunta al margen, ¿por qué algunos dicen que la probabilidad de aceptación es min(1,LR) mientras que el puesto que estoy siguiendo utiliza la aceptación aleatoria?

  1. Iterar hasta la convergencia

Resultados

enter image description here enter image description here

---------edit--------------

Por cortesía de la respuesta de Joriki, he eliminado el 2sigma2 de la función de verosimilitud, de modo que el paso 4 queda así:

  1. Calcular el cociente de probabilidades LR : LR=exp[(ln(SSRproposed)+ln(SSRcurrent)]

Esto ha mejorado considerablemente los resultados: enter image description here

enter image description here

Código Matlab

Para completar y dar los detalles del algoritmo, aquí está el código que estoy usando para generar los gráficos:

interval=1:100;
y=mx_plus_c((2),interval,(4));
n=1e5; %iterations
results=zeros(n,8);
m0=25;
c0=25;
y_sim=mx_plus_c(m0,interval,c0);
SSR_cur=SSR(y,y_sim,0.0001);
mlb=log(1);   %lb lower bound, ub upper bound respoectively 
mub=log(100);
clb=log(1);
cub=log(100);
for i=1:n,
    m_prop   =   (mlb+(mub-mlb).*rand(1,1)   )   ;
    c_prop   =    (clb+(cub-clb).*rand(1,1)   )  ;
    SSR_prop=SSR(y,mx_plus_c(m_prop,interval,c_prop),0.0001);
    likelihood_ratio=exp((-log(SSR_prop)+log(SSR_cur)));
    r   =    ( (0+(1-0).*rand(1,1)   )  );
    if likelihood_ratio>r,
        m0=m_prop;
        c0=c_prop;
        SSR_cur=SSR_prop;
    end
    results(i,1)=m0;
    results(i,2)=c0;
    results(i,3)=SSR_cur;
    results(i,4)=m_prop;
    results(i,5)=c_prop;
    results(i,6)=SSR_prop;
    results(i,7)=likelihood_ratio;
    results(i,8)=r;

end
% results
figure(2)
hist(results(:,1),1000)
title('Distribution of m parameters','fontsize',16) 
xlabel('Parameter Values','fontsize',16)
ylabel('Frequency','fontsize',16)

figure(3)
hist(results(:,2),1000)
title('Distribution of c parameters','fontsize',16) 
xlabel('Parameter Values','fontsize',16)
ylabel('Frequency','fontsize',16)

Où : mx_plus_c es una función de Matlab:

function y=mx_plus_c(m,x,c)
y=m*[x]+c;
end

Y SSR también es una función de Matlab

function chi2 = SSR(sim,exp,sigma)
chi2 =sum(  (  ([sim]-[exp]).^2)./ ( 2*sigma^2) ) ;

1voto

JiminyCricket Puntos 143

Hay varios problemas; sin ver los detalles de la simulación, es difícil saber cuál de ellos, si es que hay alguno, está causando el fallo.

  • Cada vez eliges los parámetros de nuevo, no aprovechas los avances anteriores para mejorar los parámetros. La idea es proponer nuevos parámetros en la vecindad de los parámetros actuales, no tomar muestras de la misma distribución cada vez. (Lo que es exactamente la "vecindad" depende de la aplicación específica, y se puede cambiar con el tiempo para dar grandes pasos al principio y luego pasos cada vez más pequeños).
  • No creo que debas tomar el logaritmo y dividir por 2σ2 de nuevo en el cálculo de la relación de probabilidad - sólo debe exponer la diferencia entre los errores al cuadrado. Dado que su σ es pequeño, esto puede estar causando problemas.
  • No dices cómo determinas la convergencia. Con ese pequeño valor de σ y esa amplia previa que nunca cambias, si terminas después de un cierto número de intentos fallidos de cambiar los parámetros, esto puede estar dejándote en un lugar aleatorio porque es poco probable que progreses en cada paso.

Por lo general, para depurar este tipo de cosas, hay que observar los valores a medida que evolucionan y tratar de comprobar en cada etapa si lo que está ocurriendo se corresponde con lo que se esperaba que ocurriera, en lugar de limitarse a hacer un gran gráfico al final que no muestre lo que ha ido mal.

En cuanto a su pregunta complementaria, "¿por qué algunos dicen que la probabilidad de aceptación es min mientras que el post que estoy siguiendo utiliza la aceptación aleatoria", no entiendo la pregunta - utilizando una probabilidad de aceptación de \min(1,LR) es aceptación aleatoria (es decir, con una cierta probabilidad), y es exactamente lo que estás haciendo: Si LR\gt1 siempre aceptas, y si no, aceptas con probabilidad LR .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X