It makes sense if you take the generative process
to be i.i.d. followed by sorting.
For example, 5 i.i.d. normal variates sorted:
parameters {
vector[5] mu_raw;
}
transformed parameters {
ordered[5] mu;
mu <- sort_asc(mu_raw);
}
model {
mu_raw ~ normal(0,1);
}
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
mu_raw[1] 0.0 0 1.0 -2.0 -0.7 0.0 0.7 2.0 3240 1
mu_raw[2] 0.0 0 1.0 -1.9 -0.6 0.0 0.7 2.0 3012 1
mu_raw[3] 0.0 0 1.0 -1.9 -0.6 0.0 0.7 1.9 3602 1
mu_raw[4] 0.0 0 1.0 -1.9 -0.6 0.0 0.7 1.9 3478 1
mu_raw[5] 0.0 0 1.0 -1.9 -0.6 0.0 0.7 2.0 3191 1
mu[1] -1.1 0 0.6 -2.5 -1.5 -1.1 -0.7 0.0 2162 1
mu[2] -0.5 0 0.5 -1.6 -0.8 -0.5 -0.1 0.6 2687 1
mu[3] 0.0 0 0.5 -1.0 -0.3 0.0 0.4 1.0 3407 1
mu[4] 0.5 0 0.5 -0.5 0.1 0.5 0.9 1.6 2653 1
mu[5] 1.2 0 0.7 0.0 0.7 1.1 1.6 2.6 2159 1
lp__ -2.4 0 1.6 -6.3 -3.2 -2.1 -1.3 -0.4 1359 1
This is the same result as
parameters {
ordered[5] mu;
}
model {
mu ~ normal(0,1);
}
mean se_mean sd 2.5% 25% 50% 75% 97.5% n_eff Rhat
mu[1] -1.2 0.0 0.7 -2.6 -1.6 -1.1 -0.7 0.0 1060 1
mu[2] -0.5 0.0 0.5 -1.6 -0.8 -0.5 -0.1 0.5 2311 1
mu[3] 0.0 0.0 0.5 -1.0 -0.3 0.0 0.4 1.1 2627 1
mu[4] 0.5 0.0 0.5 -0.5 0.1 0.5 0.8 1.6 2953 1
mu[5] 1.1 0.0 0.7 0.0 0.7 1.1 1.6 2.5 2995 1
lp__ -6.6 0.1 1.7 -10.9 -7.6 -6.3 -5.3 -4.3 883 1
I ran both of these in R using
> fit <- stan("modelname.stan"));
and maximum split R-hat was 1.002 in both cases.
- Bob