I'm trying to fit longitudinal item response theory (IRT) models in R. I have a test that was administered at multiple measurement occasions. I'd like to examine individuals' growth curves of factor scores (i.e., ability levels) from graded response models (GRMs). I have used the ltm package in R to fit cross-sectional GRM models in IRT, but it's not clear to me how (or whether it's even possible in ltm) to extend the models to handle repeated measures of the same items across time. How can I fit growth curves to longitudinal GRM factor scores to see changes in means/variances of ability levels over time? If this isn't possible with the ltm package, what packages/functions permit this? Specific code examples would be especially appreciated.
Here are empirical examples similar to what I'm looking to do (except the examples use a Rasch model for binary items where I'm using GRMs for polytomous data):
McArdle, J. J., Grimm, K. J., Hamagami, F., Bowles, R. P., & Meredith, W. (2009). Modeling life-span growth curves of cognition using longitudinal data with multiple samples and changing scales of measurement. Psychological Methods, 14, 126-149. doi: 10.1037/a0015857
McArdle, J. J., & Grimm, K. J. (2011). An empirical example of change analysis by linking longitudinal item response data from multiple tests. In A. A. Davier (Ed.), Statistical models for test equating, scaling, and linking (pp. 71-88): Springer: New York.
For example, I'd like to be able to estimate and plot individuals' growth curves to examine mean-level change in ability levels over time (from McArdle & Grimm, 2011):
And, I'd like to be able to estimate an average or prototypical growth curve for the sample (from McArdle & Grimm, 2011):
Here's a simulated data set with 20 polytomous items (1-3 response scale) at 3 different time points:
library(mirt) library(mvtnorm) set.seed(1) numberItems <- 20 numberItemLevels <- 2 sampleSize <- 1000 a <- matrix(rlnorm(numberItems, .2, .2)) d <- matrix(rnorm(numberItems*numberItemLevels), numberItems) d <- t(apply(d, 1, sort, decreasing=TRUE)) Theta <- mvtnorm::rmvnorm(n=sampleSize, 0, matrix(1)) t1 <- simdata(a, d, N=sampleSize, itemtype="graded", Theta=Theta) t2 <- simdata(a, d, N=sampleSize, itemtype="graded", Theta=Theta+.5) t3 <- simdata(a, d, N=sampleSize, itemtype="graded", Theta=Theta+1) dat <- data.frame(t1, t2, t3)