| fit.TIRT | R Documentation |
Fits the Thurstonian IRT model for forced-choice data. Unlike the FCMIRT/FCGGUM models that operate on the item-level endorsement probabilities, the TIRT model works directly at the level of paired comparisons: each pairwise comparison is treated as a binary outcome governed by a latent difference process with a probit link.
fit.TIRT(
data,
Q.matrix,
block.items = NULL,
fc.type = NULL,
method = c("iStEM", "stan"),
control.model = NULL,
control.method = NULL
)
data |
An |
Q.matrix |
An |
block.items |
A list of length |
fc.type |
Forced-choice response type: |
method |
Estimation method: |
control.model |
A named list of model-level hyperparameters for the Thurstonian IRT model. Supported entries:
|
control.method |
A named list of method-specific tuning parameters. Common entries (used by both Stan and iStEM):
Stan-specific entries:
iStEM-specific entries:
|
An object of class "TIRT" containing:
nparNumber of free parameters.
method"stan" or "iStEM".
thetaList with est, se, Rhat
(N \times D).
parList with est, se, Rhat,
free (I \times (D + 1)). Columns include the
loading \lambda_i on the design dimension and
\psi_i^2.
CorrList with est, se, Rhat
(D \times D).
gamma.matrixList with est, se, Rhat
(I \times I); pairwise intercept matrix.
pairs.matrix, pairs.value, response,
response.totalPairwise and response data structures.
logLikMarginal log-likelihood (class "logLik").
Pairwise utility difference.
For a pair of statements (i, k) in block b, the latent
comparative judgment is:
y_{j,ik}^* =
-\gamma_{ik} +
\lambda_i \sum_{d=1}^{D} q_{id}\,\theta_{jd} -
\lambda_k \sum_{d=1}^{D} q_{kd}\,\theta_{jd} +
\varepsilon_{j,i} - \varepsilon_{j,k},
where:
\gamma_{ik} is the pairwise intercept (unfolding threshold
parameter). Skew-symmetry requires \gamma_{ik} = -\gamma_{ki}.
\lambda_i > 0 is the loading magnitude of statement
i; the sign of the statement direction is carried by
q_{id}.
q_{id} \in \{-1, 0, 1\} is the Q-matrix entry; each row
has exactly one non-zero entry.
\varepsilon_{j,i} \sim N(0, \psi_i^2) is the uniqueness
(error) of statement i.
Binary pairwise response. The observed response is
Y_{j,ik} = \begin{cases}
1, & \text{if } y_{j,ik}^* \ge 0 \quad (\text{prefer } i \text{ over } k), \\
0, & \text{otherwise}.
\end{cases}
Under the normality of errors, the probability is:
P(Y_{j,ik} = 1 \mid \boldsymbol{\theta}_j) =
\Phi\!\left(
\frac{
-\gamma_{ik} + \lambda_i\,\mathbf{q}_i'\boldsymbol{\theta}_j -
\lambda_k\,\mathbf{q}_k'\boldsymbol{\theta}_j
}{
\sqrt{\psi_i^2 + \psi_k^2}
}
\right),
where \Phi(\cdot) is the standard normal CDF.
Identification constraints. Several standard constraints are applied:
Case A (I_{\text{block}} = 2, D > 2): All
\psi_i^2 = 0.5 are fixed.
Case B (D = 2, I_{\text{block}} = 2): The first
block's \lambda_i are fixed to 0.80, all
\psi_i^2 = 0.5 are fixed.
General case: The last item in each block has
\psi_i^2 = 1.0 fixed. Pairwise \gamma_{ik}
parameters for comparisons that are never observed under the
supplied RANK/MOLE/PICK design are fixed to gamma.mu.
Correlation structure. The inter-trait correlation matrix
\boldsymbol{\Sigma} is estimated as in the MIRT model. In the Stan
file, \boldsymbol{\theta}_j is centered at zero; the iStEM backend
uses control.model$theta.mu as the mean in the normal kernel.
method = "stan"):Full Bayesian inference via HMC. The probit likelihood is evaluated over all pairwise comparisons.
method = "iStEM"):Improved Stochastic EM. Person sampling uses finite-grid block Gibbs;
structural parameters (\lambda, \psi^2, \gamma)
updated via optimization or closed-form steps.
Brown, A., & Maydeu-Olivares, A. (2011). Item response modeling of forced-choice questionnaires. Educational and Psychological Measurement, 71(3), 460–502. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1177/0013164410375112")}
Maydeu-Olivares, A., & Brown, A. (2010). Item response modeling of paired comparison and ranking data. Multivariate Behavioral Research, 45(6), 935–974.
Thurstone, L. L. (1927). A law of comparative judgment. Psychological Review, 34(4), 273–286.
sim.data.TIRT, get.fit.index.TIRT,
logLik.TIRT
sim <- sim.data.TIRT(N.person = 20, N.block = 3, I.block = 2,
D = 2, fc.type = "RANK")
fit <- fit.TIRT(sim$data, Q.matrix = sim$Q.matrix,
block.items = sim$block.items,
fc.type = "RANK", method = "iStEM",
control.method = list(
vis = FALSE, seed = 123,
M = 2, B = 2, burnin.maxitr = 2,
maxitr = 3, eps1 = 10, eps2 = 10,
estimate.se = FALSE))
head(fit$theta$est)
cor(fit$theta$est, sim$theta)
gof <- get.fit.index(fit)
summary(gof)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.