| Title: | Procedures Based on Item Response Theory Models for the Development of Short Test Forms |
|---|---|
| Description: | Implement different Item Response Theory (IRT) based procedures for the development of tests from item bank. The procedures are flexible enough to be adopted for the development of short forms of full-length tests. Different procedures are considered (Epifania, Anselmi & Robusto, 2022 <doi:10.1007/978-3-031-27781-8_7> and Epifania & Finos, 2025 <doi:10.1007/978-3-031-95995-0_32>). The main difference between the presented procedures refers to the degree of control that they allow for targeting specific latent trait levels. The simplest procedure, denoted as benchmark procedure, does not allow for any control on the latent trait levels of interest, while the other procedures allow for specifying either discrete latent trait levels for which the information needs to be maximized (theta-target procedure, <doi:10.1007/978-3-031-27781-8_7>) or a target information function that needs to be recreated with the selected items (item selection algorithm -ISA- denoted as Frank in <doi:10.1007/978-3-031-95995-0_32>). Another difference concerns the definition of the number of items to be selected. In the benchmark and theta-target procedures, the number of items must be defined a priori, while in ISA the number of items is determined automatically by the algorithm. |
| Authors: | Ottavia M. Epifania [aut, cre] (ORCID: <https://orcid.org/0000-0001-8552-568X>), Pasquale Anselmi [ctb], Egidio Robusto [ctb], Livio Finos [ctb] |
| Maintainer: | Ottavia M. Epifania <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 2.0.0 |
| Built: | 2026-06-04 19:30:25 UTC |
| Source: | https://github.com/cran/shortIRT |
Develop a test or a short form of a test given the parameters of dichotomous or polytomous items in an item bank/full-length test according to the benchmark procedure. See Details.
bench(item_pars = NULL, iifs = NULL, theta = NULL, num_item = NULL, K = NULL)bench(item_pars = NULL, iifs = NULL, theta = NULL, num_item = NULL, K = NULL)
item_pars |
|
iifs |
|
theta |
|
num_item |
|
K |
|
Let be the number of items to be included in the test developed from an item bank .
The test with is constructed by selecting the items with the highest item information values, with no explicit reference to any specific level of the latent trait.
Given that is the IIF for each item , the maximum value of its information function over is computed, as to define the vector
where
The vector is then sorted in decreasing order, and the first items in the ordered vector (i.e., the items with the highest information functions), with
, are selected to form the test.
Further details on the benchmark procedure can be found in Epifania et al. (2022).
An object of class bench of length 3 with:
test: dataframe with the items selected for inclusion in the test (isel),
their maximum information function (maxiif), for a specific latent trait
level (column theta).
item_pars: the original dataframe containing the item parameters.
selected_items: dataframe with the parameters of the selected items.
K: number of thresholds for the response categories of the items. If the items are dichotomous K is NULL.
Epifania, O. M., Anselmi, P., & Robusto, E. (2022). Item response theory approaches for test shortening. In M. Wiberg, D. Molenaar, J. Gonzalez, J. S. Kim, & H. Hwang (Eds.), Quantitative Psychology (Vol. 422, pp. 75–83). Springer Proceedings in Mathematics and Statistics. Springer, Cham. https://doi.org/10.1007/978-3-031-27781-8_7
# set a seed for the reproducibility of the results set.seed(123) # define the number of items in the item bank n <- 50 # generate 500 random values of theta from a normal distribution with sd = 2 theta <- rnorm(500, sd = 2) # generate item parameters of the items in the item bank according to the 2-PL model item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # apply benchmark procedure resB <- bench(item_pars, theta = theta, num_item = 5) str(resB) # generate an item bank with 4 polytomous items with K = 3 item_pars <- data.frame(matrix(c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1, -1.5, -1.0, 0, 1, 1, 1, -1.5, -0, 0.5 ), nrow = 4, byrow = TRUE)) # rename the columns colnames(item_pars) = paste(rep(c("a", "b"), each = 3), 1:3, sep = "") # apply benchmark procedure on polytomous items resB_poly <- bench(item_pars, theta = theta, num_item = 2, K = 3) str(resB_poly)# set a seed for the reproducibility of the results set.seed(123) # define the number of items in the item bank n <- 50 # generate 500 random values of theta from a normal distribution with sd = 2 theta <- rnorm(500, sd = 2) # generate item parameters of the items in the item bank according to the 2-PL model item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # apply benchmark procedure resB <- bench(item_pars, theta = theta, num_item = 5) str(resB) # generate an item bank with 4 polytomous items with K = 3 item_pars <- data.frame(matrix(c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1, -1.5, -1.0, 0, 1, 1, 1, -1.5, -0, 0.5 ), nrow = 4, byrow = TRUE)) # rename the columns colnames(item_pars) = paste(rep(c("a", "b"), each = 3), 1:3, sep = "") # apply benchmark procedure on polytomous items resB_poly <- bench(item_pars, theta = theta, num_item = 2, K = 3) str(resB_poly)
targetsDefine targets either by considering the midpoints of equal intervals defined on the latent trait (equal) or the centroids obtained by clustering the latent trait (clusters). Further details on targets definition can be found in Epifania et al. (2022).
define_targets(theta, num_targets = NULL, method = c("equal", "clusters"))define_targets(theta, num_targets = NULL, method = c("equal", "clusters"))
theta |
|
num_targets |
|
method |
|
A vector of length num_targets with the generated targets. The class can be either equal or clusters, depending on the method used for the definition of the targets.
Epifania, O. M., Anselmi, P., & Robusto, E. (2022). Item response theory approaches for test shortening. In M. Wiberg, D. Molenaar, J. Gonzalez, J. S. Kim, & H. Hwang (Eds.), Quantitative Psychology (Vol. 422, pp. 75–83). Springer Proceedings in Mathematics and Statistics. Springer, Cham. https://doi.org/10.1007/978-3-031-27781-8_7
# set a seed for the reproducibility of the results set.seed(123) # generate 1000 random values of theta from a normal distribution theta <- rnorm(1000) # extract theta targets as the centroids of the clusters targets <- define_targets(theta, num_targets = 5, method = "clusters")# set a seed for the reproducibility of the results set.seed(123) # generate 1000 random values of theta from a normal distribution theta <- rnorm(1000) # extract theta targets as the centroids of the clusters targets <- define_targets(theta, num_targets = 5, method = "clusters")
)Compute the item information function for a single dichotomous
or polytoumous item under either the 4-PL model (dichotomous item) or the Generalized Partial Credit model (polytomous item).
Specific models (e.g., 3-PL, 2-PL, 1-PL, or PCM, Rating Scale) are obtained by imposing
constraints on the item parameters.
See Details.
i_info(item_pars, theta = seq(-5, 5, length.out = 1000), K = NULL)i_info(item_pars, theta = seq(-5, 5, length.out = 1000), K = NULL)
item_pars |
|
theta |
|
K |
|
Let denote the probability of a correct response for person (with latent trait level defined as ) on item under the four-parameter logistic
(4-PL; Barton & Lord, 1981) model is defined as:
where is the discrimination parameter,
is the difficulty parameter (or location of item on the latent trait),
is the lower asymptote (pseudo-guessing probability),
and is the upper asymptote (inattention/slip). By constraining , , and , the probability
is computed according to the 3-PL (Lord, 1980), 2-PL (Birnbaum, 1968) and 1-PL or the Rasch model (Rasch, 1960), respectively.
Let , the information function of item is computed as:
According to the Generalized Partial Credit Model (GPCM; Muraki, 1997), for a polytomous item with thresholds separating the categories, the probability of category is defined as:
where and are the discrimination and location parameters associate with each threshold . If , the Partial Credit Model (PCM, Muraki, 1992) is obtained.
The item information is computed as:
A numeric vector of length equal to theta, which contains the item information function for a single item with respect to the values specified in theta
Barton, M. A., & Lord, F. M. (1981). An upper asymptote for the three-parameter logistic item-response model. ETS Research Report Series, 1981(1), i–8. Princeton, NJ: Educational Testing Service.
Birnbaum, A. (1968). Some latent trait models and their use in inferring an examinee's ability. In F. M. Lord & M. R. Novick (Eds.), Statistical theories of mental test scores (pp. 397–479). Reading, MA: Addison-Wesley.
Lord, F. M. (1980). Applications of item response theory to practical testing problems. Hillsdale, NJ: Lawrence Erlbaum Associates.
Muraki, G. (1992). A generalized partial credit model: Application of an EM algorithm. Psychometrika, 57(2), 159–176.
Muraki, G. (1997). A generalized partial credit model with step discrimination. Journal of Educational Measurement, 34(2), 115–127.
Rasch, G. (1960). Probabilistic models for some intelligence and attainment tests. Copenhagen, Denmark: Danish Institute for Educational Research.
# Set random seed for reproducibility set.seed(123) # Create a sequence of latent trait values # spanning the ability continuum theta <- seq(-4, 4, length.out = 200) # Define parameters for a dichotomous item # b = difficulty # a = discrimination # c = lower asymptote (guessing) # e = upper asymptote item_par <- data.frame( b = 0, a = 1.5, c = .10, e = .98 ) # Compute item information function (IIF) # across the theta continuum info_dichotomous <- i_info(item_par, theta = theta) # Define parameters for a 4-category item # (K = 3 thresholds / category transitions) # a's = category discrimination parameters # b's = threshold/location parameters item_pars <- data.frame( a1 = 1.2, a2 = 1.0, a3 = 0.8, b1 = -1.0, b2 = 0.0, b3 = 1.2 ) # Compute item information for the polytomous item # across the theta continuum info <- i_info(item_pars, theta = theta, K = 3)# Set random seed for reproducibility set.seed(123) # Create a sequence of latent trait values # spanning the ability continuum theta <- seq(-4, 4, length.out = 200) # Define parameters for a dichotomous item # b = difficulty # a = discrimination # c = lower asymptote (guessing) # e = upper asymptote item_par <- data.frame( b = 0, a = 1.5, c = .10, e = .98 ) # Compute item information function (IIF) # across the theta continuum info_dichotomous <- i_info(item_par, theta = theta) # Define parameters for a 4-category item # (K = 3 thresholds / category transitions) # a's = category discrimination parameters # b's = threshold/location parameters item_pars <- data.frame( a1 = 1.2, a2 = 1.0, a3 = 0.8, b1 = -1.0, b2 = 0.0, b3 = 1.2 ) # Compute item information for the polytomous item # across the theta continuum info <- i_info(item_pars, theta = theta, K = 3)
Compute the expected probability for an item given the latent trait and the item parameters.
Depending on the parameters that are specified, the probability is computed according to the 1-PL, 2-PL, 3-PL, or 4-PL models.
IRT(theta, b = 0, a = 1, c = 0, e = 1)IRT(theta, b = 0, a = 1, c = 0, e = 1)
theta |
|
b |
|
a |
|
c |
|
e |
|
The probability of a correct response for person (with latent trait level defined as ) on item under the four-parameter logistic
(4-PL; Barton & Lord, 1981) model is defined as:
where is the discrimination parameter,
is the difficulty parameter (or location of item on the latent trait),
is the lower asymptote (pseudo-guessing probability),
and is the upper asymptote (inattention/slip). By constraining , , and , the probability
is computed according to the 3-PL (Lord, 1980), 2-PL (Birnbaum, 1968) and 1-PL or the Rasch model (Rasch, 1960), respectively.
a single value, that is the probability of the correct response for item given the specified parameters
Barton, M. A., & Lord, F. M. (1981). An upper asymptote for the three-parameter logistic item-response model. ETS Research Report Series, 1981(1), i–8. Princeton, NJ: Educational Testing Service.
Birnbaum, A. (1968). Some latent trait models and their use in inferring an examinee's ability. In F. M. Lord & M. R. Novick (Eds.), Statistical theories of mental test scores (pp. 397–479). Reading, MA: Addison-Wesley.
Lord, F. M. (1980). Applications of item response theory to practical testing problems. Hillsdale, NJ: Lawrence Erlbaum Associates.
Rasch, G. (1960). Probabilistic models for some intelligence and attainment tests. Copenhagen, Denmark: Danish Institute for Educational Research.
# compute the probability for an item according to the 1-PL model IRT(theta = 0, b = 0, a = 1, c = 0, e = 1) # compute the probability for a vector of thetas for the same item IRT(theta = c(-1, 0, 1), b = 0, a = 1, c = 0, e = 1) # compute the probability for a vector of thetas for an item according to the 4-PL model IRT(theta = c(-1, 0, 1), b = 0, a = 1.25, c = 0.10, e = 0.98)# compute the probability for an item according to the 1-PL model IRT(theta = 0, b = 0, a = 1, c = 0, e = 1) # compute the probability for a vector of thetas for the same item IRT(theta = c(-1, 0, 1), b = 0, a = 1, c = 0, e = 1) # compute the probability for a vector of thetas for an item according to the 4-PL model IRT(theta = c(-1, 0, 1), b = 0, a = 1.25, c = 0.10, e = 0.98)
via Maximum LikelihoodMaximum Likelihood estimation of
irt_estimate(item_par, responses = NULL, theta, lower = -3, upper = abs(lower))irt_estimate(item_par, responses = NULL, theta, lower = -3, upper = abs(lower))
item_par |
|
responses |
|
theta |
|
lower |
|
upper |
|
A numeric vector of length equal to the length of theta with the ML estimation of the latent trait
set.seed(123) n <- 50 theta <- rnorm(500) item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # estimate theta theta_hat <- irt_estimate(item_par, theta = theta) plot(theta, theta_hat)set.seed(123) n <- 50 theta <- rnorm(500) item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # estimate theta theta_hat <- irt_estimate(item_par, theta = theta) plot(theta, theta_hat)
Develop a test or a short form given the parameters of dichotomous or polytomous in an item bank/full-length test according to the Item Selection Algorithm (ISA, Epifania & Finos, 2025). See Details.
isa(item_pars, tif_target, nmin = round(nrow(item_pars) * 0.1), K = NULL)isa(item_pars, tif_target, nmin = round(nrow(item_pars) * 0.1), K = NULL)
item_pars |
|
tif_target |
|
nmin |
|
K |
|
Let denote the iteration index of the procedure, denote the test information target, and denote the test information function obtained from (where is the item bank and is the subset of items selected up to iteration ).
At : , , .
For ,
Consider the available items at iteration
Compute the provisional TIF () considering the available items one at the time
Select a provisional item allowing for minimizing the distance from the TIF target
Test the termination criterion: If
, , Go back to 1
Stop,
Further details on the algorithm can be found in Epifania & Finos (2025), where the algorithm is denoted as Frank.
An object of class isa of length 6 containing:
test: a dataframe containing the items selected for inclusion
in the test (column isel) and the minimum number of items set in nmin.
item_pars: the original dataframe containing the item parameters.
selected_items: a dataframe containing the parameters of the selected items.
all_iifs: a dataframe containing the IIFs of all the original items.
tif_target: the dataframe with the TIF target used for the item selection.
K: Number of thresholds for the response categories of the items. If the items are dichotomous K is NULL.
Epifania, O. M., & Finos, L. (2025). Nothing lasts forever – only item administration: An item response theory algorithm to shorten tests. In E. Di Bella, V. Gioia, C. Lagazio, & S. Zaccarin (Eds.), Statistics for Innovation III (pp. 188–193). Italian Statistical Society Series on Advances in Statistics. Springer, Cham. https://doi.org/10.1007/978-3-031-95995-0_32
# set a seed for the reproducibility of the results set.seed(123) # define the number of items in the item bank n <- 50 # generate 500 random values of theta from a normal distribution with sd = 2 theta <- rnorm(500, sd = 2) # generate item parameters of the items in the item bank according to the 2-PL model item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # define the tif target as the average tif of the items in the item bank tif_target <- tif( item_info(item_pars), fun = "mean" ) # apply ISA with the constraint of selecting at least 4 items resIsa <- isa(item_pars, tif_target, nmin = 4) str(resIsa) # generate an item bank with 4 polytomous items with K = 3 item_pars <- data.frame( matrix(c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1.0, -1.5, -1.0, 0.0, 1.0, 1.0, 1.0, -1.5, 0.0, 0.5 ), nrow = 4, byrow = TRUE) ) colnames(item_pars) <- paste( rep(c("a", "b"), each = 3), 1:3, sep = "" ) # rename the columns # apply ISA with the constraint of selecting at least 2 items resIsa_poly <- isa(item_pars, tif_target, nmin = 2, K = 3) str(resIsa_poly)# set a seed for the reproducibility of the results set.seed(123) # define the number of items in the item bank n <- 50 # generate 500 random values of theta from a normal distribution with sd = 2 theta <- rnorm(500, sd = 2) # generate item parameters of the items in the item bank according to the 2-PL model item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # define the tif target as the average tif of the items in the item bank tif_target <- tif( item_info(item_pars), fun = "mean" ) # apply ISA with the constraint of selecting at least 4 items resIsa <- isa(item_pars, tif_target, nmin = 4) str(resIsa) # generate an item bank with 4 polytomous items with K = 3 item_pars <- data.frame( matrix(c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1.0, -1.5, -1.0, 0.0, 1.0, 1.0, 1.0, -1.5, 0.0, 0.5 ), nrow = 4, byrow = TRUE) ) colnames(item_pars) <- paste( rep(c("a", "b"), each = 3), 1:3, sep = "" ) # rename the columns # apply ISA with the constraint of selecting at least 2 items resIsa_poly <- isa(item_pars, tif_target, nmin = 2, K = 3) str(resIsa_poly)
)Computes the item information functions for multiple dichotomous or polytomous items
item_info(item_pars, theta = seq(-5, 5, length.out = 1000), K = NULL)item_info(item_pars, theta = seq(-5, 5, length.out = 1000), K = NULL)
item_pars |
|
theta |
|
K |
|
Let denote the probability of a correct response for person (with latent trait level defined as ) on item under the four-parameter logistic
(4-PL; Barton & Lord, 1981) model is defined as:
where is the discrimination parameter,
is the difficulty parameter (or location of item on the latent trait),
is the lower asymptote (pseudo-guessing probability),
and is the upper asymptote (inattention/slip). By constraining , , and , the probability
is computed according to the 3-PL (Lord, 1980), 2-PL (Birnbaum, 1968) and 1-PL or the Rasch model (Rasch, 1960), respectively.
Let , the information function of item is computed as:
According to the Generalized Partial Credit Model (GPCM; Muraki, 1997), for a polytomous item with thresholds separating the categories, the probability of category is defined as:
where and are the discrimination and location parameters associate with each threshold . If , the Partial Credit Model (PCM, Muraki, 1992) is obtained.
The item information is computed as:
A matrix of class iifs with number of rows equal to the length of theta and number of columns equal to the number of items in item_par
Barton, M. A., & Lord, F. M. (1981). An upper asymptote for the three-parameter logistic item-response model. ETS Research Report Series, 1981(1), i–8. Princeton, NJ: Educational Testing Service.
Birnbaum, A. (1968). Some latent trait models and their use in inferring an examinee's ability. In F. M. Lord & M. R. Novick (Eds.), Statistical theories of mental test scores (pp. 397–479). Reading, MA: Addison-Wesley.
Lord, F. M. (1980). Applications of item response theory to practical testing problems. Hillsdale, NJ: Lawrence Erlbaum Associates.
Muraki, G. (1992). A generalized partial credit model: Application of an EM algorithm. Psychometrika, 57(2), 159–176.
Muraki, G. (1997). A generalized partial credit model with step discrimination. Journal of Educational Measurement, 34(2), 115–127.
Rasch, G. (1960). Probabilistic models for some intelligence and attainment tests. Copenhagen, Denmark: Danish Institute for Educational Research.
# Set random seed for reproducibility set.seed(123) # Define parameters for five dichotomous items # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote parameters <- data.frame( b = c(-3, -2, 0, 2, 3), a = runif(5, 1.2, 1.9), c = rep(0, 5), e = rep(1, 5) ) # Compute item information functions for # dichotomous items using default theta values infos <- item_info(parameters) # Display the first rows of the information matrix head(infos) # Define parameters for four polytomous items # with four response categories (K = 3 thresholds) item_pars <- data.frame( matrix( c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1.0, -1.5, -1.0, 0.0, 1.0, 1.0, 1.0, -1.5, 0.0, 0.5 ), nrow = 4, byrow = TRUE ) ) # Assign parameter names: # a1-a3 = discrimination parameters # b1-b3 = threshold/location parameters colnames(item_pars) <- paste( rep(c("a", "b"), each = 3), 1:3, sep = "" ) # Compute item information functions # for the polytomous items info_poly <- item_info(item_pars, K = 3) # Display the first rows of the information matrix head(info_poly)# Set random seed for reproducibility set.seed(123) # Define parameters for five dichotomous items # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote parameters <- data.frame( b = c(-3, -2, 0, 2, 3), a = runif(5, 1.2, 1.9), c = rep(0, 5), e = rep(1, 5) ) # Compute item information functions for # dichotomous items using default theta values infos <- item_info(parameters) # Display the first rows of the information matrix head(infos) # Define parameters for four polytomous items # with four response categories (K = 3 thresholds) item_pars <- data.frame( matrix( c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1.0, -1.5, -1.0, 0.0, 1.0, 1.0, 1.0, -1.5, 0.0, 0.5 ), nrow = 4, byrow = TRUE ) ) # Assign parameter names: # a1-a3 = discrimination parameters # b1-b3 = threshold/location parameters colnames(item_pars) <- paste( rep(c("a", "b"), each = 3), 1:3, sep = "" ) # Compute item information functions # for the polytomous items info_poly <- item_info(item_pars, K = 3) # Display the first rows of the information matrix head(info_poly)
Provide the log-likelihood function for estimating given
the item parameters (dichotomous only) and the true values of
logLik_theta(theta, x, item_par)logLik_theta(theta, x, item_par)
theta |
|
x |
|
item_par |
|
The function for estimating the log-likelihood of
set.seed(123) n <- 50 theta <- rnorm(500) item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) obs_response <- obsirt(mpirt(item_par, theta)) # LogLikelihood of theta logLik_theta(theta, obs_response, item_par)set.seed(123) n <- 50 theta <- rnorm(500) item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) obs_response <- obsirt(mpirt(item_par, theta)) # LogLikelihood of theta logLik_theta(theta, obs_response, item_par)
Compute the expected probability for multiple dichotomous items given the latent trait levels and the item parameters.
Depending on the parameters that are specified, the probability is computed according to the 1-PL, 2-PL, 3-PL, or 4-PL models.
mpirt(item_pars, theta)mpirt(item_pars, theta)
item_pars |
|
theta |
|
The probability of a correct response for person (with latent trait level defined as ) on item under the four-parameter logistic
(4-PL; Barton & Lord, 1981) model is defined as:
where is the discrimination parameter,
is the difficulty parameter (or location of item on the latent trait),
is the lower asymptote (pseudo-guessing probability),
and is the upper asymptote (inattention/slip). By constraining , , and , the probability
is computed according to the 3-PL (Lord, 1980), 2-PL (Birnbaum, 1968) and 1-PL or the Rasch model (Rasch, 1960), respectively.
A (where is the number of respondents corresponding to the length of theta and is the number of items corresponding to the number of rows in item_pars) matrix of class mpirt with the expected probability of observing a correct response for respondent on item
Barton, M. A., & Lord, F. M. (1981). An upper asymptote for the three-parameter logistic item-response model. ETS Research Report Series, 1981(1), i–8. Princeton, NJ: Educational Testing Service.
Birnbaum, A. (1968). Some latent trait models and their use in inferring an examinee's ability. In F. M. Lord & M. R. Novick (Eds.), Statistical theories of mental test scores (pp. 397–479). Reading, MA: Addison-Wesley.
Lord, F. M. (1980). Applications of item response theory to practical testing problems. Hillsdale, NJ: Lawrence Erlbaum Associates.
Rasch, G. (1960). Probabilistic models for some intelligence and attainment tests. Copenhagen, Denmark: Danish Institute for Educational Research.
# Set random seed for reproducibility set.seed(123) # Define the number of items n <- 50 # Generate latent trait values (theta) for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = item difficulty parameters # a = item discrimination parameters # c = lower asymptote (guessing parameter) # e = upper asymptote item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute expected response probabilities # for each respondent-item combination expected_prob <- mpirt(item_pars, theta)# Set random seed for reproducibility set.seed(123) # Define the number of items n <- 50 # Generate latent trait values (theta) for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = item difficulty parameters # a = item discrimination parameters # c = lower asymptote (guessing parameter) # e = upper asymptote item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute expected response probabilities # for each respondent-item combination expected_prob <- mpirt(item_pars, theta)
Simulate dichotomous responses according to IRT probabilities simulated with the mpirt() function .
obsirt(myp)obsirt(myp)
myp |
Object of class |
# Set random seed for reproducibility set.seed(123) # Define the number of items n <- 50 # Generate latent trait values (theta) for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = item difficulty parameters # a = item discrimination parameters # c = lower asymptote (guessing parameter) # e = upper asymptote item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute expected response probabilities # for each respondent-item combination expected_prob <- mpirt(item_pars, theta) # Generate observed item responses from the # expected probabilities simulated_responses <- obsirt(expected_prob)# Set random seed for reproducibility set.seed(123) # Define the number of items n <- 50 # Generate latent trait values (theta) for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = item difficulty parameters # a = item discrimination parameters # c = lower asymptote (guessing parameter) # e = upper asymptote item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute expected response probabilities # for each respondent-item combination expected_prob <- mpirt(item_pars, theta) # Generate observed item responses from the # expected probabilities simulated_responses <- obsirt(expected_prob)
The test/short test form is obtained with the benchmark procedure implemented with function bench(). Details on the procedure can be found in the documentation of the bench() function.
## S3 method for class 'bench' plot(x, fun = "sum", ...)## S3 method for class 'bench' plot(x, fun = "sum", ...)
x |
Object of class |
fun |
|
... |
other arguments |
A ggplot showing the TIFs of the test.
# Set random seed for reproducibility set.seed(123) # Define the number of items n <- 50 # Generate latent trait values for 500 respondents # using a wider latent distribution (sd = 2) theta <- rnorm(500, sd = 2) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Run benchmark/selection procedure # selecting 5 items from the item pool resB <- bench( item_par, theta = theta, num_item = 5 ) # Plot benchmark results including # item-level and test-level information plot(resB) # Plot only the Test Information Function (TIF) plot(resB, show_both = FALSE) # Define parameters for four polytomous items # with four response categories (K = 3 thresholds) item_pars <- data.frame( matrix( c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1.0, -1.5, -1.0, 0.0, 1.0, 1.0, 1.0, -1.5, 0.0, 0.5 ), nrow = 4, byrow = TRUE ) ) # Assign parameter names colnames(item_pars) <- paste( rep(c("a", "b"), each = 3), 1:3, sep = "" ) # Run benchmark/selection procedure # for polytomous items selecting 2 items resB_poly <- bench( item_pars, theta = theta, num_item = 2, K = 3 ) # Plot benchmark results for the polytomous case plot(resB_poly)# Set random seed for reproducibility set.seed(123) # Define the number of items n <- 50 # Generate latent trait values for 500 respondents # using a wider latent distribution (sd = 2) theta <- rnorm(500, sd = 2) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Run benchmark/selection procedure # selecting 5 items from the item pool resB <- bench( item_par, theta = theta, num_item = 5 ) # Plot benchmark results including # item-level and test-level information plot(resB) # Plot only the Test Information Function (TIF) plot(resB, show_both = FALSE) # Define parameters for four polytomous items # with four response categories (K = 3 thresholds) item_pars <- data.frame( matrix( c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1.0, -1.5, -1.0, 0.0, 1.0, 1.0, 1.0, -1.5, 0.0, 0.5 ), nrow = 4, byrow = TRUE ) ) # Assign parameter names colnames(item_pars) <- paste( rep(c("a", "b"), each = 3), 1:3, sep = "" ) # Run benchmark/selection procedure # for polytomous items selecting 2 items resB_poly <- bench( item_pars, theta = theta, num_item = 2, K = 3 ) # Plot benchmark results for the polytomous case plot(resB_poly)
Plot the information functions of polytomous or dichotomous items
## S3 method for class 'iifs' plot(x, single_panels = TRUE, items = NULL, ...)## S3 method for class 'iifs' plot(x, single_panels = TRUE, items = NULL, ...)
x |
|
single_panels |
|
items |
default is |
... |
other arguments |
If more there are more than 10 items, the legend associated to the color of the lines is not displayed.
A ggplot
# Set random seed for reproducibility set.seed(123) # Simulate parameters for five dichotomous items # according to a 2-PL specification # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote parameters <- data.frame( b = c(-3, -2, 0, 2, 3), a = runif(5, 1.2, 1.9), c = rep(0, 5), e = rep(1, 5) ) # Compute item information functions (IIFs) infos <- item_info(parameters) # Plot information functions for all items plot(infos) # Plot information functions only for items 1 and 3 # on a single panel plot( infos, items = c(1, 3), single_panels = FALSE )# Set random seed for reproducibility set.seed(123) # Simulate parameters for five dichotomous items # according to a 2-PL specification # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote parameters <- data.frame( b = c(-3, -2, 0, 2, 3), a = runif(5, 1.2, 1.9), c = rep(0, 5), e = rep(1, 5) ) # Compute item information functions (IIFs) infos <- item_info(parameters) # Plot information functions for all items plot(infos) # Plot information functions only for items 1 and 3 # on a single panel plot( infos, items = c(1, 3), single_panels = FALSE )
The test/short test form is obtained with the ISA procedure implemented with function isa(). Details on the procedure can be found in the documentation of the isa() function.
## S3 method for class 'isa' plot(x, fun = "mean", show_all = FALSE, show_dist = FALSE, ...)## S3 method for class 'isa' plot(x, fun = "mean", show_all = FALSE, show_dist = FALSE, ...)
x |
Object of class |
fun |
|
show_all |
|
show_dist |
|
... |
other arguments |
A ggplot showing either the TIFs of the test, that of the item bank, and the TIF target or the distance/difference.
# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values (not directly used here, # but typically included in IRT simulations) theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions for the item bank # and define a target test information function (TIF) # as the mean information across items target <- tif(item_info(item_par), fun = "mean") # Run item selection algorithm (ISA) # selecting a minimum of 5 items resI <- isa(item_par, target, nmin = 5) # Plot selected item set and related results plot(resI) # Show the Test Information Function (TIF) # of the selected item bank plot(resI, show_all = TRUE) # Show the distance between obtained TIF and target TIF plot(resI, show_dist = TRUE)# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values (not directly used here, # but typically included in IRT simulations) theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions for the item bank # and define a target test information function (TIF) # as the mean information across items target <- tif(item_info(item_par), fun = "mean") # Run item selection algorithm (ISA) # selecting a minimum of 5 items resI <- isa(item_par, target, nmin = 5) # Plot selected item set and related results plot(resI) # Show the Test Information Function (TIF) # of the selected item bank plot(resI, show_all = TRUE) # Show the distance between obtained TIF and target TIF plot(resI, show_dist = TRUE)
The test/short test form is obtained with the theta target procedure implemented with function theta_target(). Details on the procedure can be found in the documentation of the theta_target() function.
## S3 method for class 'theta_target' plot(x, fun = "sum", show_targets = TRUE, ...)## S3 method for class 'theta_target' plot(x, fun = "sum", show_targets = TRUE, ...)
x |
Object of class |
fun |
|
show_targets |
|
... |
other arguments |
If more than 10 theta targets are selected, the legend associated to each theta target is not displayed.
A ggplot showing the TIFs of the test, the locations of the theta targets, and the items that satisfy each theta target.
# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Define a theta targets targets <- define_targets(theta, num_targets = 4) # Perform theta-targeted item selection resT <- theta_target(targets, item_par) # Plot results of the target-based selection plot(resT) # Plot results without displaying theta target plot(resT, show_targets = FALSE)# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Define a theta targets targets <- define_targets(theta, num_targets = 4) # Perform theta-targeted item selection resT <- theta_target(targets, item_par) # Plot results of the target-based selection plot(resT) # Plot results without displaying theta target plot(resT, show_targets = FALSE)
Plot the test information function computed with the tif() function.
## S3 method for class 'tif' plot(x, ...)## S3 method for class 'tif' plot(x, ...)
x |
object of class |
... |
other arguments |
A ggplot displaying the TIF
# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 5 # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions (IIFs) iifs <- item_info(item_par) # Compute Test Information Function (TIF) test_tif <- tif(iifs) # Plot the test information function plot(test_tif) # Compute the mean TIF across items/components test_tif_mean <- tif(iifs, fun = "mean") # Plot the mean test information function plot(test_tif_mean)# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 5 # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions (IIFs) iifs <- item_info(item_par) # Compute Test Information Function (TIF) test_tif <- tif(iifs) # Plot the test information function plot(test_tif) # Compute the mean TIF across items/components test_tif_mean <- tif(iifs, fun = "mean") # Plot the mean test information function plot(test_tif_mean)
The test/short test form is obtained with the benchmark procedure implemented with function bench(). Details on the procedure can be found in the documentation of the bench() function.
## S3 method for class 'bench' summary(object, ...)## S3 method for class 'bench' summary(object, ...)
object |
Object of class |
... |
other arguments |
A summary of the test obtained from the application of the benchmark procedure
# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Run benchmark/item selection procedure # selecting 5 items from the item bank resB <- bench( item_par, theta = theta, num_item = 5 ) # Summarize benchmark results summary(resB)# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Run benchmark/item selection procedure # selecting 5 items from the item bank resB <- bench( item_par, theta = theta, num_item = 5 ) # Summarize benchmark results summary(resB)
The test/short test form is obtained with the ISA procedure implemented with function isa(). Details on the procedure can be found in the documentation of the isa() function.
## S3 method for class 'isa' summary(object, ...)## S3 method for class 'isa' summary(object, ...)
object |
Object of class |
... |
other arguments |
A summary of the test obtained from the application of ISA
# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions and define # a target Test Information Function (TIF) # using the mean information across items target <- tif( item_info(item_par), fun = "mean" ) # Run item selection algorithm (ISA) # selecting at least 5 items resI <- isa( item_par, target, nmin = 5 ) # Summarize item selection results summary(resI)# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions and define # a target Test Information Function (TIF) # using the mean information across items target <- tif( item_info(item_par), fun = "mean" ) # Run item selection algorithm (ISA) # selecting at least 5 items resI <- isa( item_par, target, nmin = 5 ) # Summarize item selection results summary(resI)
The test/short test form is obtained with the theta target procedure implemented with function theta_target(). Details on the procedure can be found in the documentation of the theta_target() function.
## S3 method for class 'theta_target' summary(object, ...)## S3 method for class 'theta_target' summary(object, ...)
object |
Object of class |
... |
other arguments |
A summary of the test obtained from the application of the theta target procedure
# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Define theta-based target regions # splitting the latent trait distribution into 4 segments targets <- define_targets(theta, num_targets = 4) # Perform theta-targeted item selection # matching item information to target regions resT <- theta_target(targets, item_par) # Summarize theta-targeted selection results summary(resT)# Set random seed for reproducibility set.seed(123) # Define the number of items in the item bank n <- 50 # Generate latent trait values for 500 respondents theta <- rnorm(500) # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Define theta-based target regions # splitting the latent trait distribution into 4 segments targets <- define_targets(theta, num_targets = 4) # Perform theta-targeted item selection # matching item information to target regions resT <- theta_target(targets, item_par) # Summarize theta-targeted selection results summary(resT)
Develop a test or a short form given the parameters of dichotomous or polytomous in an item bank/full-length test according to the theta target procedure. See Details.
theta_target( targets, item_pars, theta = seq(-5, 5, length.out = 1000), K = NULL )theta_target( targets, item_pars, theta = seq(-5, 5, length.out = 1000), K = NULL )
targets |
|
item_pars |
|
theta |
|
K |
|
Let be the set of -targets (), i.e., the latent trait levels of interest for the assessment defined as discrete levels of , where denotes the desired length of , where denotes the item bank.
The test of length is developed by considering the information that each item in provides with respect to each . Therefore, an optimal item (i.e., the item with the highest information function) is chosen for each . Given that is the pre-defined length of test and that an optimal item is selected for each , then .
Let denote the iteration index of the procedure and define:
as the set of items selected for
inclusion in the test up to iteration ;
as the set of s
satisfied up to iteration .
At , and
.
The procedure iterates the following steps until :
Select the item–target pair maximizing the item
information function:
Update the set of selected items:
Update the set of satisfied ability targets:
At iteration , the procedure yields
and . Further details can be found in Epifania et al. (2022).
An object of class theta_target of length 4 containing:
test: a data frame containing the items selected for inclusion
in the test (column isel), their maximum item information
function (column maxiif), and the corresponding theta target
(column theta_target).
item_pars: the original data frame containing the item parameters.
selected_items: a data frame containing the parameters of the selected items.
intervals: a character string indicating how the theta
targets were obtained. The value "clusters" denotes clustering of
the latent trait, "equal" denotes equally spaced intervals, and
"unknown" identifies any other case (e.g., user-defined theta targets).
K: Number of thresholds for the response categories of the items. If the items are dichotomous K is NULL.
Epifania, O. M., Anselmi, P., & Robusto, E. (2022). Item response theory approaches for test shortening. In M. Wiberg, D. Molenaar, J. Gonzalez, J. S. Kim, & H. Hwang (Eds.), Quantitative Psychology (Vol. 422, pp. 75–83). Springer Proceedings in Mathematics and Statistics. Springer, Cham. https://doi.org/10.1007/978-3-031-27781-8_7
set.seed(123) n <- 50 theta <- rnorm(500) item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) targets <- define_targets(theta, num_targets = 4) resT <- theta_target(targets, item_pars) str(resT) # polytomous items with user defined theta targets item_pars <- data.frame(matrix(c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1, -1.5, -1.0, 0, 1, 1, 1, -1.5, -0, 0.5 ), nrow = 4, byrow = TRUE)) colnames(item_pars) = paste(rep(c("a", "b"), each = 3), 1:3, sep = "") resT_poly <- theta_target(c(-1,0), item_pars, K = 3) str(resT_poly)set.seed(123) n <- 50 theta <- rnorm(500) item_pars <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) targets <- define_targets(theta, num_targets = 4) resT <- theta_target(targets, item_pars) str(resT) # polytomous items with user defined theta targets item_pars <- data.frame(matrix(c( 1.2, 1.0, 0.8, -1.0, 0.0, 1.2, 0.9, 1.1, 1.3, -0.5, 0.7, 1.8, 0.5, 1.5, 1, -1.5, -1.0, 0, 1, 1, 1, -1.5, -0, 0.5 ), nrow = 4, byrow = TRUE)) colnames(item_pars) = paste(rep(c("a", "b"), each = 3), 1:3, sep = "") resT_poly <- theta_target(c(-1,0), item_pars, K = 3) str(resT_poly)
Compute the test information function of a test given a matrix of item information functions computed with the item_info() function. See Details.
tif(iifs, fun = "sum")tif(iifs, fun = "sum")
iifs |
object of class |
fun |
|
The test infromation function (TIF) for both polytomous and dichotomous items is computed as:
Where is the item bank.
A data.frame of class tif with two columns: (i) theta containing the latent trait values, and (ii) tif containing the TIF values computed as either the sum or the mean of the IIFs
# Set random seed for reproducibility set.seed(123) # Generate latent trait values for 100 respondents theta <- rnorm(100) # Define the number of items n <- 5 # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions (IIFs) # using default theta values iifs <- item_info(item_par) # Compute the test information function (TIF) # by combining information across items test_tif <- tif(iifs)# Set random seed for reproducibility set.seed(123) # Generate latent trait values for 100 respondents theta <- rnorm(100) # Define the number of items n <- 5 # Create item parameter matrix/data frame # b = difficulty parameters # a = discrimination parameters # c = lower asymptote # e = upper asymptote item_par <- data.frame( b = runif(n, -3, 3), a = runif(n, 1.2, 1.9), c = rep(0, n), e = rep(1, n) ) # Compute item information functions (IIFs) # using default theta values iifs <- item_info(item_par) # Compute the test information function (TIF) # by combining information across items test_tif <- tif(iifs)