Hi,
I have been struggling with this for considerable amount of time now and haven’t had much of a success. In short, I’m calibrating the parameters of the bunch of surrogate models (linear or/and RSM).
I often use Uniform distribution for priors but there are cases when I can be more “precise” with prior definition. I’ve tried various approaches and the code below is the closest to what I need except it only calibrates the last parameter (clearly the for loop doesn’t work as intended). Can you please advice on best way to implement this. I’ve tried np.append, tt.stack and tt.concatenate but just can’t get it right.
with pm.Model():
for i, pri in enumerate(pri_inputs):
if pri[0] == 1:
priors = pm.Uniform("priors_{}".format(i), lower=pri[1], upper=pri[2])
elif pri[0] == 2:
priors = pm.TruncatedNormal("priors_{}".format(i), mu=pri[1], sigma=pri[2], lower=pri[3], upper=pri[4])
# Define the surrogate models for the outputs using the priors defined above
linear = sm_linear * priors
rsm = tt.sum(sm_rsm * priors * priors.T, axis=2)
out_mu = sm_intercept + tt.sum(linear, axis=0) + tt.sum(rsm, axis=1)
# Define loglikelihood as Multivariate Normal with defined covariance matrix and observations
loglikelihood = pm.MvNormal(
"loglikelihood", mu=out_mu, cov=true_cov, observed=measured
)
# Inference
step = pm.NUTS() # using NUTS sampling
trace = pm.sample(3500, step=step, cores=1, progressbar=True)
If I assumed that all the priors are Uniform I can replace the for loop with the code below and the model works perfectly fine. Any suggestions would be much appreciated.
priors = pm.Uniform( "priors", pri_inputs[:, 1], pri_inputs[:, 2], shape=len(pri_inputs))[:, None]
Regards,
Pawel