Skip to content

jansteinfeld/jmleIRT

Repository files navigation

jmleIRT: Rasch Model Joint Maximum Likelihood Estimation in R

CRAN status R-CMD-check

GitHub version GitHub release GitHub issues

codecov CRAN version CRAN checks downloads License

Overview

The jmleIRT package includes Joint Maximum Likelihood Estimation (JMLE) of person abilities and item difficulties for the Rasch model (1PL). It incorporates some selected bias correction techniques and offers Warm’s Weighted Likelihood Estimates (WLE) for person ability estimation.


Features

  • Joint Maximum Likelihood Estimation of person abilities $\theta_p$ and item difficulties $\beta_i$.
  • Bias correction to reduce estimation bias, including epsilon bias stabilization.
  • Warm’s Weighted Likelihood Estimates (WLE) for refined person ability estimates.
  • Handling of missing data (missing responses coded as NA).
  • Verbose mode for detailed iteration progress monitoring.
  • Unit testing.

Installation

Or install the development version from GitHub:

# install.packages("remotes")
remotes::install_github("jansteinfeld/jmleIRT")

Usage Example

library(jmleIRT)

# Simulate response  40 persons (p) × 5 items (i)
set.seed(123)
X <- matrix(rbinom(40 * 5, 1, 0.5), nrow = 40)

# Estimate Rasch model using JMLE with bias correction
fit <- jmle_estimation(X, max_iter = 200, conv = 1e-5,
                      center = "items", bias_correction = "simple")

# Item difficulties (centered)
print(fit$beta)

# Compute Weighted Likelihood Estimates for persons
wle_res <- estimate_wle(X, fit$beta)

# Person ability estimates via WLE
print(wle_res$wle)

# Plot item characteristic curves
plot(fit, type = "hist")
plot(fit, type = "icc", items = 1:3)

Mathematical Model

The Rasch Model

The Rasch model is a fundamental Item Response Theory (IRT) model used for dichotomous item data. The probability that person $p$ with ability $\theta_p$ answers item $i$ with difficulty $\beta_i$ correctly is modeled as:

$$P(X_{pi} = 1 \mid \theta_p, \beta_i) = \frac{e^{\theta_p - \beta_i}}{1 + e^{\theta_p - \beta_i}}$$

where $X_{pi} \in {0,1}$ indicates the correctness of response.

Joint Maximum Likelihood Estimation (JMLE)

JMLE simultaneously estimates person abilities $\theta = (\theta_1, \ldots, \theta_P)$ and item difficulties $\beta = (\beta_1, \ldots, \beta_I)$ by maximizing the joint likelihood of observed responses:

$$L(\theta, \beta) = \prod_{p=1}^P \prod_{i=1}^I P(X_{pi} \mid \theta_p, \beta_i)$$

This is typically solved via an iterative algorithm updating $\theta_p$ and $\beta_i$, until convergence criteria are met.

Although easy to implement and computationally efficient, JMLE estimates suffer from bias, especially in small samples or with extreme response patterns.

Bias Correction Methods

The Joint Maximum Likelihood Estimation (JMLE) for the Rasch model is known to produce biased parameter estimates, especially in finite samples and with extreme response patterns. The jmleIRT package implements two key bias correction techniques:

  • Epsilon adjustment: Proposed by Bertoli Barsotti, Punzo, and Lando, this method adds a small positive constant $$\varepsilon &gt; 0$$ during the estimation process. This adjustment prevents infinite log-odds for perfect or zero scores, ensuring finite item difficulty and ability estimates. It also helps alleviate bias related to extreme response patterns by smoothing the estimation. The adjustment is controlled by the argument eps in jmle_estimation(). When eps > 0, a small positive constant is used to regularize extreme response patterns; when eps = 0 (default), persons with all 0 or all 1 responses are excluded from the iterative updates and assigned ±Inf afterward.

  • Simple post-hoc bias correction: The option bias_correction = TRUE in jmle_estimation() applies a simple finite-sample scaling of item difficulties (factor (I − 1)/I) as a fast bias-reduction heuristic.

  • Analytical bias correction: The function biasCorrection() applies a separate, more elaborate first-order analytic correction based on score and information terms for person and item parameters. This approach involves modifying the item difficulty estimates based on theoretical bias expressions derived from asymptotic expansions or minimum divergence estimators. It aims to reduce the structural bias inherent in the JMLE estimates as described in psychometric literature (e.g., Bertoli Barsotti & Punzo, 2012; Lando & Bertoli Barsotti, 2014).

In combination, the epsilon adjustment promotes numerical stability and improved bias behavior at the estimation level, while analytical bias correction provides targeted, theoretically grounded refinement of item parameter estimates to enhance overall accuracy and robustness of the JMLE algorithm.

Bias correction modes

The jmleIRT package offers three levels of bias correction for the JMLE estimates, controlled by the argument bias_correction in jmle_estimation():

  • "none": Plain JMLE without any bias correction. This is the classical joint ML estimator and is useful as a baseline, but is known to be biased in finite samples.

  • "simple": A fast finite-sample adjustment that rescales item difficulties by a factor $(I - 1)/I$, where $I$ is the number of items. This provides a quick reduction of the small-sample bias in item parameters.

  • "analytic": A first-order analytical bias correction based on score and information terms for persons and items. Internally, jmle_estimation(..., bias_correction = "analytic") first computes the JMLE solution and then calls biasCorrection() to obtain corrected parameters. The result object contains both the raw JMLE (theta, beta) and the analytically corrected estimates (theta_analytic, beta_analytic).

  • Use "none" for didactic purposes and to reproduce classical JMLE results.

  • Use "simple" for ‘quick, low-cost bias reduction’ in item difficulties.

  • Use "analytic" when sample size is moderate to large (N >> I) and bias in both person and item parameters is a concern.

Person ability estimates: JMLE vs WLE

By default, jmle_estimation() returns joint ML person estimates theta. For reporting individual abilities, Warm’s Weighted Likelihood Estimates (WLE) often have better bias properties.

  • Set estimatewle = TRUE in jmle_estimation() to obtain WLEs in fit$wle_estimate.
  • The joint ML estimates (fit$theta) are primarily useful for calibration and comparison with other Rasch estimation methods.

The object returned by jmle_estimation() also contains approximate standard errors for person and item parameters (se_theta, se_beta), computed from the observed information at the final JMLE solution.

Package Features

  • Estimation of person and item parameters using bias-corrected JMLE
  • optional ability estimation based on Warm’s Weighted Likelihood Estimates (WLE)
  • Handling of missing data
  • documentation and examples
  • Open-source development on GitHub for transparency and collaboration
  • Optimized C++ backend for performance

References

  • Bertoli Barsotti, L., & Punzo, A. (2012). Comparison of two bias reduction techniques for the Rasch model. Electronic Journal of Applied Statistical Analysis, 5(3), 360-366.
  • Lando, T., & Bertoli Barsotti, L. (2014). A modified minimum divergence estimator: some preliminary results for the Rasch model. Electronic Journal of Applied Statistical Analysis, 7(1), 37-57.
  • Wright, B. D., & Panchapakesan, N. (1969). A Procedure for Sample-Free Item Analysis. Educational and Psychological Measurement, 29(1), 23-48.

License

GPL-3


Contributions welcome via GitHub: jansteinfeld/jmleIRT.

About

R Package for JMLE parameter estimation License

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published