---
title: "Quick Start Guide"
author: "Emre Gönülateş"
date: "`r Sys.Date()`"
output: 
  rmarkdown::html_vignette: 
    toc: true
vignette: >
  %\VignetteIndexEntry{Quick Start Guide}
  %\VignetteEngine{knitr::knitr}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

```{r setup}
library(irt)
```

# Basic Objects

`irt` package contains many useful functions commonly used in psychometrics. 

Item parameters are defined within three main objects types:

* __`Item`__ object contains all of the information about a test/survey item. It
is the building block of `Testlet` and `Itempool` objects. It mainly contains
item parameters and item's psychometric model.  But it can also contain many
other item attributes such as item `content`, `item_id`. User can also define
additional attributes, for example, `key`, `enemies`, `word_count`,
`seed_group`, etc.

* __`Testlet`__ object is a set of `Item` objects. It can also have it's own
psychometric model. User can also define additional attributes.

* __`Itempool`__ object is a collection of `Item` and `Testlet` objects. 


## `Item` 

In order to create an `Item` object, the psychometric model and item parameter
values is sufficient. Specifying an `item_id` field is required if `Item` will be
used within an `Itempool` or `Testlet`. 

### 3PL Model

A three parameter logistic model item (`3PL`) requires `a`, `b` and `c` 
parameters to be specified:

```{r}
item1 <- item(a = 1.2, b = -.8, c = .33, model = "3PL")
item1
```

`a` is the item discrimination, `b` is the item difficulty and `c` is the
pseudo-guessing parameter.

By default, the value of scaling constant `D` is specified as `1`. But it can be
overridden:


```{r}
item1 <- item(a = 1.2, b = -.8, c = .33, D = 1.7, model = "3PL")
item1
```

`item_id` and `content` field can be specified as well:

```{r}
item1 <- item(a = 1.2, b = -.8, c = .33, D = 1.7, model = "3PL", 
              item_id = "ITM384", content = "Quadratic Equations")
item1
```

Additional fields can be added through `misc` field: 


```{r}
item1 <- item(a = 1.2, b = -.8, c = .33, D = 1.7, model = "3PL", 
              item_id = "ITM384", content = "Quadratic Equations", 
              misc = list(key = "A", 
                          enemies = c("ITM664", "ITM964"), 
                          seed_year = 2020, 
                          target_grade = "11")
              )
item1
```

An item characteristic curve can be plotted using `plot` function:

```{r}
plot(item1)
```

### Rasch Model 

`Rasch` model item requires `b` parameter to be specified:

```{r}
item2 <- item(b = -.8, model = "Rasch")
item2
```

For `Rasch` model, `D` parameter cannot be specified. 

### `1PL` Model 

A one-parameter model item requires `b` parameter to be specified:

```{r}
item3 <- item(b = -.8, D = 1.7, model = "1PL")
item3
```



### `2PL` Model 

A two-parameter model item requires `a` and `b` parameters to be specified:

```{r}
item4 <- item(a = 1.2, b = -.8, D = 1.702, model = "2PL")
item4
```


### `4PL` Model 

A four-parameter model item requires `a`, `b`, `c` and `d` parameters to be
specified:

```{r}
item5 <- item(a = 1.06, b = 1.76, c = .13, d = .98, model = "4PL", 
              item_id = "itm-5")
item5
```

`d` is the upper-asymptote parameter. 

### Graded Response Model (`GRM`)

A Graded Response model item requires `a` and `b` parameters to be specified. 
`b` parameters is ascending vector of threshold parameters: 

```{r}
item6 <- item(a = 1.22, b = c(-1.9, -0.37, 0.82, 1.68), model = "GRM", 
              item_id = "itm-6")
item6
plot(item6)
```

`D` parameter can also be specified. 

### Generalized Partial Credit Model (`GPCM`) 

A Generalized Partial Credit model item requires `a` and `b` parameters to be
specified. `b` parameters is ascending vector of threshold parameters:

```{r}
item7 <- item(a = 1.22, b = c(-1.9, -0.37, 0.82, 1.68), D = 1.7, model = "GPCM", 
              item_id = "itm-7")
item7
```


### Partial Credit Model (`PCM`) 

A Partial Credit model item requires `b` parameters to be
specified. `b` parameters is ascending vector of threshold parameters:

```{r}
item8 <- item(b = c(-1.9, -0.37, 0.82, 1.68), model = "PCM")
item8
```


### Generating Random Item Parameters

An item with random item parameters can be generated using `generate_item` 
function:

```{r}
generate_item("3PL")
generate_item("2PL")
generate_item("Rasch")
generate_item("GRM")
# The number of categories of polytomous items can be specified:
generate_item("GPCM", n_categories = 5)
```


## `Testlet`

A testlet is simply a collection of `Item` objects:

```{r}
item1 <- item(a = 1.2, b = -.8, c = .33, D = 1.7, model = "3PL", 
              item_id = "ITM384", content = "Quadratic Equations")
item2 <- item(a = 0.75, b = 1.8, c = .21, D = 1.7, model = "3PL", 
              item_id = "ITM722", content = "Quadratic Equations")
item3 <- item(a = 1.06, b = 1.76, c = .13, d = .98, model = "4PL", 
              item_id = "itm-5")
t1 <- testlet(c(item1, item2, item3))
t1
```

An `testlet_id` field is required if testlet will be used in an item pool.

```{r}
t1 <- testlet(item1, item2, item3, testlet_id = "T1")
t1
```

## `Itempool`

An `Itempool` object is the most frequently used object type in `irt` package. 
It is a collection of `Item` and `Testlet` objects. 


```{r}
item1 <- generate_item("3PL", item_id = "I1") 
item2 <- generate_item("3PL", item_id = "I2") 
item3 <- generate_item("3PL", item_id = "I3") 
ip1 <- itempool(item1, item2, item3)
```

Item pools can be composed of items from different psychometric models and
testlets:

```{r}
item4 <- generate_item("GRM", item_id = "I4") 
item5 <- generate_item("3PL", item_id = "T1-I1") 
item6 <- generate_item("3PL", item_id = "T1-I2") 
t1 <- testlet(item5, item6, item_id = "T1")
ip2 <- itempool(item1, item2, item3, item4, t1)
```

Most of the time item pools are generated using data frames:

```{r}
n_item <- 6 # Number of items
ipdf <- data.frame(a = rlnorm(n_item), b = rnorm(n_item), 
                   c = runif(n_item, 0, .3))
ip3 <- itempool(ipdf)
ip3

# Scaling constant can be specified
ip4 <- itempool(ipdf, D = 1.7)
ip4
```



```{r}
ipdf <- data.frame(
  item_id = c("Item_1", "Item_2", "Item_3", "Item_4", "Item_5", "Item_6"), 
  model = c("3PL", "3PL", "3PL", "GPCM", "GPCM", "GPCM"), 
  a = c(1.0253, 1.3609, 1.6617, 1.096, 0.9654, 1.3995), 
  b1 = c(NA, NA, NA, -1.112, -0.1709, -1.1324), 
  b2 = c(NA, NA, NA, -0.4972, 0.2778, -0.5242), 
  b3 = c(NA, NA, NA, -0.0077, 0.9684, NA), 
  D = c(1.7, 1.7, 1.7, 1.7, 1.7, 1.7), 
  b = c(0.7183, -0.4107, -1.5452, NA, NA, NA), 
  c = c(0.0871, 0.0751, 0.0589, NA, NA, NA), 
  content = c("Geometry", "Algebra", "Algebra", "Geometry", "Algebra", 
              "Algebra") 
)

ip5 <- itempool(ipdf)
```


`Itempool` objects can also be converted to a data frame:

```{r}
as.data.frame(ip2)
```



# Basic IRT Functions

## Probability

Probability of correct response (for dichotomous items) and probability of 
each category (for polytomous items) can be calculated using `prob` function:

```{r}
item1 <- generate_item("3PL")
theta <- 0.84
# The probability of correct and incorrect response for `item1` at theta = 0.84
prob(item1, theta)

# Multiple theta values
prob(item1, theta = c(-1, 1))

# Polytomous items:
item2 <- generate_item(model = "GPCM")
prob(item2, theta = 1)
prob(item2, theta = c(-1, 0, 1))
```

Probability of correct response (or category) for each item in an item pool 
can be calculated as:

```{r}
ip <- generate_ip(model = "3PL", n = 7)
ip
prob(ip, theta = 0)
# When there are multiple theta values, a list where each element corresponds
# to a theta value returned. 
prob(ip, theta = c(-2, 0, 1))
```

Item characteristic curves (ICC) can be plotted:

```{r}
# Plot ICC of each item in the item pool
plot(ip)

# Plot test characteristic curve
plot(ip, type = "tcc")
```


# Information

Information value of an item at a given $\theta$ value can also be calculated:

```{r}
item1 <- generate_item("3PL")
info(item1, theta = -2)

# Multiple theta values
info(item1, theta = c(-1, 1))

# Polytomous items:
item2 <- generate_item(model = "GPCM")
info(item2, theta = 1)
info(item2, theta = c(-1, 0, 1))
```

Information values for each item in an item pool can be calculated as:

```{r}
ip <- generate_ip(model = "3PL", n = 7)
ip
info(ip, theta = 0)
info(ip, theta = c(-2, 0, 1))
```

Information functions can be plotted:

```{r}
# Plot information function of each item
plot_info(ip)
# Plot test information function
plot_info(ip, tif = TRUE)
```


# Ability Estimation

For a given set of item parameters and item responses, the ability ($\theta$)
estimates can be calculated using `est_ability` function. 

```{r}
# Generate an item pool 
ip <- generate_ip(model = "2PL", n = 10)
true_theta <- rnorm(5)
resp <- sim_resp(ip = ip, theta = true_theta, output = "matrix")

# Calculate raw scores
est_ability(resp = resp, ip = ip, method = "sum_score")
# Estimate ability using maximum likelihood estimation:
est_ability(resp = resp, ip = ip, method = "ml")
# Estimate ability using EAP estimation:
est_ability(resp = resp, ip = ip, method = "eap")
# Estimate ability using EAP estimation with a different prior 
# (prior mean = 0, prior standard deviation = 2):
est_ability(resp = resp, ip = ip, method = "eap", prior_pars = c(0, 2))
```




