Updating Priors with Posterior for Vector-Valued Distributions



I’m looking to build on the technique demonstrated in the “Updating Priors” notebook in the PyMC3 documentation. I have an initial model parameter which has a shape argument passed to indicate that it’s vector-valued.

Once I do an initial run of the model, is it possible to create, in a new model, an Interpolated parameter from the trace of my vector-valued parameter such that the shape is preserved from the original parameter? I tried doing a crude edit of the from_posterior function from the above notebook like so:

def from_posterior_multi(param, samples):
    smin, smax = np.min(samples, axis=0), np.max(samples, axis=0)
    width = smax - smin
    x = []
    y = []
    for i in range(width.shape[0]):
        x_i = np.linspace(smin[i], smax[i], 100)
        y_i = stats.gaussian_kde(samples[:,i])(x_i)
        # what was never sampled should have a small probability but not 0,
        # so we'll extend the domain and use linear approximation of density on it
        x.append(np.concatenate([[x_i[0] - 3 * width[i]], x_i, [x_i[-1] + 3 * width[i]]]))
        y.append(np.concatenate([[0], y_i, [0]]))
    return pm.Interpolated(param, x, y, shape=width.shape[0])

but I got the following error when I tried to create an Interpolated parameter this way:

error: failed in converting 2nd argument `y' of dfitpack.fpcurf0 to C/Fortran array

Am I trying to force pm.Interpolated to do something it doesn’t want to in terms of shape?
Apologies if I’ve missed the answer lurking somewhere here or in the docs!


Drawing from posterior of a Multivariate Distribution

pm.Interpolated is only meant for 1D random variables. So if you have a vector random variable, you need to apply pm.Interpolated separately for each element.


Hey thanks for the reply! If I want to iterate within a model context and create an Interpolated RV for each element, is there a good way to concatenate them back together if other variables in the model downstream depend on (advanced, in this case) indexing the vector-valued random variable?


I think it might help, but I am not sure how much as the interpolation RV is not particularly fast I think.


@jmharkins were you able to figure out a solution?