The natural way to represent a draw from a posterior distribution is as a NamedTuple whose keys are parameter names and whose values are the values. The values can be scalars, arrays, or arbitrary Julia objects. Then all draws for a chain are a vector of such NamedTuples, and we may have a vector of chains. When we convert to InferenceData, we would "flatten" until we get numeric arrays. Each element of such an array is a marginal draw, and this is useful for plotting and diagnostics.
Sometimes though users need the unflattened draws; e.g., when interacting with the PPL, one often needs draws in a format produced by the PPL, which will in general not look like a Dataset. In #11 we discuss ideas for not flattening. A simpler alternative is to provide utility functions for "unflattening". Here's an example of such a function:
The natural way to represent a draw from a posterior distribution is as a
NamedTuple
whose keys are parameter names and whose values are the values. The values can be scalars, arrays, or arbitrary Julia objects. Then all draws for a chain are a vector of suchNamedTuple
s, and we may have a vector of chains. When we convert toInferenceData
, we would "flatten" until we get numeric arrays. Each element of such an array is a marginal draw, and this is useful for plotting and diagnostics.Sometimes though users need the unflattened draws; e.g., when interacting with the PPL, one often needs draws in a format produced by the PPL, which will in general not look like a
Dataset
. In #11 we discuss ideas for not flattening. A simpler alternative is to provide utility functions for "unflattening". Here's an example of such a function:By passing
f=identity
, we can handle the case where draws are scalars or arrays of scalars:Other
f
s let us handle cases where draws are not array types. For example, here's how we might unflatten a real array representing complex draws:By applying this approach to all parameters in a
Dataset
, we can unflatten everything:I propose we add something like this utility to the API to make it easier to use InferenceObjects with PPLs.