Learn R Programming

pscl (version 0.60)

postProcess: remap MCMC output via affine transformations

Description

Remap the MCMC iterates in an ideal object via an affine transformation, imposing identifying restrictions ex post (aka post-processing).

Usage

postProcess(object, constraints, debug = FALSE)

Arguments

object
an object of class ideal
constraints
list of length d+1, each component providing a set of d restrictions, where d is the dimension of the fitted ideal model. The name of each component should
debug
logical flag for verbose output, used for debugging

Value

  • An object of class ideal, with components suitably transformed and recomputed (i.e., x is transformed and xbar recomputed, and if the ideal object was fit with store.item=TRUE, beta is transformed and betabar is recomputed).

Details

Item-response models are unidentified without restrictions on the underlying parameters. Consider the d=1 dimensional case. The model is $$P(y_{ij} = 1) = F(x_i \beta_j - \alpha_j)$$ Any linear transformation of the latent traits, say, $$x^* = mx + c$$ can be exactly offset by applying the appropriate linear transformations to the item/bill parameters, meaning that there is no unique set of values for the model parameters that will maximize the likelihood function. In higher dimensions, the latent traits can also be transformed via any arbitrary rotation, dilation and translation, with offsetting transformations applied to the item/bill parameters.

One strategy in MCMC is to ignore the lack of identification at run time, but apply identifying restrictions ex post, post-processing the MCMC output, iteration-by-iteration. In a d-dimensional IRT model, a sufficient condition for global identification is to fix d+1 latent traits, provided the constrained latent traits span the d dimensional latent space. This function implements this strategy. The user supplies a set of constrained ideal points in the constraints list. The function then processes the MCMC output in the ideal object, finding the transformation that maps the current iteration's sampled values for x (latent traits/ideal points) into the sub-space of identified parameters defined by the fixed points in constraints; i.e., what is the affine transformation that maps the unconstrained ideal points into the constraints. Aside from miniscule numerical inaccuracies resulting from matrix inversion etc, this transformation is exact: after post-processing, the d+1 constrained points do not vary over the MCMC iterations. The remaining n-d-1 ideal points are subject to (posterior) uncertainty; the random tour of the joint parameter space of these parameters produced by the MCMC algorithm has been mapped into a subspace in which the parameters are globally identified.

If the ideal object was produced with store.item set to TRUE, then the item parameters are also post-processed, applying the inverse transformation. Specifically, recall that the IRT model is $$P(y_{ij} = 1) = F(x_i'\beta_j)$$ where in this formulation $x_i$ is a vector of length d+1, including a 1 to put a constant term into the model (i.e., the intercept or minus-difficulty parameter is part of $\beta_j$). Let $A$ denote the non-singular, d+1-by-d+1 matrix that maps the $x$ into the space of identified parameters. Recall that this transformation is computed iteration by iteration. Then each $x_i$ is transformed to $x^*_i = Ax_i$ and $\beta_j$ is transformed to $\beta_j^* = A^{-1} \beta_j$, $i = 1, \ldots, n; j = 1, \ldots, m$.

References

Rivers, Douglas. 2003. "Identification of Multidimensional Item-Response Models." Typescript. Department of Political Science, Stanford University.

Examples

Run this code
data(s109)

## short run for examples
id1 <- ideal(s109,
             d=1,
             meanzero=FALSE,     ## no identification...!
             store.item=TRUE,
             maxiter=500,
             burnin=0,
             thin=10)

id1pp <- postProcess(id1,
                     constraints=list(BOXER=-1,INHOFE=1))

id2 <- ideal(s109,
             d=2,
             store.item=TRUE,
             maxiter=1e4,
             burnin=0,
             thin=25)

tracex(id2,d=1:2,
       legis=c("BOXER","INHOFE","BYRD","CHAFEE","MCCAIN"),
       showAll=TRUE)

id2pp <- postProcess(id2,
                     constraints=list(BOXER=c(-1,0),
                       INHOFE=c(1,0),
                       CHAFEE=c(0,.25)))

tracex(id2pp,d=1:2,
       legis=c("BOXER","INHOFE","COLLINS","FEINGOLD","COLEMAN",
         "CHAFEE","MCCAIN","KYL"),
       showAll=TRUE)

Run the code above in your browser using DataLab