Learn R Programming

mirt (version 1.17.1)

SIBTEST: Simultaneous Item Bias Test (SIBTEST)

Description

Classical test theory approach to detecting DIF for unidimensional tests by applying a regression-corrected matched-total score approach. 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 poltomous data (compensatory) and also supports crossed DIF testing (i.e., non-compensatory) for dichotomous data.

Usage

SIBTEST(dat, group, focal_set, match_set, focal_name = "focal",
  guess_correction = 0, Jmin = 2, cross = FALSE, permute = 1000,
  pk_focal = FALSE, correction = TRUE)

Arguments

dat
integer dataset to be tested containing dichotomous or polytomous responses
group
a vector indicating group membership
focal_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,
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 'achor' items in the likelihood method to locate DIF. If missing, all items other than the items found in the focal_set will be u
focal_name
name of the focal group. E.g., 'focal'
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
cross
logical; perform the crossing test for DIF? Can only be used when the data consist of dichotomous responses. Default is FALSE
permute
number of permutations to perform when cross = TRUE. Default is 1000
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 TRUE, reflecting Shealy and Stout's method

References

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 detetion 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 ddetect test bias/DTF as well as item bias/DIF. Psychometrika, 58, 159-194.

Examples

Run this code
library(mirt)

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, focal_set = 6)

#DIF (specific anchors)
SIBTEST(dat, group, match_set = 1:5, focal_set = 6)

# DBF (all and specific anchors, respectively)
SIBTEST(dat, group, focal_set = 11:30)
SIBTEST(dat, group, match_set = 1:5, focal_set = 11:30)

#DTF
SIBTEST(dat, group, focal_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)

#crossed SIBTEST
SIBTEST(dat, group, 6, match_set = 1:5, cross=TRUE)
SIBTEST(dat, group, 7, match_set = 1:5, cross=TRUE)
SIBTEST(dat, group, 8, match_set = 1:5, cross=TRUE)

## -------------
## 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)

#DIF testing using valid anchors
SIBTEST(dat, group, focal_set = 6, match_set = 1:5)
SIBTEST(dat, group, focal_set = 7, match_set = 1:5)
SIBTEST(dat, group, focal_set = 30, match_set = 1:5)

SIBTEST(dat, group, focal_set = 11, match_set = 1:10, cross=TRUE)
SIBTEST(dat, group, focal_set = 30, match_set = 1:15, cross=TRUE)

Run the code above in your browser using DataLab