Python: Ajuste MCMC a datos con incertidumbres variables (usando lmfit)
Por favor, ten paciencia mientras trato de explicar lo que estoy tratando de hacer.
Estoy tratando de ajustar un modelo de arcotangente a algunos datos. Tengo dos mediciones independientes en mi conjunto de datos; una de ellas tiene incertidumbres desconocidas.
El modelo que estoy tratando de ajustar tiene la siguiente forma:
def modelo(x, s, d, c):
return (s/np.pi) * np.arctan(x/d) + c
Puedo ajustar el modelo a los datos del conjunto (con incertidumbres desconocidas) utilizando algo como esto:
params = lmfit.Parameters()
params['s'] = lmfit.Parameter(name='s', value=-3, min=-10, max=10)
params['d'] = lmfit.Parameter(name='d', value=15, min=0, max=30)
params['c'] = lmfit.Parameter(name='c', value=5, min=-10, max=10)
emcee_kws = dict(steps=10000, burn=300, thin=20, progress=True)
m = lmfit.Model(modelo)
result_emcee = m.fit(data=y, x=x, params=params, method='emcee', fit_kws=emcee_kws)
Pero lo que realmente me gustaría hacer es ajustar ambos conjuntos de datos simultáneamente teniendo en cuenta las incertidumbres variables de los datos.
¡Cualquier ayuda es muy apreciada!
davy.ai
Para ajustar ambos conjuntos de datos simultáneamente teniendo en cuenta las incertidumbres de los datos variables, se puede utilizar un enfoque bayesiano. Esto implica definir una función de verosimilitud que incorpore las incertidumbres, y utilizar métodos MCMC (cadenas de Markov Monte Carlo) para muestrear de la distribución posterior de los parámetros del modelo.
Una forma de hacer esto en Python es utilizar el paquete
emcee
en lugar delmfit
.emcee
es un paquete especializado en MCMC que se puede utilizar para ajustar modelos complejos a datos.Aquí tienes un ejemplo de cómo implementar este enfoque:
En este ejemplo,
x
,y1
yy2
son la variable independiente y dos conjuntos de datos, respectivamente.y1_err
es el array de incertidumbres para el primer conjunto de datos. La funciónln_verosimilitud
calcula la log-verosimilitud para ambos conjuntos de datos, ponderando los residuos del primer conjunto de datos por las incertidumbres. La funciónln_previo
define la distribución de probabilidad previa para los parámetros, y la funciónln_posterior
combina la verosimilitud y el previo para calcular la log-probabilidad posterior. Luego, se utiliza el objetoemcee.EnsembleSampler
para muestrear de la distribución posterior, utilizando un período de quemado para descartar cualquier muestra inicial deficiente.Una vez finalizado el muestreo, se extraen las muestras posteriores y se utilizan para calcular los valores de mejor ajuste e incertidumbres.