---
title: "The R Package equateIRT: A Tutorial"
output: 
  rmarkdown::html_document:
    toc: true
    toc_float: true
    number_sections: true
    theme: spacelab
    highlight: pygments
vignette: >
  %\VignetteIndexEntry{The R Package equateIRT: A Tutorial}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

# Functionalities

The equateIRT package computes:

* __Direct equating coefficients__ (between two forms with common items).
* __Chain equating coefficients__ (through a chain of forms with common items in pairs).
* __Average (bisector) equating coefficients__ (between two forms connected through more than one path).
* __Equated scores__ with __true score equating__ and __observed score equating__ methods.
* __Standard errors__ of all equating coefficients and equated scores.
* __Test for DIF__ and __tests for drifts__. 

# Data preparation

Load the package equateIRT and the data

```{r}
library("equateIRT")
data("data2pl", package = "equateIRT")
```

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

```{r, message=FALSE, results='hide'}
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

```{r}
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

```{r}
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`

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

The linkage plan

```{r}
lplan<-linkp(coef = estc)
lplan
```

A graphic of the linkage plan with package `sna`

```{r, message=FALSE, fig.cap="Linkage plan",fig.width=3.5,fig.height=3}
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.__


```{r}
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

```{r}
direclist2pl <- alldirec(mods = mod2pl, method = "mean-mean")
direclist2pl
```
```{r}

```

Direct equating coefficients for Forms 1 and 2

```{r}
summary(direclist2pl, link="test1.test2")
```

# Chain equating coefficients

Estimation of all chain equating coefficients of length 4

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

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

```{r}
summary(cec4, path="test1.test2.test3.test4")
```

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

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

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

```{r}
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

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

Extract the equating coefficients

```{r}
 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.

```{r}
itm(fec, bistype = "weighted")
```

# Equated scores

Equated scores with the true score equating method

```{r}
score(fec, bistype = "weighted")
```

Equated scores with the observed score equating method

```{r}
score(fec, method = "OSE", bistype = "weighted")
```

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

```{r}
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

```{r}
data(dataDIF)
```

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

```{r, message=FALSE, results='hide'}
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

```{r}
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

```{r}
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

```{r}
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.

```{r}
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.


```{r}
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.

```{r}
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.
