qp : quantile-parametrized PDF approximation

In a scientific inference we typically seek to characterize the posterior probability density function (PDF) for our parameter(s), which means we need to fund a suitable, calculable approximation to it. Popular choices include an ensemble of samples, a histogram estimator based on those samples, or (in 1 dimensional problems) a tabulation of the PDF on a regular parameter grid. qp is a python package that supports these approximations, as well as the “quantile parameterization” from which the package gets its name.

Quick examples

Building an ensemble

#Here we will create 100 Gaussians with means distributed between -1 and 1
#and widths distributed between 0.9 and 1.

locs = 2* (np.random.uniform(size=(100,1))-0.5)
scales = 1 + 0.2*(np.random.uniform(size=(100,1))-0.5)
ens_n = qp.Ensemble(qp.stats.norm, data=dict(loc=locs, scale=scales))


#Here we create a 100 PDF using the histogram representation and
#61 bins running from 0 to 3, filled with random values
bins = np.linspace(0, 3, 61)
pdfs = np.random.random((100, 61))

ens_h = qp.Ensemble(qp.hist, data=dict(bins=bins, pdfs=pdfs))

Evaluating functions of the distribution

# Here we will evaluate the pdfs() and cdfs() on a grid of 501 points from 0 to 3.
# Since there are 100 pdfs, this will return an array of shape (100, 501)
grid = np.linscape(0, 3, 501)
pdf_vals = ens_n.pdf(grid)
cdf_vals = ens_n.cdf(grid)

Converting an ensemble to a different representation

#Here we convert our ensemble of Gaussians to an representation using an interpolated grid
#with 201 grid points between 0 and 3

xvals = np.linspace(0, 3, 201)
ens_i = ens_n.convert_to(qp.interp_gen, xvals=vals)

Reading and writing ensembles

#Here we write our interpolated grid representation ensemble to an hdf5 file and read it back
ens_i.writeto("qp_interp_ensemble.hdf5")

ens_read = qp.read("qp_interp_ensemble.hdf5")

Computing a point estimate and storing it with the ensemble

#Here compute the mode (i.e., the location of the maximum) on a grid of 501 values
modes = ens_i.mode(grid=np.linspace(0, 3, 501)
ens_i.set_ancil(dict(modes=modes))

Sampling the pdf and storing the samples

#Pull 5 samples from each PDF, this will return an array of shape (100, 5)
samples = ens_i.rvs(size=5)
ens_i.set_ancil(dict(samples=samples))

Documentation Contents