En utilisant le package mirt, j'ai obtenu (éventuellement) des résultats étranges pour mon modèle nominal.

 library(difNLR)
 library(mirt)
 data("GMATtest", "GMATkey")
 key <- as.numeric(as.factor(GMATkey))
 data <- sapply(1:20, function(i) as.numeric(GMATtest[, i]))
 colnames(data) <- paste("Item", 1:ncol(data))
 scoredGMAT <- key2binary(data, key)

 # 2PL IRT model for scored data
 mod0 <- mirt(scoredGMAT, 1)
 # nominal model for unscored data
 mod1 <- mirt(data, 1, 'nominal')

# plots of characteristic curves for item 1
itemplot(mod0, 1)
itemplot(mod1, 1)

enter image description here enter image description here

Je m'attendais à ce que pour le modèle nominal mod1 il y ait une courbe très similaire à la bonne réponse comme tracée pour mon mod0. Cependant, il semble que les distracteurs aient une probabilité croissante avec l'augmentation du thêta, ce qui ne semble pas vraiment raisonnable. Bien sûr, il peut y avoir un problème avec les données ou (plus probablement) quelque chose me manque.

J'ai déjà vérifié des exemples dans l'aide de mirt et les résultats sont ceux que j'attendais.

Toutes les suggestions (ce qui peut être faux) seraient appréciées!

Une dernière chose - j'ai aussi essayé d'adapter le modèle 2PLNRM mais ma session R a été abandonnée. Quelqu'un a remarqué le même problème? Mon code:

# 2PLNRM model
mod2 <- mirt(data, 1, "2PLNRM", key = key)
coef(mod2)$`Item 1`
itemplot(mod2, 1)

MODIFIER: Il existe un exemple du package mirt:

library(mirt)
data(SAT12)
SAT12[SAT12 == 8] <- NA #set 8 as a missing value
head(SAT12)

# correct answer key
key <- c(1, 4, 5, 2, 3, 1, 2, 1, 3, 1, 2, 4, 2, 1, 5, 3, 4, 4, 1, 4, 3, 
         3, 4, 1, 3, 5, 1, 3, 1, 5, 4, 5)
scoredSAT12 <- key2binary(SAT12, key)
mod0 <- mirt(scoredSAT12, 1)

# for first 5 items use 2PLNRM and nominal
scoredSAT12[, 1:5] <- as.matrix(SAT12[, 1:5])
mod1 <- mirt(scoredSAT12, 1, c(rep('nominal', 5), rep('2PL', 27)))

coef(mod0)$Item.1
coef(mod1)$Item.1

itemplot(mod0, 1)
itemplot(mod1, 1)

Et les résultats sont ce à quoi je m'attendais, cependant, lorsque j'essaie d'ajuster le modèle nominal pour tous les éléments, les courbes ont changé:

# nominal for all items
mod1 <- mirt(SAT12, 1, 'nominal')
coef(mod1)$Item.1
itemplot(mod1, 1)

Donc, comme vous l'avez suggéré, il semble que thêta et son interprétation ont changé, mais pourquoi et comment?

r
1
Adela 16 janv. 2017 à 10:22

2 réponses

Meilleure réponse

@Juan Bosco a raison de dire que ce comportement est cohérent. Le problème avec l'utilisation du modèle de réponse nominal pour tous les éléments est que la direction d'une valeur $ \ theta $ croissante n'est pas évidente dans le modèle car sa direction est arbitraire (les éléments sont `` non ordonnés '' par défaut, après tout).

De plus, en raison du paramétrage par défaut de mirt, qui suppose que la catégorie numérique la plus basse / la plus élevée devrait être associée à des valeurs $ \ theta $ faible / élevée, ce type de retournement est courant dans les éléments de type à choix multiples (où , contrairement aux données ordonnées par échelle de notation, il ne devrait pas y avoir de relation directe) car le modèle choisira l'orientation qui correspond le mieux à ces contraintes d'identification.

Pour résoudre ce problème, redéfinissez simplement les contraintes de notation utilisées par mirt en remplaçant le coefficient de notation fixe le plus élevé par la clé de notation réelle fournie. Ainsi:

#starting values data.frame
sv <- mirt(data, 1, 'nominal', pars = 'values')
head(sv)

# set all values to 0 and estimated
sv$value[grepl('ak', sv$name)] <- 0
sv$est[grepl('ak', sv$name)] <- TRUE

nms <- colnames(data)
for(i in 1:length(nms)){

    #set highest category based on key fixed to 3
    pick <- paste0('ak', key[i]-1)
    index <- sv$item == nms[i] & pick == sv$name
    sv[index, 'value'] <- 3
    sv[index, 'est'] <- FALSE

    # set arbitrary lowest category fixed at 0
    if(pick == 'ak0') pick2 <- 'ak3'
    else pick2 <- paste0('ak', key[i]-2)
    index2 <- sv$item == nms[i] & pick2 == sv$name
    sv[index2, 'est'] <- FALSE
}

#estimate
mod2 <- mirt(data, 1, 'nominal', pars=sv)
plot(mod2, type = 'trace')
itemplot(mod2, 1)
coef(mod2, simplify=TRUE)

À tout le moins, cela informe le modèle de la catégorie la plus élevée et fournit donc suffisamment d'informations pour terminer avec une orientation plus appropriée. Notez que cela n'affecte pas vraiment l'interprétation du modèle en soi, car tout ce qui se passe, c'est que les pentes sont multipliées par -1 et les coefs de notation sont ajustés en conséquence. HTH.

1
philchalmers 19 janv. 2017 à 23:56

Eh bien, comme suggéré par Juan, le problème est que l'estimation de thêta est modifiée lors de l'utilisation d'un modèle IRT différent. De plus, il existe un lien entre les estimations du modèle 2PL et nominal.

library(difNLR)
library(mirt)
data("GMATtest", "GMATkey")
key <- as.numeric(as.factor(GMATkey))
data <- sapply(1:20, function(i) as.numeric(GMATtest[, i]))
colnames(data) <- paste("Item", 1:ncol(data))
scoredGMAT <- key2binary(data, key)

# 2PL IRT model for scored data
mod0 <- mirt(scoredGMAT, 1)
# nominal model for unscored data
mod1_all <- mirt(data, 1, 'nominal')
# nominal model for only first item
df <- data.frame(data[, 1], scoredGMAT[, 2:20])
mod1_1 <- mirt(df, 1, c('nominal', rep('2PL', 19)))

# plots of characteristic curves for item 1
itemplot(mod0, 1)
itemplot(mod1_all, 1)
itemplot(mod1_1, 1)

# factor scores
fs0 <- fscores(mod0)
fs1_all <- fscores(mod1_all)
fs1_1 <- fscores(mod1_1)


plot(fs1_all ~ fs0)
plot(fs1_1 ~ fs0)

enter image description here

# linear model
round(coef(lm(fs1_all ~ fs0)), 4)

(Intercept)         fs0 
    -0.0001     -0.9972 

Cela semble que le nouveau thêta ressemble à «ignoration» plutôt qu'à «connaissance», car il est presque moins thêta original.

Merci Juan pour vos idées, elles ont été vraiment utiles!

0
Adela 18 janv. 2017 à 09:35