使用mirt
包装,我的标称模型获得了(可能)奇怪的结果。
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)
我期望标称模型mod1
会有一条非常类似于我的正确答案的曲线mod0
。但是,似乎随着干扰角的增加,干扰物的概率也随之增加,这似乎并不合理。当然,数据可能有问题,或者(很可能是)我遗漏了一些..
我已经检查了mirt
帮助中的示例,结果与预期的一样。
任何建议(可能出了什么问题)将不胜感激!
最后一件事-我也尝试拟合2PLNRM
模型,但我的R会话中止了。有人注意到同样的问题吗?我的代码:
# 2PLNRM model
mod2 <- mirt(data, 1, "2PLNRM", key = key)
coef(mod2)$`Item 1`
itemplot(mod2, 1)
编辑: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)
结果是我所期望的,但是,当我尝试nominal
对所有项目拟合模型时,曲线发生了变化:
# nominal for all items
mod1 <- mirt(SAT12, 1, 'nominal')
coef(mod1)$Item.1
itemplot(mod1, 1)
因此,正如您所建议的,似乎theta及其解释发生了变化,但是为什么以及如何改变呢?
@Juan Bosco是正确的,此行为是一致的。对所有项目使用名义响应模型的问题在于,$ \ theta $值增加的方向在模型中不明显,因为它的方向是任意的(毕竟,默认情况下,项目是“无序的”)。
此外,由于mirt
的默认参数设置(假定最低/最高数值类别应与低/高$ \ theta $值相关联),因此这种类型的翻转在多个选择类型项中很常见(其中,与订购的等级量表不同数据,应该没有直接关系),因为模型会选择与这些识别约束条件最匹配的方向。
要解决此问题,只需mirt
将最高的固定评分系数替换为提供的实际评分键,即可重新定义使用的评分约束。像这样:
#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)
至少,这可以告知模型哪个类别是最高的,因此可以提供足够的信息来完成更合适的定位。请注意,这实际上并不会影响模型的解释,因为发生的只是将坡度乘以-1并相应地调整得分系数。HTH。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句