WrightMap: Multifaceted models

January 7, 2015

(This article was first published on R Snippets for IRT, and kindly contributed to R-bloggers)

We received an email from a user who was interested in displaying results from a multifaceted model in WrightMap. In the WrightMap manual, we show how to use multifaceted results from ConQuest:

fpath <- system.file("extdata", package = "WrightMap")

model4 <- CQmodel(file.path(fpath, "ex4a.mle"), file.path(fpath, "ex4a.shw"))
wrightMap(model4, item.table = "rater", interactions = "rater*topic", step.table = "topic")


(See this tutorial for more details.)

But if your results aren’t from ConQuest, this example won’t be as useful to you. However, the basic WrightMap function is program-independent. If you can put your results into a matrix, WrightMap can graph it. The most important thing to remember is that WrightMap treats rows as “items” and columns as “steps”. So if you would like to make a graph like the one above with your data, each rater (Amy, Beverley, etc.) should be associated with a column, and each topic (School, Family) with a row.

For this example, we will be using results from the R package TAM (created by Thomas Kiefer, Alexander Robitzsch, and Margaret Wu). We discussed using TAM results in WrightMap in this post and this follow-up, using a simple dichotomous model. For this tutorial, we’ll use a item * rater model.

The setup and comments here are taken from the TAM manual:

dat <- data.ex10

facets <- dat[, "rater", drop = FALSE]  # define facet (rater)
pid <- dat$pid  # define person identifier (a person occurs multiple times)
resp <- dat[, -c(1:2)]  # item response data
formulaA <- ~item * rater  # formula

mod <- tam.mml.mfr(resp = resp, facets = facets, formulaA = formulaA, pid = dat$pid)

persons.mod <- tam.wle(mod)
theta <- persons.mod$theta

The tam.thresholds command provides us with the estimated difficulty for each item-by-rater (item + rater + item * rater).

thr <- tam.threshold(mod)
item.labs <- c("I0001", "I0002", "I0003", "I0004", "I0005")
rater.labs <- c("rater1", "rater2", "rater3")

Now we need to turn it into a matrix formatted the way WrightMap expects. We could organize it by item:

thr1 <- matrix(thr, nrow = 5, byrow = TRUE)
wrightMap(theta, thr1, label.items = item.labs, thr.lab.text = rep(rater.labs, each = 5))

Or by rater:

thr2 <- matrix(thr, nrow = 3)
wrightMap(theta, thr2, label.items = rater.labs, thr.lab.text = rep(item.labs,  each = 3), axis.items = "Raters")

Another option is to show the item, rater, and item * rater parameters separately. We can get these from the xsi.facets table.

pars <- mod$xsi.facets$xsi
facet <- mod$xsi.facets$facet

item.par <- pars[facet == "item"]
rater.par <- pars[facet == "rater"]
item_rat <- pars[facet == "item:rater"]

We could put them in separate bands, adding NA to make them all the same length.

len <- length(item_rat)
item.long <- c(item.par, rep(NA, len - length(item.par)))
rater.long <- c(rater.par, rep(NA, len - length(rater.par)))
ir.labs <- mod$xsi.facets$parameter[facet == "item:rater"]

wrightMap(theta, rbind(item.long, rater.long, item_rat), label.items = c("Items",  "Raters", "Item*Raters"), thr.lab.text = rbind(item.labs, rater.labs, ir.labs), axis.items = "")

But the item*rater band is a little crowded. So let’s separate it by rater:

ir_rater<- matrix(item_rat, nrow = 3, byrow = TRUE)

wrightMap(theta, rbind(item.par, c(rater.par, NA, NA), ir_rater), label.items = c("Items", "Raters", "Item*Raters (R1)", "Item*Raters (R2)", "Item*Raters (R3)"), axis.items = "", thr.lab.text = rbind(item.labs, rater.labs, matrix(item.labs, nrow = 3, ncol = 5, byrow = TRUE)))

Or by item:

ir_item <- matrix(item_rat, nrow = 5)

wrightMap(theta, rbind(item.par, c(rater.par, NA, NA), cbind(ir_item, NA, NA)), label.items = c("Items", "Raters", "Item*Raters (I1)", "Item*Raters (I2)", "Item*Raters (I3)", "Item*Raters (I4)", "Item*Raters (I5)"), axis.items = "", thr.lab.text = rbind(item.labs, matrix(c(rater.labs, NA, NA), nrow = 6, ncol = 5, byrow = TRUE)))

To leave a comment for the author, please follow the link and comment on their blog: R Snippets for IRT.

R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.


Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)