有没有办法在TAM中基于模型对象模拟数据集?

时间:2015-06-30 08:23:15

标签: r simulation

所以我根据我的数据集估算了使用TAM包的多维IRT模型。

现在我有了TAM fit对象,有没有办法用它来模拟一个符合规则的新数据集"我估计那个模型?

这是类似的东西,但关于lme fit对象: https://stats.stackexchange.com/questions/11233/how-to-simulate-data-based-on-a-linear-mixed-model-fit-object-in-r

提前致谢, KH

1 个答案:

答案 0 :(得分:1)

修改

现在,由于TAM版本1.10-0,可以使用函数IRT.simulate(参见相应的帮助文件)。再次感谢您的要求。

library(TAM)
data(data.gpcm)
psych::describe(data.gpcm)
resp <- data.gpcm

# define three dimensions and different loadings of item categories 
# on these dimensions in B loading matrix
I <- 3  # 3 items
D <- 3  # 3 dimensions
# define loading matrix B
# 4 categories for each item (0, 1, 2, 3)
B <- array(0 , dim = c(I, 4, D))
for (ii in 1:I){
  B[ii, 1:4, 1] <- 0:3
  B[ii, 1, 2] <- 1    
  B[ii, 4, 3] <- 1
}
dimnames(B)[[1]] <- colnames(resp)            
B[1, , ]
##   > B[1,,]
##        [,1] [,2] [,3]
##   [1,]    0    1    0
##   [2,]    1    0    0
##   [3,]    2    0    0
##   [4,]    3    0    1
#-- test run
mod1 <- tam.mml(resp, B = B, control = list(snodes = 1000, maxiter = 5))

sim.dat <- IRT.simulate(mod1, nobs = 2000)

旧解决方案

我不会说这是不可能的。但是,目前它不是 easy ,因为它涉及处理TAM内部函数和估计对象的属性。也就是说,还没有一种方法可以让你在预先指定的特征点提取响应概率函数。

但是,由于您的要求,我们正在研究这一非常有价值的功能,并且只要该方法在CRAN上,我就会对此答案进行更新。

现在,让我们扩展该请求的示例:Implement ConQuest score command in TAM Alex还将tam函数的手册页中包含为EXAMPLE 20

data(data.gpcm)
psych::describe(data.gpcm)
resp <- data.gpcm

# define three dimensions and different loadings of item categories 
# on these dimensions in B loading matrix
I <- 3  # 3 items
D <- 3  # 3 dimensions
# define loading matrix B
# 4 categories for each item (0, 1, 2, 3)
B <- array(0 , dim = c(I, 4, D))
for (ii in 1:I){
  B[ii, 1:4, 1] <- 0:3
  B[ii, 1, 2] <- 1    
  B[ii, 4, 3] <- 1
}
dimnames(B)[[1]] <- colnames(resp)            
B[1, , ]
##   > B[1,,]
##        [,1] [,2] [,3]
##   [1,]    0    1    0
##   [2,]    1    0    0
##   [3,]    2    0    0
##   [4,]    3    0    1
#-- test run
mod1 <- tam.mml(resp, B = B, control = list(snodes = 1000, maxiter = 5))

现在我们提取计算响应概率所需的属性并生成新的测试者。

# Extract necessary item attributes
xsi <- mod1$xsi$xsi
A <- mod1$A
B <- mod1$B
maxK <- mod1$maxK

nI <- dim(A)[1]
iIndex <- 1:nI
AXsi <- matrix(0, nrow = nI, ncol = maxK)

# Simulate new testees
nnodes <- 2000
theta <- mvrnorm(n = nnodes, mod1$beta, mod1$variance)

可以通过调用内部函数来获取响应概率。

# Calculate response probablities and simulate
p <- TAM:::calc_prob.v5(iIndex, A, AXsi, B, xsi, theta, nnodes, maxK, recalc = TRUE)$rprobs 
p[,,1] # response probability of testee 1 to each category 0, 1, 2, 3 for all three items
#            [,1]      [,2]      [,3]      [,4]
# [1,] 0.06738066 0.8111365 0.1043441 0.0171387
# [2,] 0.02545206 0.4895568 0.3182046 0.1667866
# [3,] 0.04503185 0.5105446 0.3429603 0.1014633

有了这个,模拟成功削减并将其与响应概率进行比较。

sim.data <- matrix(runif(nnodes * nI), nrow = nnodes, ncol = nI)
for(pp in 1:nnodes){
  cat.success.pp <- (sim.data[pp, ] > t(apply(p[, , pp], 1, cumsum)))
  sim.data[pp, ] <-  c(cat.success.pp %*% rep(1, maxK))
}

最佳, 汤姆