philchalmers / mirt

Multidimensional item response theory
199 stars 75 forks source link

error using DIF return_models = TRUE #253

Closed begavett closed 1 month ago

begavett commented 1 month ago
library(mirt)
#> Loading required package: stats4
#> Loading required package: lattice
set.seed(491)
a1 <- a2 <- a3 <- matrix(abs(rnorm(15,1,.3)), ncol=1)

set.seed(8201)
d1 <- d2 <- d3 <- matrix(rnorm(15,0,.7),ncol=1)
a2[1:2, ] <- a1[1:2, ]/3
d3[c(1,3), ] <- d2[c(1,3), ]/4
head(data.frame(a.group1 = a1, a.group2 = a2, a.group3 = a3,
                d.group1 = d1, d.group2 = d2, d.group3 = d3))
#>   a.group1  a.group2 a.group3    d.group1    d.group2    d.group3
#> 1 1.170728 0.3902426 1.170728 -1.26223091 -1.26223091 -0.31555773
#> 2 1.058121 0.3527071 1.058121 -0.51946546 -0.51946546 -0.51946546
#> 3 1.191190 1.1911902 1.191190 -0.05570914 -0.05570914 -0.01392728
#> 4 1.078027 1.0780269 1.078027 -0.47294618 -0.47294618 -0.47294618
#> 5 1.238547 1.2385473 1.238547  0.48731368  0.48731368  0.48731368
#> 6 1.020715 1.0207154 1.020715 -0.72882216 -0.72882216 -0.72882216
itemtype <- rep('2PL', nrow(a1))
N <- 1000
dataset1 <- simdata(a1, d1, N, itemtype)
dataset2 <- simdata(a2, d2, N, itemtype, mu = .1, sigma = matrix(1.5))
dataset3 <- simdata(a3, d3, N, itemtype, mu = .2)
dat <- rbind(dataset1, dataset2, dataset3)
group <- gl(3, N, labels = c('g1', 'g2', 'g3'))

# equate the groups by assuming the last 5 items have no DIF
itemnames <- colnames(dat)
model <- multipleGroup(dat, group=group, SE=TRUE,
                       invariance = c(itemnames[11:ncol(dat)], 'free_means', 'free_var'))
#> Iteration: 1, Log-Lik: -27705.113, Max-Change: 0.53469Iteration: 2, Log-Lik: -27377.493, Max-Change: 0.17146Iteration: 3, Log-Lik: -27343.319, Max-Change: 0.07388Iteration: 4, Log-Lik: -27337.331, Max-Change: 0.03419Iteration: 5, Log-Lik: -27335.378, Max-Change: 0.01779Iteration: 6, Log-Lik: -27334.351, Max-Change: 0.01636Iteration: 7, Log-Lik: -27333.243, Max-Change: 0.02379Iteration: 8, Log-Lik: -27332.731, Max-Change: 0.01373Iteration: 9, Log-Lik: -27332.421, Max-Change: 0.01086Iteration: 10, Log-Lik: -27332.030, Max-Change: 0.02702Iteration: 11, Log-Lik: -27331.363, Max-Change: 0.00869Iteration: 12, Log-Lik: -27331.258, Max-Change: 0.00549Iteration: 13, Log-Lik: -27331.083, Max-Change: 0.00858Iteration: 14, Log-Lik: -27330.980, Max-Change: 0.00406Iteration: 15, Log-Lik: -27330.930, Max-Change: 0.00325Iteration: 16, Log-Lik: -27330.839, Max-Change: 0.00980Iteration: 17, Log-Lik: -27330.726, Max-Change: 0.00270Iteration: 18, Log-Lik: -27330.705, Max-Change: 0.00213Iteration: 19, Log-Lik: -27330.666, Max-Change: 0.00616Iteration: 20, Log-Lik: -27330.622, Max-Change: 0.00148Iteration: 21, Log-Lik: -27330.613, Max-Change: 0.00140Iteration: 22, Log-Lik: -27330.596, Max-Change: 0.00416Iteration: 23, Log-Lik: -27330.575, Max-Change: 0.00094Iteration: 24, Log-Lik: -27330.571, Max-Change: 0.00093Iteration: 25, Log-Lik: -27330.564, Max-Change: 0.00273Iteration: 26, Log-Lik: -27330.555, Max-Change: 0.00062Iteration: 27, Log-Lik: -27330.553, Max-Change: 0.00061Iteration: 28, Log-Lik: -27330.550, Max-Change: 0.00179Iteration: 29, Log-Lik: -27330.546, Max-Change: 0.00044Iteration: 30, Log-Lik: -27330.545, Max-Change: 0.00040Iteration: 31, Log-Lik: -27330.544, Max-Change: 0.00118Iteration: 32, Log-Lik: -27330.542, Max-Change: 0.00031Iteration: 33, Log-Lik: -27330.542, Max-Change: 0.00027Iteration: 34, Log-Lik: -27330.541, Max-Change: 0.00078Iteration: 35, Log-Lik: -27330.541, Max-Change: 0.00021Iteration: 36, Log-Lik: -27330.540, Max-Change: 0.00017Iteration: 37, Log-Lik: -27330.540, Max-Change: 0.00050Iteration: 38, Log-Lik: -27330.540, Max-Change: 0.00015Iteration: 39, Log-Lik: -27330.540, Max-Change: 0.00011Iteration: 40, Log-Lik: -27330.540, Max-Change: 0.00032Iteration: 41, Log-Lik: -27330.539, Max-Change: 0.00010Iteration: 42, Log-Lik: -27330.539, Max-Change: 0.00008
#> 
#> Calculating information matrix...
coef(model, simplify=TRUE)
#> $g1
#> $items
#>            a1      d g u
#> Item_1  1.218 -1.369 0 1
#> Item_2  1.054 -0.598 0 1
#> Item_3  1.198 -0.181 0 1
#> Item_4  1.061 -0.568 0 1
#> Item_5  1.160  0.347 0 1
#> Item_6  0.919 -0.789 0 1
#> Item_7  1.171  0.913 0 1
#> Item_8  0.995 -0.094 0 1
#> Item_9  0.911 -0.589 0 1
#> Item_10 0.559  0.260 0 1
#> Item_11 0.661  0.218 0 1
#> Item_12 1.239  0.754 0 1
#> Item_13 1.065  1.019 0 1
#> Item_14 1.587 -1.068 0 1
#> Item_15 1.148 -0.139 0 1
#> 
#> $means
#> F1 
#>  0 
#> 
#> $cov
#>    F1
#> F1  1
#> 
#> 
#> $g2
#> $items
#>            a1      d g u
#> Item_1  0.329 -1.188 0 1
#> Item_2  0.305 -0.524 0 1
#> Item_3  1.352 -0.200 0 1
#> Item_4  0.985 -0.558 0 1
#> Item_5  1.372  0.406 0 1
#> Item_6  1.079 -0.779 0 1
#> Item_7  0.805  0.774 0 1
#> Item_8  0.959 -0.134 0 1
#> Item_9  0.885 -0.903 0 1
#> Item_10 0.378  0.260 0 1
#> Item_11 0.661  0.218 0 1
#> Item_12 1.239  0.754 0 1
#> Item_13 1.065  1.019 0 1
#> Item_14 1.587 -1.068 0 1
#> Item_15 1.148 -0.139 0 1
#> 
#> $means
#>    F1 
#> 0.193 
#> 
#> $cov
#>       F1
#> F1 1.389
#> 
#> 
#> $g3
#> $items
#>            a1      d g u
#> Item_1  1.324 -0.442 0 1
#> Item_2  1.081 -0.660 0 1
#> Item_3  1.173 -0.179 0 1
#> Item_4  1.153 -0.515 0 1
#> Item_5  1.227  0.455 0 1
#> Item_6  1.022 -0.741 0 1
#> Item_7  0.938  0.715 0 1
#> Item_8  0.875 -0.108 0 1
#> Item_9  0.829 -0.744 0 1
#> Item_10 0.438  0.340 0 1
#> Item_11 0.661  0.218 0 1
#> Item_12 1.239  0.754 0 1
#> Item_13 1.065  1.019 0 1
#> Item_14 1.587 -1.068 0 1
#> Item_15 1.148 -0.139 0 1
#> 
#> $means
#>    F1 
#> 0.312 
#> 
#> $cov
#>       F1
#> F1 1.011

# omnibus tests
dif <- DIF(model, which.par = c('a1', 'd'), items2test=1:9)

# add return_models = TRUE
dif <- DIF(model, which.par = c('a1', 'd'), items2test=1:9, return_models = TRUE)
#> Error in converged[i] <- attr(res[[i]], "converged"): replacement has length zero

Created on 2024-05-13 with reprex v2.0.2

philchalmers commented 1 month ago

Thanks, patched.