Skip to contents

This function extracts elements, as well as builds a few convenient elements, from the three internal person, design, or test objects that are accessible through a customNextItem function definition (see mirtCAT for details).

Usage

extract.mirtCAT(x, what)

Arguments

x

either the person, design, or test object defined through a customNextItem definition

what

a character vector extracting the desired element (see the Details section)

Details

Depending on which object is supplied, the following elements can be extracted.

The 'person' argument

ID

a scalar value indicating the ID of the participant (generally only needed in Monte Carlo simulations)

responses

an integer vector indicating how items that have been responded to. Each element pertains to the associated item location (e.g., responses[100] is associated with the 100th item), and is NA if the item has not been responded to

raw_responses

of the same form as responses, pertaining to the observed responses in a character vector

items_in_bank

an integer vector indicating items which have not been administered yet and are also valid candidates for administration

items_answered

an integer vector indicating the order in which items have been responded to

thetas

the current ability/latent trait estimates given the previously administered items

thetas_SE

the current ability/latent trait standard error estimates given the previously administered items

thetas_history

history of the ability/latent trait estimates

thetas_SE_history

history of the latent trait standard error estimates

item_time

of the same form as items_answered, pertaining to the amount of time it took the participant to response to the item

demographics

a data.frame containing the (optional) prior survey information from the GUI interface

clientData

a list of useful information from shiny's session$clientData

The 'design' argument

items_not_scored

an integer vector indicating items which should be included but not scored in the test (these are experimental items)

min_items

minimum number of items to administer

max_items

maximum number of items to administer

max_time

maximum amount of time alloted to the GUI

met_SEM

logical vector indicating whether the SEM criteria has been met

met_delta_thetas

logical vector indicating whether the delta_thetas criteria has been met

met_classify

logical vector indicating whether the classify criteria has been met

exposure

exposure control elements of the same form as responses

content

content constraint information

content_prop

content proportions

test_properties

user-defined data.frame of test-based properties

person_properties

user-defined data.frame of person-based properties

The 'test' argument

mo

extract the defined model from the mirt package. Afterward, users can use the extract.mirt function to pull out a large number of internal elements for easy use

References

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

Chalmers, R. P. (2016). Generating Adaptive and Non-Adaptive Test Interfaces for Multidimensional Item Response Theory Applications. Journal of Statistical Software, 71(5), 1-39. doi:10.18637/jss.v071.i05

Author

Phil Chalmers rphilip.chalmers@gmail.com

Examples


if (FALSE) { # \dontrun{
 #example test
set.seed(1234)
nitems <- 25
itemnames <- paste0('Item.', 1:nitems)
a <- matrix(rlnorm(nitems, .2, .3))
d <- matrix(rnorm(nitems))
dat <- simdata(a, d, 500, itemtype = 'dich')
colnames(dat) <- itemnames
mod <- mirt(dat, 1, verbose = FALSE, TOL = .01)

# simple math items
questions <- answers <- character(nitems)
choices <- matrix(NA, nitems, 5)
spacing <- floor(d - min(d)) + 1 #easier items have more variation in the options

for(i in 1:nitems){
  n1 <- sample(1:50, 1)
  n2 <- sample(51:100, 1)
  ans <- n1 + n2
  questions[i] <- paste0(n1, ' + ', n2, ' = ?')
  answers[i] <- as.character(ans)
  ch <- ans + sample(c(-5:-1, 1:5) * spacing[i,], 5)
  ch[sample(1:5, 1)] <- ans
  choices[i, ] <- as.character(ch)
}

df <- data.frame(Question=questions, Option=choices, 
  Type = 'radio', stringsAsFactors = FALSE)
df$Answer <- answers

pat <- generate_pattern(mod, Theta = 0, df)

#------------------------------------------------
# administer items in sequence
customNextItem <- function(person, design, test){
   # browser()
   items_left_2_choose_from <- extract.mirtCAT(person, 'items_in_bank')
   min(items_left_2_choose_from)
}

res <- mirtCAT(df, local_pattern=pat, 
  design = list(customNextItem=customNextItem))
summary(res)

#------------------------------------------------
# administer items in order, but stop after 10 items
customNextItem <- function(person, design, test){
   items_left_2_choose_from <- extract.mirtCAT(person, 'items_in_bank')
   items_answered <- extract.mirtCAT(person, 'items_answered')
   total <- sum(!is.na(items_answered))
   ret <- if(total < 10) min(items_left_2_choose_from)
     else return(NA)
   ret
}

res <- mirtCAT(df, local_pattern=pat, 
  design = list(customNextItem=customNextItem))
summary(res)

#------------------------------------------------
# using findNextItem() and stopping after 10 items

customNextItem <- function(person, design, test){
   items_answered <- extract.mirtCAT(person, 'items_answered')
   total <- sum(!is.na(items_answered))
   ret <- NA
   if(total < 10) 
     ret <- findNextItem(person=person, test=test, design=design, criteria = 'MI')
   ret
}

res <- mirtCAT(df, mod, local_pattern=pat, start_item = 'MI',
  design = list(customNextItem=customNextItem))
summary(res)

# equivalent to the following
res2 <- mirtCAT(df, mod, local_pattern=pat, start_item = 'MI', 
  criteria = 'MI', design = list(max_items = 10))
summary(res2)

} # }