My model contains arrays of stochastic univariate normal RVs and I want to constrain them to be in a monotonic order, x_0<x_1<x_2, and so on. I don’t care whether they are increasing or decreasing (so it can be x_0>x_1>x_2), they just need to be monotonic. Any idea how to code this?
Yes, you can pass a Ordered transformation to the init of the random variable.
Thanks! Do you have a trivial example? Will this allow a positive or negative order?
From my reading of the source code it looks like
Ordered only allows ordering in one direction, or am I reading it incorrectly?
EDIT: My reading was correct,
Ordered only allows monotonically increasing RVs. This minimal example,
import pymc3 as pm
if __name__ == '__main__':
ordered = pm.distributions.transforms.Ordered()
x = pm.Normal(
testval=[0.9, 0.1], # wrong order
pymc3.parallel_sampling.ParallelSamplingError: Bad initial energy.
You are right ordered transformation returns a sorted random variable. I think you would actually want it sorted as otherwise you will have multimodal that makes sampling difficult.