Implements the set of fixed-item calibration methods described by Kim (2006). The initial
calibrated model must be fitted via mirt
, is currently limited to
unidimensional models only, and should only be utilized when the new set of responses
are obtained from a population with similar distributional characteristics in the latent traits.
For more flexible calibration of items, including a fixed-item calibration variant involving
anchor items for equating, see multipleGroup
.
Usage
fixedCalib(
data,
model = 1,
old_mod,
PAU = "MWU",
NEMC = "MEM",
technical = list(),
...
)
Arguments
- data
new data to be used for calibration. Note that to be consistent with the
mod
object, observed responses/NA placeholders must be included to link the item names used in the originalmod
definition (i.e.,extract.mirt(mod, what = 'itemnames')
)- model
type of model to fit for the complete dataset (not that for the fixed items in
old_mod
the factor loadings/constraints specified by the potentialmirt.model
specification is not relevant)- old_mod
a model of class SingleGroupClass fitted using
mirt
- PAU
prior ability update (PAU) approach. Supports none (
"NWU"
), one ("OWU"
), and many ("MWU"
)- NEMC
number of EM cycles (NEMC) to use for the to-be-estimated parameters. Supports one (
"OEM"
) and many ("MEM"
)- technical
list of technical estimation arguments (see
mirt
for details)- ...
additional arguments to pass to
mirt
References
Kim, S. (2006). A comparative study of IRT fixed parameter calibration methods. Journal of Educational Measurement, 4(43), 355-381.
Examples
if (FALSE) { # \dontrun{
# single factor
set.seed(12345)
J <- 50
a <- matrix(abs(rnorm(J,1,.3)), ncol=1)
d <- matrix(rnorm(J,0,.7),ncol=1)
itemtype <- rep('2PL', nrow(a))
# calibration data theta ~ N(0,1)
N <- 3000
dataset1 <- simdata(a, d, N = N, itemtype=itemtype)
# new data (again, theta ~ N(0,1))
dataset2 <- simdata(a, d, N = 1000, itemtype=itemtype)
# last 40% of experimental items not given to calibration group
# (unobserved; hence removed)
dataset1 <- dataset1[,-c(J:(J*.6))]
head(dataset1)
#--------------------------------------
# calibrated model from dataset1 only
mod <- mirt(dataset1, model = 1)
coef(mod, simplify=TRUE)
# No Prior Weights Updating and One EM Cycle (NWU-OEM)
NWU_OEM <- fixedCalib(dataset2, model=1, old_mod=mod, PAU='NWU', NEMC='OEM')
coef(NWU_OEM, simplify=TRUE)
data.frame(coef(NWU_OEM, simplify=TRUE)$items[,c('a1','d')],
pop_a1=a, pop_d=d)
plot(NWU_OEM, type = 'empiricalhist')
# No Prior Weights Updating and Multiple EM Cycles (NWU-MEM)
NWU_MEM <- fixedCalib(dataset2, model = 1, old_mod = mod, PAU = 'NWU')
coef(NWU_MEM, simplify=TRUE)
data.frame(coef(NWU_MEM, simplify=TRUE)$items[,c('a1','d')],
pop_a1=a, pop_d=d)
plot(NWU_MEM, type = 'empiricalhist')
# One Prior Weights Updating and One EM Cycle (OWU-OEM)
OWU_OEM <- fixedCalib(dataset2, model=1, old_mod=mod, PAU='OWU', NEMC="OEM")
coef(OWU_OEM, simplify=TRUE)
data.frame(coef(OWU_OEM, simplify=TRUE)$items[,c('a1','d')], pop_a1=a, pop_d=d)
plot(OWU_OEM, type = 'empiricalhist')
# One Prior Weights Updating and Multiple EM Cycles (OWU-MEM)
OWU_MEM <- fixedCalib(dataset2, model = 1, old_mod = mod, PAU = 'OWU')
coef(OWU_MEM, simplify=TRUE)
data.frame(coef(OWU_MEM, simplify=TRUE)$items[,c('a1','d')],
pop_a1=a, pop_d=d)
plot(OWU_MEM, type = 'empiricalhist')
# Multiple Prior Weights Updating and Multiple EM Cycles (MWU-MEM)
MWU_MEM <- fixedCalib(dataset2, model = 1, old_mod = mod)
coef(MWU_MEM, simplify=TRUE)
data.frame(coef(MWU_MEM, simplify=TRUE)$items[,c('a1','d')],
pop_a1=a, pop_d=d)
plot(MWU_MEM, type = 'empiricalhist')
# factor scores distribution check
fs <- fscores(MWU_MEM)
hist(fs)
c(mean_calib=mean(fs[1:N, ]), sd_calib=sd(fs[1:N, ]))
c(mean_exper=mean(fs[-c(1:N), ]), sd_exper=sd(fs[-c(1:N), ]))
############################
## Item length constraint example for each participant in the experimental
## items group. In this example, all participants were forced to have a test
## length of J=30, though the item pool had J=50 total items.
# new experimental data (relatively extreme, theta ~ N(.5,1.5))
dataset2 <- simdata(a, d, N = 1000, itemtype=itemtype,
mu=.5, sigma=matrix(1.5))
# Add missing values to each participant in new dataset where individuals
# were randomly administered 10 experimental items, subject to the constraint
# that each participant received a test with J=30 items.
dataset2 <- t(apply(dataset2, 1, function(x){
NA_precalib <- sample(1:30, 10)
NA_experimental <- sample(31:50, 10)
x[c(NA_precalib, NA_experimental)] <- NA
x
}))
head(dataset2)
# check that all individuals had 30 items
all(rowSums(!is.na(dataset2)) == 30)
# Multiple Prior Weights Updating and Multiple EM Cycles (MWU-MEM)
MWU_MEM <- fixedCalib(dataset2, model = 1, old_mod = mod)
coef(MWU_MEM, simplify=TRUE)
data.frame(coef(MWU_MEM, simplify=TRUE)$items[,c('a1','d')],
pop_a1=a, pop_d=d)
plot(MWU_MEM, type = 'empiricalhist')
## factor scores check
fs <- fscores(MWU_MEM)
hist(fs)
c(mean_calib=mean(fs[1:N, ]), sd_calib=sd(fs[1:N, ]))
## shrinkage, but generally different from calibrated sample
c(mean_exper=mean(fs[-c(1:N), ]), sd_exper=sd(fs[-c(1:N), ]))
} # }