FCGDINA | R Documentation |
Estimation of the G-DINA model for forced-choice responses according to Nájera et al. (2024).
Block polarity (i.e., statement direction), initial values for parameters, and prior distributions can be specified to determine the design of the forced-choice blocks.
The GDINA
package (Ma & de la Torre, 2020) is used to estimate the model via expectation maximumation (EM) algorithm if no priors are used.
The code provided by Ma and Jiang (2021) is used to estimate the model via Bayes modal (BM) estimation if priors are used.
The forced-choice diagnostic classification model (FC-DCM; Huang, 2023) can be efficiently estimated using Bayes modal estimation rather than Markov chain Monte Carlo.
Only unidimensional statements (i.e., bidimensional blocks) are currently supported.
FCGDINA(
dat,
Q,
polarity = NULL,
polarity.initial = 1e-04,
polarity.prior = NULL,
att.dist = "saturated",
att.prior = NULL,
verbose = 1,
higher.order = list(),
catprob.parm = NULL,
control = list()
)
dat |
A N individuals x J items ( |
Q |
A F blocks x K attributes Q-matrix ( |
polarity |
A F blocks x 2 ( |
polarity.initial |
A |
polarity.prior |
A |
att.dist |
How is the joint attribute distribution estimated? It can be |
att.prior |
A |
verbose |
How to print calibration information after each EM iteration? Can be 0, 1 or 2, indicating to print no information, information for current iteration, or information for all iterations. |
higher.order |
A |
catprob.parm |
A |
control |
A |
FCGDINA
returns an object of class FCGDINA
.
GDINA.obj
Estimation output from the GDINA
function of the GDINA.MJ
(Ma & Jiang, 2021) function, depending on whether EM or BM estimation has been used (list
).
technical
Information about the estimation method (EM or BM), initial values, and priors (list
).
specifications
Function call specifications (list
).
Pablo Nájera, Universidad Pontificia Comillas
Huang, H.-Y. (2023). Diagnostic Classification Model for Forced-Choice Items and Noncognitive Tests. Educational and Psychological Measurement, 83(1), 146-180. https://doi.org/10.1177/00131644211069906
Ma, W., & de la Torre, J. (2020). GDINA: An R package for cognitive diagnosis modeling. Journal of Statistical Software, 93(14). https://doi.org/10.18637/jss.v093.i14
Ma, W., & Jiang, Z. (2021). Estimating Cognitive Diagnosis Models in Small Samples: Bayes Modal Estimation and Monotonic Constraints. Applied Psychological Measurement, 45(2), 95-111. https://doi.org/10.1177/0146621620977681
Nájera, P., Kreitchmann, R. S., Escudero, S., Abad, F. J., de la Torre, J., & Sorrel, M. A. (2025). A General Diagnostic Modeling Framework for Forced-Choice Assessments. British Journal of Mathematical and Statistical Psychology.
library(GDINA)
set.seed(123)
Q.items <- do.call("rbind", replicate(5, diag(5), simplify = FALSE)) # Q-matrix for the unidimensional statements
GS <- cbind(runif(n = nrow(Q.items), min = 0.1, max = 0.3), runif(n = nrow(Q.items), min = 0.1, max = 0.3)) # Guessing and slip parameter for each statement
n.blocks <- 30 # Number of forced-choice blocks
#----------------------------------------------------------------------------------------
# Illustration with simulated data using only direct statements (i.e., homopolar blocks)
#----------------------------------------------------------------------------------------
polarity <- matrix(1, nrow = n.blocks, ncol = 2) # Block polarity (1 = direct statement; -1 = indirect statement)
sim <- simFCGDINA(N = 1000, Q.items, n.blocks = n.blocks, polarity = polarity, model = "GDINA", GDINA.args = list(GS = GS), seed = 123)
Q <- sim$Q # Generated Q-matrix of forced-choice blocks
dat <- sim$dat # Generated responses
att <- sim$att # Generated attribute profiles
fit <- FCGDINA(dat = dat, Q = Q, polarity = polarity) # Fit the G-DINA model with EM estimation
ClassRate(personparm(fit$GDINA.obj), att) # Classification accuracy
#-------------------------------------------------------------------------------------------
# Illustration with simulated data using some inverse stataments (i.e., heteropolar blocks)
#-------------------------------------------------------------------------------------------
polarity <- matrix(1, nrow = n.blocks, ncol = 2)
polarity[sample(x = 1:(2*n.blocks), size = 15, replace = FALSE)] <- -1 # Including 15 inverse statements
sim <- simFCGDINA(N = 1000, Q.items, n.blocks = n.blocks, polarity = polarity, model = "GDINA", GDINA.args = list(GS = GS), seed = 123)
Q <- sim$Q
dat <- sim$dat
att <- sim$att
fit <- FCGDINA(dat = dat, Q = Q, polarity = polarity)
ClassRate(personparm(fit$GDINA.obj), att)
#------------------------------------------------------------
# Illustration of the FC-DCM (Huang, 2023) via BM estimation
#------------------------------------------------------------
priors <- list("Minimum" = c(1, 1), # Non-informative prior, Beta(1, 1), for latent group with ideal response = 0
"Intermediate" = c(1e8, 1e8), # Extremely informative prior, Beta(1e8, 1e8), for latent groups with ideal response = 0.5
"Maximum" = c(1, 1)) # Non-informative prior, Beta(1, 1), for latent group with ideal response = 1
fit <- FCGDINA(dat = dat, Q = Q, polarity = polarity, polarity.prior = priors, verbose = 0)
ClassRate(fit$GDINA.obj$EAP, att)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.