DRF {mirt} | R Documentation |
Function performs various omnibus differential item (DIF), bundle (DBF), and test (DTF)
functioning procedures on an object
estimated with multipleGroup()
. The compensatory and non-compensatory statistics provided
are described in Chalmers (2018), which generally can be interpreted as IRT generalizations
of the SIBTEST and CSIBTEST statistics. For hypothesis tests, these measures
require the ACOV matrix to be computed in the
fitted multiple-group model (otherwise, sets of plausible draws from the posterior are explicitly
required).
DRF(
mod,
draws = NULL,
focal_items = 1L:extract.mirt(mod, "nitems"),
param_set = NULL,
den.type = "marginal",
best_fitting = FALSE,
CI = 0.95,
npts = 1000,
quadpts = NULL,
theta_lim = c(-6, 6),
Theta_nodes = NULL,
plot = FALSE,
DIF = FALSE,
DIF.cats = FALSE,
groups2test = "all",
pairwise = FALSE,
simplify = TRUE,
p.adjust = "none",
par.strip.text = list(cex = 0.7),
par.settings = list(strip.background = list(col = "#9ECAE1"), strip.border = list(col =
"black")),
auto.key = list(space = "right", points = FALSE, lines = TRUE),
verbose = TRUE,
...
)
mod |
a multipleGroup object which estimated only 2 groups |
draws |
a number indicating how many draws to take to form a suitable multiple imputation
or bootstrap estimate of the expected test scores (100 or more). If |
focal_items |
a character/numeric vector indicating which items to include in the DRF tests. The default uses all of the items (note that including anchors in the focal items has no effect because they are exactly equal across groups). Selecting fewer items will result in tests of 'differential bundle functioning' |
param_set |
an N x p matrix of parameter values drawn from the posterior (e.g., using the
parametric sampling approach, bootstrap, of MCMC). If supplied, then these will be used to compute
the DRF measures. Can be much more efficient to pre-compute these values if DIF, DBF, or DTF are
being evaluated within the same model (especially when using the bootstrap method).
See |
den.type |
character specifying how the density of the latent traits is computed.
Default is |
best_fitting |
logical; use the best fitting parametric distribution (Gaussian by default) that was used at the time of model estimation? This will result in much fast computations, however the results are more dependent upon the underlying modelling assumptions. Default is FALSE, which uses the empirical histogram approach |
CI |
range of confidence interval when using draws input |
npts |
number of points to use for plotting. Default is 1000 |
quadpts |
number of quadrature nodes to use when constructing DRF statistics. Default is extracted from the input model object |
theta_lim |
lower and upper limits of the latent trait (theta) to be evaluated, and is
used in conjunction with |
Theta_nodes |
an optional matrix of Theta values to be evaluated in the draws for the sDRF statistics. However, these values are not averaged across, and instead give the bootstrap confidence intervals at the respective Theta nodes. Useful when following up a large sDRF or uDRF statistic, for example, to determine where the difference between the test curves are large (while still accounting for sampling variability). Returns a matrix with observed variability |
plot |
logical; plot the 'sDRF' functions for the evaluated sDBF or sDTF values across the
integration grid or, if |
DIF |
logical; return a list of item-level imputation properties using the DRF statistics? These can generally be used as a DIF detection method and as a graphical display for understanding DIF within each item |
DIF.cats |
logical; same as |
groups2test |
when more than 2 groups are being investigated which two groups should be used in the effect size comparisons? |
pairwise |
logical; perform pairwise computations when the applying to multi-group settings |
simplify |
logical; attempt to simplify the output rather than returning larger lists? |
p.adjust |
string to be passed to the |
par.strip.text |
plotting argument passed to |
par.settings |
plotting argument passed to |
auto.key |
plotting argument passed to |
verbose |
logical; include additional information in the console? |
... |
additional arguments to be passed to |
The effect sizes estimates by the DRF function are
sDRF = \int [S(C|\bm{\Psi}^{(R)},\theta) S(C|\bm{\Psi}^{(F)},\theta)] f(\theta)d\theta,
uDRF = \int |S(C|\bm{\Psi}^{(R)},\theta) S(C|\bm{\Psi}^{(F)},\theta)| f(\theta)d\theta,
and
dDRF = \sqrt{\int [S(C|\bm{\Psi}^{(R)},\theta) S(C|\bm{\Psi}^{(F)},\theta)]^2 f(\theta)d\theta}
where S(.)
are the scoring equations used to evaluate the model-implied
difference between the focal and reference group. The f(\theta)
terms can either be estimated from the posterior via an empirical
histogram approach (default), or can use the best
fitting prior distribution that is obtain post-convergence (default is a Guassian
distribution). Note that, in comparison to Chalmers (2018), the focal group is
the leftmost scoring function while the reference group is the rightmost
scoring function. This is largely to keep consistent with similar effect
size statistics, such as SIBTEST, DFIT, Wainer's measures of impact, etc,
which in general can be seen as special-case estimators of this family.
Phil Chalmers rphilip.chalmers@gmail.com
Chalmers, R. P. (2018). Model-Based Measures for Detecting and Quantifying Response Bias. Psychometrika, 83(3), 696-732. doi:10.1007/s11336-018-9626-9
## No test:
set.seed(1234)
n <- 30
N <- 500
# only first 5 items as anchors
model <- 'F = 1-30
CONSTRAINB = (1-5, a1), (1-5, d)'
a <- matrix(1, n)
d <- matrix(rnorm(n), n)
group <- c(rep('Group_1', N), rep('Group_2', N))
## -------------
# groups completely equal
dat1 <- simdata(a, d, N, itemtype = 'dich')
dat2 <- simdata(a, d, N, itemtype = 'dich')
dat <- rbind(dat1, dat2)
mod <- multipleGroup(dat, model, group=group, SE=TRUE,
invariance=c('free_means', 'free_var'))
plot(mod)
plot(mod, which.items = 6:10) #DBF
plot(mod, type = 'itemscore')
plot(mod, type = 'itemscore', which.items = 10:15)
# empirical histogram approach
DRF(mod)
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 30 -0.326 0.326 0.328
DRF(mod, focal_items = 6:10) #DBF
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 5 -0.069 0.071 0.084
DRF(mod, DIF=TRUE)
## groups item sDIF uDIF dDIF
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.000 0.016 0.018
## 7 Group_1,Group_2 Item_7 -0.026 0.026 0.028
## 8 Group_1,Group_2 Item_8 -0.008 0.008 0.008
## 9 Group_1,Group_2 Item_9 -0.026 0.026 0.028
## 10 Group_1,Group_2 Item_10 -0.010 0.036 0.044
## 11 Group_1,Group_2 Item_11 -0.056 0.059 0.065
## 12 Group_1,Group_2 Item_12 -0.016 0.016 0.017
## 13 Group_1,Group_2 Item_13 -0.015 0.022 0.025
## 14 Group_1,Group_2 Item_14 -0.033 0.046 0.054
## 15 Group_1,Group_2 Item_15 -0.045 0.045 0.047
## 16 Group_1,Group_2 Item_16 -0.030 0.030 0.032
## 17 Group_1,Group_2 Item_17 0.018 0.019 0.023
## 18 Group_1,Group_2 Item_18 0.011 0.013 0.014
## 19 Group_1,Group_2 Item_19 -0.045 0.094 0.117
## 20 Group_1,Group_2 Item_20 -0.008 0.010 0.010
## 21 Group_1,Group_2 Item_21 -0.070 0.070 0.073
## 22 Group_1,Group_2 Item_22 0.017 0.020 0.024
## 23 Group_1,Group_2 Item_23 0.036 0.064 0.078
## 24 Group_1,Group_2 Item_24 0.040 0.040 0.042
## 25 Group_1,Group_2 Item_25 0.002 0.018 0.021
## 26 Group_1,Group_2 Item_26 -0.019 0.047 0.065
## 27 Group_1,Group_2 Item_27 -0.049 0.049 0.052
## 28 Group_1,Group_2 Item_28 0.027 0.029 0.031
## 29 Group_1,Group_2 Item_29 0.007 0.025 0.028
## 30 Group_1,Group_2 Item_30 -0.029 0.031 0.033
DRF(mod, DIF=TRUE, focal_items = 10:15)
## groups item sDIF uDIF dDIF
## 1 Group_1,Group_2 Item_10 -0.010 0.036 0.044
## 2 Group_1,Group_2 Item_11 -0.056 0.059 0.065
## 3 Group_1,Group_2 Item_12 -0.016 0.016 0.017
## 4 Group_1,Group_2 Item_13 -0.015 0.022 0.025
## 5 Group_1,Group_2 Item_14 -0.033 0.046 0.054
## 6 Group_1,Group_2 Item_15 -0.045 0.045 0.047
# Best-fitting Gaussian distributions
DRF(mod, best_fitting=TRUE)
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 30 -0.326 0.326 0.328
DRF(mod, focal_items = 6:10, best_fitting=TRUE) #DBF
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 5 -0.069 0.071 0.084
DRF(mod, DIF=TRUE, best_fitting=TRUE)
## groups item sDIF uDIF dDIF
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.000 0.016 0.018
## 7 Group_1,Group_2 Item_7 -0.026 0.026 0.028
## 8 Group_1,Group_2 Item_8 -0.008 0.008 0.008
## 9 Group_1,Group_2 Item_9 -0.026 0.026 0.028
## 10 Group_1,Group_2 Item_10 -0.010 0.036 0.045
## 11 Group_1,Group_2 Item_11 -0.056 0.059 0.065
## 12 Group_1,Group_2 Item_12 -0.016 0.016 0.017
## 13 Group_1,Group_2 Item_13 -0.015 0.023 0.025
## 14 Group_1,Group_2 Item_14 -0.033 0.046 0.054
## 15 Group_1,Group_2 Item_15 -0.045 0.045 0.047
## 16 Group_1,Group_2 Item_16 -0.030 0.030 0.032
## 17 Group_1,Group_2 Item_17 0.018 0.019 0.023
## 18 Group_1,Group_2 Item_18 0.011 0.013 0.014
## 19 Group_1,Group_2 Item_19 -0.045 0.094 0.118
## 20 Group_1,Group_2 Item_20 -0.008 0.010 0.010
## 21 Group_1,Group_2 Item_21 -0.070 0.070 0.073
## 22 Group_1,Group_2 Item_22 0.017 0.020 0.024
## 23 Group_1,Group_2 Item_23 0.036 0.064 0.078
## 24 Group_1,Group_2 Item_24 0.040 0.040 0.042
## 25 Group_1,Group_2 Item_25 0.002 0.019 0.021
## 26 Group_1,Group_2 Item_26 -0.019 0.047 0.065
## 27 Group_1,Group_2 Item_27 -0.049 0.049 0.052
## 28 Group_1,Group_2 Item_28 0.027 0.029 0.031
## 29 Group_1,Group_2 Item_29 0.007 0.025 0.028
## 30 Group_1,Group_2 Item_30 -0.029 0.031 0.033
DRF(mod, DIF=TRUE, focal_items = 10:15, best_fitting=TRUE)
## groups item sDIF uDIF dDIF
## 1 Group_1,Group_2 Item_10 -0.010 0.036 0.045
## 2 Group_1,Group_2 Item_11 -0.056 0.059 0.065
## 3 Group_1,Group_2 Item_12 -0.016 0.016 0.017
## 4 Group_1,Group_2 Item_13 -0.015 0.023 0.025
## 5 Group_1,Group_2 Item_14 -0.033 0.046 0.054
## 6 Group_1,Group_2 Item_15 -0.045 0.045 0.047
DRF(mod, plot = TRUE)
DRF(mod, focal_items = 6:10, plot = TRUE) #DBF
DRF(mod, DIF=TRUE, plot = TRUE)
DRF(mod, DIF=TRUE, focal_items = 10:15, plot = TRUE)
if(interactive()) mirtCluster()
DRF(mod, draws = 500)
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 30 -0.326 -1.007 0.416 0.841 1 0.359
## uDRF Group_1,Group_2 30 0.326 0.092 1.019 2.447 2 0.294
## dDRF Group_1,Group_2 30 0.328 0.112 1.140
DRF(mod, draws = 500, best_fitting=TRUE)
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 30 -0.326 -1.034 0.336 0.885 1 0.347
## uDRF Group_1,Group_2 30 0.326 0.095 1.042 2.342 2 0.31
## dDRF Group_1,Group_2 30 0.328 0.114 1.086
DRF(mod, draws = 500, plot=TRUE)
# pre-draw parameter set to save computations
# (more useful when using non-parametric bootstrap)
param_set <- draw_parameters(mod, draws = 500)
DRF(mod, focal_items = 6, param_set=param_set) #DIF test
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 1 0.000 -0.058 0.061 0 1 0.998
## uDRF Group_1,Group_2 1 0.016 0.006 0.079 0.809 2 0.667
## dDRF Group_1,Group_2 1 0.018 0.007 0.093
DRF(mod, DIF=TRUE, param_set=param_set) #DIF test
## $sDIF
## groups item sDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.000 -0.058 0.061 0 1 0.998
## 7 Group_1,Group_2 Item_7 -0.026 -0.090 0.041 0.675 1 0.411
## 8 Group_1,Group_2 Item_8 -0.008 -0.074 0.055 0.057 1 0.812
## 9 Group_1,Group_2 Item_9 -0.026 -0.083 0.035 0.71 1 0.399
## 10 Group_1,Group_2 Item_10 -0.010 -0.070 0.048 0.112 1 0.738
## 11 Group_1,Group_2 Item_11 -0.056 -0.111 0.000 3.424 1 0.064
## 12 Group_1,Group_2 Item_12 -0.016 -0.074 0.043 0.286 1 0.593
## 13 Group_1,Group_2 Item_13 -0.015 -0.075 0.044 0.257 1 0.612
## 14 Group_1,Group_2 Item_14 -0.033 -0.098 0.037 1.04 1 0.308
## 15 Group_1,Group_2 Item_15 -0.045 -0.102 0.014 2.566 1 0.109
## 16 Group_1,Group_2 Item_16 -0.030 -0.097 0.033 0.821 1 0.365
## 17 Group_1,Group_2 Item_17 0.018 -0.051 0.077 0.334 1 0.564
## 18 Group_1,Group_2 Item_18 0.011 -0.047 0.075 0.128 1 0.721
## 19 Group_1,Group_2 Item_19 -0.045 -0.103 0.007 2.569 1 0.109
## 20 Group_1,Group_2 Item_20 -0.008 -0.046 0.034 0.142 1 0.706
## 21 Group_1,Group_2 Item_21 -0.070 -0.131 -0.009 5.334 1 0.021
## 22 Group_1,Group_2 Item_22 0.017 -0.042 0.077 0.29 1 0.59
## 23 Group_1,Group_2 Item_23 0.036 -0.024 0.096 1.459 1 0.227
## 24 Group_1,Group_2 Item_24 0.040 -0.021 0.108 1.442 1 0.23
## 25 Group_1,Group_2 Item_25 0.002 -0.056 0.061 0.005 1 0.944
## 26 Group_1,Group_2 Item_26 -0.019 -0.072 0.039 0.455 1 0.5
## 27 Group_1,Group_2 Item_27 -0.049 -0.106 0.010 2.552 1 0.11
## 28 Group_1,Group_2 Item_28 0.027 -0.035 0.089 0.779 1 0.378
## 29 Group_1,Group_2 Item_29 0.007 -0.054 0.073 0.053 1 0.818
## 30 Group_1,Group_2 Item_30 -0.029 -0.087 0.030 0.934 1 0.334
##
## $uDIF
## groups item uDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.016 0.006 0.079 0.809 2 0.667
## 7 Group_1,Group_2 Item_7 0.026 0.007 0.090 2.081 2 0.353
## 8 Group_1,Group_2 Item_8 0.008 0.005 0.078 0.196 2 0.907
## 9 Group_1,Group_2 Item_9 0.026 0.007 0.087 2.361 2 0.307
## 10 Group_1,Group_2 Item_10 0.036 0.008 0.088 3.785 2 0.151
## 11 Group_1,Group_2 Item_11 0.059 0.019 0.115 9.802 2 0.007
## 12 Group_1,Group_2 Item_12 0.016 0.006 0.078 0.862 2 0.65
## 13 Group_1,Group_2 Item_13 0.022 0.007 0.081 1.881 2 0.39
## 14 Group_1,Group_2 Item_14 0.046 0.015 0.110 5.833 2 0.054
## 15 Group_1,Group_2 Item_15 0.045 0.013 0.102 6.172 2 0.046
## 16 Group_1,Group_2 Item_16 0.030 0.008 0.098 2.346 2 0.309
## 17 Group_1,Group_2 Item_17 0.019 0.006 0.084 0.978 2 0.613
## 18 Group_1,Group_2 Item_18 0.013 0.006 0.078 0.438 2 0.803
## 19 Group_1,Group_2 Item_19 0.094 0.045 0.153 22.77 2 0
## 20 Group_1,Group_2 Item_20 0.010 0.004 0.052 0.551 2 0.759
## 21 Group_1,Group_2 Item_21 0.070 0.021 0.131 12.597 2 0.002
## 22 Group_1,Group_2 Item_22 0.020 0.005 0.086 1.009 2 0.604
## 23 Group_1,Group_2 Item_23 0.064 0.018 0.117 7.009 2 0.03
## 24 Group_1,Group_2 Item_24 0.040 0.009 0.108 2.211 2 0.331
## 25 Group_1,Group_2 Item_25 0.018 0.008 0.076 1.154 2 0.562
## 26 Group_1,Group_2 Item_26 0.047 0.016 0.100 7.134 2 0.028
## 27 Group_1,Group_2 Item_27 0.049 0.008 0.106 6.028 2 0.049
## 28 Group_1,Group_2 Item_28 0.029 0.007 0.091 1.693 2 0.429
## 29 Group_1,Group_2 Item_29 0.025 0.007 0.089 1.543 2 0.462
## 30 Group_1,Group_2 Item_30 0.031 0.008 0.093 3.067 2 0.216
##
## $dDIF
## groups item dDIF CI_2.5 CI_97.5
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.018 0.007 0.093
## 7 Group_1,Group_2 Item_7 0.028 0.008 0.100
## 8 Group_1,Group_2 Item_8 0.008 0.006 0.089
## 9 Group_1,Group_2 Item_9 0.028 0.008 0.097
## 10 Group_1,Group_2 Item_10 0.044 0.010 0.110
## 11 Group_1,Group_2 Item_11 0.065 0.020 0.126
## 12 Group_1,Group_2 Item_12 0.017 0.007 0.088
## 13 Group_1,Group_2 Item_13 0.025 0.009 0.086
## 14 Group_1,Group_2 Item_14 0.054 0.017 0.126
## 15 Group_1,Group_2 Item_15 0.047 0.016 0.108
## 16 Group_1,Group_2 Item_16 0.032 0.009 0.104
## 17 Group_1,Group_2 Item_17 0.023 0.007 0.099
## 18 Group_1,Group_2 Item_18 0.014 0.006 0.092
## 19 Group_1,Group_2 Item_19 0.117 0.057 0.187
## 20 Group_1,Group_2 Item_20 0.010 0.006 0.076
## 21 Group_1,Group_2 Item_21 0.073 0.024 0.135
## 22 Group_1,Group_2 Item_22 0.024 0.006 0.097
## 23 Group_1,Group_2 Item_23 0.078 0.020 0.140
## 24 Group_1,Group_2 Item_24 0.042 0.010 0.119
## 25 Group_1,Group_2 Item_25 0.021 0.009 0.087
## 26 Group_1,Group_2 Item_26 0.065 0.019 0.136
## 27 Group_1,Group_2 Item_27 0.052 0.009 0.116
## 28 Group_1,Group_2 Item_28 0.031 0.008 0.102
## 29 Group_1,Group_2 Item_29 0.028 0.008 0.105
## 30 Group_1,Group_2 Item_30 0.033 0.010 0.106
DRF(mod, focal_items = 6:10, param_set=param_set) #DBF test
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 5 -0.069 -0.241 0.103 0.597 1 0.44
## uDRF Group_1,Group_2 5 0.071 0.019 0.245 2.118 2 0.347
## dDRF Group_1,Group_2 5 0.084 0.023 0.278
DRF(mod, param_set=param_set) #DTF test
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 30 -0.326 -0.925 0.355 0.947 1 0.33
## uDRF Group_1,Group_2 30 0.326 0.075 1.000 2.69 2 0.261
## dDRF Group_1,Group_2 30 0.328 0.090 1.047
DRF(mod, focal_items = 6:10, draws=500) #DBF test
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 5 -0.069 -0.238 0.102 0.63 1 0.427
## uDRF Group_1,Group_2 5 0.071 0.020 0.251 2.236 2 0.327
## dDRF Group_1,Group_2 5 0.084 0.024 0.283
DRF(mod, focal_items = 10:15, draws=500) #DBF test
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 6 -0.175 -0.384 0.035 2.698 1 0.1
## uDRF Group_1,Group_2 6 0.175 0.041 0.382 6.734 2 0.034
## dDRF Group_1,Group_2 6 0.185 0.051 0.409
DIFs <- DRF(mod, draws = 500, DIF=TRUE)
print(DIFs)
## $sDIF
## groups item sDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.000 -0.065 0.064 0 1 0.998
## 7 Group_1,Group_2 Item_7 -0.026 -0.097 0.029 0.676 1 0.411
## 8 Group_1,Group_2 Item_8 -0.008 -0.067 0.053 0.061 1 0.805
## 9 Group_1,Group_2 Item_9 -0.026 -0.088 0.030 0.711 1 0.399
## 10 Group_1,Group_2 Item_10 -0.010 -0.066 0.055 0.112 1 0.738
## 11 Group_1,Group_2 Item_11 -0.056 -0.115 -0.001 3.612 1 0.057
## 12 Group_1,Group_2 Item_12 -0.016 -0.076 0.038 0.304 1 0.581
## 13 Group_1,Group_2 Item_13 -0.015 -0.076 0.039 0.239 1 0.625
## 14 Group_1,Group_2 Item_14 -0.033 -0.088 0.028 1.175 1 0.278
## 15 Group_1,Group_2 Item_15 -0.045 -0.102 0.016 2.391 1 0.122
## 16 Group_1,Group_2 Item_16 -0.030 -0.091 0.030 0.956 1 0.328
## 17 Group_1,Group_2 Item_17 0.018 -0.045 0.074 0.31 1 0.578
## 18 Group_1,Group_2 Item_18 0.011 -0.048 0.071 0.12 1 0.729
## 19 Group_1,Group_2 Item_19 -0.045 -0.106 0.012 2.22 1 0.136
## 20 Group_1,Group_2 Item_20 -0.008 -0.048 0.033 0.159 1 0.69
## 21 Group_1,Group_2 Item_21 -0.070 -0.134 -0.013 4.877 1 0.027
## 22 Group_1,Group_2 Item_22 0.017 -0.049 0.081 0.277 1 0.599
## 23 Group_1,Group_2 Item_23 0.036 -0.027 0.087 1.471 1 0.225
## 24 Group_1,Group_2 Item_24 0.040 -0.022 0.102 1.646 1 0.2
## 25 Group_1,Group_2 Item_25 0.002 -0.063 0.054 0.005 1 0.944
## 26 Group_1,Group_2 Item_26 -0.019 -0.071 0.031 0.544 1 0.461
## 27 Group_1,Group_2 Item_27 -0.049 -0.117 0.003 2.54 1 0.111
## 28 Group_1,Group_2 Item_28 0.027 -0.035 0.087 0.798 1 0.372
## 29 Group_1,Group_2 Item_29 0.007 -0.056 0.064 0.058 1 0.81
## 30 Group_1,Group_2 Item_30 -0.029 -0.098 0.026 0.89 1 0.345
##
## $uDIF
## groups item uDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.016 0.008 0.084 0.723 2 0.697
## 7 Group_1,Group_2 Item_7 0.026 0.009 0.097 1.93 2 0.381
## 8 Group_1,Group_2 Item_8 0.008 0.006 0.081 0.206 2 0.902
## 9 Group_1,Group_2 Item_9 0.026 0.008 0.091 2.192 2 0.334
## 10 Group_1,Group_2 Item_10 0.036 0.011 0.093 3.933 2 0.14
## 11 Group_1,Group_2 Item_11 0.059 0.017 0.118 10.277 2 0.006
## 12 Group_1,Group_2 Item_12 0.016 0.005 0.078 0.908 2 0.635
## 13 Group_1,Group_2 Item_13 0.022 0.008 0.082 1.788 2 0.409
## 14 Group_1,Group_2 Item_14 0.046 0.009 0.103 5.854 2 0.054
## 15 Group_1,Group_2 Item_15 0.045 0.012 0.104 5.895 2 0.052
## 16 Group_1,Group_2 Item_16 0.030 0.010 0.095 2.606 2 0.272
## 17 Group_1,Group_2 Item_17 0.019 0.007 0.082 1.022 2 0.6
## 18 Group_1,Group_2 Item_18 0.013 0.008 0.086 0.348 2 0.84
## 19 Group_1,Group_2 Item_19 0.094 0.047 0.147 22.07 2 0
## 20 Group_1,Group_2 Item_20 0.010 0.004 0.054 0.565 2 0.754
## 21 Group_1,Group_2 Item_21 0.070 0.022 0.134 10.634 2 0.005
## 22 Group_1,Group_2 Item_22 0.020 0.007 0.087 1.044 2 0.593
## 23 Group_1,Group_2 Item_23 0.064 0.019 0.118 7.265 2 0.026
## 24 Group_1,Group_2 Item_24 0.040 0.010 0.102 2.698 2 0.26
## 25 Group_1,Group_2 Item_25 0.018 0.005 0.088 0.88 2 0.644
## 26 Group_1,Group_2 Item_26 0.047 0.014 0.097 7.008 2 0.03
## 27 Group_1,Group_2 Item_27 0.049 0.010 0.117 5.785 2 0.055
## 28 Group_1,Group_2 Item_28 0.029 0.008 0.088 1.811 2 0.404
## 29 Group_1,Group_2 Item_29 0.025 0.008 0.085 1.771 2 0.412
## 30 Group_1,Group_2 Item_30 0.031 0.008 0.098 2.947 2 0.229
##
## $dDIF
## groups item dDIF CI_2.5 CI_97.5
## 1 Group_1,Group_2 Item_1 0.000 0.000 0.000
## 2 Group_1,Group_2 Item_2 0.000 0.000 0.000
## 3 Group_1,Group_2 Item_3 0.000 0.000 0.000
## 4 Group_1,Group_2 Item_4 0.000 0.000 0.000
## 5 Group_1,Group_2 Item_5 0.000 0.000 0.000
## 6 Group_1,Group_2 Item_6 0.018 0.009 0.096
## 7 Group_1,Group_2 Item_7 0.028 0.010 0.102
## 8 Group_1,Group_2 Item_8 0.008 0.007 0.092
## 9 Group_1,Group_2 Item_9 0.028 0.009 0.101
## 10 Group_1,Group_2 Item_10 0.044 0.013 0.117
## 11 Group_1,Group_2 Item_11 0.065 0.019 0.125
## 12 Group_1,Group_2 Item_12 0.017 0.007 0.090
## 13 Group_1,Group_2 Item_13 0.025 0.009 0.096
## 14 Group_1,Group_2 Item_14 0.054 0.010 0.120
## 15 Group_1,Group_2 Item_15 0.047 0.015 0.113
## 16 Group_1,Group_2 Item_16 0.032 0.010 0.105
## 17 Group_1,Group_2 Item_17 0.023 0.007 0.097
## 18 Group_1,Group_2 Item_18 0.014 0.009 0.094
## 19 Group_1,Group_2 Item_19 0.117 0.055 0.184
## 20 Group_1,Group_2 Item_20 0.010 0.006 0.076
## 21 Group_1,Group_2 Item_21 0.073 0.024 0.139
## 22 Group_1,Group_2 Item_22 0.024 0.008 0.096
## 23 Group_1,Group_2 Item_23 0.078 0.022 0.142
## 24 Group_1,Group_2 Item_24 0.042 0.011 0.109
## 25 Group_1,Group_2 Item_25 0.021 0.006 0.103
## 26 Group_1,Group_2 Item_26 0.065 0.016 0.136
## 27 Group_1,Group_2 Item_27 0.052 0.012 0.126
## 28 Group_1,Group_2 Item_28 0.031 0.010 0.100
## 29 Group_1,Group_2 Item_29 0.028 0.009 0.095
## 30 Group_1,Group_2 Item_30 0.033 0.009 0.102
DRF(mod, draws = 500, DIF=TRUE, plot=TRUE)
DIFs <- DRF(mod, draws = 500, DIF=TRUE, focal_items = 6:10)
print(DIFs)
## $sDIF
## groups item sDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_6 0.000 -0.065 0.061 0 1 0.998
## 2 Group_1,Group_2 Item_7 -0.026 -0.092 0.036 0.682 1 0.409
## 3 Group_1,Group_2 Item_8 -0.008 -0.072 0.049 0.057 1 0.811
## 4 Group_1,Group_2 Item_9 -0.026 -0.088 0.034 0.719 1 0.397
## 5 Group_1,Group_2 Item_10 -0.010 -0.074 0.051 0.102 1 0.75
##
## $uDIF
## groups item uDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_6 0.016 0.006 0.082 0.689 2 0.708
## 2 Group_1,Group_2 Item_7 0.026 0.010 0.092 2.077 2 0.354
## 3 Group_1,Group_2 Item_8 0.008 0.007 0.078 0.203 2 0.903
## 4 Group_1,Group_2 Item_9 0.026 0.007 0.089 2.212 2 0.331
## 5 Group_1,Group_2 Item_10 0.036 0.010 0.092 3.641 2 0.162
##
## $dDIF
## groups item dDIF CI_2.5 CI_97.5
## 1 Group_1,Group_2 Item_6 0.018 0.006 0.096
## 2 Group_1,Group_2 Item_7 0.028 0.011 0.100
## 3 Group_1,Group_2 Item_8 0.008 0.008 0.092
## 4 Group_1,Group_2 Item_9 0.028 0.008 0.099
## 5 Group_1,Group_2 Item_10 0.044 0.011 0.117
DRF(mod, draws = 500, DIF=TRUE, focal_items = 6:10, plot = TRUE)
DRF(mod, DIF=TRUE, focal_items = 6)
## groups item sDIF uDIF dDIF
## 1 Group_1,Group_2 Item_6 0 0.016 0.018
DRF(mod, draws=500, DIF=TRUE, focal_items = 6)
## $sDIF
## groups item sDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_6 0 -0.062 0.066 0 1 0.999
##
## $uDIF
## groups item uDIF CI_2.5 CI_97.5 X2 df p
## 1 Group_1,Group_2 Item_6 0.016 0.008 0.086 0.713 2 0.7
##
## $dDIF
## groups item dDIF CI_2.5 CI_97.5
## 1 Group_1,Group_2 Item_6 0.018 0.009 0.099
# evaluate specific values for sDRF
Theta_nodes <- matrix(seq(-6,6,length.out = 100))
sDTF <- DRF(mod, Theta_nodes=Theta_nodes)
head(sDTF)
## Theta sDRF
## sDRF.1 -6.000 0.006
## sDRF.2 -5.879 0.006
## sDRF.3 -5.758 0.007
## sDRF.4 -5.636 0.007
## sDRF.5 -5.515 0.007
## sDRF.6 -5.394 0.008
sDTF <- DRF(mod, Theta_nodes=Theta_nodes, draws=200)
head(sDTF)
## Theta sDRF CI_2.5 CI_97.5
## sDRF.1 -6.000 0.006 -0.084 0.197
## sDRF.2 -5.879 0.006 -0.092 0.211
## sDRF.3 -5.758 0.007 -0.102 0.224
## sDRF.4 -5.636 0.007 -0.112 0.239
## sDRF.5 -5.515 0.007 -0.123 0.254
## sDRF.6 -5.394 0.008 -0.135 0.269
# sDIF (isolate single item)
sDIF <- DRF(mod, Theta_nodes=Theta_nodes, focal_items=6)
head(sDIF)
## Theta sDRF
## sDRF.1 -6.000 0.001
## sDRF.2 -5.879 0.001
## sDRF.3 -5.758 0.001
## sDRF.4 -5.636 0.002
## sDRF.5 -5.515 0.002
## sDRF.6 -5.394 0.002
sDIF <- DRF(mod, Theta_nodes=Theta_nodes, focal_items = 6, draws=200)
head(sDIF)
## Theta sDRF CI_2.5 CI_97.5
## sDRF.1 -6.000 0.001 -0.004 0.020
## sDRF.2 -5.879 0.001 -0.005 0.022
## sDRF.3 -5.758 0.001 -0.005 0.024
## sDRF.4 -5.636 0.002 -0.006 0.026
## sDRF.5 -5.515 0.002 -0.007 0.028
## sDRF.6 -5.394 0.002 -0.007 0.030
## -------------
## random slopes and intercepts for 15 items, and latent mean difference
## (no systematic DTF should exist, but DIF will be present)
set.seed(1234)
dat1 <- simdata(a, d, N, itemtype = 'dich', mu=.50, sigma=matrix(1.5))
dat2 <- simdata(a + c(numeric(15), rnorm(n-15, 0, .25)),
d + c(numeric(15), rnorm(n-15, 0, .5)), N, itemtype = 'dich')
dat <- rbind(dat1, dat2)
mod1 <- multipleGroup(dat, 1, group=group)
plot(mod1)
DRF(mod1) #does not account for group differences! Need anchors
## No hyper-parameters were estimated in the DIF model. For effective
## DRF testing freeing the focal group hyper-parameters is recommended.
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 30 -3.25 3.268 3.642
mod2 <- multipleGroup(dat, model, group=group, SE=TRUE,
invariance=c('free_means', 'free_var'))
plot(mod2)
# significant DIF in multiple items....
# DIF(mod2, which.par=c('a1', 'd'), items2test=16:30)
DRF(mod2)
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 30 -0.421 0.421 0.51
DRF(mod2, draws=500) #non-sig DTF due to item cancellation
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 30 -0.421 -1.133 0.238 1.476 1 0.224
## uDRF Group_1,Group_2 30 0.421 0.169 1.186 4.437 2 0.109
## dDRF Group_1,Group_2 30 0.510 0.232 1.334
## -------------
## systematic differing slopes and intercepts (clear DTF)
set.seed(1234)
dat1 <- simdata(a, d, N, itemtype = 'dich', mu=.50, sigma=matrix(1.5))
dat2 <- simdata(a + c(numeric(15), rnorm(n-15, 1, .25)),
d + c(numeric(15), rnorm(n-15, 1, .5)),
N, itemtype = 'dich')
dat <- rbind(dat1, dat2)
mod3 <- multipleGroup(dat, model, group=group, SE=TRUE,
invariance=c('free_means', 'free_var'))
plot(mod3) #visable DTF happening
# DIF(mod3, c('a1', 'd'), items2test=16:30)
DRF(mod3) #unsigned bias. Signed bias (group 2 scores higher on average)
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 30 1.983 2.192 2.471
DRF(mod3, draws=500)
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 30 1.983 1.263 2.634 30.314 1 0
## uDRF Group_1,Group_2 30 2.192 1.520 2.785 50.951 2 0
## dDRF Group_1,Group_2 30 2.471 1.708 3.140
DRF(mod3, draws=500, plot=TRUE) #multiple DRF areas along Theta
# plot the DIF
DRF(mod3, draws=500, DIF=TRUE, plot=TRUE)
# evaluate specific values for sDRF
Theta_nodes <- matrix(seq(-6,6,length.out = 100))
sDTF <- DRF(mod3, Theta_nodes=Theta_nodes, draws=200)
head(sDTF)
## Theta sDRF CI_2.5 CI_97.5
## sDRF.1 -6.000 -0.012 -0.077 0.014
## sDRF.2 -5.879 -0.014 -0.087 0.015
## sDRF.3 -5.758 -0.016 -0.098 0.016
## sDRF.4 -5.636 -0.019 -0.110 0.016
## sDRF.5 -5.515 -0.022 -0.124 0.017
## sDRF.6 -5.394 -0.026 -0.139 0.017
# DIF
sDIF <- DRF(mod3, Theta_nodes=Theta_nodes, focal_items = 30, draws=200)
car::some(sDIF)
## Theta sDRF CI_2.5 CI_97.5
## sDRF.5 -5.515 0.000 -0.003 0.000
## sDRF.25 -3.091 -0.008 -0.029 0.001
## sDRF.40 -1.273 0.015 -0.058 0.105
## sDRF.45 -0.667 0.135 0.032 0.241
## sDRF.64 1.636 0.129 0.072 0.197
## sDRF.67 2.000 0.086 0.042 0.149
## sDRF.81 3.697 0.010 0.003 0.030
## sDRF.87 4.424 0.004 0.001 0.014
## sDRF.91 4.909 0.002 0.000 0.009
## sDRF.92 5.030 0.002 0.000 0.008
## ----------------------------------------------------------------
# polytomous example
# simulate data where group 2 has a different slopes/intercepts
set.seed(4321)
a1 <- a2 <- matrix(rlnorm(20,.2,.3))
a2[c(16:17, 19:20),] <- a1[c(16:17, 19:20),] + c(-.5, -.25, .25, .5)
# for the graded model, ensure that there is enough space between the intercepts,
# otherwise closer categories will not be selected often
diffs <- t(apply(matrix(runif(20*4, .3, 1), 20), 1, cumsum))
diffs <- -(diffs - rowMeans(diffs))
d1 <- d2 <- diffs + rnorm(20)
rownames(d1) <- rownames(d2) <- paste0('Item.', 1:20)
d2[16:20,] <- d1[16:20,] + matrix(c(-.5, -.5, -.5, -.5,
1, 0, 0, -1,
.5, .5, -.5, -.5,
1, .5, 0, -1,
.5, .5, .5, .5), byrow=TRUE, nrow=5)
tail(data.frame(a.group1 = a1, a.group2 = a2), 6)
## a.group1 a.group2
## 15 0.8465935 0.8465935
## 16 1.9581395 1.4581395
## 17 1.2486255 0.9986255
## 18 0.8585293 0.8585293
## 19 0.7584499 1.0084499
## 20 0.9760766 1.4760766
list(d.group1 = d1[15:20,], d.group2 = d2[15:20,])
## $d.group1
## [,1] [,2] [,3] [,4]
## Item.15 2.0841033 1.2423287 0.38217647 -0.0009005437
## Item.16 0.2454193 -0.2924192 -0.63521843 -1.5254133343
## Item.17 1.3003614 0.5847340 -0.09046573 -0.9841542611
## Item.18 1.5079114 0.6489106 -0.03799347 -0.3892116221
## Item.19 1.3766077 0.4483499 -0.20715833 -0.8701328534
## Item.20 0.1461006 -0.8364834 -1.32963653 -1.6894534436
##
## $d.group2
## [,1] [,2] [,3] [,4]
## Item.15 2.0841033 1.2423287 0.38217647 -0.0009005437
## Item.16 -0.2545807 -0.7924192 -1.13521843 -2.0254133343
## Item.17 2.3003614 0.5847340 -0.09046573 -1.9841542611
## Item.18 2.0079114 1.1489106 -0.53799347 -0.8892116221
## Item.19 2.3766077 0.9483499 -0.20715833 -1.8701328534
## Item.20 0.6461006 -0.3364834 -0.82963653 -1.1894534436
itemtype <- rep('graded', nrow(a1))
N <- 600
dataset1 <- simdata(a1, d1, N, itemtype)
dataset2 <- simdata(a2, d2, N, itemtype, mu = -.25, sigma = matrix(1.25))
dat <- rbind(dataset1, dataset2)
group <- c(rep('D1', N), rep('D2', N))
# item 1-10 as anchors
mod <- multipleGroup(dat, group=group, SE=TRUE,
invariance=c(colnames(dat)[1:10], 'free_means', 'free_var'))
coef(mod, simplify=TRUE)
## $D1
## $items
## a1 d1 d2 d3 d4
## Item_1 1.194 0.911 0.177 -0.462 -1.105
## Item_2 1.320 0.787 0.362 -0.152 -0.951
## Item_3 1.561 0.794 0.013 -0.973 -1.774
## Item_4 1.491 1.977 1.304 0.284 -0.236
## Item_5 1.249 1.435 0.351 -0.329 -1.273
## Item_6 2.071 0.517 0.072 -0.564 -1.551
## Item_7 1.333 0.157 -0.374 -0.848 -1.911
## Item_8 1.304 1.117 0.512 -0.467 -0.868
## Item_9 1.830 1.501 0.639 -0.176 -0.906
## Item_10 1.073 1.485 0.567 -0.190 -0.812
## Item_11 1.327 2.039 1.529 0.756 -0.283
## Item_12 1.481 -0.268 -1.021 -1.534 -2.229
## Item_13 0.812 0.641 0.086 -0.832 -1.977
## Item_14 1.713 1.850 1.191 0.511 -0.262
## Item_15 0.913 2.168 1.401 0.468 0.058
## Item_16 2.245 0.286 -0.345 -0.728 -1.687
## Item_17 1.233 1.357 0.673 0.057 -0.916
## Item_18 0.983 1.515 0.625 -0.171 -0.564
## Item_19 0.946 1.415 0.521 -0.227 -0.966
## Item_20 0.847 0.181 -0.828 -1.245 -1.624
##
## $means
## F1
## 0
##
## $cov
## F1
## F1 1
##
##
## $D2
## $items
## a1 d1 d2 d3 d4
## Item_1 1.194 0.911 0.177 -0.462 -1.105
## Item_2 1.320 0.787 0.362 -0.152 -0.951
## Item_3 1.561 0.794 0.013 -0.973 -1.774
## Item_4 1.491 1.977 1.304 0.284 -0.236
## Item_5 1.249 1.435 0.351 -0.329 -1.273
## Item_6 2.071 0.517 0.072 -0.564 -1.551
## Item_7 1.333 0.157 -0.374 -0.848 -1.911
## Item_8 1.304 1.117 0.512 -0.467 -0.868
## Item_9 1.830 1.501 0.639 -0.176 -0.906
## Item_10 1.073 1.485 0.567 -0.190 -0.812
## Item_11 1.106 1.818 1.282 0.635 -0.498
## Item_12 1.562 -0.249 -0.917 -1.667 -2.266
## Item_13 0.853 0.595 -0.044 -1.057 -1.890
## Item_14 2.147 2.155 1.311 0.566 -0.248
## Item_15 0.889 2.101 1.164 0.343 -0.010
## Item_16 1.622 -0.395 -0.979 -1.278 -2.255
## Item_17 1.060 2.345 0.587 -0.113 -2.040
## Item_18 0.923 1.860 1.099 -0.508 -0.793
## Item_19 1.051 2.528 0.960 -0.227 -1.976
## Item_20 1.456 0.690 -0.277 -0.806 -1.164
##
## $means
## F1
## -0.303
##
## $cov
## F1
## F1 1.147
plot(mod)
plot(mod, type='itemscore')
# DIF tests vis Wald method
DIF(mod, items2test=11:20,
which.par=c('a1', paste0('d', 1:4)),
Wald=TRUE, p.adjust='holm')
## groups W df p adj_p
## Item_11 D1,D2 5.854 5 0.321 1
## Item_12 D1,D2 4.808 5 0.44 1
## Item_13 D1,D2 6.854 5 0.232 1
## Item_14 D1,D2 4.854 5 0.434 1
## Item_15 D1,D2 3.861 5 0.57 1
## Item_16 D1,D2 35.919 5 0 0
## Item_17 D1,D2 121.671 5 0 0
## Item_18 D1,D2 45.135 5 0 0
## Item_19 D1,D2 96.182 5 0 0
## Item_20 D1,D2 32.769 5 0 0
DRF(mod)
## groups n_focal_items sDRF uDRF dDRF
## 1 D1,D2 20 -0.195 0.329 0.382
DRF(mod, DIF=TRUE, focal_items=11:20)
## groups item sDIF uDIF dDIF
## 1 D1,D2 Item_11 -0.080 0.119 0.131
## 2 D1,D2 Item_12 0.011 0.024 0.031
## 3 D1,D2 Item_13 -0.068 0.069 0.072
## 4 D1,D2 Item_14 -0.010 0.121 0.134
## 5 D1,D2 Item_15 -0.083 0.083 0.085
## 6 D1,D2 Item_16 -0.393 0.402 0.522
## 7 D1,D2 Item_17 -0.053 0.219 0.248
## 8 D1,D2 Item_18 0.038 0.093 0.110
## 9 D1,D2 Item_19 0.073 0.104 0.122
## 10 D1,D2 Item_20 0.370 0.425 0.542
DRF(mod, DIF.cats=TRUE, focal_items=11:20)
## groups item cat sDIF uDIF dDIF
## 1 D1,D2 Item_11 1 0.009 0.021 0.024
## 2 D1,D2 Item_11 2 0.012 0.012 0.012
## 3 D1,D2 Item_11 3 -0.010 0.015 0.018
## 4 D1,D2 Item_11 4 0.032 0.032 0.034
## 5 D1,D2 Item_11 5 -0.041 0.045 0.056
## 6 D1,D2 Item_12 1 -0.004 0.008 0.010
## 7 D1,D2 Item_12 2 -0.015 0.015 0.017
## 8 D1,D2 Item_12 3 0.031 0.031 0.036
## 9 D1,D2 Item_12 4 -0.013 0.013 0.015
## 10 D1,D2 Item_12 5 0.001 0.005 0.008
## 11 D1,D2 Item_13 1 0.012 0.012 0.015
## 12 D1,D2 Item_13 2 0.017 0.017 0.018
## 13 D1,D2 Item_13 3 0.010 0.013 0.016
## 14 D1,D2 Item_13 4 -0.050 0.050 0.053
## 15 D1,D2 Item_13 5 0.011 0.011 0.016
## 16 D1,D2 Item_14 1 -0.002 0.028 0.034
## 17 D1,D2 Item_14 2 0.011 0.018 0.023
## 18 D1,D2 Item_14 3 -0.004 0.012 0.013
## 19 D1,D2 Item_14 4 -0.010 0.013 0.015
## 20 D1,D2 Item_14 5 0.004 0.034 0.037
## 21 D1,D2 Item_15 1 0.006 0.006 0.006
## 22 D1,D2 Item_15 2 0.033 0.033 0.034
## 23 D1,D2 Item_15 3 -0.014 0.014 0.018
## 24 D1,D2 Item_15 4 -0.011 0.011 0.012
## 25 D1,D2 Item_15 5 -0.014 0.014 0.015
## 26 D1,D2 Item_16 1 0.099 0.103 0.126
## 27 D1,D2 Item_16 2 0.004 0.025 0.031
## 28 D1,D2 Item_16 3 -0.008 0.017 0.021
## 29 D1,D2 Item_16 4 -0.001 0.033 0.047
## 30 D1,D2 Item_16 5 -0.095 0.095 0.144
## 31 D1,D2 Item_17 1 -0.147 0.147 0.175
## 32 D1,D2 Item_17 2 0.154 0.154 0.170
## 33 D1,D2 Item_17 3 0.024 0.024 0.024
## 34 D1,D2 Item_17 4 0.132 0.132 0.152
## 35 D1,D2 Item_17 5 -0.162 0.162 0.191
## 36 D1,D2 Item_18 1 -0.055 0.055 0.064
## 37 D1,D2 Item_18 2 -0.039 0.040 0.043
## 38 D1,D2 Item_18 3 0.162 0.162 0.164
## 39 D1,D2 Item_18 4 -0.023 0.023 0.024
## 40 D1,D2 Item_18 5 -0.044 0.044 0.049
## 41 D1,D2 Item_19 1 -0.133 0.133 0.145
## 42 D1,D2 Item_19 2 0.054 0.059 0.083
## 43 D1,D2 Item_19 3 0.078 0.078 0.083
## 44 D1,D2 Item_19 4 0.137 0.137 0.155
## 45 D1,D2 Item_19 5 -0.138 0.138 0.149
## 46 D1,D2 Item_20 1 -0.072 0.098 0.110
## 47 D1,D2 Item_20 2 -0.038 0.040 0.056
## 48 D1,D2 Item_20 3 0.016 0.024 0.028
## 49 D1,D2 Item_20 4 0.000 0.011 0.015
## 50 D1,D2 Item_20 5 0.095 0.102 0.146
## ----------------------------------------------------------------
### multidimensional DTF
set.seed(1234)
n <- 50
N <- 1000
# only first 5 items as anchors within each dimension
model <- 'F1 = 1-25
F2 = 26-50
COV = F1*F2
CONSTRAINB = (1-5, a1), (1-5, 26-30, d), (26-30, a2)'
a <- matrix(c(rep(1, 25), numeric(50), rep(1, 25)), n)
d <- matrix(rnorm(n), n)
group <- c(rep('Group_1', N), rep('Group_2', N))
Cov <- matrix(c(1, .5, .5, 1.5), 2)
Mean <- c(0, 0.5)
# groups completely equal
dat1 <- simdata(a, d, N, itemtype = 'dich', sigma = cov2cor(Cov))
dat2 <- simdata(a, d, N, itemtype = 'dich', sigma = Cov, mu = Mean)
dat <- rbind(dat1, dat2)
mod <- multipleGroup(dat, model, group=group, SE=TRUE,
invariance=c('free_means', 'free_var'))
coef(mod, simplify=TRUE)
## $Group_1
## $items
## a1 a2 d g u
## Item_1 1.006 0.000 -1.208 0 1
## Item_2 1.080 0.000 0.301 0 1
## Item_3 0.833 0.000 1.126 0 1
## Item_4 0.977 0.000 -2.342 0 1
## Item_5 1.005 0.000 0.410 0 1
## Item_6 0.864 0.000 0.428 0 1
## Item_7 1.014 0.000 -0.495 0 1
## Item_8 1.133 0.000 -0.472 0 1
## Item_9 0.945 0.000 -0.585 0 1
## Item_10 1.001 0.000 -0.787 0 1
## Item_11 1.009 0.000 -0.390 0 1
## Item_12 0.920 0.000 -1.061 0 1
## Item_13 1.189 0.000 -0.711 0 1
## Item_14 1.125 0.000 0.066 0 1
## Item_15 1.122 0.000 0.896 0 1
## Item_16 1.094 0.000 -0.203 0 1
## Item_17 1.041 0.000 -0.479 0 1
## Item_18 1.011 0.000 -0.849 0 1
## Item_19 0.962 0.000 -0.768 0 1
## Item_20 0.937 0.000 2.372 0 1
## Item_21 0.935 0.000 0.082 0 1
## Item_22 0.886 0.000 -0.482 0 1
## Item_23 0.921 0.000 -0.443 0 1
## Item_24 0.937 0.000 0.521 0 1
## Item_25 0.959 0.000 -0.674 0 1
## Item_26 0.000 0.999 -1.498 0 1
## Item_27 0.000 0.978 0.590 0 1
## Item_28 0.000 0.997 -1.035 0 1
## Item_29 0.000 0.917 -0.055 0 1
## Item_30 0.000 0.982 -0.970 0 1
## Item_31 0.000 0.891 0.931 0 1
## Item_32 0.000 0.863 -0.453 0 1
## Item_33 0.000 1.140 -0.759 0 1
## Item_34 0.000 0.943 -0.469 0 1
## Item_35 0.000 1.289 -1.852 0 1
## Item_36 0.000 0.791 -1.064 0 1
## Item_37 0.000 0.980 -2.323 0 1
## Item_38 0.000 1.051 -1.367 0 1
## Item_39 0.000 1.097 -0.113 0 1
## Item_40 0.000 0.908 -0.523 0 1
## Item_41 0.000 1.059 1.708 0 1
## Item_42 0.000 1.146 -1.078 0 1
## Item_43 0.000 1.086 -0.967 0 1
## Item_44 0.000 1.095 -0.415 0 1
## Item_45 0.000 0.984 -1.066 0 1
## Item_46 0.000 0.996 -0.726 0 1
## Item_47 0.000 1.330 -1.037 0 1
## Item_48 0.000 1.072 -1.148 0 1
## Item_49 0.000 0.898 -0.429 0 1
## Item_50 0.000 1.078 -0.525 0 1
##
## $means
## F1 F2
## 0 0
##
## $cov
## F1 F2
## F1 1.000 0.453
## F2 0.453 1.000
##
##
## $Group_2
## $items
## a1 a2 d g u
## Item_1 1.006 0.000 -1.208 0 1
## Item_2 1.080 0.000 0.301 0 1
## Item_3 0.833 0.000 1.126 0 1
## Item_4 0.977 0.000 -2.342 0 1
## Item_5 1.005 0.000 0.410 0 1
## Item_6 0.886 0.000 0.558 0 1
## Item_7 0.967 0.000 -0.583 0 1
## Item_8 0.988 0.000 -0.613 0 1
## Item_9 0.962 0.000 -0.467 0 1
## Item_10 0.865 0.000 -0.999 0 1
## Item_11 1.076 0.000 -0.448 0 1
## Item_12 1.145 0.000 -1.198 0 1
## Item_13 0.991 0.000 -0.789 0 1
## Item_14 1.039 0.000 0.070 0 1
## Item_15 1.201 0.000 1.070 0 1
## Item_16 0.989 0.000 -0.084 0 1
## Item_17 0.995 0.000 -0.569 0 1
## Item_18 0.932 0.000 -0.925 0 1
## Item_19 0.866 0.000 -0.790 0 1
## Item_20 1.123 0.000 2.463 0 1
## Item_21 1.055 0.000 0.200 0 1
## Item_22 1.107 0.000 -0.610 0 1
## Item_23 0.992 0.000 -0.513 0 1
## Item_24 0.992 0.000 0.388 0 1
## Item_25 0.934 0.000 -0.794 0 1
## Item_26 0.000 0.999 -1.498 0 1
## Item_27 0.000 0.978 0.590 0 1
## Item_28 0.000 0.997 -1.035 0 1
## Item_29 0.000 0.917 -0.055 0 1
## Item_30 0.000 0.982 -0.970 0 1
## Item_31 0.000 1.015 0.962 0 1
## Item_32 0.000 1.115 -0.596 0 1
## Item_33 0.000 1.095 -0.874 0 1
## Item_34 0.000 0.856 -0.486 0 1
## Item_35 0.000 1.138 -1.636 0 1
## Item_36 0.000 1.085 -1.353 0 1
## Item_37 0.000 1.115 -2.169 0 1
## Item_38 0.000 1.146 -1.450 0 1
## Item_39 0.000 1.130 -0.441 0 1
## Item_40 0.000 0.978 -0.632 0 1
## Item_41 0.000 1.202 1.439 0 1
## Item_42 0.000 0.942 -0.943 0 1
## Item_43 0.000 1.033 -0.899 0 1
## Item_44 0.000 1.144 -0.339 0 1
## Item_45 0.000 0.844 -0.728 0 1
## Item_46 0.000 1.068 -1.046 0 1
## Item_47 0.000 0.952 -1.123 0 1
## Item_48 0.000 1.018 -1.317 0 1
## Item_49 0.000 0.881 -0.381 0 1
## Item_50 0.000 1.092 -0.605 0 1
##
## $means
## F1 F2
## 0.072 0.505
##
## $cov
## F1 F2
## F1 1.067 0.518
## F2 0.518 1.415
plot(mod, degrees = c(45,45))
DRF(mod)
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 50 -0.347 0.347 0.353
# some intercepts slightly higher in Group 2
d2 <- d
d2[c(10:15, 31:35)] <- d2[c(10:15, 31:35)] + 1
dat1 <- simdata(a, d, N, itemtype = 'dich', sigma = cov2cor(Cov))
dat2 <- simdata(a, d2, N, itemtype = 'dich', sigma = Cov, mu = Mean)
dat <- rbind(dat1, dat2)
mod <- multipleGroup(dat, model, group=group, SE=TRUE,
invariance=c('free_means', 'free_var'))
coef(mod, simplify=TRUE)
## $Group_1
## $items
## a1 a2 d g u
## Item_1 0.942 0.000 -1.195 0 1
## Item_2 0.973 0.000 0.294 0 1
## Item_3 0.833 0.000 1.131 0 1
## Item_4 1.049 0.000 -2.575 0 1
## Item_5 1.078 0.000 0.517 0 1
## Item_6 0.919 0.000 0.456 0 1
## Item_7 0.929 0.000 -0.473 0 1
## Item_8 0.918 0.000 -0.554 0 1
## Item_9 0.907 0.000 -0.582 0 1
## Item_10 1.096 0.000 -0.821 0 1
## Item_11 1.000 0.000 -0.483 0 1
## Item_12 0.986 0.000 -1.016 0 1
## Item_13 1.013 0.000 -0.870 0 1
## Item_14 0.861 0.000 0.104 0 1
## Item_15 1.097 0.000 0.908 0 1
## Item_16 0.871 0.000 -0.119 0 1
## Item_17 0.949 0.000 -0.417 0 1
## Item_18 1.019 0.000 -0.987 0 1
## Item_19 1.031 0.000 -0.962 0 1
## Item_20 0.904 0.000 2.378 0 1
## Item_21 1.177 0.000 0.061 0 1
## Item_22 1.044 0.000 -0.551 0 1
## Item_23 0.948 0.000 -0.510 0 1
## Item_24 0.915 0.000 0.387 0 1
## Item_25 0.901 0.000 -0.778 0 1
## Item_26 0.000 0.979 -1.450 0 1
## Item_27 0.000 0.999 0.603 0 1
## Item_28 0.000 1.105 -1.108 0 1
## Item_29 0.000 1.034 0.043 0 1
## Item_30 0.000 0.974 -0.925 0 1
## Item_31 0.000 0.982 1.258 0 1
## Item_32 0.000 1.012 -0.407 0 1
## Item_33 0.000 0.957 -0.619 0 1
## Item_34 0.000 1.076 -0.548 0 1
## Item_35 0.000 0.761 -1.608 0 1
## Item_36 0.000 0.962 -1.091 0 1
## Item_37 0.000 0.891 -2.076 0 1
## Item_38 0.000 0.895 -1.162 0 1
## Item_39 0.000 1.023 -0.260 0 1
## Item_40 0.000 0.949 -0.394 0 1
## Item_41 0.000 1.145 1.451 0 1
## Item_42 0.000 1.037 -1.063 0 1
## Item_43 0.000 0.891 -0.937 0 1
## Item_44 0.000 0.929 -0.397 0 1
## Item_45 0.000 0.987 -0.887 0 1
## Item_46 0.000 0.955 -1.032 0 1
## Item_47 0.000 0.888 -1.063 0 1
## Item_48 0.000 1.058 -1.267 0 1
## Item_49 0.000 0.969 -0.486 0 1
## Item_50 0.000 1.086 -0.442 0 1
##
## $means
## F1 F2
## 0 0
##
## $cov
## F1 F2
## F1 1.000 0.409
## F2 0.409 1.000
##
##
## $Group_2
## $items
## a1 a2 d g u
## Item_1 0.942 0.000 -1.195 0 1
## Item_2 0.973 0.000 0.294 0 1
## Item_3 0.833 0.000 1.131 0 1
## Item_4 1.049 0.000 -2.575 0 1
## Item_5 1.078 0.000 0.517 0 1
## Item_6 0.903 0.000 0.610 0 1
## Item_7 1.006 0.000 -0.476 0 1
## Item_8 0.889 0.000 -0.501 0 1
## Item_9 0.855 0.000 -0.604 0 1
## Item_10 0.892 0.000 0.069 0 1
## Item_11 0.931 0.000 0.498 0 1
## Item_12 0.962 0.000 0.065 0 1
## Item_13 0.845 0.000 0.311 0 1
## Item_14 0.893 0.000 1.036 0 1
## Item_15 0.998 0.000 1.919 0 1
## Item_16 0.949 0.000 -0.155 0 1
## Item_17 0.989 0.000 -0.545 0 1
## Item_18 0.866 0.000 -0.945 0 1
## Item_19 0.893 0.000 -0.872 0 1
## Item_20 0.732 0.000 2.195 0 1
## Item_21 0.854 0.000 0.059 0 1
## Item_22 0.783 0.000 -0.498 0 1
## Item_23 0.966 0.000 -0.561 0 1
## Item_24 0.944 0.000 0.384 0 1
## Item_25 0.940 0.000 -0.794 0 1
## Item_26 0.000 0.979 -1.450 0 1
## Item_27 0.000 0.999 0.603 0 1
## Item_28 0.000 1.105 -1.108 0 1
## Item_29 0.000 1.034 0.043 0 1
## Item_30 0.000 0.974 -0.925 0 1
## Item_31 0.000 0.998 1.989 0 1
## Item_32 0.000 1.190 0.252 0 1
## Item_33 0.000 1.064 0.076 0 1
## Item_34 0.000 0.885 0.444 0 1
## Item_35 0.000 1.065 -0.597 0 1
## Item_36 0.000 1.080 -1.273 0 1
## Item_37 0.000 1.034 -2.217 0 1
## Item_38 0.000 1.040 -1.451 0 1
## Item_39 0.000 1.160 -0.496 0 1
## Item_40 0.000 1.015 -0.711 0 1
## Item_41 0.000 0.946 1.416 0 1
## Item_42 0.000 1.006 -1.144 0 1
## Item_43 0.000 0.969 -0.818 0 1
## Item_44 0.000 1.099 -0.322 0 1
## Item_45 0.000 1.062 -1.103 0 1
## Item_46 0.000 1.064 -0.951 0 1
## Item_47 0.000 1.025 -1.122 0 1
## Item_48 0.000 0.975 -1.194 0 1
## Item_49 0.000 1.083 -0.461 0 1
## Item_50 0.000 0.935 -0.512 0 1
##
## $means
## F1 F2
## 0.003 0.578
##
## $cov
## F1 F2
## F1 1.165 0.459
## F2 0.459 1.340
plot(mod, degrees = c(45,45))
DRF(mod)
## groups n_focal_items sDRF uDRF dDRF
## 1 Group_1,Group_2 50 1.803 1.803 1.831
DRF(mod, draws = 500)
## groups n_focal_items stat CI_2.5 CI_97.5 X2 df p
## sDRF Group_1,Group_2 50 1.803 1.279 2.350 40.994 1 0
## uDRF Group_1,Group_2 50 1.803 1.280 2.350 43.448 2 0
## dDRF Group_1,Group_2 50 1.831 1.338 2.386
## End(No test)