Parametric smoothed regression lines for item response probability functions
This function uses a generalized additive model (GAM) to estimate response curves for items that do not seem to fit well in a given model. Using a stable axillary model, traceline functions for poorly fitting dichotomous or polytomous items can be inspected using point estimates (or plausible values) of the latent trait. Plots of the tracelines and their associated standard errors are available to help interpret the misfit. This function may also be useful when adding new items to an existing, well established set of items, especially when the parametric form of the items under investigation are unknown.
itemGAM( item, Theta, formula = resp ~ s(Theta, k = 10), CI = 0.95, theta_lim = c(-3, 3), return.models = FALSE, ... ) ## S3 method for class 'itemGAM' plot( x, y = NULL, 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), ... )
item |
a single poorly fitting item to be investigated. Can be a vector or matrix |
Theta |
a list or matrix of latent trait estimates typically returned from |
formula |
an R formula to be passed to the |
CI |
a number ranging from 0 to 1 indicating the confidence interval range. Default provides the 95 percent interval |
theta_lim |
range of latent trait scores to be evaluated |
return.models |
logical; return a list of GAM models for each category? Useful when the GAMs should be inspected directly, but also when fitting multidimensional models (this is set to TRUE automatically for multidimensional models) |
... |
additional arguments to be passed to |
x |
an object of class 'itemGAM' |
y |
a |
par.strip.text |
plotting argument passed to |
par.settings |
plotting argument passed to |
auto.key |
plotting argument passed to |
Phil Chalmers rphilip.chalmers@gmail.com
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
## Not run: set.seed(10) N <- 1000 J <- 30 a <- matrix(1, J) d <- matrix(rnorm(J)) Theta <- matrix(rnorm(N, 0, 1.5)) dat <- simdata(a, d, N, itemtype = '2PL', Theta=Theta) # make a bad item ps <- exp(Theta^2 + Theta) / (1 + exp(Theta^2 + Theta)) item1 <- sapply(ps, function(x) sample(c(0,1), size = 1, prob = c(1-x, x))) ps2 <- exp(2 * Theta^2 + Theta + .5 * Theta^3) / (1 + exp(2 * Theta^2 + Theta + .5 * Theta^3)) item2 <- sapply(ps2, function(x) sample(c(0,1), size = 1, prob = c(1-x, x))) #' # how the actual item looks in the population plot(Theta, ps, ylim = c(0,1)) plot(Theta, ps2, ylim = c(0,1)) baditems <- cbind(item1, item2) newdat <- cbind(dat, baditems) badmod <- mirt(newdat, 1) itemfit(badmod) #clearly a bad fit for the last two items mod <- mirt(dat, 1) #fit a model that does not contain the bad items itemfit(mod) #### Pure non-parametric way of investigating the items library(KernSmoothIRT) ks <- ksIRT(newdat, rep(1, ncol(newdat)), 1) plot(ks, item=c(1,31,32)) par(ask=FALSE) # Using point estimates from the model Theta <- fscores(mod) IG0 <- itemGAM(dat[,1], Theta) #good item IG1 <- itemGAM(baditems[,1], Theta) IG2 <- itemGAM(baditems[,2], Theta) plot(IG0) plot(IG1) plot(IG2) # same as above, but with plausible values to obtain the standard errors set.seed(4321) ThetaPV <- fscores(mod, plausible.draws=10) IG0 <- itemGAM(dat[,1], ThetaPV) #good item IG1 <- itemGAM(baditems[,1], ThetaPV) IG2 <- itemGAM(baditems[,2], ThetaPV) plot(IG0) plot(IG1) plot(IG2) ## for polytomous test items SAT12[SAT12 == 8] <- NA dat <- key2binary(SAT12, key = c(1,4,5,2,3,1,2,1,3,1,2,4,2,1,5,3,4,4,1,4,3,3,4,1,3,5,1,3,1,5,4,5)) dat <- dat[,-32] mod <- mirt(dat, 1) # Kernal smoothing is very sensitive to which category is selected as 'correct' # 5th category as correct ks <- ksIRT(cbind(dat, SAT12[,32]), c(rep(1, 31), 5), 1) plot(ks, items = c(1,2,32)) # 3rd category as correct ks <- ksIRT(cbind(dat, SAT12[,32]), c(rep(1, 31), 3), 1) plot(ks, items = c(1,2,32)) # splines approach Theta <- fscores(mod) IG <- itemGAM(SAT12[,32], Theta) plot(IG) set.seed(1423) ThetaPV <- fscores(mod, plausible.draws=10) IG2 <- itemGAM(SAT12[,32], ThetaPV) plot(IG2) # assuming a simple increasing parametric form (like in a standard IRT model) IG3 <- itemGAM(SAT12[,32], Theta, formula = resp ~ Theta) plot(IG3) IG3 <- itemGAM(SAT12[,32], ThetaPV, formula = resp ~ Theta) plot(IG3) ### multidimensional example by returning the GAM objects mod2 <- mirt(dat, 2) Theta <- fscores(mod2) IG4 <- itemGAM(SAT12[,32], Theta, formula = resp ~ s(Theta1, k=10) + s(Theta2, k=10), return.models=TRUE) names(IG4) plot(IG4[[1L]], main = 'Category 1') plot(IG4[[2L]], main = 'Category 2') plot(IG4[[3L]], main = 'Category 3') ## End(Not run)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.