Nominal response model output?

518 views
Skip to first unread message

AM

unread,
Dec 22, 2020, 7:08:14 PM12/22/20
to mirt-package
Hi,

I have a question about the output of the nominal response model in the multidimensional case. Specifically, let's say we're fitting three factors to a set of items with six response categories.

The mirt documentation states:  In the nominal model this parametrization helps to identify the empirical ordering of the categories by inspecting the ak values. Larger values indicate that the item category is more positively related to the latent trait(s) being measured.

Putting aside the fact that I'm not looking to examine the empirical ordering of the categories, in the case where I'm not measuring one trait, but three traits, I would expect to get three sets of aks. However, the output of the coef function only lists one set of ak values.

I was wondering what am I understanding wrong and how can I correctly interpret the results of the fitted model. My hypothesis states that Factor 1 will be associated with response categories 1 and 2, Factor 2 with response categories 3 and 4 and Factor 3 with response categories 5 and 6, but I don't know how to accept/reject this conclusion without three sets of parameters.

AM

unread,
Dec 22, 2020, 7:09:24 PM12/22/20
to mirt-package
Edit: for the beginning, I'm fitting an exploratory model, so all categories are loaded on each factor.

Phil Chalmers

unread,
Jan 12, 2021, 11:29:38 PM1/12/21
to AM, mirt-package
Hi,

That's an interesting question, as indeed the item category orderings according to the ak values do act much like one would see in the unidimensional nominal response model. THe resolution in this case is that the latent traits are assumed to be compensatory, and so are first collapsed to a single composite dimension within the NRM. Then, the ak values are interpreted as ordered given this weighted linear composite. In your thinking I assume that you want a model where the categories themselves are conditional on the latent trait of interest, in a way that is kind of like a non-compensatory model. I'm not aware of such a specification in the literature, but if you can reason out a reasonable probability function that would reflect this associated structure then I'd be happy to show you how it can be fit using mirt's more general custom item specifications. HTH, and sorry for the belated reply.

Phil


--
You received this message because you are subscribed to the Google Groups "mirt-package" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mirt-package...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/mirt-package/ff009d8c-9757-4598-9c5c-a71464fd58b0n%40googlegroups.com.

AM

unread,
Jan 13, 2021, 2:30:25 AM1/13/21
to mirt-package
Hi Phil,

Thank you very much for your response and for the thorough explanation. I am looking to fit a model akin to the one in this article: 10....@10705511.2019.1668276 (Table 4). The table shows two different methods of calculation using exclusion constraints or deviation constraints, I really only need one of those and not both. In any case, I think the probability function is equation number 8 in the article. When you find some time, I would be really grateful if you could help me fit this model.

AM

unread,
Jan 13, 2021, 2:31:42 AM1/13/21
to mirt-package
Sorry, Google seems to automatically censor out a few characters from the DOI thinking it's an email address. The beginning of the DOI (before @) should be 10.1080

AM

unread,
Feb 13, 2021, 2:15:19 AM2/13/21
to mirt-package
Hi Phil,

I was wondering if maybe you could help out with this?

Best,
AM

Phil Chalmers

unread,
Mar 6, 2021, 8:31:02 PM3/6/21
to AM, mirt-package
I can take a look at some point, but am quite burdened with teaching and other admin work while the term is still running. I'll start having more time for research/outside interests when this semester ends. Sorry for the delayed replies.
Phil


smi...@rowan.edu

unread,
Mar 9, 2021, 9:14:33 PM3/9/21
to mirt-package
Greetings,
I am also interested in using a nominal model where the ak parameters are determined independently for each dimension. I've written something that might be helpful using the createItem() function (see below). I've run into a couple of problems here. One is that I can't figure out how to get the mirt() function to automatically determine the number of parameters like it usually does with the "nominal" model. This also means that I have specified the starting par and est objects with a particular number of categories and dimensions in mind. In the example below I've used 4 categories for each item, and I've assumed 2 dimensions. The aki parameters are ak for the first dimension, and akii are ak for the second dimension. The aki, akii, and dk for the first category are fixed at 0 and not estimated to be able to uniquely determine the parameters. The par and est objects have to be changed for different numbers of categories and dimensions, but the P.nomfull() function works for any number of categories and dimensions, so I think that's good to go.

The bigger problem I've encountered is that this is MUCH slower than the regular "nominal" model. This may be expected in the 2-dimensional case because there are more parameters to estimate, but I also found it to be much slower when I did a test using a 1-dimensional model. I'm not exactly sure why it's so much slower, but maybe it has something to do with the way mirt() handles custom items. So, this may not be the best solution, but it's something to start with. I hope someone might find it useful.

Best,
Trevor

ncat <- 4
par <- c(aki=seq(0, 1, 1/(ncat-1)), akii=seq(0, 1, 1/(ncat-1)), dk=c(0,rep(.4, ncat - 1)))
est <- c(F, rep(T, ncat - 1), F, rep(T, ncat - 1), F, rep(T, ncat - 1))
P.nomfull <- function(par, Theta, ncat){
  ndim <- ncol(Theta)
  ak <- matrix(0, ndim, ncat)
  for(j in 1:ndim){
    ak[j,] <- par[(ncat*(j-1)+1):(ncat*j)]
  }
  dk <- par[(ncat*ndim + 1):(ncat*(ndim + 1))]
  dmat <- matrix(rep(dk, nrow(Theta)), nrow = nrow(Theta), byrow = T)
  z <- Theta %*% ak + dmat
  P <- exp(z) / rowSums(exp(z))
  P
}
nomfull <- createItem(name = "fullNominal", par = par, est = est, P = P.nomfull)
nomtest <- mirt(Science, model = 2, itemtype = "fullNominal", customItems = list(fullNominal = nomfull)) 

Phil Chalmers

unread,
May 26, 2021, 11:29:11 AM5/26/21
to smi...@rowan.edu, mirt-package
I don't know why I didn't realize this before, but mirt can already handle this type of model through a bit of data manipulation. In the "Factor Analysis for Nominal (First Choice) Data" article's Table 4, you can see that each category gets its own unique intercept parameter as well as a unique combination of latent variables within each respective category. However, when setting up the model in this way when modeling polytomous response data you can just transform the polytomous responses into binary indicators (0-1), created whether the item was not equal or equal to the respective category level under investigation. So, a polytomous item with 4 responses, such as 

1
3
4
2
1
2

could be expressed as the matrix

1000
0010
0001
0100
1000
0100

and the columns treated as independent items to be fitted with, say, a 2PL model. This is what is performed by mirt::poly2dich() as this type of transformation can be a little tedious for a complete dataset. After setting up the data in this form it's just a matter of specifying the appropriate model and parameter constraints to properly identify an exploratory factor analysis model under this setup.

Here's an example using the Science dataset in mirt, which provides the same model information as the left part of Table 4. The model fails to converge in this case, but the concept is the same nonetheless.

#############
library(mirt)
head(Science)
newScience <- poly2dich(Science)
head(newScience)

model <- "
F1 = 1-3,5-7,9-11,13-15
F2 = 2-3,5-7,9-11,13-15
F3 = 3,5-7,9-11,13-15
START = (4,8,12,16, d, 0.0)
FIXED = (4,8,12,16, d)
"

mod <- mirt(newScience, model)
coef(mod, simplify=TRUE)

$items
                   a1      a2      a3       d g u
Comfort_cat.1   0.930   0.000   0.000  -4.830 0 1
Comfort_cat.2   3.257  -3.179   0.000  -7.022 0 1
Comfort_cat.3 -16.772  27.972   0.615  15.271 0 1
Comfort_cat.4   0.000   0.000   0.000   0.000 0 1
Work_cat.1      0.200   0.215  -0.369  -2.532 0 1
Work_cat.2      0.146   0.253  -0.102  -1.149 0 1
Work_cat.3     -0.319  -0.027   0.270   0.153 0 1
Work_cat.4      0.000   0.000   0.000   0.000 0 1
Future_cat.1    0.404  -0.510  -0.517  -3.676 0 1
Future_cat.2   17.575  14.985 -59.914 -67.357 0 1
Future_cat.3  -14.377   2.698  38.125   8.748 0 1
Future_cat.4    0.000   0.000   0.000   0.000 0 1
Benefit_cat.1   0.899  -0.428  -0.045  -3.355 0 1
Benefit_cat.2  42.951  44.407  11.154 -45.462 0 1
Benefit_cat.3 -53.327 -26.558 -14.412   3.704 0 1
Benefit_cat.4   0.000   0.000   0.000   0.000 0 1

$means
F1 F2 F3
 0  0  0

$cov
   F1 F2 F3
F1  1  0  0
F2  0  1  0
F3  0  0  1
#############

HTH.

Phil


AM

unread,
May 26, 2021, 12:02:11 PM5/26/21
to mirt-package
Thank you Phil, this is extremely helpful!

martin...@gmail.com

unread,
Dec 4, 2022, 2:46:17 PM12/4/22
to mirt-package
Pardon my ignorance if I'm missing something, but isn't this a slightly different model from that discussed in the Revuelta paper? It looks like poly2dich followed by independent 2PL models is essentially multiple one-vs-rest (OvR) binary logistic regressions, whereas the paper is using a multinomial logistic regression / softmax. As far as I can tell, these are similar in function but not identical, right? (see e.g. https://stats.stackexchange.com/q/52104 or https://stats.stackexchange.com/q/60087)
Reply all
Reply to author
Forward
0 new messages