Many thanks again @ricardoV94 . The code now runs properly but does not converge to the correct values. First I generate some random values from my distribution:
from scipy.special import erf
L0 = 1e42
Lstar = 2.59e44
def schechter(logL, alpha, n42, a, b):
L = 10. ** logL
schechter = 10 ** n42 * (L / L0) ** (-alpha) * np.exp(- L / Lstar) * (L / Lstar)
selfunc = 0.5 + 0.5 * erf(a * (logL - b))
totmod = selfunc * schechter
return totmod
logLt = np.linspace(40., 45., 1000)
alpha = 1.8
n42 = np.log10(6e-3)
a = 5.
b = 41.
mod = schechter(logLt, alpha, n42, a, b)
prob_schechter = mod / np.sum(mod)
nsim = 1000
realiz = np.random.choice(logLt, nsim, p=prob_schechter)
Now here is how I coded it:
import aesara.tensor as T
def schechter_theano(logL, alpha, n42, a, b):
L = 10. ** logL
schechter = 10 ** n42 * (L / L0) ** (-alpha) * T.exp(- L / Lstar) * (L / Lstar)
selfunc = 0.5 + 0.5 * T.erf(a * (logL - b))
totmod = selfunc * schechter
return T.log(totmod)
with pm.Model() as model:
alpha = pm.Uniform('alpha', lower=0.5, upper=4.0)
n42 = pm.Uniform('n42', lower=0, upper=10)
a = pm.Uniform('a', lower=1, upper=8)
b = pm.Uniform('b', lower=40, upper=43)
obs = pm.DensityDist('obs', alpha, n42, a, b, logp=schechter_theano, observed=realiz)
trace = pm.sample()
This code runs fine but the fitted parameter values are way off. In the way I am calling my theano function, where is it specified that the variable is logL and the other arguments are parameters?