Modify prior logp using custom function

I would like to modify the priors in my model based on the results of a custom function. Something like:

with pm.Model() as model:
    x1 = pm.Normal('x1', 0, 1)
    x2 = pm.Normal('x2', 1, 2)
    logp_scaler = my_custom_function(x1, x2)

Then how would:

  • Modify the e.g. x1.logp(value) so that is equals x1.logp(value) * logp_scaler
  • Compute and apply the normalising constant so that my modified probabilities behave like probabilities?

Many thanks

You can simply add logp_scalar via a pymc.Potential If you want to access the logp of x1, you can write pm.logp(pm.Normal.dist(0, 1), x1) If you wanted to add that 5 times, you could multiply by 4 (4 because the logp of x1 is already considered once).

Alternatively you could give x a Flat and consider it 5 times in the Potential alone.

with pm.Model() as m:
  x = pm.Flat("x")
  x_logp = pm.Potential("x_logp", pm.logp(pm.Normal.dist(0, 1), x) * 5)

The 5 in that example could be the output of your custom function.

I don’t know. That probably depends on the exact function you have. Is your question on the PyMC side or on the probability side?

1 Like