The R Package equateIRT: A Tutorial"

Functionalities

The equateIRT package computes:

Data preparation

Load the package equateIRT and the data

library("equateIRT")
data("data2pl", package = "equateIRT")

Estimate a two parameter logistic model for 5 data sets with the R package mirt

library("mirt")
m1 <- mirt(data2pl[[1]], SE = TRUE)
m2 <- mirt(data2pl[[2]], SE = TRUE)
m3 <- mirt(data2pl[[3]], SE = TRUE)
m4 <- mirt(data2pl[[4]], SE = TRUE)
m5 <- mirt(data2pl[[5]], SE = TRUE)

Extract the item parameter estimates and the covariance matrices

estm1 <- import.mirt(m1, display = FALSE)
estm2 <- import.mirt(m2, display = FALSE)
estm3 <- import.mirt(m3, display = FALSE)
estm4 <- import.mirt(m4, display = FALSE)
estm5 <- import.mirt(m5, display = FALSE)
estm1$coef[1:3, ]
estm1$var[1:3, 1:3]

Create a list of coefficients and covariance matrices

estc <- list(estm1$coef, estm2$coef, estm3$coef, estm4$coef, estm5$coef)
estv <- list(estm1$var, estm2$var, estm3$var, estm4$var, estm5$var)
test <- paste("test", 1:5, sep = "")

Create an object of class modIRT

mod2pl <- modIRT(coef = estc, var = estv, names = test, display = FALSE)
coef(mod2pl$test1)[1:5]

The linkage plan

lplan<-linkp(coef = estc)
lplan

A graphic of the linkage plan with package sna

library(sna)
par(mar=c(0, 0, 0, 0))
set.seed(6)
gplot(lplan, displaylabels = TRUE,  vertex.sides = 4, vertex.cex = 5, vertex.rot =45,  usearrows = FALSE, label.pos = 5, label.cex = 1, vertex.col = 0)

Direct equating coefficients

Estimation of direct equating coefficients between Forms 1 and 2 using the mean-mean method.

NOTE: Item parameters are converted to the scale of Form 2.

l12 <- direc(mods = mod2pl, which = c(1,2), method = "mean-mean")
l12
summary(l12)

Estimation of all direct equating coefficients between forms with common items using the mean-mean method

direclist2pl <- alldirec(mods = mod2pl, method = "mean-mean")
direclist2pl

Direct equating coefficients for Forms 1 and 2

summary(direclist2pl, link="test1.test2")

Chain equating coefficients

Estimation of all chain equating coefficients of length 4

cec4 <- chainec(r = 4, direclist = direclist2pl)
cec4
summary(cec4, path="test1.test2.test3.test4")

Chain equating coefficients for path {1, 2, 3, 4}

summary(cec4, path="test1.test2.test3.test4")

Estimation of all chain equating coefficients of length 4 from Form 1 to Form 4

cec14 <- chainec(r = 4, direclist = direclist2pl, f1 = "test1", f2 = "test4")
cec14
summary(cec14)

Estimation of chain equating coefficient for path {1, 5, 4}

pth <- paste("test", c(1,5,4), sep = "")
chainec154 <- chainec(direclist = direclist2pl, pths = pth)
summary(chainec154)

NOTE: Item parameters are converted to the scale of Form 4.

Average equating coefficients

Estimation of bisector equating coefficients

ecall <- c(cec14, chainec154)
fec <- bisectorec(ecall = ecall, weighted = TRUE, unweighted = TRUE)
fec
summary(fec)

Extract the equating coefficients

 eqc(fec)

Extract item parameters of two forms being equated in the original scale and item parameters of the first form converted to the scale of the second form.

itm(fec, bistype = "weighted")

Equated scores

Equated scores with the true score equating method

score(fec, bistype = "weighted")

Equated scores with the observed score equating method

score(fec, method = "OSE", bistype = "weighted")

A comparison of equated scores obtained with 2 different chains, bisector and weighted bisector methods.

score(chainec154, scores = 17)
score(cec4, path = "test1.test2.test3.test4", scores = 17)
score(fec, bistype = "unweighted", scores = 17)
score(fec, bistype = "weighted", scores = 17)

Test for DIF

Load the data

data(dataDIF)

Create a dataset for each group and estimate a 2PL model for each group using the R package mirt

library(mirt)
data1 <- dataDIF[dataDIF$group == 1, 1:20]
data2 <- dataDIF[dataDIF$group == 2, 1:20]
data3 <- dataDIF[dataDIF$group == 3, 1:20]
mod1 <- mirt(data1, SE = TRUE)
mod2 <- mirt(data2, SE = TRUE)
mod3 <- mirt(data3, SE = TRUE)

Extract the coefficients and the covariance matrix

est1 <- import.mirt(mod1, display = FALSE)
est2 <- import.mirt(mod2, display = FALSE)
est3 <- import.mirt(mod3, display = FALSE)

Perform the test for DIF on two groups

res_diftest2 <- dif.test(coef = list(est1$coef, est2$coef), var = list(est1$var, est2$var))
res_diftest2

Perform the test for DIF on three groups

res_diftest3 <- dif.test(coef = list(est1$coef, est2$coef, est3$coef), 
                         var = list(est1$var, est2$var, est3$var))
res_diftest3

It is possible to change the reference group, the equating method used, and to apply purification.

res_diftest3 <- dif.test(coef = list(est1$coef, est2$coef, est3$coef), 
                         var = list(est1$var, est2$var, est3$var), 
                         reference = 2, method = "Haebara", purification = TRUE)
res_diftest3

Tests for drifts

The identity test performs a statistical test to verify if the chain equating coeffients from one form to itself are A=1 and B=0.

data(est3pl)
test <- paste("test", 1:5, sep = "")
mod3pl <- modIRT(coef = est3pl$coef, var = est3pl$var, names = test, display = FALSE)
direclist3pl <- alldirec(mods = mod3pl, method = "Haebara")
pth3 <- paste("test", c(1:5,1), sep = "")
chainec_circle <- chainec(direclist = direclist3pl, pths = pth3)
summary(chainec_circle)
id.test(chainec_circle)

The null hypothesis A=1 and B=0 is not rejected.

It is also possible to performs a statistical test to verify if the chain equating coeffients that link the same two forms are equal.

In the following example test 1 and 5 are linked through two different paths giving two different pairs of equating coefficients. The example uses the 3PL models and the Haebara method, though other options are possible.

pth3 <- paste("test", 1:5, sep = "")
chainec3 <- chainec(direclist = direclist3pl, pths = pth3)
ecall <- c(chainec3, direclist3pl["test1.test5"])
summary(chainec3)
summary(direclist3pl$test1.test5)
sd.test(ecall)

The null hypothesis of equality of the equating coefficients is not rejected.



Try the equateIRT package in your browser

Any scripts or data that you put into this service are public.

equateIRT documentation built on Aug. 8, 2022, 5:08 p.m.