Simultaneous Item Bias Test (SIBTEST)
Classical test theory approach to detecting unidirectional and bidirectional (with one crossing location) DIF. This family of statistics is intended for unidimensional tests, and applies a regression-corrected matched-total score approach to quantify the response bias between two groups. Can be used for DIF, DBF, and DTF testing.
SIBTEST( dat, group, suspect_set, match_set, focal_name = unique(group)[2], guess_correction = 0, Jmin = 5, na.rm = FALSE, LiStout1996 = FALSE, permute = 1000, pk_focal = FALSE, correction = TRUE, details = FALSE, plot = "none", ... )
dat |
integer-based dataset to be tested, containing dichotomous or polytomous responses |
group |
a vector indicating group membership with the same length as the number of rows in
|
suspect_set |
an integer vector indicating which items to inspect with SIBTEST. Including only one value will perform a DIF test, while including more than one will perform a simultaneous bundle test (DBF); including all non-matched items will perform DTF. If missing, a simultaneous test using all the items not listed in match_set will be used (i.e., DTF) |
match_set |
an integer vector indicating which items to use as the items which are matched
(i.e., contain no DIF). These are analogous to 'anchor' items in the likelihood method to locate
DIF. If missing, all items other than the items found in the |
focal_name |
name of the focal group; e.g., |
guess_correction |
a vector of numbers from 0 to 1 indicating how much to correct the items for guessing. It's length should be the same as ncol(dat) |
Jmin |
the minimum number of observations required when splitting the data into focal and reference groups conditioned on the matched set |
na.rm |
logical; remove rows in |
LiStout1996 |
logical; perform the crossing test for non-compensatory bias
using Li and Stout's (1996) permutation approach? Default is |
permute |
number of permutations to perform when |
pk_focal |
logical; using the group weights from the focal group instead of the total sample? Default is FALSE as per Shealy and Stout's recommendation |
correction |
logical; apply the composite correction for the difference between focal
composite scores using the true-score regression technique? Default is |
details |
logical; return a data.frame containing the details required to compute SIBTEST? |
plot |
a character input indicating the type of plot to construct. Options are |
... |
additional plotting arguments to be passed |
SIBTEST is similar to the Mantel-Haenszel approach for detecting DIF but uses a regression correction based on the KR-20/coefficient alpha reliability index to correct the observed differences when the latent trait distributions are not equal. Function supports the standard SIBTEST for dichotomous and polytomous data (compensatory) and supports crossing DIF testing (i.e., non-compensatory/non-uniform) using the asymptotic sampling distribution version of the Crossing-SIBTEST (CSIBTEST) statistic described by Chalmers (2018) and the permutation method described by Li and Stout (1996). For convenience, the beta coefficient for CSIBTEST is always reported as an absolute value.
Phil Chalmers rphilip.chalmers@gmail.com
Chalmers, R. P. (2018). Improving the Crossing-SIBTEST statistic for detecting non-uniform DIF. Psychometrika, 83, 2, 376-386.
Chalmers, R., P. (2012). mirt: A Multidimensional Item Response Theory Package for the R Environment. Journal of Statistical Software, 48(6), 1-29. doi: 10.18637/jss.v048.i06
Chang, H. H., Mazzeo, J. & Roussos, L. (1996). DIF for Polytomously Scored Items: An Adaptation of the SIBTEST Procedure. Journal of Educational Measurement, 33, 333-353.
Li, H.-H. & Stout, W. (1996). A new procedure for detection of crossing DIF. Psychometrika, 61, 647-677.
Shealy, R. & Stout, W. (1993). A model-based standardization approach that separates true bias/DIF from group ability differences and detect test bias/DTF as well as item bias/DIF. Psychometrika, 58, 159-194.
## Not run: set.seed(1234) n <- 30 N <- 500 a <- matrix(1, n) d <- matrix(rnorm(n), n) group <- c(rep('reference', N), rep('focal', N*2)) ## ------------- # groups completely equal dat1 <- simdata(a, d, N, itemtype = 'dich') dat2 <- simdata(a, d, N*2, itemtype = 'dich') dat <- rbind(dat1, dat2) # DIF (all other items as anchors) SIBTEST(dat, group, suspect_set = 6) # Some plots depicting the above tests SIBTEST(dat, group, suspect_set = 6, plot = 'observed') SIBTEST(dat, group, suspect_set = 6, plot = 'weights') SIBTEST(dat, group, suspect_set = 6, plot = 'wdifference') # Include CSIBTEST with randomization method SIBTEST(dat, group, suspect_set = 6, LiStout1996 = TRUE) # DIF (specific anchors) SIBTEST(dat, group, match_set = 1:5, suspect_set = 6) SIBTEST(dat, group, match_set = 1:5, suspect_set = 6, LiStout1996=TRUE) # DBF (all and specific anchors, respectively) SIBTEST(dat, group, suspect_set = 11:30) SIBTEST(dat, group, match_set = 1:5, suspect_set = 11:30) # DTF SIBTEST(dat, group, suspect_set = 11:30) SIBTEST(dat, group, match_set = 1:10) #equivalent # different hyper pars dat1 <- simdata(a, d, N, itemtype = 'dich') dat2 <- simdata(a, d, N*2, itemtype = 'dich', mu = .5, sigma = matrix(1.5)) dat <- rbind(dat1, dat2) SIBTEST(dat, group, 6:30) SIBTEST(dat, group, 11:30) # DIF testing with anchors 1 through 5 SIBTEST(dat, group, 6, match_set = 1:5) SIBTEST(dat, group, 7, match_set = 1:5) SIBTEST(dat, group, 8, match_set = 1:5) # DIF testing with all other items as anchors SIBTEST(dat, group, 6) SIBTEST(dat, group, 7) SIBTEST(dat, group, 8) ## ------------- ## systematic differing slopes and intercepts (clear DTF) dat1 <- simdata(a, d, N, itemtype = 'dich') dat2 <- simdata(a + c(numeric(15), rnorm(n-15, 1, .25)), d + c(numeric(15), rnorm(n-15, 1, 1)), N*2, itemtype = 'dich') dat <- rbind(dat1, dat2) SIBTEST(dat, group, 6:30) SIBTEST(dat, group, 11:30) # Some plots depicting the above tests SIBTEST(dat, group, suspect_set = 11:30, plot = 'observed') SIBTEST(dat, group, suspect_set = 11:30, plot = 'weights') SIBTEST(dat, group, suspect_set = 11:30, plot = 'wdifference') # DIF testing using valid anchors SIBTEST(dat, group, suspect_set = 6, match_set = 1:5) SIBTEST(dat, group, suspect_set = 7, match_set = 1:5) SIBTEST(dat, group, suspect_set = 30, match_set = 1:5) # randomization method is fairly poor when smaller matched-set used SIBTEST(dat, group, suspect_set = 30, match_set = 1:5, LiStout1996=TRUE) SIBTEST(dat, group, suspect_set = 30, LiStout1996=TRUE) ## End(Not run)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.