so after you take say 5000 samples from a model how do you draw and example say 100 of those samples?
Here’s a snippet of how to grab the first sample from the first chain:
samp = idata.posterior.sel(draw=0, chain=0)
And here is a snippet to grab a single random sample from your trace:
samp = idata.posterior.sel(chain=np.random.choice(range(0,num_chains)),
draw=np.random.choice(range(0,num_samples))
)
thank you! How would I specify if I wanted a specific number of random samples?
You can either do this:
# number of samples to grab
n = 10
samp = idata.posterior.sel(chain=np.random.choice(range(0,num_chains,size=n)),
draw=np.random.choice(range(0,num_samples,size=n,replace=False))
)
However, this will only work when n<num_samples
. If you want more than that, you’ll have to do something like this:
# number of samples to grab
n = 20
# calculate how many samples that implies per chain
nperchain,rem = divmod(n, num_chains)
# make sure we have asked for a multiple of num_chains
assert(rem==0)
# generate random indicies
draw_idx = np.random.choice(np.arange(num_samples),
size=nperchain,
replace=False
)
# indices corresponding to each chain
chain_idx = np.arange(num_chains)
# get cartesian product of indices
prod = np.transpose([np.tile(chain_idx, len(draw_idx)), np.repeat(draw_idx, len(chain_idx))])
# grab samples
samps = idata.posterior.sel(chain=prod[:,0],
draw=prod[:,1]
)
This generates a list of indices and then grabs the corresponding samples from each chain. That would allow you to sample anywhere from num_chains
samples all the way up to num_samples * num_chains
samples.
You’re a life saver!
You can also use arviz.extract_dataset
: arviz.extract_dataset — ArviZ dev documentation. There are also several examples of working with InferenceData in Working with InferenceData — ArviZ dev documentation which I think will also be helpful.