psych (version 1.0-97)

irt.fa: Item Response Analysis by factor analysis of tetrachoric/polychoric correlations


Although factor analysis and Item Response Theory seem to be very different models of binary data, they can provide equivalent parameter estimates of item difficulty and item discrimination. Tetrachoric correlations of a data set of dichotomous items may be factor analysed using a minimum residual or maximum likelihood factor analysis and the result loadings transformed to item discrimination parameters. The tau parameter from the tetrachoric correlation combined with the item factor loading may be used to estimate item difficulties. Similar analyses can be done for discrete item responses using the polychoric correlation.




A data matrix of dichotomous or discrete items, or the result of tetrachoric or polychoric
the subset of variables to pick from the rho and tau output of a previous irt.fa analysis to allow for further analysis.
Additional parameters to pass to the factor analysis function


  • irtA list of Item location (difficulty) and discrimination
  • faA list of statistics for the factor analyis
  • rhoThe tetrachoric/polychoric correlation matrix
  • tauThe tetrachoric/polychoric cut points


The tetrachoric correlation matrix of dichotomous items may be factored using a (e.g.) minimum residual factor analyis function fa and the resulting loadings, $\lambda_i$ are transformed to discriminations by $\alpha = \frac{\lambda_i}{\sqrt{1-\lambda_i^2}}$.

The difficulty parameter, $\delta$ may be found from the $\tau$ parameter of the tetrachoric or polychoric function.

$\delta_i = \frac{\tau_i}{\sqrt{1-\lambda_i^2}}$

Similar analyses may be done with discrete item responses using polychoric correlations and distinct estimates of item difficulty (location) for each item response.

The results may be shown graphically using plot. For plotting there are three options: type = "ICC" will plot the item characteristic respone function. type = "IIC" will plot the item information function, and type= "test" will plot the test information function.

The normal input is just the raw data. If, however, the correlation matrix has already been found using tetrachoric or polychoric, then that result can be processed directly. Because irt.fa saves the rho and tau matrices from the analysis, subsequent analyses of the same data set are much faster if the input is the object returned on the first run.

The output is best seen in terms of graphic displays. Plot the output from irt.fa to see item and test information functions.

The function is a helper function to allow for selecting a subset of a prior analysis for further analysis. First run irt.fa, then select a subset of variables to be analyzed in a subsequent irt.fa analysis. Perhaps a better approach is to just plot and find the information for selected items.

The plot function for an irt.fa object will plot ICC (item characteristic curves), IIC (item information curves), or test information curves. In addition, by using the "keys" option, these three kinds of plots can be done for selected items. This is particularly useful when trying to see the information characteristics of short forms of tests based upon the longer form factor analysis.

The plot function will also return (invisibly) the average information (area under the curve) for each item. These may be then printed or printed in sorted order using the sort option in print.


McDonald, Roderick P. (1999) Test theory: A unified treatment. L. Erlbaum Associates.

Revelle, William. (in prep) An introduction to psychometric theory with applications in R. Springer. Working draft available at

See Also

fa, sim.irt, tetrachoric, polychoric as well as plot.psych for plotting the IRT item curves.


Run this code
d9 <- sim.irt(9,1000,-2.5,2.5,mod="normal") #dichotomous items
test <- irt.fa(d9$items)
op <- par(mfrow=c(3,1))
items <- sim.congeneric(N=500,short=FALSE,categorical=TRUE) #500 responses to 4 discrete items
d4 <- irt.fa(items$observed)  #item response analysis of congeneric measures

op <- par(mfrow=c(2,2))

#using the iq data set for an example of real items
#first need to convert the responses to tf
iq.keys <- c(4,4,3,1,4,3,2,3,1,4,1,3,4,3) <- score.multiple.choice(iq.keys,iqitems,score=FALSE)  #just the responses
iq.irt <- irt.fa(
#select a subset of these variables <-,c(1,5,9,10,11,13))
small.irt <- irt.fa(
#find the information for three subset of iq items
keys <- make.keys(14,list(all=1:14,some=c(1,5,9,10,11,13),others=c(1:5)))

Run the code above in your browser using DataCamp Workspace