Specifying Shared Thresholds in Multivariate Ordinal Models

Hi,

I’d like to confirm if it’s possible to have shared thresholds for multivariate ordinal models in brms. My goal is to model a set of Likert items that use the same scale, where the thresholds are common but predictor effects are item-specific.

Assume I have data with N=100 where each person responds to two similar Likert questions (y1 and y2) and there are two predictor variables, X and Y. I can fit the model like this:

model = brm(
formula = bf(mvbind(y1, y2) ~ 1 + X + Y),
data = my_wide_data,
family = cumulative(“logit”)
)`

However, this gives me two sets of thresholds, one for y1 and another for y2. I don’t want this, as it’s reasonable to assume a person uses the Likert scale the same way for both responses.

In the mvord package, I could achieve this with threshold.constraints:

model = mvord(
formula = MMO2(y1, y2) ~ 1 + X + Y,
data = my_wide_data,
threshold.constraints = c(1, 1) # This forces both thresholds to be the same
)

Can I achieve something similar in brms? My research suggests the only solution is to reshape the data to a long format and add + (1|id) for repeated responses. Is that the only way to proceed here?

I could be wrong, but I think you’re right that this is what you’d have to do. I don’t think brms has anything analogous to threshold.constraints from mvord.

1 Like

Do you want to estimate the effect of X and Y on y1 and y2 separately? Then I believe this is equivalent to making this data long format, adding an indicator for which y response each row belongs to (which_y), and modeling the interactions X * which_y and Y * which_y.

I don’t want this, as it’s reasonable to assume a person uses the Likert scale the same way for both responses.

I could be wrong, but I’m not sure if this interpretation of the thresholds is entirely correct. The thresholds map the responses to the latent variable under study; is it reasonable to assume that the mapping is the same for both latent variables?

1 Like

Thanks for these replies! Yes, I want to estimate X and Y on y1 and y2 separately.

When ‘y1’ and ‘y2’ (and possibly many more) responses are collected using the same Likert question battery, I think people do consider levels similarly between questions. For example, consider this:


Why would a responder think the Likert scale (i.e., distances between options) would differ between, e.g., “Appeal” and “Looks” properties? Therefore, it would make sense to only estimate one set of thresholds that apply to all properties. Or am I missing something here…?

Finally, after some more thought, I think the following long format formula is closest to what ‘mvord’ does in taking into account varying correlations between responses:
y ~ 1 + which_y:(X + Y + X:Y) + (0 + which_y | id)
I should probably not use “which_y*(X + Y + X:Y)” as it results in additional terms.