Plotting priors in traceplot

There is a priors argument in traceplot, but it isn’t intuitive to use at all. Currently I call the function as pm.traceplot(trace, varnames, priors=[getattr(model[n], 'distribution', None) for n in varnames], combined=True), and it provides expected results for my cases (visually). But as I couldn’t find anything like this neither in documentation nor in discussion, I’m not sure if that’s always correct and will not give some nonsense results sometime? Or maybe there is a more straightforward method for this, as plotting priors taken from a model looks like the most common usecase for priors argument?

2 Likes

Yeah I dont think many ppl is using it, as it gets quite confusing with multi-chain and/or multivariate RVs. It is great for demonstration purpose in low dimension toy problems, a use case is something like this:

with pm.Model() as m:
    mu = pm.Normal('mu', 0, 1)
    sd = pm.HalfCauchy('sd', 1.5)
    obs = pm.Normal('obs', mu, sd, observed=np.random.randn(10)*2.5+1)
    trace = pm.sample()

pm.traceplot(trace, 
             combined=True,
             priors=[pm.Normal.dist(0., 1), pm.HalfCauchy.dist(2.5)]);

# this is also allow
pm.traceplot(trace, 
             combined=True,
             priors=[mu.distribution, sd.distribution]);

So yes I think what you are doing is correct at least in univariate cases.

Ok, thanks for confirmation :slight_smile:
And I personally often use such prior-plots when I suspect that the prior may have a strong influence. Multi-chain doesn’t look like a problem, as combined=True is needed even without prior-plots when there are multivariate RVs: otherwise the plots are way to messy.

2 Likes