 # Combining item response theory and growth curve estimation in same model

I’d like to combine item response theory (IRT) and growth curve estimation in the same model. Basically, I’d like to estimate a 2-parameter logistic item response model (difficulty and discrimination) and growth curves (intercepts and slopes) of participants’ latent trait levels (theta). But, I’d like to simultaneously estimate the item response model and growth curves in the same model. Is this possible in brms? Here’s a small reproducible example of an IRT model that I’d like to extend to include growth curves (using simulated longitudinal data from Phil Chalmers: https://github.com/philchalmers/mirt/blob/gh-pages/data-scripts/Longitudinal-IRT.R ; and Paul Bürkner’s example of a 2-PL item response model in his Bayesian IRT paper: https://arxiv.org/abs/1905.09501 ):

``````library("brms")
library("mirt")
library("mvtnorm")

numberItems <- 20
numberItemLevels <- 2

a <- matrix(rlnorm(numberItems, .2, .2))
d <- matrix(rnorm(numberItems*numberItemLevels), numberItems)
d <- t(apply(d, 1, sort, decreasing=TRUE))

#Simulate Data
set.seed(1)
Theta <- mvtnorm::rmvnorm(n = 1000, 0, matrix(1))
t1 <- simdata(a, d, N = 1000, itemtype = "graded", Theta = Theta)
t2 <- simdata(a, d, N = 1000, itemtype = "graded", Theta = Theta +.5 + rnorm(nrow(Theta), 0, .3))
t3 <- simdata(a, d, N = 1000, itemtype = "graded", Theta = Theta + 1 + rnorm(nrow(Theta), 0, .3))

colnames(t1) <- paste(colnames(t1), ".1", sep = "")
colnames(t2) <- paste(colnames(t2), ".2", sep = "")
colnames(t3) <- paste(colnames(t3), ".3", sep = "")

dat <- data.frame(t1, t2, t3)
dat\$id <- as.factor(as.numeric(row.names(dat)))

#Wide to Long form
dat_long <- pivot_longer(dat, -id, names_to = c("item", "timepoint"), names_sep = "\\.", values_to = "response")

#Change data types
dat_long\$item <- factor(dat_long\$item)
dat_long\$response <- factor(dat_long\$response, levels = c(0,1,2), ordered = TRUE)
dat_long\$timepoint <- as.numeric(dat_long\$timepoint)

#Model formula
formula_va_ord_2pl <- bf(
response ~ 1 + (1 |i| item) + (1 | id),
disc ~ 1 + (1 |i| item)
)

#Fit the model
fit_va_ord_2pl <- brm(
formula = formula_va_ord_2pl,
data = dat_long,
family = brmsfamily("cumulative", "logit"),
seed = 1234
)
``````

Is it possible to extend this model to estimate intercepts and slopes of participant’s latent trait levels in the same model?

For an example of a longitudinal IRT model that simultaneously estimates a 1-PL IRT model and growth curves using a mixed-effects model framework in SAS and WinBUGS, see the following paper (see example code in Appendix examples 3 and 4 on pp. 148-149):

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

Thanks in advance!

Bumping this up. Maybe @Max_Mantei can answer?

A bit out of my comfort zone, but I can have a look at it tomorrow. :)

I’ve had a look at it and I think I’m not the right person to ask. What’s the mathematical representation of the model you want to fit?

Modeling-wise maybe @Guido_Biele has some insights. @paul.buerkner will be able to tell whether `brms` is capable to fit such a model, although he’s always flooded with questions and might not have time to answer this one.

1 Like

You could allow random effects of persons to vary over time, for example via

``````response ~ 1 + time + (1 |i| item) + (1 + time | id)
``````
2 Likes