有没有办法根据 TAM 中的模型对象模拟数据集?

Is there a way to simulate a dataset based on a model object in TAM?

所以我根据我拥有的这个数据集使用 TAM 包估计了一个多维 IRT 模型。

现在我有了 TAM 拟合对象,有什么方法可以用它来模拟我估计的那个模型的 "abides by the rules" 的新数据集?

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

提前致谢, KH

编辑

现在,自 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)

旧解决方案

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

但是,由于您的请求,我们正在研究这个非常有价值的功能,一旦该方法在 CRAN 上,我将更新此答案。

现在,让我们扩展该请求的示例: 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))
}

最好的, 汤姆