knitr::opts_chunk$set(collapse = TRUE, comment = "#>") library(meow)
Parameter update functions re-estimate person and item parameters from the
responses administered so far. They are the estimation engine of a meow
simulation and can form the bulk of your runtime. For the full module contract, see vignette("extending-meow").
Every parameter update function has the signature
update_fun <- function(pers, item, R, admin, ...) { # ... re-estimate parameters ... list(pers = updated_pers, item = updated_item) }
It receives the current person and item parameter estimates (pers, item), the full response matrix R, and the non-negative integer valued administration matrix admin. Parameter update functions return a list with the updated pers and item data frames. The responses to administered items are obtained from the matrix state:
idx <- which(admin != 0, arr.ind = TRUE) persons <- unique(idx[, 1]) items <- unique(idx[, 2]) resp <- R[idx]
or, equivalently, as a long data frame with meow_long(R, admin).
update_theta_mle() treats item parameters as fixed and finds each respondent's 2PL maximum likelihood ability estimate, constrained to $[-4, 4]$. The log-likelihood is fully vectorized over the administered responses:
loglik <- function(theta) { p <- stats::plogis(item$a[item_j] * (theta[person] - item$b[item_j])) sum(resp * log(p) + (1 - resp) * log(1 - p)) } est <- stats::optim(pers$theta, loglik, lower = -4, upper = 4, method = "L-BFGS-B", control = list(fnscale = -1))
update_maths_garden() updates both abilities and difficulties with the on-the-fly Elo rule of Klinkenberg, Straatemeier, and van der Maas (2011):
$$\hat\theta_j = \theta_j + K_\theta \sum_i (S_{ij} - E(S_{ij})), \qquad \hat b_i = b_i + K_b \sum_j (E(S_{ij}) - S_{ij}).$$
See vignette("maths-garden-update").
update_prowise_learn() updates abilities with the same rule, but updates item difficulties through paired comparisons of consecutively administered items, which controls rating drift (Vermeiren et al., 2025). See vignette("prowise-learn-update").
list(pers, item) with both objects as both data frames, even if one is unchanged.tapply(), matrix indexing) rather than looping over respondents or items.admin matrix, but meow_long() returns responses ordered by respondent and then by administration order.Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.