# How to impose ordered constraints to model variables

Hi, everyone.

Lately, I have been learning Bayesian inference with Julia and Turing and trying to implement IRT(Item response model; logistic regression with latent variables).
Today, I ask a question related to ordered variables in Turing model.

Now, I want to model polytomous data using Graded Response Model (ordered logistic model with latent variables), which models categorical variables with some ordered threshold parameters.

then wrote the model as described below.

``````@model graded(data) = begin
N, J = size(data)
θ = Vector{Real}(undef, N)
α = Vector{Real}(undef, J)
β = Vector{Vector}(undef, J)
β_diff = Vector{Vector}(undef, J)
for j in 1:J
cat = sort(unique(skipmissing(data[:,j])))
K = length(cat)
α[j] ~ LogNormal(0, 2)
# Assign normal prior with ordered constraints
β[j] = Vector{Real}(undef, K-1)
β_diff[j] = Vector{Real}(undef, length(cat) - 2)
for k in 1:K - 1
if k == 1
β[j][k] ~ Normal(-3, 1)
else
β_diff[j][k-1] ~ Normal(0, 1)
β[j][k] = β[j][k - 1] + exp(β_diff[j][k-1])
end
end
end
# assign distributon to each element
for i in 1:N
θ[i] ~ Normal(0, 1)
end
for i in 1:N
for j in 1:J
data[i,j] ~ OrderedLogistic(α[j]*θ[i], β[j])
end
end
end
``````

This model seems to work well judging from simulation data, however, the prior settings about β and β_diff are not so intuitive that customizing prior is some tricky.

So, I come up with to use truncated distributions as follows.

``````		β[j] = Vector{Real}(undef, K-1)
bounds = [-Inf; sort(rand(Normal(0, 2), K-2)); Inf]
for k in 1:K-1
β[j][k] ~ truncated(Normal(0, 2), bounds[k], bounds[k+1])
end
``````

But this model returns the error below.

``````ERROR: cutpoints are not sorted
``````

Do you know the more sophisticated idea to handle ordered categorical variables in Turing?