Rescale posterior samples for identification
dpmirt_rescale.RdApplies post-hoc rescaling to MCMC posterior samples to resolve identification indeterminacy. For unconstrained models, this centers item difficulties and (for 2PL/3PL) normalizes discriminations.
Value
A dpmirt_fit S3 object containing rescaled posterior
samples, chain/run metadata, diagnostics (ESS, WAIC, cluster info), and
model configuration. This object can be passed directly to
dpmirt_estimates, dpmirt_resume, and
other downstream functions.
Details
Post-hoc rescaling resolves the identification indeterminacy inherent in unconstrained IRT models:
Rasch (location only): For each MCMC iteration \(s\): $$\beta^*_i = \beta_i - \bar{\beta}$$ $$\theta^*_j = \theta_j - \bar{\beta}$$
2PL/3PL IRT parameterization (location + scale): Let \(c_s = \bar{\beta}_s\) and \(d_s = (\prod_i \lambda_i)^{-1/I}\): $$\beta^*_i = (\beta_i - c_s) / d_s$$ $$\lambda^*_i = \lambda_i \cdot d_s$$ $$\theta^*_j = (\theta_j - c_s) / d_s$$
2PL/3PL slope-intercept parameterization: Let \(c_s = \sum_i \gamma_i / \sum_i \lambda_i\) and \(d_s = (\prod_i \lambda_i)^{-1/I}\): $$\gamma^*_i = \gamma_i - \lambda_i c_s$$ $$\lambda^*_i = \lambda_i \cdot d_s$$ $$\theta^*_j = (\theta_j + c_s) / d_s$$
Constrained models and calls with rescale = FALSE use the same
dpmirt_fit wrapper but preserve the raw sampled scale.
After rescaling: \(\bar{\beta}^* = 0\) and \((\prod_i \lambda^*_i)^{1/I} = 1\).
References
Paganin, S., Paciorek, C. J., Wehrhahn, C., Rodriguez, A., Rabe-Hesketh, S., & de Valpine, P. (2023). Computational strategies and estimation performance with Bayesian semiparametric item response theory models. Journal of Educational and Behavioral Statistics, 48(2), 147–188.
See also
dpmirt_sample, dpmirt_estimates
Other estimation:
dpmirt_draws(),
dpmirt_estimates()
Examples
if (FALSE) { # \dontrun{
sim <- dpmirt_simulate(200, 20, model = "rasch", seed = 42)
spec <- dpmirt_spec(sim$response, model = "rasch", prior = "normal",
identification = "unconstrained")
compiled <- dpmirt_compile(spec)
samples <- dpmirt_sample(compiled, niter = 5000, nburnin = 1000)
# Apply rescaling
rescaled <- dpmirt_rescale(samples)
} # }