Title: | Cognitive Diagnosis Modeling |
---|---|
Description: | Functions for cognitive diagnosis modeling and multidimensional item response modeling for dichotomous and polytomous item responses. This package enables the estimation of the DINA and DINO model (Junker & Sijtsma, 2001, <doi:10.1177/01466210122032064>), the multiple group (polytomous) GDINA model (de la Torre, 2011, <doi:10.1007/s11336-011-9207-7>), the multiple choice DINA model (de la Torre, 2009, <doi:10.1177/0146621608320523>), the general diagnostic model (GDM; von Davier, 2008, <doi:10.1348/000711007X193957>), the structured latent class model (SLCA; Formann, 1992, <doi:10.1080/01621459.1992.10475229>) and regularized latent class analysis (Chen, Li, Liu, & Ying, 2017, <doi:10.1007/s11336-016-9545-6>). See George, Robitzsch, Kiefer, Gross, and Uenlue (2017) <doi:10.18637/jss.v074.i02> or Robitzsch and George (2019, <doi:10.1007/978-3-030-05584-4_26>) for further details on estimation and the package structure. For tutorials on how to use the CDM package see George and Robitzsch (2015, <doi:10.20982/tqmp.11.3.p189>) as well as Ravand and Robitzsch (2015). |
Authors: | Alexander Robitzsch [aut, cre], Thomas Kiefer [aut], Ann Cathrice George [aut], Ali Uenlue [aut] |
Maintainer: | Alexander Robitzsch <[email protected]> |
License: | GPL (>= 2) |
Version: | 8.3-7 |
Built: | 2025-01-21 04:57:01 UTC |
Source: | https://github.com/alexanderrobitzsch/cdm |
Functions for cognitive diagnosis modeling and multidimensional item response modeling for dichotomous and polytomous item responses. This package enables the estimation of the DINA and DINO model (Junker & Sijtsma, 2001, <doi:10.1177/01466210122032064>), the multiple group (polytomous) GDINA model (de la Torre, 2011, <doi:10.1007/s11336-011-9207-7>), the multiple choice DINA model (de la Torre, 2009, <doi:10.1177/0146621608320523>), the general diagnostic model (GDM; von Davier, 2008, <doi:10.1348/000711007X193957>), the structured latent class model (SLCA; Formann, 1992, <doi:10.1080/01621459.1992.10475229>) and regularized latent class analysis (Chen, Li, Liu, & Ying, 2017, <doi:10.1007/s11336-016-9545-6>). See George, Robitzsch, Kiefer, Gross, and Uenlue (2017) <doi:10.18637/jss.v074.i02> or Robitzsch and George (2019, <doi:10.1007/978-3-030-05584-4_26>) for further details on estimation and the package structure. For tutorials on how to use the CDM package see George and Robitzsch (2015, <doi:10.20982/tqmp.11.3.p189>) as well as Ravand and Robitzsch (2015).
Cognitive diagnosis models (CDMs) are restricted latent class models. They represent model-based classification approaches, which aim at assigning respondents to different attribute profile groups. The latent classes correspond to the possible attribute profiles, and the conditional item parameters model atypical response behavior in the sense of slipping and guessing errors. The core CDMs in particular differ in the utilized condensation rule, conjunctive / non-compensatory versus disjunctive / compensatory, where in the model structure these two types of response error parameters enter and what restrictions are imposed on them. The confirmatory character of CDMs is apparent in the Q-matrix, which can be seen as an operationalization of the latent concepts of an underlying theory. The Q-matrix allows incorporating qualitative prior knowledge and typically has as its rows the items and as the columns the attributes, with entries 1 or 0, depending on whether an attribute is measured by an item or not, respectively.
CDMs as compared to common psychometric models (e.g., IRT) contain categorical instead of continuous latent variables. The results of analyses using CDMs differ from the results obtained under continuous latent variable models. CDMs estimate in a direct manner the probabilistic attribute profile of a respondent, that is, the multivariate vector of the conditional probabilities for possessing the individual attributes, given her / his response pattern. Based on these probabilities, simplified deterministic attribute profiles can be derived, showing whether an individual attribute is essentially possessed or not by a respondent. As compared to alternative two-step discretization approaches, which estimate continuous scores and discretize the continua based on cut scores, with CDMs the classification error can generally be reduced.
The package CDM
implements parameter estimation procedures for the
DINA and DINO model (e.g.,de la Torre &
Douglas, 2004; Junker & Sijtsma, 2001; Templin &
Henson, 2006; the generalized DINA model for dichotomous attributes
(GDINA, de la Torre, 2011) and for polytomous attributes
(pGDINA, Chen & de la Torre, 2013);
the general diagnostic model (GDM, von Davier, 2008) and its extension
to the multidimensional latent class IRT model (Bartolucci, 2007),
the structure latent class model (Formann, 1992),
and tools for analyzing data under the models.
These and related concepts are explained in detail in the
book about diagnostic measurement and CDMs by
Rupp, Templin and Henson (2010), and in such survey articles as
DiBello, Roussos and Stout (2007) and
Rupp and Templin (2008).
The package CDM
is implemented based on the S3 system. It comes
with a namespace and consists of several external functions (functions the
package exports).
The package contains a utility method for the simulation of artificial data based
on a CDM model (sim.din
). It also contains seven internal functions
(functions not exported by the package): this are plot
, print
, and
summary
methods for objects of the class din
(plot.din
,
print.din
, summary.din
), a print
method for
objects of the class summary.din
(print.summary.din
),
and three functions for checking the input format and computing intermediate
information. The features of the package CDM
are
illustrated with an accompanying real dataset and Q-matrix
(fraction.subtraction.data
and fraction.subtraction.qmatrix
)
and artificial examples (Data-sim
).
See George et al. (2016) and Robitzsch and George (2019) for an overview and some computational details of the CDM package.
Alexander Robitzsch [aut, cre], Thomas Kiefer [aut], Ann Cathrice George [aut], Ali Uenlue [aut]
Maintainer: Alexander Robitzsch <[email protected]>
Bartolucci, F. (2007). A class of multidimensional IRT models for testing unidimensionality and clustering items. Psychometrika, 72, 141-157.
Chen, J., & de la Torre, J. (2013). A general cognitive diagnosis model for expert-defined polytomous attributes. Applied Psychological Measurement, 37, 419-437.
Chen, Y., Li, X., Liu, J., & Ying, Z. (2017). Regularized latent class analysis with application in cognitive diagnosis. Psychometrika, 82, 660-692.
de la Torre, J., & Douglas, J. (2004). Higher-order latent trait models for cognitive diagnosis. Psychometrika, 69, 333–353.
de la Torre, J. (2009). A cognitive diagnosis model for cognitively based multiple-choice options. Applied Psychological Measurement, 33, 163-183.
de la Torre, J. (2011). The generalized DINA model framework. Psychometrika, 76, 179–199.
DiBello, L. V., Roussos, L. A., & Stout, W. F. (2007). Review of cognitively diagnostic assessment and a summary of psychometric models. In C. R. Rao and S. Sinharay (Eds.), Handbook of Statistics, Vol. 26 (pp. 979–1030). Amsterdam: Elsevier.
Formann, A. K. (1992). Linear logistic latent class analysis for polytomous data. Journal of the American Statistical Association, 87, 476-486.
George, A. C., & Robitzsch, A. (2015) Cognitive diagnosis models in R: A didactic. The Quantitative Methods for Psychology, 11, 189-205. doi:10.20982/tqmp.11.3.p189
George, A. C., Robitzsch, A., Kiefer, T., Gross, J., & Uenlue, A. (2016). The R package CDM for cognitive diagnosis models. Journal of Statistical Software, 74(2), 1-24.
Junker, B. W., & Sijtsma, K. (2001). Cognitive assessment models with few assumptions, and connections with nonparametric item response theory. Applied Psychological Measurement, 25, 258–272.
Ravand, H., & Robitzsch, A.(2015). Cognitive diagnostic modeling using R. Practical Assessment, Research & Evaluation, 20(11). Available online: http://pareonline.net/getvn.asp?v=20&n=11
Robitzsch, A., & George, A. C. (2019). The R package CDM. In M. von Davier & Y.-S. Lee (Eds.). Handbook of diagnostic classification models (pp. 549-572). Cham: Springer. doi:10.1007/978-3-030-05584-4_26
Rupp, A. A., & Templin, J. (2008). Unique characteristics of diagnostic classification models: A comprehensive review of the current state-of-the-art. Measurement: Interdisciplinary Research and Perspectives, 6, 219–262.
Rupp, A. A., Templin, J., & Henson, R. A. (2010). Diagnostic Measurement: Theory, Methods, and Applications. New York: The Guilford Press.
Templin, J., & Henson, R. (2006). Measurement of psychological disorders using cognitive diagnosis models. Psychological Methods, 11, 287–305.
von Davier, M. (2008). A general diagnostic model applied to language testing data. British Journal of Mathematical and Statistical Psychology, 61, 287-307.
See the GDINA package for comprehensive functions for the GDINA model.
See also the ACTCD and NPCD packages for nonparametric cognitive diagnostic models.
See the dina package for estimating the DINA model with a Gibbs sampler.
## ## ********************************** ## ** CDM 2.5-16 (2013-11-29) ** ## ** Cognitive Diagnostic Models ** ## ********************************** ##
## ## ********************************** ## ** CDM 2.5-16 (2013-11-29) ** ## ** Cognitive Diagnostic Models ** ## ********************************** ##
This function compares two models estimated with din
, gdina
or gdm
using a likelihood ratio test.
## S3 method for class 'din' anova(object,...) ## S3 method for class 'gdina' anova(object,...) ## S3 method for class 'gdm' anova(object,...) ## S3 method for class 'mcdina' anova(object,...) ## S3 method for class 'reglca' anova(object,...) ## S3 method for class 'slca' anova(object,...)
## S3 method for class 'din' anova(object,...) ## S3 method for class 'gdina' anova(object,...) ## S3 method for class 'gdm' anova(object,...) ## S3 method for class 'mcdina' anova(object,...) ## S3 method for class 'reglca' anova(object,...) ## S3 method for class 'slca' anova(object,...)
object |
Two objects of class |
... |
Further arguments to be passed |
This function is based on IRT.anova
.
############################################################################# # EXAMPLE 1: anova with din objects ############################################################################# # Model 1 d1 <- CDM::din(sim.dina, q.matr=sim.qmatrix ) # Model 2 with equal guessing and slipping parameters d2 <- CDM::din(sim.dina, q.matr=sim.qmatrix, guess.equal=TRUE, slip.equal=TRUE) # model comparison anova(d1,d2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 d2 -2176.482 4352.963 9 4370.963 4406.886 268.2071 16 0 ## 1 d1 -2042.378 4084.756 25 4134.756 4234.543 NA NA NA ## Not run: ############################################################################# # EXAMPLE 2: anova with gdina objects ############################################################################# # Model 3: GDINA model d3 <- CDM::gdina( sim.dina, q.matr=sim.qmatrix ) # Model 4: DINA model d4 <- CDM::gdina( sim.dina, q.matr=sim.qmatrix, rule="DINA") # model comparison anova(d3,d4) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 d4 -2042.293 4084.586 25 4134.586 4234.373 31.31995 16 0.01224 ## 1 d3 -2026.633 4053.267 41 4135.266 4298.917 NA NA NA ## End(Not run)
############################################################################# # EXAMPLE 1: anova with din objects ############################################################################# # Model 1 d1 <- CDM::din(sim.dina, q.matr=sim.qmatrix ) # Model 2 with equal guessing and slipping parameters d2 <- CDM::din(sim.dina, q.matr=sim.qmatrix, guess.equal=TRUE, slip.equal=TRUE) # model comparison anova(d1,d2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 d2 -2176.482 4352.963 9 4370.963 4406.886 268.2071 16 0 ## 1 d1 -2042.378 4084.756 25 4134.756 4234.543 NA NA NA ## Not run: ############################################################################# # EXAMPLE 2: anova with gdina objects ############################################################################# # Model 3: GDINA model d3 <- CDM::gdina( sim.dina, q.matr=sim.qmatrix ) # Model 4: DINA model d4 <- CDM::gdina( sim.dina, q.matr=sim.qmatrix, rule="DINA") # model comparison anova(d3,d4) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 d4 -2042.293 4084.586 25 4134.586 4234.373 31.31995 16 0.01224 ## 1 d3 -2026.633 4053.267 41 4135.266 4298.917 NA NA NA ## End(Not run)
This function computes several cognitive diagnostic indices grounded on the Kullback-Leibler information (Rupp, Henson & Templin, 2009, Ch. 13) at the test, item, attribute and item-attribute level. See Henson and Douglas (2005) and Henson, Roussos, Douglas and He (2008) for more details.
cdi.kli(object) ## S3 method for class 'cdi.kli' summary(object, digits=2, ...)
cdi.kli(object) ## S3 method for class 'cdi.kli' summary(object, digits=2, ...)
object |
Object of class |
digits |
Number of digits for rounding |
... |
Further arguments to be passed |
A list with following entries
test_disc |
Test discrimination which is the sum of all global item discrimination indices |
attr_disc |
Attribute discriminations |
glob_item_disc |
Global item discriminations (Cognitive diagnostic index) |
attr_item_disc |
Attribute-specific item discrimination |
KLI |
Array with Kullback-Leibler informations of all items (first dimension) and skill classes (in the second and third dimension) |
skillclasses |
Matrix containing all used skill classes in the model |
hdist |
Matrix containing Hamming distance between skill classes |
pjk |
Used probabilities |
q.matrix |
Used Q-matrix |
summary |
Data frame with test- and item-specific discrimination statistics |
Henson, R., DiBello, L., & Stout, B. (2018). A generalized approach to defining item discrimination for DCMs. Measurement: Interdisciplinary Research and Perspectives, 16(1), 18-29. http://dx.doi.org/10.1080/15366367.2018.1436855
Henson, R., & Douglas, J. (2005). Test construction for cognitive diagnosis. Applied Psychological Measurement, 29, 262-277. http://dx.doi.org/10.1177/0146621604272623
Henson, R., Roussos, L., Douglas, J., & He, X. (2008). Cognitive diagnostic attribute-level discrimination indices. Applied Psychological Measurement, 32, 275-288. http://dx.doi.org/10.1177/0146621607302478
Rupp, A. A., Templin, J., & Henson, R. A. (2010). Diagnostic Measurement: Theory, Methods, and Applications. New York: The Guilford Press.
See discrim.index
for computing discrimination indices at the
probability metric.
See Henson, DiBello and Stout (2018) for an overview of different discrimination indices.
############################################################################# # EXAMPLE 1: Examples based on CDM::sim.dina ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") mod <- CDM::din( sim.dina, q.matrix=sim.qmatrix ) summary(mod) ## Item parameters ## item guess slip IDI rmsea ## Item1 Item1 0.086 0.210 0.704 0.014 ## Item2 Item2 0.109 0.239 0.652 0.034 ## Item3 Item3 0.129 0.185 0.686 0.028 ## Item4 Item4 0.226 0.218 0.556 0.019 ## Item5 Item5 0.059 0.000 0.941 0.002 ## Item6 Item6 0.248 0.500 0.252 0.036 ## Item7 Item7 0.243 0.489 0.268 0.041 ## Item8 Item8 0.278 0.125 0.597 0.109 ## Item9 Item9 0.317 0.027 0.656 0.065 cmod <- CDM::cdi.kli( mod ) # attribute discrimination indices round( cmod$attr_disc, 3 ) ## V1 V2 V3 ## 1.966 2.506 11.169 # look at global item discrimination indices round( cmod$glob_item_disc, 3 ) ## > round( cmod$glob_item_disc, 3 ) ## Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8 Item9 ## 0.594 0.486 0.533 0.465 5.913 0.093 0.040 0.397 0.656 # correlation of IDI and global item discrimination stats::cor( cmod$glob_item_disc, mod$IDI ) ## [1] 0.6927274 # attribute-specific item indices round( cmod$attr_item_disc, 3 ) ## V1 V2 V3 ## Item1 0.648 0.648 0.000 ## Item2 0.000 0.530 0.530 ## Item3 0.581 0.000 0.581 ## Item4 0.697 0.000 0.000 ## Item5 0.000 0.000 8.870 ## Item6 0.000 0.140 0.000 ## Item7 0.040 0.040 0.040 ## Item8 0.000 0.433 0.433 ## Item9 0.000 0.715 0.715 ## Note that attributes with a zero entry for an item ## do not differ from zero for the attribute specific item index
############################################################################# # EXAMPLE 1: Examples based on CDM::sim.dina ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") mod <- CDM::din( sim.dina, q.matrix=sim.qmatrix ) summary(mod) ## Item parameters ## item guess slip IDI rmsea ## Item1 Item1 0.086 0.210 0.704 0.014 ## Item2 Item2 0.109 0.239 0.652 0.034 ## Item3 Item3 0.129 0.185 0.686 0.028 ## Item4 Item4 0.226 0.218 0.556 0.019 ## Item5 Item5 0.059 0.000 0.941 0.002 ## Item6 Item6 0.248 0.500 0.252 0.036 ## Item7 Item7 0.243 0.489 0.268 0.041 ## Item8 Item8 0.278 0.125 0.597 0.109 ## Item9 Item9 0.317 0.027 0.656 0.065 cmod <- CDM::cdi.kli( mod ) # attribute discrimination indices round( cmod$attr_disc, 3 ) ## V1 V2 V3 ## 1.966 2.506 11.169 # look at global item discrimination indices round( cmod$glob_item_disc, 3 ) ## > round( cmod$glob_item_disc, 3 ) ## Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8 Item9 ## 0.594 0.486 0.533 0.465 5.913 0.093 0.040 0.397 0.656 # correlation of IDI and global item discrimination stats::cor( cmod$glob_item_disc, mod$IDI ) ## [1] 0.6927274 # attribute-specific item indices round( cmod$attr_item_disc, 3 ) ## V1 V2 V3 ## Item1 0.648 0.648 0.000 ## Item2 0.000 0.530 0.530 ## Item3 0.581 0.000 0.581 ## Item4 0.697 0.000 0.000 ## Item5 0.000 0.000 8.870 ## Item6 0.000 0.140 0.000 ## Item7 0.040 0.040 0.040 ## Item8 0.000 0.433 0.433 ## Item9 0.000 0.715 0.715 ## Note that attributes with a zero entry for an item ## do not differ from zero for the attribute specific item index
Utility functions in CDM.
## requireNamespace with package message for needed installation CDM_require_namespace(pkg) ## attach internal function in a package cdm_attach_internal_function(pack, fun) ## print function in summary cdm_print_summary_data_frame(obji, from=NULL, to=NULL, digits=3, rownames_null=FALSE) ## print summary call cdm_print_summary_call(object, call_name="call") ## print computation time cdm_print_summary_computation_time(object, time_name="time", time_start="s1", time_end="s2") ## string vector of matrix entries cdm_matrixstring( matr, string ) ## mvtnorm::rmvnorm with vector conversion for n=1 CDM_rmvnorm(n, mean=NULL, sigma, ...) ## fit univariate and multivariate normal distribution cdm_fit_normal(x, w) ## fit unidimensional factor analysis by unweighted least squares cdm_fa1(Sigma, method=1, maxit=50, conv=1E-5) ## another rbind.fill implementation CDM_rbind_fill( x, y ) ## fills a vector row-wise into a matrix cdm_matrix2( x, nrow ) ## fills a vector column-wise into a matrix cdm_matrix1( x, ncol ) ## SCAD thresholding operator cdm_penalty_threshold_scad(beta, lambda, a=3.7) ## lasso thresholding operator cdm_penalty_threshold_lasso(val, eta ) ## ridge thresholding operator cdm_penalty_threshold_ridge(beta, lambda) ## elastic net threshold operator cdm_penalty_threshold_elnet( beta, lambda, alpha ) ## SCAD-L2 thresholding operator cdm_penalty_threshold_scadL2(beta, lambda, alpha, a=3.7) ## truncated L1 penalty thresholding operator cdm_penalty_threshold_tlp( beta, tau, lambda ) ## MCP thresholding operator cdm_penalty_threshold_mcp(beta, lambda, a=3.7) ## general thresholding operator for regularization cdm_parameter_regularization(x, regular_type, regular_lam, regular_alpha=NULL, regular_tau=NULL ) ## values of penalty function cdm_penalty_values(x, regular_type, regular_lam, regular_tau=NULL, regular_alpha=NULL) ## thresholding operators regularization cdm_parameter_regularization(x, regular_type, regular_lam, regular_alpha=NULL, regular_tau=NULL) ## utility functions for P-EM acceleration cdm_pem_inits(parmlist) cdm_pem_inits_assign_parmlist(pem_pars, envir) cdm_pem_acceleration( iter, pem_parameter_index, pem_parameter_sequence, pem_pars, PEM_itermax, parmlist, ll_fct, ll_args, deviance.history=NULL ) cdm_pem_acceleration_assign_output_parameters(res_ll_fct, vars, envir, update) ## approximation of absolute value function and its derivative abs_approx(x, eps=1e-05) abs_approx_D1(x, eps=1e-05) ## information criteria cdm_calc_information_criteria(ic) cdm_print_summary_information_criteria(object, digits_crit=0, digits_penalty=2) ## string pasting cat_paste(...)
## requireNamespace with package message for needed installation CDM_require_namespace(pkg) ## attach internal function in a package cdm_attach_internal_function(pack, fun) ## print function in summary cdm_print_summary_data_frame(obji, from=NULL, to=NULL, digits=3, rownames_null=FALSE) ## print summary call cdm_print_summary_call(object, call_name="call") ## print computation time cdm_print_summary_computation_time(object, time_name="time", time_start="s1", time_end="s2") ## string vector of matrix entries cdm_matrixstring( matr, string ) ## mvtnorm::rmvnorm with vector conversion for n=1 CDM_rmvnorm(n, mean=NULL, sigma, ...) ## fit univariate and multivariate normal distribution cdm_fit_normal(x, w) ## fit unidimensional factor analysis by unweighted least squares cdm_fa1(Sigma, method=1, maxit=50, conv=1E-5) ## another rbind.fill implementation CDM_rbind_fill( x, y ) ## fills a vector row-wise into a matrix cdm_matrix2( x, nrow ) ## fills a vector column-wise into a matrix cdm_matrix1( x, ncol ) ## SCAD thresholding operator cdm_penalty_threshold_scad(beta, lambda, a=3.7) ## lasso thresholding operator cdm_penalty_threshold_lasso(val, eta ) ## ridge thresholding operator cdm_penalty_threshold_ridge(beta, lambda) ## elastic net threshold operator cdm_penalty_threshold_elnet( beta, lambda, alpha ) ## SCAD-L2 thresholding operator cdm_penalty_threshold_scadL2(beta, lambda, alpha, a=3.7) ## truncated L1 penalty thresholding operator cdm_penalty_threshold_tlp( beta, tau, lambda ) ## MCP thresholding operator cdm_penalty_threshold_mcp(beta, lambda, a=3.7) ## general thresholding operator for regularization cdm_parameter_regularization(x, regular_type, regular_lam, regular_alpha=NULL, regular_tau=NULL ) ## values of penalty function cdm_penalty_values(x, regular_type, regular_lam, regular_tau=NULL, regular_alpha=NULL) ## thresholding operators regularization cdm_parameter_regularization(x, regular_type, regular_lam, regular_alpha=NULL, regular_tau=NULL) ## utility functions for P-EM acceleration cdm_pem_inits(parmlist) cdm_pem_inits_assign_parmlist(pem_pars, envir) cdm_pem_acceleration( iter, pem_parameter_index, pem_parameter_sequence, pem_pars, PEM_itermax, parmlist, ll_fct, ll_args, deviance.history=NULL ) cdm_pem_acceleration_assign_output_parameters(res_ll_fct, vars, envir, update) ## approximation of absolute value function and its derivative abs_approx(x, eps=1e-05) abs_approx_D1(x, eps=1e-05) ## information criteria cdm_calc_information_criteria(ic) cdm_print_summary_information_criteria(object, digits_crit=0, digits_penalty=2) ## string pasting cat_paste(...)
pkg |
An R package |
pack |
An R package |
fun |
An R function |
obji |
Object |
from |
Integer |
to |
Integer |
digits |
Number of digits used for printing |
rownames_null |
Logical |
call_name |
Character |
time_name |
Character |
time_start |
Character |
time_end |
Character |
matr |
Matrix |
string |
String |
object |
Object |
n |
Integer |
mean |
Mean vector or matrix if separate means for cases are provided. In this case,
|
sigma |
Covariance matrix |
... |
More arguments to be passed (or a list of arguments) |
x |
Matrix or vector |
y |
Matrix or vector |
w |
Vector of sampling weights |
nrow |
Integer |
ncol |
Integer |
Sigma |
Covariance matrix |
method |
Method |
maxit |
Maximum number of iterations |
conv |
Convergence criterion |
beta |
Numeric |
lambda |
Regularization parameter |
alpha |
Regularization parameter |
a |
Parameter |
tau |
Regularization parameter |
val |
Numeric |
eta |
Regularization parameter |
regular_type |
Type of regularization |
regular_lam |
Regularization parameter |
regular_tau |
Regularization parameter |
regular_alpha |
Regularization parameter |
parmlist |
List containing parameters |
pem_pars |
Vector containing parameter names |
envir |
Environment |
update |
Logical |
iter |
Iteration number |
pem_parameter_index |
List with parameter indices |
pem_parameter_sequence |
List with updated parameter sequence |
PEM_itermax |
Maximum number of iterations for PEM |
ll_fct |
Name of log-likelihood function |
ll_args |
Arguments of log-likelihood function |
deviance.history |
Deviance history, a data frame. |
res_ll_fct |
Result of maximized log-likelihood function |
vars |
Vector containing parameter names |
eps |
Numeric |
ic |
List |
digits_crit |
Integer |
digits_penalty |
Integer |
This function computes the classification accuracy and consistency originally proposed by Cui, Gierl and Chang (2012; see also Wang et al., 2015). The function computes both statistics by estimators of Johnson and Sinharay (2018; see also Sinharay & Johnson, 2019) and simulation based estimation.
cdm.est.class.accuracy(cdmobj, n.sims=0, version=2)
cdm.est.class.accuracy(cdmobj, n.sims=0, version=2)
cdmobj |
Object of class |
n.sims |
Number of simulated persons. If |
version |
Correct classification reliability statistics can be obtained
using the default |
The item parameters and the probability distribution of latent classes is used as the basis of the simulation. Accuracy and consistency is estimated for both MLE and MAP classification estimators. In addition, classification accuracy measures are available for the separate classification of all skills.
A data frame for MLE, MAP and MAP (Skill 1, ..., Skill )
classification reliability for the whole latent class pattern and
marginal skill classification with following columns:
Pa_est |
Classification accuracy (Cui et al., 2012) using the estimator of Johnson and Sinharay, 2018 |
Pa_sim |
Classification accuracy based on simulated data
(only for |
Pc |
Classification consistency (Cui et al., 2012) using the estimator of Johnson and Sinharay, 2018 |
Pc_sim |
Classification consistency based on simulated data
(only for |
Cui, Y., Gierl, M. J., & Chang, H.-H. (2012). Estimating classification consistency and accuracy for cognitive diagnostic assessment. Journal of Educational Measurement, 49, 19-38. doi:10.1111/j.1745-3984.2011.00158.x
Johnson, M. S., & Sinharay, S. (2018). Measures of agreement to assess attribute-level classification accuracy and consistency for cognitive diagnostic assessments. Journal of Educational Measurement, 45(4), 635-664. doi:10.1111/jedm.12196
Sinharay, S., & Johnson, M. S. (2019). Measures of agreement: Reliability, classification accuracy, and classification consistency. In M. von Davier & Y.-S. Lee (Eds.). Handbook of diagnostic classification models (pp. 359-377). Cham: Springer. doi:10.1007/978-3-030-05584-4_17
Wang, W., Song, L., Chen, P., Meng, Y., & Ding, S. (2015). Attribute-level and pattern-level classification consistency and accuracy indices for cognitive diagnostic assessment. Journal of Educational Measurement, 52(4), 457-476. doi:10.1111/jedm.12096
## Not run: ############################################################################# # EXAMPLE 1: DINO data example ############################################################################# data(sim.dino, package="CDM") data(sim.qmatrix, package="CDM") #*** # Model 1: estimate DINO model with din mod1 <- CDM::din( sim.dino, q.matrix=sim.qmatrix, rule="DINO") # estimate classification reliability cdm.est.class.accuracy( mod1, n.sims=5000) #*** # Model 2: estimate DINO model with gdina mod2 <- CDM::gdina( sim.dino, q.matrix=sim.qmatrix, rule="DINO") # estimate classification reliability cdm.est.class.accuracy( mod2 ) m1 <- mod1$coef[, c("guess", "slip" ) ] m2 <- mod2$coef m2 <- cbind( m1, m2[ seq(1,18,2), "est" ], 1 - m2[ seq(1,18,2), "est" ] - m2[ seq(2,18,2), "est" ] ) colnames(m2) <- c("g.M1", "s.M1", "g.M2", "s.M2" ) ## > round( m2, 3 ) ## g.M1 s.M1 g.M2 s.M2 ## Item1 0.109 0.192 0.109 0.191 ## Item2 0.073 0.234 0.072 0.234 ## Item3 0.139 0.238 0.146 0.238 ## Item4 0.124 0.065 0.124 0.009 ## Item5 0.125 0.035 0.125 0.037 ## Item6 0.214 0.523 0.214 0.529 ## Item7 0.193 0.514 0.192 0.514 ## Item8 0.246 0.100 0.246 0.100 ## Item9 0.201 0.032 0.195 0.032 # Note that s (the slipping parameter) substantially differs for Item4 # for DINO estimation in 'din' and 'gdina' ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: DINO data example ############################################################################# data(sim.dino, package="CDM") data(sim.qmatrix, package="CDM") #*** # Model 1: estimate DINO model with din mod1 <- CDM::din( sim.dino, q.matrix=sim.qmatrix, rule="DINO") # estimate classification reliability cdm.est.class.accuracy( mod1, n.sims=5000) #*** # Model 2: estimate DINO model with gdina mod2 <- CDM::gdina( sim.dino, q.matrix=sim.qmatrix, rule="DINO") # estimate classification reliability cdm.est.class.accuracy( mod2 ) m1 <- mod1$coef[, c("guess", "slip" ) ] m2 <- mod2$coef m2 <- cbind( m1, m2[ seq(1,18,2), "est" ], 1 - m2[ seq(1,18,2), "est" ] - m2[ seq(2,18,2), "est" ] ) colnames(m2) <- c("g.M1", "s.M1", "g.M2", "s.M2" ) ## > round( m2, 3 ) ## g.M1 s.M1 g.M2 s.M2 ## Item1 0.109 0.192 0.109 0.191 ## Item2 0.073 0.234 0.072 0.234 ## Item3 0.139 0.238 0.146 0.238 ## Item4 0.124 0.065 0.124 0.009 ## Item5 0.125 0.035 0.125 0.037 ## Item6 0.214 0.523 0.214 0.529 ## Item7 0.193 0.514 0.192 0.514 ## Item8 0.246 0.100 0.246 0.100 ## Item9 0.201 0.032 0.195 0.032 # Note that s (the slipping parameter) substantially differs for Item4 # for DINO estimation in 'din' and 'gdina' ## End(Not run)
Extracts the estimated parameters from either
din
, gdina
, gdina
or gdm
objects.
## S3 method for class 'din' coef(object, ...) ## S3 method for class 'gdina' coef(object, ...) ## S3 method for class 'mcdina' coef(object, ...) ## S3 method for class 'gdm' coef(object, ...) ## S3 method for class 'slca' coef(object, ...)
## S3 method for class 'din' coef(object, ...) ## S3 method for class 'gdina' coef(object, ...) ## S3 method for class 'mcdina' coef(object, ...) ## S3 method for class 'gdm' coef(object, ...) ## S3 method for class 'slca' coef(object, ...)
object |
An object inheriting from either class |
... |
Additional arguments to be passed. |
A vector, a matrix or a data frame of the estimated parameters for the fitted model.
data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # DINA model d1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix) coef(d1) ## Not run: # GDINA model d2 <- CDM::gdina( sim.dina, q.matrix=sim.qmatrix) coef(d2) # GDM model theta.k <- seq(-4,4,len=11) d3 <- CDM::gdm( sim.dina, irtmodel="2PL", theta.k=theta.k, Qmatrix=as.matrix(sim.qmatrix), centered.latent=TRUE) coef(d3) ## End(Not run)
data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # DINA model d1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix) coef(d1) ## Not run: # GDINA model d2 <- CDM::gdina( sim.dina, q.matrix=sim.qmatrix) coef(d2) # GDM model theta.k <- seq(-4,4,len=11) d3 <- CDM::gdm( sim.dina, irtmodel="2PL", theta.k=theta.k, Qmatrix=as.matrix(sim.qmatrix), centered.latent=TRUE) coef(d3) ## End(Not run)
Artificial data: dichotomously coded fictitious answers of 400 respondents to 9 items assuming 3 underlying attributes.
data(sim.dina) data(sim.dino) data(sim.qmatrix)
data(sim.dina) data(sim.dino) data(sim.qmatrix)
The sim.dina
and sim.dino
data sets include dichotomous
answers of respondents to
items, thus they are
data matrices. For both data sets
attributes are assumed to underlie the process of responding, stored
in
sim.qmatrix
.
The sim.dina
data set is simulated according to the DINA condensation
rule, whereas the sim.dino
data set is simulated according to the
DINO condensation rule. The slipping errors for the items 1 to 9 in both
data sets are 0.20, 0.20, 0.20, 0.20, 0.00, 0.50, 0.50, 0.10, 0.03
and the guessing errors are 0.10, 0.125, 0.15, 0.175, 0.2, 0.225,
0.25, 0.275, 0.3
. The attributes are assumed to be mastered with expected
probabilities of -0.4, 0.2, 0.6
, respectively. The correlation of
the attributes is 0.3
for attributes 1 and 2, 0.4
for
attributes 1 and 3 and 0.1
for attributes 2 and 3.
Dataset sim.dina
anova
(Examples 1, 2),
cdi.kli
(Example 1),
din
(Examples 2, 4, 5),
gdina
(Example 1),
itemfit.sx2
(Example 2),
modelfit.cor.din
(Example 1)
Dataset sim.dino
cdm.est.class.accuracy
(Example 1),
din
(Example 3), gdina
(Examples 2, 3, 4),
Rupp, A. A., Templin, J. L., & Henson, R. A. (2010) Diagnostic Measurement: Theory, Methods, and Applications. New York: The Guilford Press.
Several datasets for the CDM package
data(data.cdm01) data(data.cdm02) data(data.cdm03) data(data.cdm04) data(data.cdm05) data(data.cdm06) data(data.cdm07) data(data.cdm08) data(data.cdm09) data(data.cdm10)
data(data.cdm01) data(data.cdm02) data(data.cdm03) data(data.cdm04) data(data.cdm05) data(data.cdm06) data(data.cdm07) data(data.cdm08) data(data.cdm09) data(data.cdm10)
Dataset data.cdm01
This dataset is a multiple choice dataset and used in the mcdina
function. The format is:
List of 3
$ data :'data.frame':
..$ I1 : int [1:5003] 3 3 4 1 1 1 1 1 1 1 ...
..$ I2 : int [1:5003] 1 1 3 1 1 2 1 1 2 1 ...
..$ I3 : int [1:5003] 4 3 2 3 2 2 2 2 1 2 ...
..$ I4 : int [1:5003] 3 3 3 2 2 2 2 3 3 1 ...
..$ I5 : int [1:5003] 2 2 2 3 1 1 2 3 2 1 ...
..$ I6 : int [1:5003] 3 1 1 1 1 2 1 1 1 1 ...
..$ I7 : int [1:5003] 1 1 2 2 1 3 1 1 1 3 ...
..$ I8 : int [1:5003] 1 1 1 1 1 2 1 4 3 3 ...
..$ I9 : int [1:5003] 3 2 1 1 1 1 3 3 1 3 ...
..$ I10: int [1:5003] 2 1 2 1 1 2 2 2 2 1 ...
..$ I11: int [1:5003] 2 2 2 2 1 2 1 2 1 1 ...
..$ I12: int [1:5003] 1 2 1 1 2 1 1 1 1 2 ...
..$ I13: int [1:5003] 2 1 1 1 2 1 2 2 1 1 ...
..$ I14: int [1:5003] 1 1 1 1 1 2 1 1 2 1 ...
..$ I15: int [1:5003] 1 2 1 1 1 1 1 1 1 1 ...
..$ I16: int [1:5003] 1 2 2 1 2 2 2 1 1 1 ...
..$ I17: int [1:5003] 1 1 1 1 1 1 1 1 1 1 ...
$ group : int [1:5003] 1 1 1 1 1 1 1 1 1 1 ...
$ q.matrix:'data.frame':
..$ item : int [1:52] 1 1 1 1 2 2 2 2 3 3 ...
..$ categ: int [1:52] 1 2 3 4 1 2 3 4 1 2 ...
..$ A1 : int [1:52] 0 1 0 1 0 1 1 1 0 0 ...
..$ A2 : int [1:52] 0 0 1 1 0 0 0 1 0 0 ...
..$ A3 : int [1:52] 0 0 0 0 0 0 0 0 0 0 ...
Dataset data.cdm02
Multiple choice dataset with a Q-matrix designed for polytomous attributes.
List of 2
$ data :'data.frame':
..$ I1 : int [1:3000] 3 3 4 1 1 1 1 1 1 1 ...
..$ I2 : int [1:3000] 1 1 3 1 1 2 1 1 2 1 ...
..$ I3 : int [1:3000] 4 3 2 3 2 2 2 2 1 2 ...
[...]
..$ B17: num [1:3000] 1 1 1 1 1 1 1 1 1 1 ...
..$ B18: num [1:3000] 1 1 1 1 2 2 2 2 2 2 ...
$ q.matrix:'data.frame':
..$ item : int [1:100] 1 1 1 1 2 2 2 2 3 3 ...
..$ categ: int [1:100] 1 2 3 4 1 2 3 4 1 2 ...
..$ A1 : num [1:100] 0 1 0 1 0 1 1 1 0 0 ...
..$ A2 : num [1:100] 0 0 1 1 0 0 0 1 0 0 ...
..$ A3 : num [1:100] 0 0 0 0 0 0 0 0 0 0 ...
..$ B1 : num [1:100] 0 0 0 0 0 0 0 0 0 0 ...
Dataset data.cdm03
:
This is a resimulated dataset from Chiu, Koehn and Wu (2016) where the data generating model is a reduced RUM model. See Example 1.
List of 2
$ data : num [1:725, 1:16] 0 1 1 1 1 1 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:16] "I01" "I02" "I03" "I04" ...
$ qmatrix:'data.frame': 16 obs. of 6 variables:
..$ item: Factor w/ 16 levels "I01","I02","I03",..: 1 2 3 4 5 6 7 8 9 10 ...
..$ A1 : int [1:16] 1 0 0 0 0 0 0 0 1 1 ...
..$ A2 : int [1:16] 0 1 0 0 1 1 0 0 0 0 ...
..$ A3 : int [1:16] 0 0 1 1 1 1 0 0 0 0 ...
..$ A4 : int [1:16] 0 0 0 0 0 0 1 1 1 1 ...
..$ A5 : int [1:16] 0 0 0 0 0 0 0 0 0 0 ...
Dataset data.cdm04
:
Simulated dataset for the sequential DINA model (as described in Ma & de la Torre, 2016). The dataset contains 1000 persons and 12 items which measure 2 skills.
List of 3
$ data : num [1:1000, 1:12] 0 0 0 1 1 0 0 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:12] "I1" "I2" "I3" "I4" ...
$ q.matrix1:'data.frame': 18 obs. of 4 variables:
..$ Item: chr [1:18] "I1" "I2" "I3" "I4" ...
..$ Cat : int [1:18] 1 1 1 1 1 1 1 2 1 2 ...
..$ A1 : int [1:18] 1 1 1 0 0 0 1 1 1 1 ...
..$ A2 : int [1:18] 0 0 0 1 1 1 0 0 0 0 ...
$ q.matrix2:'data.frame': 18 obs. of 4 variables:
..$ Item: chr [1:18] "I1" "I2" "I3" "I4" ...
..$ Cat : int [1:18] 1 1 1 1 1 1 1 2 1 2 ...
..$ A1 : num [1:18] 1 1 1 0 0 0 1 1 1 1 ...
..$ A2 : num [1:18] 0 0 0 1 1 1 0 0 0 0 ...
Dataset data.cdm05
:
Example dataset used in Philipp, Strobl, de la Torre and Zeileis (2018).
This dataset is a sub-dataset of the probability
dataset in
the pks package (Heller & Wickelmaier, 2013).
List of 3
$ data :'data.frame': 504 obs. of 12 variables:
..$ b101: num [1:504] 1 1 1 1 1 1 1 1 1 1 ...
..$ b102: num [1:504] 1 1 1 1 1 1 1 1 1 1 ...
..$ b103: num [1:504] 1 1 1 1 1 1 1 1 1 1 ...
..$ b104: num [1:504] 1 1 1 1 0 1 0 0 0 1 ...
..$ b105: num [1:504] 1 0 1 1 1 1 0 1 1 1 ...
..$ b106: num [1:504] 1 1 1 1 1 1 1 1 1 1 ...
..$ b107: num [1:504] 1 1 1 1 1 1 1 1 1 1 ...
..$ b108: num [1:504] 1 1 1 1 1 1 0 1 1 1 ...
..$ b109: num [1:504] 1 1 0 1 1 0 0 1 1 0 ...
..$ b110: num [1:504] 0 0 0 1 0 0 0 0 0 1 ...
..$ b111: num [1:504] 0 1 0 0 0 1 0 0 0 0 ...
..$ b112: num [1:504] 1 1 0 1 0 1 0 1 0 0 ...
$ q.matrix:'data.frame': 12 obs. of 4 variables:
..$ pb: num [1:12] 1 0 0 0 1 1 1 1 1 0 ...
..$ cp: num [1:12] 0 1 0 0 1 1 0 0 0 1 ...
..$ un: num [1:12] 0 0 1 0 0 0 1 1 0 0 ...
..$ id: num [1:12] 0 0 0 1 0 0 0 0 1 1 ...
$ skills : Named chr [1:4] "how to calculate the classic probability "
..- attr(*, "names")=chr [1:4] "pb" "cp" "un" "id"
Dataset data.cdm06
:
Resimulated example dataset from Chen and Chen (2017).
List of 3
$ data :'data.frame': 2733 obs. of 15 variables:
..$ I01: num [1:2733] 1 0 0 1 0 0 0 1 1 1 ...
..$ I02: num [1:2733] 1 0 0 1 1 0 1 0 0 1 ...
..$ I03: num [1:2733] 0 0 0 1 1 0 1 0 1 0 ...
..$ I04: num [1:2733] 1 1 0 0 0 0 1 1 1 0 ...
..$ I05: num [1:2733] 1 0 1 1 0 1 1 1 1 1 ...
..$ I06: num [1:2733] 0 0 0 1 1 0 0 0 1 1 ...
..$ I07: num [1:2733] 1 1 1 0 0 1 1 0 1 1 ...
..$ I08: num [1:2733] 0 0 0 0 0 0 0 0 1 1 ...
..$ I09: num [1:2733] 1 0 0 1 1 1 0 1 0 1 ...
..$ I10: num [1:2733] 0 0 0 1 0 1 1 0 1 1 ...
..$ I11: num [1:2733] 0 1 0 1 1 1 1 0 1 1 ...
..$ I12: num [1:2733] 0 1 0 1 0 0 0 1 1 1 ...
..$ I13: num [1:2733] 0 0 1 1 0 1 0 0 0 1 ...
..$ I14: num [1:2733] 0 0 0 1 1 0 1 1 0 0 ...
..$ I15: num [1:2733] 0 0 0 1 0 0 1 0 1 1 ...
$ q.matrix:'data.frame': 15 obs. of 5 variables:
..$ RI: num [1:15] 1 1 1 0 1 1 1 1 0 0 ...
..$ JS: num [1:15] 1 0 0 1 0 0 0 0 0 1 ...
..$ GI: num [1:15] 0 1 0 1 0 0 1 1 1 1 ...
..$ II: num [1:15] 0 1 1 0 1 0 1 0 0 0 ...
..$ MI: num [1:15] 0 0 1 0 0 0 0 0 1 0 ...
$ skills : chr [1:5, 1:2] "Retrieving explicit information " ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:5] "RI" "JS" "GI" "II" ...
.. ..$ : chr [1:2] "skill" "description"
Dataset data.cdm07
:
This is a resimulated dataset from the social anxiety disorder data concerning social phobia which involve 13 dichotomous questions (Fang, Liu & Ling, 2017). The simulation was based on a latent class model with five classes. The dataset was also used in Chen, Li, Liu and Ying (2017).
$ data : num [1:863, 1:13] 1 0 1 1 1 1 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:13] "I1" "I2" "I3" "I4" ...
$ q.matrix: num [1:13, 1:3] 1 1 1 1 0 0 0 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:13] "I1" "I2" "I3" "I4" ...
.. ..$ : chr [1:3] "A1" "A2" "A3"
$ items : atomic [1:13] 1 speaking in front of other people? ...
..- attr(*, "stem")=chr "Have you ever had a strong fear or avoidance of ..."
Dataset data.cdm08
:
This is a simulated dataset involving four skills and three misconceptions for the model for simultaneously identifying skills and misconceptions (SISM; Kuo, Chen & de la Torre, 2018). The Q-matrix follows the specification in their simulation study.
List of 2
$ data :'data.frame': 1300 obs. of 20 variables:
..$ I01: num [1:1300] 1 0 0 1 1 1 1 1 1 1 ...
..$ I02: num [1:1300] 0 0 0 0 1 1 1 1 1 1 ...
..$ I03: num [1:1300] 0 0 0 0 1 1 1 1 1 1 ...
..$ I04: num [1:1300] 1 1 0 1 0 1 1 0 1 1 ...
..$ I05: num [1:1300] 1 1 1 0 1 1 0 1 1 1 ...
..[...]
..$ I18: num [1:1300] 0 1 0 0 0 0 0 0 0 1 ...
..$ I19: num [1:1300] 1 1 0 0 0 0 0 1 1 1 ...
..$ I20: num [1:1300] 1 1 0 0 0 1 0 1 0 1 ...
$ q.matrix:'data.frame': 20 obs. of 7 variables:
..$ S1: num [1:20] 1 0 0 0 0 0 0 1 0 0 ...
..$ S2: num [1:20] 0 1 0 0 0 0 0 0 1 0 ...
..$ S3: num [1:20] 0 0 1 0 0 0 0 0 0 1 ...
..$ S4: num [1:20] 0 0 0 1 0 0 0 0 0 0 ...
..$ B1: num [1:20] 0 0 0 0 1 0 0 1 1 0 ...
..$ B2: num [1:20] 0 0 0 0 0 1 0 0 0 0 ...
..$ B3: num [1:20] 0 0 0 0 0 0 1 0 0 1 ...
Dataset data.cdm09
:
This is a simulated dataset involving polytomous skills which is adapted
from the empirical example (proportional reasoning data)
of Chen and de la Torre (2013).
List of 2
$ data : num [1:500, 1:15] 1 0 1 1 0 1 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:15] "I1" "I2" "I3" "I4" ...
$ q.matrix:'data.frame': 15 obs. of 4 variables:
..$ A1: int [1:15] 0 0 0 0 2 0 0 2 1 1 ...
..$ A2: int [1:15] 1 0 2 0 0 1 2 0 1 1 ...
..$ A3: int [1:15] 0 0 0 1 0 0 0 0 0 0 ...
..$ A4: int [1:15] 0 1 1 0 0 0 0 0 0 0 ...
Dataset data.cdm10
:
This is a simulated dataset involving a hierarchical skill structure.
Skill A has four levels, skill B possesses two levels and skill C has three levels.
List of 2
$ data : num [1:1500, 1:15] 1 1 0 0 0 1 1 0 0 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:15] "I1" "I2" "I3" "I4" ...
$ q.matrix: num [1:15, 1:6] 1 1 1 1 1 1 0 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:15] "I1" "I2" "I3" "I4" ...
.. ..$ : chr [1:6] "A1" "A2" "A3" "B1" ...
Chen, H., & Chen, J. (2017). Cognitive diagnostic research on chinese students' English listening skills and implications on skill training. English Language Teaching, 10(12), 107-115. http://dx.doi.org/10.5539/elt.v10n12p107
Chen, J., & de la Torre, J. (2013). A general cognitive diagnosis model for expert-defined polytomous attributes. Applied Psychological Measurement, 37, 419-437. http://dx.doi.org/10.1177/0146621613479818
Chen, Y., Li, X., Liu, J., & Ying, Z. (2017). Regularized latent class analysis with application in cognitive diagnosis. Psychometrika, 82, 660-692. http://dx.doi.org/10.1007/s11336-016-9545-6
Chiu, C.-Y., Koehn, H.-F., & Wu, H.-M. (2016). Fitting the reduced RUM with Mplus: A tutorial. International Journal of Testing, 16(4), 331-351. http://dx.doi.org/10.1080/15305058.2016.1148038
Fang, G., Liu, J., & Ying, Z. (2017). On the identifiability of diagnostic classification models. arXiv, 1706.01240. https://arxiv.org/abs/1706.01240
Heller, J. and Wickelmaier, F. (2013). Minimum discrepancy estimation in
probabilistic knowledge structures.
Electronic Notes in Discrete Mathematics, 42, 49-56.
http://dx.doi.org/10.1016/j.endm.2013.05.145
Kuo, B.-C., Chen, C.-H., & de la Torre, J. (2018). A cognitive diagnosis model for identifying coexisting skills and misconceptions. Applied Psychological Measurement, 42(3), 179-191. http://dx.doi.org/10.1177/0146621617722791
Ma, W., & de la Torre, J. (2016).
A sequential cognitive diagnosis model for polytomous responses.
British Journal of Mathematical and Statistical Psychology, 69(3), 253-275.
https://doi.org/10.1111/bmsp.12070
Philipp, M., Strobl, C., de la Torre, J., & Zeileis, A. (2018). On the estimation of standard errors in cognitive diagnosis models. Journal of Educational and Behavioral Statistics, 43(1), 88-115. http://dx.doi.org/10.3102/1076998617719728
## Not run: ############################################################################# # EXAMPLE 1: Reduced RUM model, Chiu et al. (2016) ############################################################################# data(data.cdm03, package="CDM") dat <- data.cdm03$data qmatrix <- data.cdm03$qmatrix #*** Model 1: Reduced RUM mod1 <- CDM::gdina( dat, q.matrix=qmatrix[,-1], rule="RRUM" ) summary(mod1) #*** Model 2: Additive model with identity link function mod2 <- CDM::gdina( dat, q.matrix=qmatrix[,-1], rule="ACDM" ) summary(mod2) #*** Model 3: Additive model with logit link function mod3 <- CDM::gdina( dat, q.matrix=qmatrix[,-1], rule="ACDM", linkfct="logit") summary(mod3) ############################################################################# # EXAMPLE 2: GDINA model - probability dataset from the pks package ############################################################################# data(data.cdm05, package="CDM") dat <- data.cdm05$data Q <- data.cdm05$q.matrix #* estimate model mod1 <- CDM::gdina( dat, q.matrix=Q ) summary(mod1) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Reduced RUM model, Chiu et al. (2016) ############################################################################# data(data.cdm03, package="CDM") dat <- data.cdm03$data qmatrix <- data.cdm03$qmatrix #*** Model 1: Reduced RUM mod1 <- CDM::gdina( dat, q.matrix=qmatrix[,-1], rule="RRUM" ) summary(mod1) #*** Model 2: Additive model with identity link function mod2 <- CDM::gdina( dat, q.matrix=qmatrix[,-1], rule="ACDM" ) summary(mod2) #*** Model 3: Additive model with logit link function mod3 <- CDM::gdina( dat, q.matrix=qmatrix[,-1], rule="ACDM", linkfct="logit") summary(mod3) ############################################################################# # EXAMPLE 2: GDINA model - probability dataset from the pks package ############################################################################# data(data.cdm05, package="CDM") dat <- data.cdm05$data Q <- data.cdm05$q.matrix #* estimate model mod1 <- CDM::gdina( dat, q.matrix=Q ) summary(mod1) ## End(Not run)
Dataset from Chapter 9 of the book 'Diagnostic Measurement' (Rupp, Templin & Henson, 2010).
data(data.dcm)
data(data.dcm)
The format of the data is a list containing the dichotomous item
response data data
(10000 persons at 7 items)
and the Q-matrix q.matrix
(7 items and 3 skills):
List of 2
$ data :'data.frame':
..$ id: int [1:10000] 1 2 3 4 5 6 7 8 9 10 ...
..$ D1: num [1:10000] 0 0 0 0 1 0 1 0 0 1 ...
..$ D2: num [1:10000] 0 0 0 0 0 1 1 1 0 1 ...
..$ D3: num [1:10000] 1 0 1 0 1 1 0 0 0 1 ...
..$ D4: num [1:10000] 0 0 1 0 0 1 1 1 0 0 ...
..$ D5: num [1:10000] 1 0 0 0 1 1 1 0 1 0 ...
..$ D6: num [1:10000] 0 0 0 0 1 1 1 0 0 1 ...
..$ D7: num [1:10000] 0 0 0 0 0 1 1 0 1 1 ...
$ q.matrix: num [1:7, 1:3] 1 0 0 1 1 0 1 0 1 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:7] "D1" "D2" "D3" "D4" ...
.. ..$ : chr [1:3] "skill1" "skill2" "skill3"
For supplementary material of the Rupp, Templin and Henson book (2010) see http://dcm.coe.uga.edu/.
The dataset was downloaded from http://dcm.coe.uga.edu/supplemental/chapter9.html.
Rupp, A. A., Templin, J., & Henson, R. A. (2010). Diagnostic Measurement: Theory, Methods, and Applications. New York: The Guilford Press.
## Not run: data(data.dcm, package="CDM") dat <- data.dcm$data[,-1] Q <- data.dcm$q.matrix #***************************************************** # Model 1: DINA model #***************************************************** mod1 <- CDM::din( dat, q.matrix=Q ) summary(mod1) #-------- # Model 1m: estimate model in mirt package library(mirt) library(sirt) #** define theta grid of skills # use the function skillspace.hierarchy just for convenience hier <- "skill1 > skill2" skillspace <- CDM::skillspace.hierarchy( hier, skill.names=colnames(Q) ) Theta <- as.matrix(skillspace$skillspace.complete) #** create mirt model mirtmodel <- mirt::mirt.model(" skill1=1 skill2=2 skill3=3 (skill1*skill2)=4 (skill1*skill3)=5 (skill2*skill3)=6 (skill1*skill2*skill3)=7 " ) #** mirt parameter table mod.pars <- mirt::mirt( dat, mirtmodel, pars="values") # use starting values of .20 for guessing parameter ind <- which( mod.pars$name=="d" ) mod.pars[ind,"value"] <- stats::qlogis(.20) # guessing parameter on the logit metric # use starting values of .80 for anti-slipping parameter ind <- which( ( mod.pars$name %in% paste0("a",1:20 ) ) & (mod.pars$est) ) mod.pars[ind,"value"] <- stats::qlogis(.80) - stats::qlogis(.20) mod.pars #** prior for the skill space distribution I <- ncol(dat) lca_prior <- function(Theta,Etable){ TP <- nrow(Theta) if ( is.null(Etable) ){ prior <- rep( 1/TP, TP ) } if ( ! is.null(Etable) ){ prior <- ( rowSums(Etable[, seq(1,2*I,2)]) + rowSums(Etable[,seq(2,2*I,2)]) )/I } prior <- prior / sum(prior) return(prior) } #** estimate model in mirt mod1m <- mirt::mirt(dat, mirtmodel, pars=mod.pars, verbose=TRUE, technical=list( customTheta=Theta, customPriorFun=lca_prior) ) # The number of estimated parameters is incorrect because mirt does not correctly count # estimated parameters from the user customized prior distribution. mod1m@nest <- as.integer(sum(mod.pars$est) + nrow(Theta) - 1) # extract log-likelihood mod1m@logLik # compute AIC and BIC ( AIC <- -2*mod1m@logLik+2*mod1m@nest ) ( BIC <- -2*mod1m@logLik+log(mod1m@Data$N)*mod1m@nest ) #** extract item parameters cmod1m <- sirt::mirt.wrapper.coef(mod1m)$coef # compare estimated guessing and slipping parameters dfr <- data.frame( "din.guess"=mod1$guess$est, "mirt.guess"=plogis(cmod1m$d), "din.slip"=mod1$slip$est, "mirt.slip"=1-plogis( rowSums( cmod1m[, c("d", paste0("a",1:7) ) ] ) ) ) round(t(dfr),3) ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] ## din.guess 0.217 0.193 0.189 0.135 0.143 0.135 0.162 ## mirt.guess 0.226 0.189 0.184 0.132 0.142 0.132 0.158 ## din.slip 0.338 0.331 0.334 0.220 0.222 0.211 0.042 ## mirt.slip 0.339 0.333 0.336 0.223 0.225 0.214 0.044 # compare estimated skill class distribution dfr <- data.frame("din"=mod1$attribute.patt$class.prob, "mirt"=mod1m@Prior[[1]] ) round(t(dfr),3) ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] ## din 0.113 0.083 0.094 0.092 0.064 0.059 0.065 0.429 ## mirt 0.116 0.074 0.095 0.064 0.095 0.058 0.066 0.433 #** extract estimated classifications fsc1m <- sirt::mirt.wrapper.fscores( mod1m ) #- estimated reliabilities fsc1m$EAP.rel ## skill1 skill2 skill3 ## 0.5479942 0.5362595 0.5357961 #- estimated classfications: EAPs, MLEs and MAPs head( round(fsc1m$person,3) ) ## case M EAP.skill1 SE.EAP.skill1 EAP.skill2 SE.EAP.skill2 EAP.skill3 SE.EAP.skill3 ## 1 1 0.286 0.508 0.500 0.067 0.251 0.820 0.384 ## 2 2 0.000 0.162 0.369 0.191 0.393 0.190 0.392 ## 3 3 0.286 0.200 0.400 0.211 0.408 0.607 0.489 ## 4 4 0.000 0.162 0.369 0.191 0.393 0.190 0.392 ## 5 5 0.571 0.802 0.398 0.267 0.443 0.928 0.258 ## 6 6 0.857 0.998 0.045 1.000 0.019 1.000 0.020 ## MLE.skill1 MLE.skill2 MLE.skill3 MAP.skill1 MAP.skill2 MAP.skill3 ## 1 1 0 1 1 0 1 ## 2 0 0 0 0 0 0 ## 3 0 0 1 0 0 1 ## 4 0 0 0 0 0 0 ## 5 1 0 1 1 0 1 ## 6 1 1 1 1 1 1 #** estimate model fit in mirt ( fit1m <- mirt::M2( mod1m ) ) #***************************************************** # Model 2: DINO model #***************************************************** mod2 <- CDM::din( dat, q.matrix=Q, rule="DINO") summary(mod2) #***************************************************** # Model 3: log-linear model (LCDM): this model is the GDINA model with the # logit link function #***************************************************** mod3 <- CDM::gdina( dat, q.matrix=Q, link="logit") summary(mod3) #***************************************************** # Model 4: GDINA model with identity link function #***************************************************** mod4 <- CDM::gdina( dat, q.matrix=Q ) summary(mod4) #***************************************************** # Model 5: GDINA additive model identity link function #***************************************************** mod5 <- CDM::gdina( dat, q.matrix=Q, rule="ACDM") summary(mod5) #***************************************************** # Model 6: GDINA additive model logit link function #***************************************************** mod6 <- CDM::gdina( dat, q.matrix=Q, link="logit", rule="ACDM") summary(mod6) #-------- # Model 6m: GDINA additive model in mirt package # use data specifications from Model 1m) #** create mirt model mirtmodel <- mirt::mirt.model(" skill1=1,4,5,7 skill2=2,4,6,7 skill3=3,5,6,7 " ) #** mirt parameter table mod.pars <- mirt::mirt( dat, mirtmodel, pars="values") #** estimate model in mirt # Theta and lca_prior as defined as in Model 1m mod6m <- mirt::mirt(dat, mirtmodel, pars=mod.pars, verbose=TRUE, technical=list( customTheta=Theta, customPriorFun=lca_prior) ) mod6m@nest <- as.integer(sum(mod.pars$est) + nrow(Theta) - 1) # extract log-likelihood mod6m@logLik # compute AIC and BIC ( AIC <- -2*mod6m@logLik+2*mod6m@nest ) ( BIC <- -2*mod6m@logLik+log(mod6m@Data$N)*mod6m@nest ) #** skill distribution mod6m@Prior[[1]] #** extract item parameters cmod6m <- mirt.wrapper.coef(mod6m)$coef print(cmod6m,digits=4) ## item a1 a2 a3 d g u ## 1 D1 1.882 0.000 0.000 -0.9330 0 1 ## 2 D2 0.000 2.049 0.000 -1.0430 0 1 ## 3 D3 0.000 0.000 2.028 -0.9915 0 1 ## 4 D4 2.697 2.525 0.000 -2.9925 0 1 ## 5 D5 2.524 0.000 2.478 -2.7863 0 1 ## 6 D6 0.000 2.818 2.791 -3.1324 0 1 ## 7 D7 3.113 2.918 2.785 -4.2794 0 1 #***************************************************** # Model 7: Reduced RUM model #***************************************************** mod7 <- CDM::gdina( dat, q.matrix=Q, rule="RRUM") summary(mod7) #***************************************************** # Model 8: latent class model with 3 classes and 4 sets of starting values #***************************************************** #-- Model 8a: randomLCA package library(randomLCA) mod8a <- randomLCA::randomLCA( dat, nclass=3, verbose=TRUE, notrials=4) #-- Model8b: rasch.mirtlc function in sirt package library(sirt) mod8b <- sirt::rasch.mirtlc( dat, Nclasses=3, nstarts=4 ) summary(mod8a) summary(mod8b) ## End(Not run)
## Not run: data(data.dcm, package="CDM") dat <- data.dcm$data[,-1] Q <- data.dcm$q.matrix #***************************************************** # Model 1: DINA model #***************************************************** mod1 <- CDM::din( dat, q.matrix=Q ) summary(mod1) #-------- # Model 1m: estimate model in mirt package library(mirt) library(sirt) #** define theta grid of skills # use the function skillspace.hierarchy just for convenience hier <- "skill1 > skill2" skillspace <- CDM::skillspace.hierarchy( hier, skill.names=colnames(Q) ) Theta <- as.matrix(skillspace$skillspace.complete) #** create mirt model mirtmodel <- mirt::mirt.model(" skill1=1 skill2=2 skill3=3 (skill1*skill2)=4 (skill1*skill3)=5 (skill2*skill3)=6 (skill1*skill2*skill3)=7 " ) #** mirt parameter table mod.pars <- mirt::mirt( dat, mirtmodel, pars="values") # use starting values of .20 for guessing parameter ind <- which( mod.pars$name=="d" ) mod.pars[ind,"value"] <- stats::qlogis(.20) # guessing parameter on the logit metric # use starting values of .80 for anti-slipping parameter ind <- which( ( mod.pars$name %in% paste0("a",1:20 ) ) & (mod.pars$est) ) mod.pars[ind,"value"] <- stats::qlogis(.80) - stats::qlogis(.20) mod.pars #** prior for the skill space distribution I <- ncol(dat) lca_prior <- function(Theta,Etable){ TP <- nrow(Theta) if ( is.null(Etable) ){ prior <- rep( 1/TP, TP ) } if ( ! is.null(Etable) ){ prior <- ( rowSums(Etable[, seq(1,2*I,2)]) + rowSums(Etable[,seq(2,2*I,2)]) )/I } prior <- prior / sum(prior) return(prior) } #** estimate model in mirt mod1m <- mirt::mirt(dat, mirtmodel, pars=mod.pars, verbose=TRUE, technical=list( customTheta=Theta, customPriorFun=lca_prior) ) # The number of estimated parameters is incorrect because mirt does not correctly count # estimated parameters from the user customized prior distribution. mod1m@nest <- as.integer(sum(mod.pars$est) + nrow(Theta) - 1) # extract log-likelihood mod1m@logLik # compute AIC and BIC ( AIC <- -2*mod1m@logLik+2*mod1m@nest ) ( BIC <- -2*mod1m@logLik+log(mod1m@Data$N)*mod1m@nest ) #** extract item parameters cmod1m <- sirt::mirt.wrapper.coef(mod1m)$coef # compare estimated guessing and slipping parameters dfr <- data.frame( "din.guess"=mod1$guess$est, "mirt.guess"=plogis(cmod1m$d), "din.slip"=mod1$slip$est, "mirt.slip"=1-plogis( rowSums( cmod1m[, c("d", paste0("a",1:7) ) ] ) ) ) round(t(dfr),3) ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] ## din.guess 0.217 0.193 0.189 0.135 0.143 0.135 0.162 ## mirt.guess 0.226 0.189 0.184 0.132 0.142 0.132 0.158 ## din.slip 0.338 0.331 0.334 0.220 0.222 0.211 0.042 ## mirt.slip 0.339 0.333 0.336 0.223 0.225 0.214 0.044 # compare estimated skill class distribution dfr <- data.frame("din"=mod1$attribute.patt$class.prob, "mirt"=mod1m@Prior[[1]] ) round(t(dfr),3) ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] ## din 0.113 0.083 0.094 0.092 0.064 0.059 0.065 0.429 ## mirt 0.116 0.074 0.095 0.064 0.095 0.058 0.066 0.433 #** extract estimated classifications fsc1m <- sirt::mirt.wrapper.fscores( mod1m ) #- estimated reliabilities fsc1m$EAP.rel ## skill1 skill2 skill3 ## 0.5479942 0.5362595 0.5357961 #- estimated classfications: EAPs, MLEs and MAPs head( round(fsc1m$person,3) ) ## case M EAP.skill1 SE.EAP.skill1 EAP.skill2 SE.EAP.skill2 EAP.skill3 SE.EAP.skill3 ## 1 1 0.286 0.508 0.500 0.067 0.251 0.820 0.384 ## 2 2 0.000 0.162 0.369 0.191 0.393 0.190 0.392 ## 3 3 0.286 0.200 0.400 0.211 0.408 0.607 0.489 ## 4 4 0.000 0.162 0.369 0.191 0.393 0.190 0.392 ## 5 5 0.571 0.802 0.398 0.267 0.443 0.928 0.258 ## 6 6 0.857 0.998 0.045 1.000 0.019 1.000 0.020 ## MLE.skill1 MLE.skill2 MLE.skill3 MAP.skill1 MAP.skill2 MAP.skill3 ## 1 1 0 1 1 0 1 ## 2 0 0 0 0 0 0 ## 3 0 0 1 0 0 1 ## 4 0 0 0 0 0 0 ## 5 1 0 1 1 0 1 ## 6 1 1 1 1 1 1 #** estimate model fit in mirt ( fit1m <- mirt::M2( mod1m ) ) #***************************************************** # Model 2: DINO model #***************************************************** mod2 <- CDM::din( dat, q.matrix=Q, rule="DINO") summary(mod2) #***************************************************** # Model 3: log-linear model (LCDM): this model is the GDINA model with the # logit link function #***************************************************** mod3 <- CDM::gdina( dat, q.matrix=Q, link="logit") summary(mod3) #***************************************************** # Model 4: GDINA model with identity link function #***************************************************** mod4 <- CDM::gdina( dat, q.matrix=Q ) summary(mod4) #***************************************************** # Model 5: GDINA additive model identity link function #***************************************************** mod5 <- CDM::gdina( dat, q.matrix=Q, rule="ACDM") summary(mod5) #***************************************************** # Model 6: GDINA additive model logit link function #***************************************************** mod6 <- CDM::gdina( dat, q.matrix=Q, link="logit", rule="ACDM") summary(mod6) #-------- # Model 6m: GDINA additive model in mirt package # use data specifications from Model 1m) #** create mirt model mirtmodel <- mirt::mirt.model(" skill1=1,4,5,7 skill2=2,4,6,7 skill3=3,5,6,7 " ) #** mirt parameter table mod.pars <- mirt::mirt( dat, mirtmodel, pars="values") #** estimate model in mirt # Theta and lca_prior as defined as in Model 1m mod6m <- mirt::mirt(dat, mirtmodel, pars=mod.pars, verbose=TRUE, technical=list( customTheta=Theta, customPriorFun=lca_prior) ) mod6m@nest <- as.integer(sum(mod.pars$est) + nrow(Theta) - 1) # extract log-likelihood mod6m@logLik # compute AIC and BIC ( AIC <- -2*mod6m@logLik+2*mod6m@nest ) ( BIC <- -2*mod6m@logLik+log(mod6m@Data$N)*mod6m@nest ) #** skill distribution mod6m@Prior[[1]] #** extract item parameters cmod6m <- mirt.wrapper.coef(mod6m)$coef print(cmod6m,digits=4) ## item a1 a2 a3 d g u ## 1 D1 1.882 0.000 0.000 -0.9330 0 1 ## 2 D2 0.000 2.049 0.000 -1.0430 0 1 ## 3 D3 0.000 0.000 2.028 -0.9915 0 1 ## 4 D4 2.697 2.525 0.000 -2.9925 0 1 ## 5 D5 2.524 0.000 2.478 -2.7863 0 1 ## 6 D6 0.000 2.818 2.791 -3.1324 0 1 ## 7 D7 3.113 2.918 2.785 -4.2794 0 1 #***************************************************** # Model 7: Reduced RUM model #***************************************************** mod7 <- CDM::gdina( dat, q.matrix=Q, rule="RRUM") summary(mod7) #***************************************************** # Model 8: latent class model with 3 classes and 4 sets of starting values #***************************************************** #-- Model 8a: randomLCA package library(randomLCA) mod8a <- randomLCA::randomLCA( dat, nclass=3, verbose=TRUE, notrials=4) #-- Model8b: rasch.mirtlc function in sirt package library(sirt) mod8b <- sirt::rasch.mirtlc( dat, Nclasses=3, nstarts=4 ) summary(mod8a) summary(mod8b) ## End(Not run)
This is a simulated dataset of the DTMR fraction data described in Bradshaw, Izsak, Templin and Jacobson (2014).
data(data.dtmr)
data(data.dtmr)
The format is:
List of 5
$ data : num [1:5000, 1:27] 0 0 0 0 0 1 0 0 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:27] "M1" "M2" "M3" "M4" ...
$ q.matrix :'data.frame': 27 obs. of 4 variables:
..$ RU : int [1:27] 1 0 0 1 1 0 1 0 0 0 ...
..$ PI : int [1:27] 0 0 1 0 0 1 0 0 0 0 ...
..$ APP: int [1:27] 0 1 0 0 0 0 0 1 1 1 ...
..$ MC : int [1:27] 0 0 0 0 0 0 0 0 0 0 ...
$ skill.distribution:'data.frame': 16 obs. of 5 variables:
..$ RU : int [1:16] 0 0 0 0 0 0 0 0 1 1 ...
..$ PI : int [1:16] 0 0 0 0 1 1 1 1 0 0 ...
..$ APP : int [1:16] 0 0 1 1 0 0 1 1 0 0 ...
..$ MC : int [1:16] 0 1 0 1 0 1 0 1 0 1 ...
..$ freq: int [1:16] 1064 350 280 406 196 126 238 770 14 28 ...
$ itempars :'data.frame': 27 obs. of 7 variables:
..$ item : chr [1:27] "M1" "M2" "M3" "M4" ...
..$ lam0 : num [1:27] -1.12 0.59 -2.07 -1.19 -1.67 -3.81 -0.73 -0.62 -0.09 0.28 ...
..$ RU : num [1:27] 2.24 0 0 0.65 1.52 0 1.2 0 0 0 ...
..$ PI : num [1:27] 0 0 1.7 0 0 2.08 0 0 0 0 ...
..$ APP : num [1:27] 0 1.27 0 0 0 0 0 4.25 2.16 0.87 ...
..$ MC : num [1:27] 0 0 0 0 0 0 0 0 0 0 ...
..$ RU.PI: num [1:27] 0 0 0 0 0 0 0 0 0 0 ...
$ sim_data :function (N, skill.distribution, itempars)
..- attr(*, "srcref")='srcref' int [1:8] 1 13 20 1 13 1 1 20
.. ..- attr(*, "srcfile")=Classes 'srcfilecopy', 'srcfile' <environment: 0x00000000298a8ed0>
The attribute definition are as follows
RU
: Referent units
PI
: Partitioning and iterating attribute
APP
: Appropriateness attribute
MC
: Multiplicative Comparison attribute
Simulated dataset according to Bradshaw et al. (2014).
Bradshaw, L., Izsak, A., Templin, J., & Jacobson, E. (2014). Diagnosing teachers' understandings of rational numbers: Building a multidimensional test within the diagnostic classification framework. Educational Measurement: Issues and Practice, 33, 2-14.
## Not run: ############################################################################# # EXAMPLE 1: Model comparisons data.dtmr ############################################################################# data(data.dtmr, package="CDM") data <- data.dtmr$data q.matrix <- data.dtmr$q.matrix I <- ncol(data) #*** Model 1: LCDM # define item wise rules rule <- rep( "ACDM", I ) names(rule) <- colnames(data) rule[ c("M14","M17") ] <- "GDINA2" # estimate model mod1 <- CDM::gdina( data, q.matrix, linkfct="logit", rule=rule) summary(mod1) #*** Model 2: DINA model mod2 <- CDM::gdina( data, q.matrix, rule="DINA" ) summary(mod2) #*** Model 3: RRUM model mod3 <- CDM::gdina( data, q.matrix, rule="RRUM" ) summary(mod3) #--- model comparisons # LCDM vs. DINA anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -76570.89 153141.8 69 153279.8 153729.5 1726.645 10 0 ## 1 Model 1 -75707.57 151415.1 79 151573.1 152088.0 NA NA NA # LCDM vs. RRUM anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -75746.13 151492.3 77 151646.3 152148.1 77.10994 2 0 ## 1 Model 1 -75707.57 151415.1 79 151573.1 152088.0 NA NA NA #--- model fit summary( CDM::modelfit.cor.din( mod1 ) ) ## Test of Global Model Fit ## type value p ## 1 max(X2) 7.74382 1.00000 ## 2 abs(fcor) 0.04056 0.72707 ## ## Fit Statistics ## est ## MADcor 0.00959 ## SRMSR 0.01217 ## MX2 0.75696 ## 100*MADRESIDCOV 0.20283 ## MADQ3 0.02220 ############################################################################# # EXAMPLE 2: Simulating data of structure data.dtmr ############################################################################# data(data.dtmr, package="CDM") # draw sample of N=200 set.seed(87) data.dtmr$sim_data(N=200, skill.distribution=data.dtmr$skill.distribution, itempars=data.dtmr$itempars) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Model comparisons data.dtmr ############################################################################# data(data.dtmr, package="CDM") data <- data.dtmr$data q.matrix <- data.dtmr$q.matrix I <- ncol(data) #*** Model 1: LCDM # define item wise rules rule <- rep( "ACDM", I ) names(rule) <- colnames(data) rule[ c("M14","M17") ] <- "GDINA2" # estimate model mod1 <- CDM::gdina( data, q.matrix, linkfct="logit", rule=rule) summary(mod1) #*** Model 2: DINA model mod2 <- CDM::gdina( data, q.matrix, rule="DINA" ) summary(mod2) #*** Model 3: RRUM model mod3 <- CDM::gdina( data, q.matrix, rule="RRUM" ) summary(mod3) #--- model comparisons # LCDM vs. DINA anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -76570.89 153141.8 69 153279.8 153729.5 1726.645 10 0 ## 1 Model 1 -75707.57 151415.1 79 151573.1 152088.0 NA NA NA # LCDM vs. RRUM anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -75746.13 151492.3 77 151646.3 152148.1 77.10994 2 0 ## 1 Model 1 -75707.57 151415.1 79 151573.1 152088.0 NA NA NA #--- model fit summary( CDM::modelfit.cor.din( mod1 ) ) ## Test of Global Model Fit ## type value p ## 1 max(X2) 7.74382 1.00000 ## 2 abs(fcor) 0.04056 0.72707 ## ## Fit Statistics ## est ## MADcor 0.00959 ## SRMSR 0.01217 ## MX2 0.75696 ## 100*MADRESIDCOV 0.20283 ## MADQ3 0.02220 ############################################################################# # EXAMPLE 2: Simulating data of structure data.dtmr ############################################################################# data(data.dtmr, package="CDM") # draw sample of N=200 set.seed(87) data.dtmr$sim_data(N=200, skill.distribution=data.dtmr$skill.distribution, itempars=data.dtmr$itempars) ## End(Not run)
ECPE dataset from the Templin and Hoffman (2013) tutorial of specifying cognitive diagnostic models in Mplus.
data(data.ecpe)
data(data.ecpe)
The format of the data is a list containing the dichotomous item
response data data
(2922 persons at 28 items)
and the Q-matrix q.matrix
(28 items and 3 skills):
List of 2
$ data :'data.frame':
..$ id : int [1:2922] 1 2 3 4 5 6 7 8 9 10 ...
..$ E1 : int [1:2922] 1 1 1 1 1 1 1 0 1 1 ...
..$ E2 : int [1:2922] 1 1 1 1 1 1 1 1 1 1 ...
..$ E3 : int [1:2922] 1 1 1 1 1 1 1 1 1 1 ...
..$ E4 : int [1:2922] 0 1 1 1 1 1 1 1 1 1 ...
[...]
..$ E27: int [1:2922] 1 1 1 1 1 1 1 0 1 1 ...
..$ E28: int [1:2922] 1 1 1 1 1 1 1 1 1 1 ...
$ q.matrix:'data.frame':
..$ skill1: int [1:28] 1 0 1 0 0 0 1 0 0 1 ...
..$ skill2: int [1:28] 1 1 0 0 0 0 0 1 0 0 ...
..$ skill3: int [1:28] 0 0 1 1 1 1 1 0 1 0 ...
The skills are
skill1
: Morphosyntactic rules
skill2
: Cohesive rules
skill3
: Lexical rules.
The dataset has been used in Templin and Hoffman (2013), and Templin and Bradshaw (2014).
The dataset was downloaded from http://psych.unl.edu/jtemplin/teaching/dcm/dcm12ncme/.
Templin, J., & Bradshaw, L. (2014). Hierarchical diagnostic classification models: A family of models for estimating and testing attribute hierarchies. Psychometrika, 79, 317-339.
Templin, J., & Hoffman, L. (2013). Obtaining diagnostic classification model estimates using Mplus. Educational Measurement: Issues and Practice, 32, 37-50.
## Not run: data(data.ecpe, package="CDM") dat <- data.ecpe$data[,-1] Q <- data.ecpe$q.matrix #*** Model 1: LCDM model mod1 <- CDM::gdina( dat, q.matrix=Q, link="logit") summary(mod1) #*** Model 2: DINA model mod2 <- CDM::gdina( dat, q.matrix=Q, rule="DINA") summary(mod2) # Model comparison using likelihood ratio test anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -42841.61 85683.23 63 85809.23 86185.97 206.0359 18 0 ## 1 Model 1 -42738.60 85477.19 81 85639.19 86123.57 NA NA NA #*** Model 3: Hierarchical LCDM (HLCDM) | Templin and Bradshaw (2014) # Testing a linear hierarchy hier <- "skill3 > skill2 > skill1" skill.names <- colnames(Q) # define skill space with hierarchy skillspace <- CDM::skillspace.hierarchy( hier, skill.names=skill.names ) skillspace$skillspace.reduced ## skill1 skill2 skill3 ## A000 0 0 0 ## A001 0 0 1 ## A011 0 1 1 ## A111 1 1 1 zeroprob.skillclasses <- skillspace$zeroprob.skillclasses # define user-defined parameters in LCDM: hierarchical LCDM (HLCDM) Mj.user <- mod1$Mj # select items with require two attributes items <- which( rowSums(Q) > 1 ) # modify design matrix for item parameters for (ii in items){ m1 <- Mj.user[[ii]] Mj.user[[ii]][[1]] <- (m1[[1]])[,-2] Mj.user[[ii]][[2]] <- (m1[[2]])[-2] } # estimate model # note that avoid.zeroprobs is set to TRUE to avoid algorithmic instabilities mod3 <- CDM::gdina( dat, q.matrix=Q, link="logit", zeroprob.skillclasses=zeroprob.skillclasses, Mj=Mj.user, avoid.zeroprobs=TRUE ) summary(mod3) #***************************************** #** estimate further models #*** Model 4: RRUM model mod4 <- CDM::gdina( dat, q.matrix=Q, rule="RRUM") summary(mod4) # compare some models IRT.compareModels(mod1, mod2, mod3, mod4 ) #*** Model 5a: GDINA model with identity link mod5a <- CDM::gdina( dat, q.matrix=Q, link="identity") summary(mod5a) #*** Model 5b: GDINA model with logit link mod5b <- CDM::gdina( dat, q.matrix=Q, link="logit") summary(mod5b) #*** Model 5c: GDINA model with log link mod5c <- CDM::gdina( dat, q.matrix=Q, link="log") summary(mod5c) # compare models IRT.compareModels(mod5a, mod5b, mod5c) ## End(Not run)
## Not run: data(data.ecpe, package="CDM") dat <- data.ecpe$data[,-1] Q <- data.ecpe$q.matrix #*** Model 1: LCDM model mod1 <- CDM::gdina( dat, q.matrix=Q, link="logit") summary(mod1) #*** Model 2: DINA model mod2 <- CDM::gdina( dat, q.matrix=Q, rule="DINA") summary(mod2) # Model comparison using likelihood ratio test anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -42841.61 85683.23 63 85809.23 86185.97 206.0359 18 0 ## 1 Model 1 -42738.60 85477.19 81 85639.19 86123.57 NA NA NA #*** Model 3: Hierarchical LCDM (HLCDM) | Templin and Bradshaw (2014) # Testing a linear hierarchy hier <- "skill3 > skill2 > skill1" skill.names <- colnames(Q) # define skill space with hierarchy skillspace <- CDM::skillspace.hierarchy( hier, skill.names=skill.names ) skillspace$skillspace.reduced ## skill1 skill2 skill3 ## A000 0 0 0 ## A001 0 0 1 ## A011 0 1 1 ## A111 1 1 1 zeroprob.skillclasses <- skillspace$zeroprob.skillclasses # define user-defined parameters in LCDM: hierarchical LCDM (HLCDM) Mj.user <- mod1$Mj # select items with require two attributes items <- which( rowSums(Q) > 1 ) # modify design matrix for item parameters for (ii in items){ m1 <- Mj.user[[ii]] Mj.user[[ii]][[1]] <- (m1[[1]])[,-2] Mj.user[[ii]][[2]] <- (m1[[2]])[-2] } # estimate model # note that avoid.zeroprobs is set to TRUE to avoid algorithmic instabilities mod3 <- CDM::gdina( dat, q.matrix=Q, link="logit", zeroprob.skillclasses=zeroprob.skillclasses, Mj=Mj.user, avoid.zeroprobs=TRUE ) summary(mod3) #***************************************** #** estimate further models #*** Model 4: RRUM model mod4 <- CDM::gdina( dat, q.matrix=Q, rule="RRUM") summary(mod4) # compare some models IRT.compareModels(mod1, mod2, mod3, mod4 ) #*** Model 5a: GDINA model with identity link mod5a <- CDM::gdina( dat, q.matrix=Q, link="identity") summary(mod5a) #*** Model 5b: GDINA model with logit link mod5b <- CDM::gdina( dat, q.matrix=Q, link="logit") summary(mod5b) #*** Model 5c: GDINA model with log link mod5c <- CDM::gdina( dat, q.matrix=Q, link="log") summary(mod5c) # compare models IRT.compareModels(mod5a, mod5b, mod5c) ## End(Not run)
Contains different sub-datasets of the fraction subtraction data of Tatsuoka with different Q-matrix specifications.
data(data.fraction1) data(data.fraction2) data(data.fraction3) data(data.fraction4) data(data.fraction5)
data(data.fraction1) data(data.fraction2) data(data.fraction3) data(data.fraction4) data(data.fraction5)
The dataset data.fraction1
is the fraction subtraction data set with
536 students and 15 items. The Q-matrix was defined in de la Torre (2009).
This dataset is a list with the dataset (data
) and
the Q-matrix as entries.
The format is:
List of 2
$ data :'data.frame':
..$ T01: int [1:536] 0 1 1 1 0 0 0 0 0 0 ...
..$ T02: int [1:536] 1 1 1 1 1 0 0 1 0 0 ...
..$ T03: int [1:536] 0 1 1 1 1 1 0 0 0 0 ...
..$ T04: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ T05: int [1:536] 0 1 0 0 0 1 1 0 1 1 ...
..$ T06: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ T07: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ T08: int [1:536] 1 1 0 1 1 0 0 0 1 1 ...
..$ T09: int [1:536] 1 1 1 1 0 1 0 0 1 0 ...
..$ T10: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ T11: int [1:536] 1 1 1 1 0 0 0 0 0 0 ...
..$ T12: int [1:536] 0 1 0 0 0 0 0 0 0 0 ...
..$ T13: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ T14: int [1:536] 1 1 0 0 0 0 0 0 0 0 ...
..$ T15: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
$ q.matrix: int [1:15, 1:5] 1 1 1 1 0 1 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:15] "T01" "T02" "T03" "T04" ...
.. ..$ : chr [1:5] "QT1" "QT2" "QT3" "QT4" ...
The dataset data.fraction2
is the fraction subtraction data set
with 536 students and 11 items. For this data set, several matrices are
available. The data is a list. The first entry
data
contains the data frame. The entry q.matrix1
contains
the Q-matrix of Henson, Templin and Willse (2009).
The third entry q.matrix2
is an alternative
Q-matrix of de la Torre (2009). The fourth entry is a
modified Q-matrix of q.matrix1
.
The format is:
$ data :'data.frame':
..$ H01: int [1:536] 1 1 1 1 1 0 0 1 0 0 ...
..$ H02: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ H03: int [1:536] 0 1 0 0 0 1 1 0 1 1 ...
..$ H04: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ H05: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ H06: int [1:536] 1 1 0 1 1 0 0 0 1 1 ...
..$ H08: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ H09: int [1:536] 1 1 1 1 0 0 0 0 0 0 ...
..$ H10: int [1:536] 0 1 0 0 0 0 0 0 0 0 ...
..$ H11: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ H13: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
$ q.matrix1: int [1:11, 1:3] 1 1 1 1 1 1 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:11] "H01" "H02" "H03" "H04" ...
.. ..$ : chr [1:3] "QH1" "QH2" "QH3"
$ q.matrix2: int [1:11, 1:5] 1 1 0 1 1 1 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:11] "H01" "H02" "H03" "H04" ...
.. ..$ : chr [1:5] "QT1" "QT2" "QT3" "QT4" ...
$ q.matrix3: num [1:11, 1:3] 0 0 0 1 0 0 0 0 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:11] "H01" "H02" "H03" "H04" ...
.. ..$ : chr [1:3] "Dim1" "Dim2" "Dim3"
The dataset data.fraction3
contains 12 items and was
used in de la Torre (2011).
List of 2
$ data :'data.frame': 536 obs. of 12 variables:
..$ B01: int [1:536] 0 1 1 1 0 0 0 0 0 0 ...
..$ B02: int [1:536] 1 1 1 1 1 0 0 1 0 0 ...
..$ B03: int [1:536] 0 1 1 1 1 1 0 0 0 0 ...
..$ B04: int [1:536] 0 1 0 0 0 1 1 0 1 1 ...
..$ B05: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ B06: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ B07: int [1:536] 1 1 0 1 1 0 0 0 1 1 ...
..$ B08: int [1:536] 1 1 1 1 0 1 0 0 1 0 ...
..$ B09: int [1:536] 1 1 1 1 0 0 0 0 0 0 ...
..$ B10: int [1:536] 0 1 0 0 0 0 0 0 0 0 ...
..$ B11: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ B12: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
$ q.matrix:'data.frame': 12 obs. of 5 variables:
..$ item: Factor w/ 13 levels "","B01","B02",..: 2 3 4 5 6 7 8 9 10 11 ...
..$ QA1 : int [1:12] 1 1 1 1 1 1 1 1 1 1 ...
..$ QA2 : int [1:12] 0 1 0 0 1 1 1 0 0 0 ...
..$ QA3 : int [1:12] 0 1 0 1 1 1 0 1 1 1 ...
..$ QA4 : int [1:12] 0 1 0 0 1 1 0 0 0 1 ...
The dataset data.fraction4
contains 17 items and was
used in de la Torre and Douglas (2004) and Chen, Liu, Xu and Ying (2015).
List of 2
$ data :'data.frame': 536 obs. of 17 variables:
..$ A01: int [1:536] 0 0 0 1 0 0 0 0 0 0 ...
..$ A02: int [1:536] 0 1 1 1 0 0 0 0 0 0 ...
..$ A03: int [1:536] 0 1 1 1 0 0 0 0 0 0 ...
..$ A04: int [1:536] 1 1 1 1 1 0 0 1 0 0 ...
..$ A05: int [1:536] 1 1 0 1 1 0 0 0 1 1 ...
..$ A06: int [1:536] 1 1 1 1 0 1 0 0 1 0 ...
..$ A07: int [1:536] 1 1 1 1 0 0 0 0 0 0 ...
..$ A08: int [1:536] 0 0 0 1 0 0 0 0 0 1 ...
..$ A09: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ A10: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ A11: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ A12: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ A13: int [1:536] 0 1 0 0 0 0 0 0 0 0 ...
..$ A14: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ A15: int [1:536] 1 1 0 0 0 0 0 0 0 0 ...
..$ A16: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ A17: int [1:536] 0 1 0 0 0 0 0 0 0 0 ...
$ q.matrix:'data.frame': 17 obs. of 9 variables:
..$ item: Factor w/ 18 levels "","A01","A02",..: 2 3 4 5 6 7 8 9 10 11 ...
..$ QA1 : int [1:17] 0 0 0 0 0 0 0 0 1 0 ...
..$ QA2 : int [1:17] 0 0 0 1 0 1 1 1 1 1 ...
..$ QA3 : int [1:17] 0 0 0 1 0 0 0 0 0 0 ...
..$ QA4 : int [1:17] 1 1 1 0 0 0 0 1 0 0 ...
..$ QA5 : int [1:17] 0 0 0 1 0 0 1 0 0 1 ...
..$ QA6 : int [1:17] 1 0 0 0 0 0 1 0 0 0 ...
..$ QA7 : int [1:17] 1 1 1 1 1 1 1 1 1 1 ...
..$ QA8 : int [1:17] 0 0 0 0 1 0 0 1 0 0 ...
The dataset data.fraction5
contains 15 items and was
used as an example for the multiple strategy DINA model in
de la Torre and Douglas (2008) and Hou and de la Torre (2014).
The two Q-matrices for coding the multiple strategies are contained
in one matrix q.matrix
by joining the columns of both matrices.
List of 2
$ data :'data.frame': 536 obs. of 15 variables:
..$ T01: int [1:536] 0 1 1 1 0 0 0 0 0 0 ...
..$ T02: int [1:536] 1 1 1 1 1 0 0 1 0 0 ...
..$ T03: int [1:536] 0 1 1 1 1 1 0 0 0 0 ...
..$ T04: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ T05: int [1:536] 0 1 0 0 0 1 1 0 1 1 ...
..$ T06: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ T07: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ T08: int [1:536] 1 1 0 1 1 0 0 0 1 1 ...
..$ T09: int [1:536] 1 1 1 1 0 1 0 0 1 0 ...
..$ T10: int [1:536] 1 1 1 0 0 0 0 0 0 0 ...
..$ T11: int [1:536] 1 1 1 1 0 0 0 0 0 0 ...
..$ T12: int [1:536] 0 1 0 0 0 0 0 0 0 0 ...
..$ T13: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
..$ T14: int [1:536] 1 1 0 0 0 0 0 0 0 0 ...
..$ T15: int [1:536] 1 1 0 1 0 0 0 0 0 0 ...
$ q.matrix:'data.frame': 15 obs. of 15 variables:
..$ item: Factor w/ 16 levels "","T01","T02",..: 2 3 4 5 6 7 8 9 10 11 ...
..$ SA1 : int [1:15] 0 1 1 1 0 1 1 1 1 1 ...
..$ SA2 : int [1:15] 0 1 0 1 0 1 1 1 0 0 ...
..$ SA3 : int [1:15] 0 1 0 1 1 1 1 0 1 1 ...
..$ SA4 : int [1:15] 0 1 0 1 0 1 1 0 0 1 ...
..$ SA5 : int [1:15] 0 0 0 1 0 0 0 0 0 1 ...
..$ SA6 : int [1:15] 0 0 0 0 0 0 0 0 0 0 ...
..$ SA7 : int [1:15] 0 0 0 0 0 0 0 0 0 0 ...
..$ SB1 : int [1:15] 0 1 1 1 0 1 1 1 1 1 ...
..$ SB2 : int [1:15] 0 0 0 0 1 1 1 1 0 1 ...
..$ SB3 : int [1:15] 0 0 0 0 0 0 0 0 0 0 ...
..$ SB4 : int [1:15] 0 0 0 0 0 0 0 0 0 0 ...
..$ SB5 : int [1:15] 0 0 0 1 1 0 0 0 0 1 ...
..$ SB6 : int [1:15] 0 1 0 1 1 1 1 0 1 0 ...
..$ SB7 : int [1:15] 0 0 0 0 1 0 0 0 0 0 ...
See fraction.subtraction.data
for more information
about the data source.
Chen, Y., Liu, J., Xu, G. and Ying, Z. (2015). Statistical analysis of Q-matrix based diagnostic classification models. Journal of the American Statistical Association, 110(510), 850-866.
de la Torre, J. (2009). DINA model parameter estimation: A didactic. Journal of Educational and Behavioral Statistics, 34, 115-130.
de la Torre, J. (2011). The generalized DINA model framework. Psychometrika, 76, 179-199.
de la Torre, J., & Douglas, J. A. (2004). Higher-order latent trait models for cognitive diagnosis. Psychometrika, 69, 333-353.
de la Torre, J., & Douglas, J. A. (2008). Model evaluation and multiple strategies in cognitive diagnosis: An analysis of fraction subtraction data. Psychometrika, 73, 595-624.
Henson, R. A., Templin, J. T., & Willse, J. T. (2009). Defining a family of cognitive diagnosis models using log-linear models with latent variables. Psychometrika, 74, 191-210.
Huo, Y., & de la Torre, J. (2014). Estimating a cognitive diagnostic model for multiple strategies via the EM algorithm. Applied Psychological Measurement, 38, 464-485.
data.hr
(Ravand et al., 2013)
Dataset data.hr
used for illustrating some functionalities
of the CDM package (Ravand, Barati, & Widhiarso, 2013).
data(data.hr)
data(data.hr)
The format of the dataset is:
List of 2
$ data : num [1:1550, 1:35] 1 0 1 1 1 0 1 1 1 0 ...
$ q.matrix:'data.frame':
..$ Skill1: int [1:35] 0 0 0 0 0 0 1 0 0 0 ...
..$ Skill2: int [1:35] 0 0 0 0 1 0 0 0 0 0 ...
..$ Skill3: int [1:35] 0 1 1 1 1 0 0 1 0 0 ...
..$ Skill4: int [1:35] 1 0 0 0 0 0 0 0 1 1 ...
..$ Skill5: int [1:35] 0 0 0 0 0 1 0 0 1 1 ...
Simulated data according to Ravand et al. (2013).
Ravand, H., Barati, H., & Widhiarso, W. (2013). Exploring diagnostic capacity of a high stakes reading comprehension test: A pedagogical demonstration. Iranian Journal of Language Testing, 3(1), 1-27.
## Not run: data(data.hr, package="CDM") dat <- data.hr$data Q <- data.hr$q.matrix #************* # Model 1: DINA model mod1 <- CDM::din( dat, q.matrix=Q ) summary(mod1) # summary # plot results plot(mod1) # inspect coefficients coef(mod1) # posterior distribution posterior <- mod1$posterior round( posterior[ 1:5, ], 4 ) # first 5 entries # estimate class probabilities mod1$attribute.patt # individual classifications mod1$pattern[1:5,] # first 5 entries #************* # Model 2: GDINA model mod2 <- CDM::gdina( dat, q.matrix=Q) summary(mod2) #************* # Model 3: Reduced RUM model mod3 <- CDM::gdina( dat, q.matrix=Q, rule="RRUM" ) summary(mod3) #-------- # model comparisons # DINA vs GDINA anova( mod1, mod2 ) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -31391.27 62782.54 101 62984.54 63524.49 195.9099 20 0 ## 2 Model 2 -31293.32 62586.63 121 62828.63 63475.50 NA NA NA # RRUM vs. GDINA anova( mod2, mod3 ) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -31356.22 62712.43 105 62922.43 63483.76 125.7924 16 0 ## 1 Model 1 -31293.32 62586.64 121 62828.64 63475.50 NA NA NA # DINA vs. RRUM anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -31391.27 62782.54 101 62984.54 63524.49 70.11246 4 0 ## 2 Model 2 -31356.22 62712.43 105 62922.43 63483.76 NA NA NA #------- # model fit # DINA fmod1 <- CDM::modelfit.cor.din( mod1, jkunits=0) summary(fmod1) ## Test of Global Model Fit ## type value p ## 1 max(X2) 16.35495 0.03125 ## 2 abs(fcor) 0.10341 0.01416 ## ## Fit Statistics ## est ## MADcor 0.01911 ## SRMSR 0.02445 ## MX2 0.93157 ## 100*MADRESIDCOV 0.39100 ## MADQ3 0.02373 # GDINA fmod2 <- CDM::modelfit.cor.din( mod2, jkunits=0) summary(fmod2) ## Test of Global Model Fit ## type value p ## 1 max(X2) 7.73670 1 ## 2 abs(fcor) 0.07215 1 ## ## Fit Statistics ## est ## MADcor 0.01830 ## SRMSR 0.02300 ## MX2 0.82584 ## 100*MADRESIDCOV 0.37390 ## MADQ3 0.02383 # RRUM fmod3 <- CDM::modelfit.cor.din( mod3, jkunits=0) summary(fmod3) ## Test of Global Model Fit ## type value p ## 1 max(X2) 15.49369 0.04925 ## 2 abs(fcor) 0.10076 0.02201 ## ## Fit Statistics ## est ## MADcor 0.01868 ## SRMSR 0.02374 ## MX2 0.87999 ## 100*MADRESIDCOV 0.38409 ## MADQ3 0.02416 ## End(Not run)
## Not run: data(data.hr, package="CDM") dat <- data.hr$data Q <- data.hr$q.matrix #************* # Model 1: DINA model mod1 <- CDM::din( dat, q.matrix=Q ) summary(mod1) # summary # plot results plot(mod1) # inspect coefficients coef(mod1) # posterior distribution posterior <- mod1$posterior round( posterior[ 1:5, ], 4 ) # first 5 entries # estimate class probabilities mod1$attribute.patt # individual classifications mod1$pattern[1:5,] # first 5 entries #************* # Model 2: GDINA model mod2 <- CDM::gdina( dat, q.matrix=Q) summary(mod2) #************* # Model 3: Reduced RUM model mod3 <- CDM::gdina( dat, q.matrix=Q, rule="RRUM" ) summary(mod3) #-------- # model comparisons # DINA vs GDINA anova( mod1, mod2 ) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -31391.27 62782.54 101 62984.54 63524.49 195.9099 20 0 ## 2 Model 2 -31293.32 62586.63 121 62828.63 63475.50 NA NA NA # RRUM vs. GDINA anova( mod2, mod3 ) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -31356.22 62712.43 105 62922.43 63483.76 125.7924 16 0 ## 1 Model 1 -31293.32 62586.64 121 62828.64 63475.50 NA NA NA # DINA vs. RRUM anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -31391.27 62782.54 101 62984.54 63524.49 70.11246 4 0 ## 2 Model 2 -31356.22 62712.43 105 62922.43 63483.76 NA NA NA #------- # model fit # DINA fmod1 <- CDM::modelfit.cor.din( mod1, jkunits=0) summary(fmod1) ## Test of Global Model Fit ## type value p ## 1 max(X2) 16.35495 0.03125 ## 2 abs(fcor) 0.10341 0.01416 ## ## Fit Statistics ## est ## MADcor 0.01911 ## SRMSR 0.02445 ## MX2 0.93157 ## 100*MADRESIDCOV 0.39100 ## MADQ3 0.02373 # GDINA fmod2 <- CDM::modelfit.cor.din( mod2, jkunits=0) summary(fmod2) ## Test of Global Model Fit ## type value p ## 1 max(X2) 7.73670 1 ## 2 abs(fcor) 0.07215 1 ## ## Fit Statistics ## est ## MADcor 0.01830 ## SRMSR 0.02300 ## MX2 0.82584 ## 100*MADRESIDCOV 0.37390 ## MADQ3 0.02383 # RRUM fmod3 <- CDM::modelfit.cor.din( mod3, jkunits=0) summary(fmod3) ## Test of Global Model Fit ## type value p ## 1 max(X2) 15.49369 0.04925 ## 2 abs(fcor) 0.10076 0.02201 ## ## Fit Statistics ## est ## MADcor 0.01868 ## SRMSR 0.02374 ## MX2 0.87999 ## 100*MADRESIDCOV 0.38409 ## MADQ3 0.02416 ## End(Not run)
Simulated dataset according to the Jang (2005) L2 reading comprehension study.
data(data.jang)
data(data.jang)
The format is:
List of 2
$ data : num [1:1500, 1:37] 1 1 1 1 1 1 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:37] "I1" "I2" "I3" "I4" ...
$ q.matrix:'data.frame':
..$ CDV: int [1:37] 1 0 0 1 0 0 0 0 0 0 ...
..$ CIV: int [1:37] 0 0 1 0 0 0 1 0 1 1 ...
..$ SSL: int [1:37] 1 1 1 1 0 0 0 0 0 0 ...
..$ TEI: int [1:37] 0 0 0 0 0 0 0 1 0 0 ...
..$ TIM: int [1:37] 0 0 0 1 1 1 0 0 0 0 ...
..$ INF: int [1:37] 0 1 0 0 0 0 1 0 0 0 ...
..$ NEG: int [1:37] 0 0 0 0 1 0 1 0 0 0 ...
..$ SUM: int [1:37] 0 0 0 0 1 0 0 0 0 0 ...
..$ MCF: int [1:37] 0 0 0 0 0 0 0 0 0 0 ...
Simulated dataset.
Jang, E. E. (2009). Cognitive diagnostic assessment of L2 reading comprehension ability: Validity arguments for Fusion Model application to LanguEdge assessment. Language Testing, 26, 31-73.
## Not run: data(data.jang, package="CDM") data <- data.jang$data q.matrix <- data.jang$q.matrix #*** Model 1: Reduced RUM model mod1 <- CDM::gdina( data, q.matrix, rule="RRUM", conv.crit=.001, increment.factor=1.025 ) summary(mod1) #*** Model 2: Additive model (identity link) mod2 <- CDM::gdina( data, q.matrix, rule="ACDM", conv.crit=.001, linkfct="identity" ) summary(mod2) #*** Model 3: DINA model mod3 <- CDM::gdina( data, q.matrix, rule="DINA", conv.crit=.001 ) summary(mod3) anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -30315.03 60630.06 153 60936.06 61748.98 88.29627 0 0 ## 2 Model 2 -30270.88 60541.76 153 60847.76 61660.68 NA NA NA anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -30373.99 60747.97 129 61005.97 61691.38 117.9128 24 0 ## 1 Model 1 -30315.03 60630.06 153 60936.06 61748.98 NA NA NA # RRUM summary( CDM::modelfit.cor.din( mod1, jkunits=0) ) ## type value p ## 1 max(X2) 11.79073 0.39645 ## 2 abs(fcor) 0.09541 0.07422 ## est ## MADcor 0.01834 ## SRMSR 0.02300 ## MX2 0.86718 ## 100*MADRESIDCOV 0.38690 ## MADQ3 0.02413 # additive model (identity) summary( CDM::modelfit.cor.din( mod2, jkunits=0) ) ## type value p ## 1 max(X2) 9.78958 1.00000 ## 2 abs(fcor) 0.08770 0.22993 ## est ## MADcor 0.01721 ## SRMSR 0.02158 ## MX2 0.69163 ## 100*MADRESIDCOV 0.36343 ## MADQ3 0.02423 # DINA model summary( CDM::modelfit.cor.din( mod3, jkunits=0) ) ## type value p ## 1 max(X2) 13.48449 0.16020 ## 2 abs(fcor) 0.10651 0.01256 ## est ## MADcor 0.01999 ## SRMSR 0.02495 ## MX2 0.92820 ## 100*MADRESIDCOV 0.42226 ## MADQ3 0.02258 ## End(Not run)
## Not run: data(data.jang, package="CDM") data <- data.jang$data q.matrix <- data.jang$q.matrix #*** Model 1: Reduced RUM model mod1 <- CDM::gdina( data, q.matrix, rule="RRUM", conv.crit=.001, increment.factor=1.025 ) summary(mod1) #*** Model 2: Additive model (identity link) mod2 <- CDM::gdina( data, q.matrix, rule="ACDM", conv.crit=.001, linkfct="identity" ) summary(mod2) #*** Model 3: DINA model mod3 <- CDM::gdina( data, q.matrix, rule="DINA", conv.crit=.001 ) summary(mod3) anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -30315.03 60630.06 153 60936.06 61748.98 88.29627 0 0 ## 2 Model 2 -30270.88 60541.76 153 60847.76 61660.68 NA NA NA anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -30373.99 60747.97 129 61005.97 61691.38 117.9128 24 0 ## 1 Model 1 -30315.03 60630.06 153 60936.06 61748.98 NA NA NA # RRUM summary( CDM::modelfit.cor.din( mod1, jkunits=0) ) ## type value p ## 1 max(X2) 11.79073 0.39645 ## 2 abs(fcor) 0.09541 0.07422 ## est ## MADcor 0.01834 ## SRMSR 0.02300 ## MX2 0.86718 ## 100*MADRESIDCOV 0.38690 ## MADQ3 0.02413 # additive model (identity) summary( CDM::modelfit.cor.din( mod2, jkunits=0) ) ## type value p ## 1 max(X2) 9.78958 1.00000 ## 2 abs(fcor) 0.08770 0.22993 ## est ## MADcor 0.01721 ## SRMSR 0.02158 ## MX2 0.69163 ## 100*MADRESIDCOV 0.36343 ## MADQ3 0.02423 # DINA model summary( CDM::modelfit.cor.din( mod3, jkunits=0) ) ## type value p ## 1 max(X2) 13.48449 0.16020 ## 2 abs(fcor) 0.10651 0.01256 ## est ## MADcor 0.01999 ## SRMSR 0.02495 ## MX2 0.92820 ## 100*MADRESIDCOV 0.42226 ## MADQ3 0.02258 ## End(Not run)
This is a simulated dataset according to the MELAB reading study (Li, 2011; Li & Suen, 2013). Li (2011) investigated the Fusion model (RUM model) for calibrating this dataset. The dataset in this package is simulated assuming the reduced RUM model (RRUM).
data(data.melab)
data(data.melab)
The format of the dataset is:
List of 3
$ data : num [1:2019, 1:20] 0 1 0 1 1 0 0 0 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:20] "I1" "I2" "I3" "I4" ...
$ q.matrix :'data.frame':
..$ skill1: int [1:20] 1 1 0 0 1 1 0 1 0 1 ...
..$ skill2: int [1:20] 0 0 0 0 0 0 0 0 0 0 ...
..$ skill3: int [1:20] 0 0 0 1 0 1 1 0 1 0 ...
..$ skill4: int [1:20] 1 0 1 0 1 0 0 1 0 1 ...
$ skill.labels:'data.frame':
..$ skill : Factor w/ 4 levels "skill1","skill2",..: 1 2 3 4
..$ skill.label: Factor w/ 4 levels "connecting and synthesizing",..: 4 3 2 1
Simulated data according to Li (2011).
Li, H. (2011). A cognitive diagnostic analysis of the MELAB reading test. Spaan Fellow, 9, 17-46.
Li, H., & Suen, H. K. (2013). Constructing and validating a Q-matrix for cognitive diagnostic analyses of a reading test. Educational Assessment, 18, 1-25.
## Not run: data(data.melab, package="CDM") data <- data.melab$data q.matrix <- data.melab$q.matrix #*** Model 1: Reduced RUM model mod1 <- CDM::gdina( data, q.matrix, rule="RRUM" ) summary(mod1) #*** Model 2: GDINA model mod2 <- CDM::gdina( data, q.matrix, rule="GDINA" ) summary(mod2) #*** Model 3: DINA model mod3 <- CDM::gdina( data, q.matrix, rule="DINA" ) summary(mod3) #*** Model 4: 2PL model mod4 <- CDM::gdm( data, theta.k=seq(-6,6,len=21), center ) summary(mod4) #---- # Model comparisons #*** RRUM vs. GDINA anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -20252.74 40505.48 69 40643.48 41030.60 30.88801 18 0.02966 ## 2 Model 2 -20237.30 40474.59 87 40648.59 41136.69 NA NA NA ## -> GDINA is not superior to RRUM (according to AIC and BIC) #*** DINA vs. RRUM anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -20332.52 40665.04 55 40775.04 41083.61 159.5566 14 0 ## 1 Model 1 -20252.74 40505.48 69 40643.48 41030.60 NA NA NA ## -> RRUM fits the data significantly better than the DINA model #*** RRUM vs. 2PL (use only AIC and BIC for comparison) anova(mod1,mod4) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -20390.19 40780.38 43 40866.38 41107.62 274.8962 26 0 ## 1 Model 1 -20252.74 40505.48 69 40643.48 41030.60 NA NA NA ## -> RRUM fits the data better than 2PL #---- # Model fit statistics # RRUM fmod1 <- CDM::modelfit.cor.din( mod1, jkunits=0) summary(fmod1) ## Test of Global Model Fit ## type value p ## 1 max(X2) 10.10408 0.28109 ## 2 abs(fcor) 0.06726 0.24023 ## ## Fit Statistics ## est ## MADcor 0.01708 ## SRMSR 0.02158 ## MX2 0.96590 ## 100*MADRESIDCOV 0.27269 ## MADQ3 0.02781 ## -> not a significant misfit of the RRUM model # GDINA fmod2 <- CDM::modelfit.cor.din( mod2, jkunits=0) summary(fmod2) ## Test of Global Model Fit ## type value p ## 1 max(X2) 10.40294 0.23905 ## 2 abs(fcor) 0.06817 0.20964 ## ## Fit Statistics ## est ## MADcor 0.01703 ## SRMSR 0.02151 ## MX2 0.94468 ## 100*MADRESIDCOV 0.27105 ## MADQ3 0.02713 ## End(Not run)
## Not run: data(data.melab, package="CDM") data <- data.melab$data q.matrix <- data.melab$q.matrix #*** Model 1: Reduced RUM model mod1 <- CDM::gdina( data, q.matrix, rule="RRUM" ) summary(mod1) #*** Model 2: GDINA model mod2 <- CDM::gdina( data, q.matrix, rule="GDINA" ) summary(mod2) #*** Model 3: DINA model mod3 <- CDM::gdina( data, q.matrix, rule="DINA" ) summary(mod3) #*** Model 4: 2PL model mod4 <- CDM::gdm( data, theta.k=seq(-6,6,len=21), center ) summary(mod4) #---- # Model comparisons #*** RRUM vs. GDINA anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 1 Model 1 -20252.74 40505.48 69 40643.48 41030.60 30.88801 18 0.02966 ## 2 Model 2 -20237.30 40474.59 87 40648.59 41136.69 NA NA NA ## -> GDINA is not superior to RRUM (according to AIC and BIC) #*** DINA vs. RRUM anova(mod1,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -20332.52 40665.04 55 40775.04 41083.61 159.5566 14 0 ## 1 Model 1 -20252.74 40505.48 69 40643.48 41030.60 NA NA NA ## -> RRUM fits the data significantly better than the DINA model #*** RRUM vs. 2PL (use only AIC and BIC for comparison) anova(mod1,mod4) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -20390.19 40780.38 43 40866.38 41107.62 274.8962 26 0 ## 1 Model 1 -20252.74 40505.48 69 40643.48 41030.60 NA NA NA ## -> RRUM fits the data better than 2PL #---- # Model fit statistics # RRUM fmod1 <- CDM::modelfit.cor.din( mod1, jkunits=0) summary(fmod1) ## Test of Global Model Fit ## type value p ## 1 max(X2) 10.10408 0.28109 ## 2 abs(fcor) 0.06726 0.24023 ## ## Fit Statistics ## est ## MADcor 0.01708 ## SRMSR 0.02158 ## MX2 0.96590 ## 100*MADRESIDCOV 0.27269 ## MADQ3 0.02781 ## -> not a significant misfit of the RRUM model # GDINA fmod2 <- CDM::modelfit.cor.din( mod2, jkunits=0) summary(fmod2) ## Test of Global Model Fit ## type value p ## 1 max(X2) 10.40294 0.23905 ## 2 abs(fcor) 0.06817 0.20964 ## ## Fit Statistics ## est ## MADcor 0.01703 ## SRMSR 0.02151 ## MX2 0.94468 ## 100*MADRESIDCOV 0.27105 ## MADQ3 0.02713 ## End(Not run)
Large-scale dataset with multiple groups, survey weights and 11 polytomous items.
data(data.mg)
data(data.mg)
A data frame with 38243 observations on the following 14 variables.
idstud
Student identifier
group
Group identifier
weight
Survey weight
I1
Item 1
I2
Item 2
I3
Item 3
I4
Item 4
I5
Item 5
I6
Item 6
I7
Item 7
I8
Item 8
I9
Item 9
I10
Item 10
I11
Item 11
Subsample of a large-scale dataset of 11 survey questions.
## Not run: library(psych) data(dat.mg, package="CDM") psych::describe( data.mg ) ## > psych::describe(data.mg) ## var n mean sd median trimmed mad min max ## idstud 1 38243 1039653.91 19309.80 1037899.00 1039927.73 30240.59 1007168.00 1069949.00 ## group 2 38243 8.06 4.07 7.00 8.06 5.93 2.00 14.00 ## weight 3 38243 28.76 19.25 31.88 27.92 19.12 0.79 191.89 ## I1 4 37665 0.88 0.32 1.00 0.98 0.00 0.00 1.00 ## I2 5 37639 0.93 0.25 1.00 1.00 0.00 0.00 1.00 ## I3 6 37473 0.76 0.43 1.00 0.83 0.00 0.00 1.00 ## I4 7 37687 1.88 0.39 2.00 2.00 0.00 0.00 2.00 ## I5 8 37638 1.36 0.75 2.00 1.44 0.00 0.00 2.00 ## I6 9 37587 1.05 0.82 1.00 1.06 1.48 0.00 2.00 ## I7 10 37576 1.55 0.85 2.00 1.57 1.48 0.00 3.00 ## I8 11 37044 0.45 0.50 0.00 0.44 0.00 0.00 1.00 ## I9 12 37249 0.48 0.50 0.00 0.47 0.00 0.00 1.00 ## I10 13 37318 0.63 0.48 1.00 0.66 0.00 0.00 1.00 ## I11 14 37412 1.35 0.80 1.00 1.35 1.48 0.00 3.00 ## End(Not run)
## Not run: library(psych) data(dat.mg, package="CDM") psych::describe( data.mg ) ## > psych::describe(data.mg) ## var n mean sd median trimmed mad min max ## idstud 1 38243 1039653.91 19309.80 1037899.00 1039927.73 30240.59 1007168.00 1069949.00 ## group 2 38243 8.06 4.07 7.00 8.06 5.93 2.00 14.00 ## weight 3 38243 28.76 19.25 31.88 27.92 19.12 0.79 191.89 ## I1 4 37665 0.88 0.32 1.00 0.98 0.00 0.00 1.00 ## I2 5 37639 0.93 0.25 1.00 1.00 0.00 0.00 1.00 ## I3 6 37473 0.76 0.43 1.00 0.83 0.00 0.00 1.00 ## I4 7 37687 1.88 0.39 2.00 2.00 0.00 0.00 2.00 ## I5 8 37638 1.36 0.75 2.00 1.44 0.00 0.00 2.00 ## I6 9 37587 1.05 0.82 1.00 1.06 1.48 0.00 2.00 ## I7 10 37576 1.55 0.85 2.00 1.57 1.48 0.00 3.00 ## I8 11 37044 0.45 0.50 0.00 0.44 0.00 0.00 1.00 ## I9 12 37249 0.48 0.50 0.00 0.47 0.00 0.00 1.00 ## I10 13 37318 0.63 0.48 1.00 0.66 0.00 0.00 1.00 ## I11 14 37412 1.35 0.80 1.00 1.35 1.48 0.00 3.00 ## End(Not run)
Dataset for the estimation of the polytomous GDINA model.
data(data.pgdina)
data(data.pgdina)
The dataset is a list with the item response data and the Q-matrix. The format is:
List of 2
$ dat : num [1:1000, 1:30] 1 1 1 1 1 0 1 1 1 1 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:30] "I1" "I2" "I3" "I4" ...
$ q.matrix: num [1:30, 1:5] 1 0 0 0 0 1 0 0 0 2 ...
The dataset was simulated by the following R code:
set.seed(89)
# define Q-matrix
Qmatrix <- matrix(c(1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,
1,1,2,0,0,0,0,1,2,0,0,0,0,1,2,0,0,0,0,1,1,2,0,0,0,1,2,2,0,1,0,2,
1,0,0,1,1,0,2,2,0,0,2,1,0,1,0,0,2,2,1,2,0,0,0,0,0,2,0,0,0,0,0,2,
0,0,0,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,2,0,2,0,0,0,2,0,1,2,0,0,2,0,
0,2,0,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1,0,1,0,1),
nrow=30, ncol=5, byrow=TRUE )
# define covariance matrix between attributes
Sigma <- matrix(c(1,.6,.6,.3,.3,.6,1,.6,.3,.3,.6,.6,1,
.3,.3,.3,.3,.3,1,.8,.3,.3,.3,.8,1), 5,5, byrow=TRUE )
# define thresholds for attributes
q1 <- c( -.5, .9 ) # attributes 1,...,4
q2 <- c(0) # attribute 5
# number of persons
N <- 1000
# simulate latent attributes
alpha1 <- mvrnorm(n=N, mu=rep(0,5), Sigma=Sigma)
alpha <- 0*alpha1
for (aa in 1:4){
alpha[ alpha1[,aa] > q1[1], aa ] <- 1
alpha[ alpha1[,aa] > q1[2], aa ] <- 2
}
aa <- 5 ; alpha[ alpha1[,aa] > q2[1], aa ] <- 1
# define item parameters
guess <- c(.07,.01,.34,.07,.11,.23,.27,.07,.08,.34,.19,.19,.25,.04,.34,
.03,.29,.05,.01,.17,.15,.35,.19,.16,.08,.18,.19,.07,.17,.34)
slip <- c(0,.11,.14,.09,.03,.09,.03,.1,.14,.07,.06,.19,.09,.19,.07,.08,
.16,.18,.16,.02,.11,.12,.16,.14,.18,.01,.18,.14,.05,.18)
# simulate item responses
I <- 30 # number of items
dat <- latresp <- matrix( 0, N, I, byrow=TRUE)
for (ii in 1:I){
# ii <- 2
# latent response matrix
latresp[,ii] <- 1*( rowMeans( alpha >=matrix( Qmatrix[ ii, ], nrow=N,
ncol=5, byrow=TRUE ) )==1 )
# response probability
prob <- ifelse( latresp[,ii]==1, 1-slip[ii], guess[ii] )
# simulate item responses
dat[,ii] <- 1 * ( runif(N ) < prob )
}
colnames(dat) <- paste0("I",1:I)
Chen, J., & de la Torre, J. (2013). A general cognitive diagnosis model for expert-defined polytomous attributes. Applied Psychological Measurement, 37, 419-437.
This is a sub-dataset of the PISA 2000 of German students including 26 items of the reading test. The 26 items was analyzed in Chen and de la Torre (2014) and a subset of 20 items was analyzed in Chen and Chen (2016).
data(data.pisa00R.ct) data(data.pisa00R.cc)
data(data.pisa00R.ct) data(data.pisa00R.cc)
The format of the dataset data.pisa00R.ct
(Chen & de la Torre, 2014) is:
List of 3
$ data :'data.frame': 1095 obs. of 111 variables:
.. [list output truncated]
$ q.matrix: num [1:26, 1:8] 0 1 0 0 0 1 0 0 0 1 ...
..- attr(*, "dimnames")=List of 2
$ skills : chr [1:8] "Locating information" ...
The format of the dataset data.pisa00R.cc
(Q-matrix in Chen and Chen, 2016)
List of 2
$ q.matrix:'data.frame': 20 obs. of 5 variables:
..$ A1: num [1:20] 1 1 0 0 1 1 1 0 0 0 ...
..$ A2: num [1:20] 0 0 0 1 0 1 1 1 1 1 ...
..$ A3: num [1:20] 1 1 0 1 1 0 1 0 1 0 ...
..$ A4: num [1:20] 0 1 1 1 0 0 0 0 0 0 ...
..$ A5: num [1:20] 0 0 1 0 0 0 0 1 0 1 ...
$ skills : Named chr [1:5] "Identifying Explicit Information" ...
..- attr(*, "names")=chr [1:5] "A1" "A2" "A3" "A4" ...
Chen, H., & Chen, J. (2016). Exploring reading comprehension skill relationships through the G-DINA model. Educational Psychology, 36(6), 1049-1064.
Chen, J., & de la Torre, J. (2014). A procedure for diagnostically modeling extant large-scale assessment data: the case of the programme for international student assessment in reading. Psychology, 5(18), 1967-1978.
############################################################################# # EXAMPLE 1: PISA items from Chen and de la Torre (2014) # dichotomize item responses ############################################################################# data(data.pisa00R.ct, package="CDM") dat <- data.pisa00R.ct$data Q <- data.pisa00R.ct$q.matrix resp <- dat[, rownames(Q)] #** extract item-wise maximum maxK <- apply( resp, 2, max, na.rm=TRUE ) #** dichotomize response data resp1 <- resp for (ii in seq(1,ncol(resp)) ){ resp1[,ii] <- 1 * ( resp[,ii]==maxK[ii] ) }
############################################################################# # EXAMPLE 1: PISA items from Chen and de la Torre (2014) # dichotomize item responses ############################################################################# data(data.pisa00R.ct, package="CDM") dat <- data.pisa00R.ct$data Q <- data.pisa00R.ct$q.matrix resp <- dat[, rownames(Q)] #** extract item-wise maximum maxK <- apply( resp, 2, max, na.rm=TRUE ) #** dichotomize response data resp1 <- resp for (ii in seq(1,ncol(resp)) ){ resp1[,ii] <- 1 * ( resp[,ii]==maxK[ii] ) }
This is a simulated dataset of the SDA6 study according to informations given in Jurich and Bradshaw (2014).
data(data.sda6)
data(data.sda6)
The datasets contains 17 items observed at 1710 students.
The format is:
List of 2
$ data : num [1:1710, 1:17] 0 1 0 1 0 0 0 0 1 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:17] "MCM01" "MCM03" "MCM13" "MCM17" ...
$ q.matrix:'data.frame':
..$ CM: int [1:17] 1 1 1 1 0 0 0 0 0 0 ...
..$ II: int [1:17] 0 0 0 0 1 1 1 1 0 0 ...
..$ PP: int [1:17] 0 0 0 0 0 0 0 0 1 1 ...
..$ DG: int [1:17] 0 0 0 0 0 0 0 0 0 0 ...
The meaning of the skills is
CM
– Critique Methods
II
– Identify Improvements
PP
– Protect Participants
DG
– Discern Generalizability
Simulated data
Jurich, D. P., & Bradshaw, L. P. (2014). An illustration of diagnostic classification modeling in student learning outcomes assessment. International Journal of Testing, 14, 49-72.
## Not run: data(data.sda6, package="CDM") data <- data.sda6$data q.matrix <- data.sda6$q.matrix #*** Model 1a: LCDM with gdina mod1a <- CDM::gdina( data, q.matrix, rule="ACDM", linkfct="logit", reduced.skillspace=FALSE ) summary(mod1a) #*** Model 1b: estimate LCDM with gdm mod1b <- CDM::gdm( data, q.matrix=q.matrix, theta.k=c(0,1) ) summary(mod1b) #*** Model 2: LCDM with hierarchy II > CM B <- "II > CM" ss2 <- CDM::skillspace.hierarchy(B=B, skill.names=colnames(q.matrix ) ) mod2 <- CDM::gdina( data, q.matrix, rule="ACDM", linkfct="logit", skillclasses=ss2$skillspace.reduced, reduced.skillspace=FALSE ) summary(mod2) #*** Model 3: LCDM with hierarchy II > CM and DG > CM B <- "II > CM DG > CM" ss2 <- CDM::skillspace.hierarchy(B=B, skill.names=colnames(q.matrix ) ) mod3 <- CDM::gdina( data, q.matrix, rule="ACDM", linkfct="logit", skillclasses=ss2$skillspace.reduced, reduced.skillspace=FALSE ) summary(mod3) # model comparisons anova(mod1a,mod2) anova(mod1a,mod3) # model fit summary( CDM::modelfit.cor.din(mod1a)) summary( CDM::modelfit.cor.din(mod2) ) summary( CDM::modelfit.cor.din(mod3) ) ## End(Not run)
## Not run: data(data.sda6, package="CDM") data <- data.sda6$data q.matrix <- data.sda6$q.matrix #*** Model 1a: LCDM with gdina mod1a <- CDM::gdina( data, q.matrix, rule="ACDM", linkfct="logit", reduced.skillspace=FALSE ) summary(mod1a) #*** Model 1b: estimate LCDM with gdm mod1b <- CDM::gdm( data, q.matrix=q.matrix, theta.k=c(0,1) ) summary(mod1b) #*** Model 2: LCDM with hierarchy II > CM B <- "II > CM" ss2 <- CDM::skillspace.hierarchy(B=B, skill.names=colnames(q.matrix ) ) mod2 <- CDM::gdina( data, q.matrix, rule="ACDM", linkfct="logit", skillclasses=ss2$skillspace.reduced, reduced.skillspace=FALSE ) summary(mod2) #*** Model 3: LCDM with hierarchy II > CM and DG > CM B <- "II > CM DG > CM" ss2 <- CDM::skillspace.hierarchy(B=B, skill.names=colnames(q.matrix ) ) mod3 <- CDM::gdina( data, q.matrix, rule="ACDM", linkfct="logit", skillclasses=ss2$skillspace.reduced, reduced.skillspace=FALSE ) summary(mod3) # model comparisons anova(mod1a,mod2) anova(mod1a,mod3) # model fit summary( CDM::modelfit.cor.din(mod1a)) summary( CDM::modelfit.cor.din(mod2) ) summary( CDM::modelfit.cor.din(mod3) ) ## End(Not run)
This dataset contains item responses of students at
a scale of cultural activities (act
),
mathematics self concept (sc
) and
mathematics joyment (mj
).
data(data.Students)
data(data.Students)
A data frame with 2400 observations on the following 15 variables.
urban
Urbanization level: 1=town, 0=otherwise
female
A dummy variable for female student
act1
Visit a museum (0=never, 1=once or twice a year, 2=more than twice a year)
act2
Visit a theater or classical concert (0,1,2)
act3
Visit a rock or pop concert (0,1,2)
act4
Visit a cinema (0,1,2)
act5
Visit a public library (0,1,2)
sc1
Item 1 self concept "I am usually good at math." (0=do not agree at all, 1=rather do not agree, 2=rather agree, 3=completely agree)
sc2
Item 2 self concept: "Mathematics is harder for me than many of my classmates." (0,1,2,3) (reversed)
sc3
Item 3 self concept: "I am just not good at math." (0,1,2,3) (reversed)
sc4
Item 4 self concept: "I'm learning fast in math." (0,1,2,3)
mj1
Item 1 mathematics joyment: "I would like more math at school." (0,1,2,3)
mj2
Item 2 mathematics joyment: "I like to learn mathematics." (0,1,2,3)
mj3
Item 3 mathematics joyment: "Math is boring." (0,1,2,3) (reversed)
mj4
Item 4 mathematics joyment: "I like math." (0,1,2,3)
Subsample of students from an Austrian survey of 8th grade students.
## Not run: library(psych) data(data.Students, package="CDM") psych::describe(data.Students) ## var n mean sd median trimmed mad min max range skew kurtosis se ## urban 1 2400 0.31 0.46 0.0 0.27 0.00 0 1 1 0.81 -1.34 0.01 ## female 2 2400 0.51 0.50 1.0 0.51 0.00 0 1 1 -0.03 -2.00 0.01 ## act1 3 2248 0.65 0.73 0.5 0.56 0.74 0 2 2 0.64 -0.88 0.02 ## act2 4 2230 0.47 0.69 0.0 0.34 0.00 0 2 2 1.13 -0.06 0.01 ## act3 5 2218 0.33 0.60 0.0 0.21 0.00 0 2 2 1.62 1.48 0.01 ## act4 6 2342 1.35 0.76 2.0 1.44 0.00 0 2 2 -0.69 -0.96 0.02 ## act5 7 2223 0.52 0.74 0.0 0.40 0.00 0 2 2 1.05 -0.41 0.02 ## sc1 8 2352 0.96 0.80 1.0 0.91 1.48 0 3 3 0.45 -0.39 0.02 ## sc2 9 2347 0.90 0.88 1.0 0.81 1.48 0 3 3 0.66 -0.41 0.02 ## sc3 10 2335 0.86 0.96 1.0 0.73 1.48 0 3 3 0.84 -0.35 0.02 ## sc4 11 2337 1.29 0.90 1.0 1.24 1.48 0 3 3 0.24 -0.71 0.02 ## mj1 12 2351 2.26 0.82 2.0 2.37 1.48 0 3 3 -0.94 0.28 0.02 ## mj2 13 2345 1.89 0.91 2.0 1.95 1.48 0 3 3 -0.35 -0.80 0.02 ## mj3 14 2334 1.47 1.02 1.0 1.47 1.48 0 3 3 0.10 -1.11 0.02 ## mj4 15 2346 1.59 0.99 2.0 1.62 1.48 0 3 3 -0.03 -1.06 0.02 ## End(Not run)
## Not run: library(psych) data(data.Students, package="CDM") psych::describe(data.Students) ## var n mean sd median trimmed mad min max range skew kurtosis se ## urban 1 2400 0.31 0.46 0.0 0.27 0.00 0 1 1 0.81 -1.34 0.01 ## female 2 2400 0.51 0.50 1.0 0.51 0.00 0 1 1 -0.03 -2.00 0.01 ## act1 3 2248 0.65 0.73 0.5 0.56 0.74 0 2 2 0.64 -0.88 0.02 ## act2 4 2230 0.47 0.69 0.0 0.34 0.00 0 2 2 1.13 -0.06 0.01 ## act3 5 2218 0.33 0.60 0.0 0.21 0.00 0 2 2 1.62 1.48 0.01 ## act4 6 2342 1.35 0.76 2.0 1.44 0.00 0 2 2 -0.69 -0.96 0.02 ## act5 7 2223 0.52 0.74 0.0 0.40 0.00 0 2 2 1.05 -0.41 0.02 ## sc1 8 2352 0.96 0.80 1.0 0.91 1.48 0 3 3 0.45 -0.39 0.02 ## sc2 9 2347 0.90 0.88 1.0 0.81 1.48 0 3 3 0.66 -0.41 0.02 ## sc3 10 2335 0.86 0.96 1.0 0.73 1.48 0 3 3 0.84 -0.35 0.02 ## sc4 11 2337 1.29 0.90 1.0 1.24 1.48 0 3 3 0.24 -0.71 0.02 ## mj1 12 2351 2.26 0.82 2.0 2.37 1.48 0 3 3 -0.94 0.28 0.02 ## mj2 13 2345 1.89 0.91 2.0 1.95 1.48 0 3 3 -0.35 -0.80 0.02 ## mj3 14 2334 1.47 1.02 1.0 1.47 1.48 0 3 3 0.10 -1.11 0.02 ## mj4 15 2346 1.59 0.99 2.0 1.62 1.48 0 3 3 -0.03 -1.06 0.02 ## End(Not run)
This is a dataset with a subset of 23 Mathematics items from TIMSS 2003 items used in Su, Choi, Lee, Choi and McAninch (2013).
data(data.timss03.G8.su)
data(data.timss03.G8.su)
The data contains scored item responses (data
),
the Q-matrix (q.matrix
) and further item informations (iteminfo
).
The format is
List of 3
$ data :'data.frame':
..$ idstud : num [1:757] 1e+07 1e+07 1e+07 1e+07 1e+07 ...
..$ idbook : num [1:757] 1 1 1 1 1 1 1 1 1 1 ...
..$ M012001 : num [1:757] 0 1 0 0 1 0 1 0 0 0 ...
..$ M012002 : num [1:757] 1 1 0 1 0 0 1 1 1 1 ...
..$ M012004 : num [1:757] 0 1 1 1 1 0 1 1 0 0 ...
[...]
..$ M022234B: num [1:757] 0 0 0 0 0 0 0 0 0 0 ...
..$ M022251 : num [1:757] 0 0 0 0 0 0 0 0 0 0 ...
..$ M032570 : num [1:757] 1 1 0 1 0 0 1 1 1 1 ...
..$ M032643 : num [1:757] 1 0 0 0 0 0 1 1 0 0 ...
$ q.matrix: int [1:23, 1:13] 1 0 0 0 0 0 1 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:23] "M012001" "M012002" "M012004" "M012016" ...
.. ..$ : chr [1:13] "S1" "S2" "S3" "S4" ...
$ iteminfo: chr [1:23, 1:9] "M012001" "M012002" "M012004" "M012016" ...
..- attr(*, "dimnames")=List of 2
.. ..$ : NULL
.. ..$ : chr [1:9] "item" "ItemType" "reporting_category" "content" ...
For a detailed description of skills S1
, S2
, ..., S15
see Su et al. (2013, Table 2).
Subset of US 8th graders (Booklet 1) in the TIMSS 2003 mathematics study
Skaggs, G., Wilkins, J. L. M., & Hein, S. F. (2016). Grain size and parameter recovery with TIMSS and the general diagnostic model. International Journal of Testing, 16(4), 310-330.
Su, Y.-L., Choi, K. M., Lee, W.-C., Choi, T., & McAninch, M. (2013). Hierarchical cognitive diagnostic analysis for TIMSS 2003 mathematics. CASMA Research Report 35. Center for Advanced Studies in Measurement and Assessment (CASMA), University of Iowa.
The TIMSS 2003 dataset for 8th graders (with a larger number of items) was also analyzed in Skaggs, Wilkins and Hein (2016).
## Not run: ############################################################################# # EXAMPLE 1: Data Su et al. (2013) ############################################################################# data(data.timss03.G8.su, package="CDM") data <- data.timss03.G8.su$data[,-c(1,2)] q.matrix <- data.timss03.G8.su$q.matrix #*** Model 1: DINA model with complete skill space of 2^13=8192 skill classes mod1 <- CDM::din( data, q.matrix ) #*** Model 2: Skill space approximation with 3000 skill classes instead of # 2^13=8192 classes as in Model 1 ss2 <- CDM::skillspace.approximation( L=3000, K=ncol(q.matrix) ) mod2 <- CDM::din( data, q.matrix, skillclasses=ss2 ) #*** Model 3: DINA model with a hierarchical skill space # see Su et al. (2013): Fig. 6 B <- "S1 > S2 > S7 > S8 S15 > S9 S3 > S9 S13 > S4 > S9 S14 > S5 > S6 > S11" # Note that S10 and S12 are not included in the dataset contained in this package skill.names <- colnames(q.matrix) ss3 <- CDM::skillspace.hierarchy(B=B, skill.names=skill.names) # The reduced skill space "only" contains 325 skill classes mod3 <- CDM::din( data, q.matrix, skillclasses=ss3$skillspace.reduced ) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Data Su et al. (2013) ############################################################################# data(data.timss03.G8.su, package="CDM") data <- data.timss03.G8.su$data[,-c(1,2)] q.matrix <- data.timss03.G8.su$q.matrix #*** Model 1: DINA model with complete skill space of 2^13=8192 skill classes mod1 <- CDM::din( data, q.matrix ) #*** Model 2: Skill space approximation with 3000 skill classes instead of # 2^13=8192 classes as in Model 1 ss2 <- CDM::skillspace.approximation( L=3000, K=ncol(q.matrix) ) mod2 <- CDM::din( data, q.matrix, skillclasses=ss2 ) #*** Model 3: DINA model with a hierarchical skill space # see Su et al. (2013): Fig. 6 B <- "S1 > S2 > S7 > S8 S15 > S9 S3 > S9 S13 > S4 > S9 S14 > S5 > S6 > S11" # Note that S10 and S12 are not included in the dataset contained in this package skill.names <- colnames(q.matrix) ss3 <- CDM::skillspace.hierarchy(B=B, skill.names=skill.names) # The reduced skill space "only" contains 325 skill classes mod3 <- CDM::din( data, q.matrix, skillclasses=ss3$skillspace.reduced ) ## End(Not run)
TIMSS 2007 (Grade 4) dataset with 25 mathematics (dichotomized) items used in Lee, Park and Taylan (2011), Park and Lee (2014) and Park, Xing and Lee (2018). The dataset includes a sample of 698 Austrian students.
data(data.timss07.G4.lee) data(data.timss07.G4.py) data(data.timss07.G4.Qdomains)
data(data.timss07.G4.lee) data(data.timss07.G4.py) data(data.timss07.G4.Qdomains)
The dataset data.timss07.G4.lee
is a
list containing dichotomous item responses (data
;
information on booklet and gender included),
the Q-matrix (q.matrix
) and descriptions
of the skills (skillinfo
) used in Lee et al. (2011).
The format is:
List of 3
$ data :'data.frame':
..$ idstud : int [1:698] 10110 10111 20105 20106 30203 30204 40106 40107 60111 60112 ...
..$ idbook : int [1:698] 4 5 4 5 4 5 4 5 4 5 ...
..$ girl : int [1:698] 0 0 1 1 0 1 0 1 1 1 ...
..$ M041052 : num [1:698] 1 NA 1 NA 0 NA 1 NA 1 NA ...
..$ M041056 : num [1:698] 1 NA 0 NA 0 NA 0 NA 1 NA ...
..$ M041069 : num [1:698] 0 NA 0 NA 0 NA 0 NA 1 NA ...
..$ M041076 : num [1:698] 1 NA 0 NA 1 NA 1 NA 0 NA ...
..$ M041281 : num [1:698] 1 NA 0 NA 1 NA 1 NA 0 NA ...
..$ M041164 : num [1:698] 1 NA 1 NA 0 NA 1 NA 1 NA ...
..$ M041146 : num [1:698] 0 NA 0 NA 1 NA 1 NA 0 NA ...
..$ M041152 : num [1:698] 1 NA 1 NA 1 NA 0 NA 1 NA ...
..$ M041258A: num [1:698] 0 NA 1 NA 1 NA 0 NA 1 NA ...
..$ M041258B: num [1:698] 1 NA 0 NA 1 NA 0 NA 1 NA ...
..$ M041131 : num [1:698] 0 NA 0 NA 1 NA 1 NA 1 NA ...
..$ M041275 : num [1:698] 1 NA 0 NA 0 NA 1 NA 1 NA ...
..$ M041186 : num [1:698] 1 NA 0 NA 1 NA 1 NA 0 NA ...
..$ M041336 : num [1:698] 1 NA 1 NA 0 NA 1 NA 0 NA ...
..$ M031303 : num [1:698] 1 1 0 1 0 1 1 1 0 0 ...
..$ M031309 : num [1:698] 1 0 1 1 1 1 1 1 0 0 ...
..$ M031245 : num [1:698] 0 0 0 0 0 0 0 0 0 0 ...
..$ M031242A: num [1:698] 1 1 0 1 1 1 1 1 0 0 ...
..$ M031242B: num [1:698] 0 1 0 1 1 1 1 1 1 0 ...
..$ M031242C: num [1:698] 1 1 0 1 1 1 1 1 1 0 ...
..$ M031247 : num [1:698] 0 0 0 0 0 0 0 0 0 0 ...
..$ M031219 : num [1:698] 1 1 1 0 1 1 1 1 1 0 ...
..$ M031173 : num [1:698] 1 1 0 0 0 1 1 1 1 0 ...
..$ M031085 : num [1:698] 1 0 0 1 1 1 0 0 0 1 ...
..$ M031172 : num [1:698] 1 0 0 1 1 1 1 1 1 0 ...
$ q.matrix : int [1:25, 1:15] 1 0 0 0 0 0 0 1 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:25] "M041052" "M041056" "M041069" "M041076" ...
.. ..$ : chr [1:15] "NWN01" "NWN02" "NWN03" "NWN04" ...
$ skillinfo:'data.frame':
..$ skillindex : int [1:15] 1 2 3 4 5 6 7 8 9 10 ...
..$ skill : Factor w/ 15 levels "DOR15","DRI13",..: 12 13 14 15 8 9 10 11 4 6 ...
..$ content : Factor w/ 3 levels "D","G","N": 3 3 3 3 3 3 3 3 2 2 ...
..$ content_label : Factor w/ 3 levels "Data Display",..: 3 3 3 3 3 3 3 3 2 2 ...
..$ subcontent : Factor w/ 9 levels "FD","LA","LM",..: 9 9 9 9 1 1 4 6 2 8 ...
..$ subcontent_label: Factor w/ 9 levels "Fractions and Decimals",..: 9 9 9 9 1 1 4 6 2 8 ...
The dataset data.timss07.G4.py
uses the same items as
data.timss07.G4.lee
but employs a simplified Q-matrix with 7 skills.
This Q-matrix was used in Park and Lee (2014) and Park et al. (2018).
List of 3
$ q.matrix:'data.frame': 25 obs. of 7 variables:
..$ N1: num [1:25] 1 0 1 1 1 0 0 1 0 0 ...
..$ N2: num [1:25] 0 1 1 1 0 0 0 0 0 0 ...
..$ N3: num [1:25] 0 0 0 0 1 0 0 0 0 0 ...
..$ G4: num [1:25] 0 0 0 0 0 0 1 0 0 1 ...
..$ G5: num [1:25] 0 0 0 0 0 1 1 1 1 1 ...
..$ G6: num [1:25] 0 0 0 0 0 1 1 0 0 0 ...
..$ D7: num [1:25] 0 0 0 0 0 0 0 0 0 0 ...
$ domains : Named chr [1:3] "Number" "Geometric Shapes and Measures" "Data Display"
..- attr(*, "names")=chr [1:3] "N" "G" "D"
$ skills : Named chr [1:7] "Whole Numbers" ...
..- attr(*, "names")=chr [1:7] "N1" "N2" "N3" "G4" ...
The Q-matrix data.timss07.G4.Qdomains
is a simplification
of data.timss07.G4.py$q.matrix
to 3 domains and involves a
simple structure of skills.
num [1:25, 1:3] 1 1 1 1 1 0 0 1 0 0 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:25] "M041052" "M041056" "M041069" "M041076" ...
..$ : chr [1:3] "N" "G" "D"
TIMSS 2007 study, 4th Grade, Austrian sample on booklets 4 and 5
Lee, Y. S., Park, Y. S., & Taylan, D. (2011). A cognitive diagnostic modeling of attribute mastery in Massachusetts, Minnesota, and the US national sample using the TIMSS 2007. International Journal of Testing, 11, 144-177.
Park, Y. S., & Lee, Y. S. (2014). An extension of the DINA model using covariates: Examining factors affecting response probability and latent classification. Applied Psychological Measurement, 38(5), 376-390.
Park, Y. S., Xing, K., & Lee, Y. S. (2018). Explanatory cognitive diagnostic models: Incorporating latent and observed predictors. Applied Psychological Measurement, 42(5), 376-392.
Yamaguchi, K., & Okada, K. (2018). Comparison among cognitive diagnostic models for the TIMSS 2007 fourth grade mathematics assessment. PloS ONE, 13(2), e0188691.
A comparison of several countries based on the 25 items is conducted in Yamaguchi and Okada (2018).
## Not run: ############################################################################# # EXAMPLE 1: DINA model Lee et al. (2011) - 15 skills ############################################################################# data(data.timss07.G4.lee, package="CDM") dat <- data.timss07.G4.lee$data q.matrix <- data.timss07.G4.lee$q.matrix # extract items items <- grep( "M0", colnames(dat), value=TRUE ) #*** Model 1: estimate DINA model mod1 <- CDM::din( dat[,items], q.matrix ) summary(mod1) ############################################################################# # EXAMPLE 2: DINA models Park and Lee (2014) - 7 skills and 3 skills ############################################################################# data(data.timss07.G4.lee, package="CDM") data(data.timss07.G4.py, package="CDM") data(data.timss07.G4.Qdomains, package="CDM") dat <- data.timss07.G4.lee$data q.matrix <- data.timss07.G4.py$q.matrix items <- rownames(q.matrix) #*** Model 1: estimate DINA model mod1 <- CDM::din( dat[,items], q.matrix ) summary(mod1) #*** Model 2: estimate DINA model with Q-matrix defined by domains Q <- data.timss07.G4.Qdomains mod2 <- CDM::din( dat[,items], q.matrix=Q ) summary(mod2) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: DINA model Lee et al. (2011) - 15 skills ############################################################################# data(data.timss07.G4.lee, package="CDM") dat <- data.timss07.G4.lee$data q.matrix <- data.timss07.G4.lee$q.matrix # extract items items <- grep( "M0", colnames(dat), value=TRUE ) #*** Model 1: estimate DINA model mod1 <- CDM::din( dat[,items], q.matrix ) summary(mod1) ############################################################################# # EXAMPLE 2: DINA models Park and Lee (2014) - 7 skills and 3 skills ############################################################################# data(data.timss07.G4.lee, package="CDM") data(data.timss07.G4.py, package="CDM") data(data.timss07.G4.Qdomains, package="CDM") dat <- data.timss07.G4.lee$data q.matrix <- data.timss07.G4.py$q.matrix items <- rownames(q.matrix) #*** Model 1: estimate DINA model mod1 <- CDM::din( dat[,items], q.matrix ) summary(mod1) #*** Model 2: estimate DINA model with Q-matrix defined by domains Q <- data.timss07.G4.Qdomains mod2 <- CDM::din( dat[,items], q.matrix=Q ) summary(mod2) ## End(Not run)
This is the TIMSS 2011 dataset of 4668 Austrian fourth-graders. See George and Robitzsch (2014, 2015, 2018) for publications using the TIMSS 2011 dataset for cognitive diagnosis modeling. The dataset has also been analyzed by Sedat and Arican (2015).
data(data.timss11.G4.AUT) data(data.timss11.G4.AUT.part) data(data.timss11.G4.sa)
data(data.timss11.G4.AUT) data(data.timss11.G4.AUT.part) data(data.timss11.G4.sa)
The format of the dataset data.timss11.G4.AUT
is:
List of 4
$ data :'data.frame':
..$ uidschool: int [1:4668] 10040001 10040001 10040001 10040001 10040001 10040001 10040001 10040001 10040001 10040001 ...
..$ uidstud : num [1:4668] 1e+13 1e+13 1e+13 1e+13 1e+13 ...
..$ IDCNTRY : int [1:4668] 40 40 40 40 40 40 40 40 40 40 ...
..$ IDBOOK : int [1:4668] 10 12 13 14 1 2 3 4 5 6 ...
..$ IDSCHOOL : int [1:4668] 1 1 1 1 1 1 1 1 1 1 ...
..$ IDCLASS : int [1:4668] 102 102 102 102 102 102 102 102 102 102 ...
..$ IDSTUD : int [1:4668] 10201 10203 10204 10205 10206 10207 10208 10209 10210 10211 ...
..$ TOTWGT : num [1:4668] 17.5 17.5 17.5 17.5 17.5 ...
..$ HOUWGT : num [1:4668] 1.04 1.04 1.04 1.04 1.04 ...
..$ SENWGT : num [1:4668] 0.111 0.111 0.111 0.111 0.111 ...
..$ SCHWGT : num [1:4668] 11.6 11.6 11.6 11.6 11.6 ...
..$ STOTWGTU : num [1:4668] 524 524 524 524 524 ...
..$ WGTADJ1 : int [1:4668] 1 1 1 1 1 1 1 1 1 1 ...
..$ WGTFAC1 : num [1:4668] 11.6 11.6 11.6 11.6 11.6 ...
..$ JKCREP : int [1:4668] 1 1 1 1 1 1 1 1 1 1 ...
..$ JKCZONE : int [1:4668] 1 1 1 1 1 1 1 1 1 1 ...
..$ female : int [1:4668] 1 0 1 1 1 1 1 1 0 0 ...
..$ M031346A : int [1:4668] NA NA NA 1 1 NA NA NA NA NA ...
..$ M031346B : int [1:4668] NA NA NA 0 0 NA NA NA NA NA ...
..$ M031346C : int [1:4668] NA NA NA 1 1 NA NA NA NA NA ...
..$ M031379 : int [1:4668] NA NA NA 0 0 NA NA NA NA NA ...
..$ M031380 : int [1:4668] NA NA NA 0 0 NA NA NA NA NA ...
..$ M031313 : int [1:4668] NA NA NA 1 1 NA NA NA NA NA ...
.. [list output truncated]
$ q.matrix1:'data.frame':
..$ item : Factor w/ 174 levels "M031004","M031009",..: 29 30 31 32 33 25 8 5 17 163 ...
..$ Co_DA: int [1:174] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_DK: int [1:174] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_DR: int [1:174] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_GA: int [1:174] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_GK: int [1:174] 0 0 0 0 0 0 1 1 0 0 ...
..$ Co_GR: int [1:174] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_NA: int [1:174] 1 0 0 0 0 1 0 0 0 1 ...
..$ Co_NK: int [1:174] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_NR: int [1:174] 0 1 1 1 1 0 0 0 1 0 ...
$ q.matrix2:'data.frame':
..$ item : Factor w/ 174 levels "M031004","M031009",..: 29 30 31 32 33 25 8 5 17 163 ...
..$ CONT_D: int [1:174] 0 0 0 0 0 0 0 0 0 0 ...
..$ CONT_G: int [1:174] 0 0 0 0 0 0 1 1 0 0 ...
..$ CONT_N: int [1:174] 1 1 1 1 1 1 0 0 1 1 ...
$ q.matrix3:'data.frame': 174 obs. of 4 variables:
..$ item : Factor w/ 174 levels "M031004","M031009",..: 29 30 31 32 33 25 8 5 17 163 ...
..$ COGN_A: int [1:174] 1 0 0 0 0 1 0 0 0 1 ...
..$ COGN_K: int [1:174] 0 0 0 0 0 0 1 1 0 0 ...
..$ COGN_R: int [1:174] 0 1 1 1 1 0 0 0 1 0 ...
The dataset data.timss11.G4.AUT.part
is a part of
data.timss11.G4.AUT
and contains only the first
three booklets (with N=1010 students). The format is
List of 4
$ data :'data.frame': 1010 obs. of 109 variables:
..$ uidschool: int [1:1010] 10040001 10040001 10040001 10040001 ...
..$ uidstud : num [1:1010] 1e+13 1e+13 1e+13 1e+13 1e+13 ...
..$ IDCNTRY : int [1:1010] 40 40 40 40 40 40 40 40 40 40 ...
..$ IDBOOK : int [1:1010] 1 2 3 1 2 1 2 3 1 2 ...
..$ IDSCHOOL : int [1:1010] 1 1 1 1 1 2 2 2 3 3 ...
..$ IDCLASS : int [1:1010] 102 102 102 102 102 ...
..$ IDSTUD : int [1:1010] 10206 10207 10208 10220 ...
..$ TOTWGT : num [1:1010] 17.5 17.5 17.5 17.5 17.5 ...
..$ HOUWGT : num [1:1010] 1.04 1.04 1.04 1.04 1.04 ...
..$ SENWGT : num [1:1010] 0.111 0.111 0.111 0.111 0.111 ...
..$ SCHWGT : num [1:1010] 11.6 11.6 11.6 11.6 11.6 ...
..$ STOTWGTU : num [1:1010] 524 524 524 524 524 ...
..$ WGTADJ1 : int [1:1010] 1 1 1 1 1 1 1 1 1 1 ...
..$ WGTFAC1 : num [1:1010] 11.6 11.6 11.6 11.6 11.6 ...
..$ JKCREP : int [1:1010] 1 1 1 1 1 0 0 0 0 0 ...
..$ JKCZONE : int [1:1010] 1 1 1 1 1 1 1 1 2 2 ...
..$ female : int [1:1010] 1 1 1 1 0 1 1 1 1 1 ...
..$ M031346A : int [1:1010] 1 NA NA 1 NA 1 NA NA 1 NA ...
..$ M031346B : int [1:1010] 0 NA NA 1 NA 0 NA NA 0 NA ...
..$ M031346C : int [1:1010] 1 NA NA 0 NA 0 NA NA 0 NA ...
..$ M031379 : int [1:1010] 0 NA NA 0 NA 0 NA NA 1 NA ...
..$ M031380 : int [1:1010] 0 NA NA 0 NA 0 NA NA 0 NA ...
..$ M031313 : int [1:1010] 1 NA NA 0 NA 1 NA NA 0 NA ...
..$ M031083 : int [1:1010] 1 NA NA 1 NA 1 NA NA 1 NA ...
..$ M031071 : int [1:1010] 0 NA NA 0 NA 1 NA NA 0 NA ...
..$ M031185 : int [1:1010] 0 NA NA 1 NA 0 NA NA 0 NA ...
..$ M051305 : int [1:1010] 1 1 NA 1 0 0 0 NA 0 1 ...
..$ M051091 : int [1:1010] 1 1 NA 1 1 1 1 NA 1 0 ...
.. [list output truncated]
$ q.matrix1:'data.frame': 47 obs. of 10 variables:
..$ item : Factor w/ 174 levels "M031004","M031009",..: 29 30 31 32 33 25 8 5 17 163 ...
..$ Co_DA: int [1:47] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_DK: int [1:47] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_DR: int [1:47] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_GA: int [1:47] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_GK: int [1:47] 0 0 0 0 0 0 1 1 0 0 ...
..$ Co_GR: int [1:47] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_NA: int [1:47] 1 0 0 0 0 1 0 0 0 1 ...
..$ Co_NK: int [1:47] 0 0 0 0 0 0 0 0 0 0 ...
..$ Co_NR: int [1:47] 0 1 1 1 1 0 0 0 1 0 ...
$ q.matrix2:'data.frame': 47 obs. of 4 variables:
..$ item : Factor w/ 174 levels "M031004","M031009",..: 29 30 31 32 33 25 8 5 17 163 ...
..$ CONT_D: int [1:47] 0 0 0 0 0 0 0 0 0 0 ...
..$ CONT_G: int [1:47] 0 0 0 0 0 0 1 1 0 0 ...
..$ CONT_N: int [1:47] 1 1 1 1 1 1 0 0 1 1 ...
$ q.matrix3:'data.frame': 47 obs. of 4 variables:
..$ item : Factor w/ 174 levels "M031004","M031009",..: 29 30 31 32 33 25 8 5 17 163 ...
..$ COGN_A: int [1:47] 1 0 0 0 0 1 0 0 0 1 ...
..$ COGN_K: int [1:47] 0 0 0 0 0 0 1 1 0 0 ...
..$ COGN_R: int [1:47] 0 1 1 1 1 0 0 0 1 0 ...
The dataset data.timss11.G4.sa
contains the Q-matrix
used in Sedat and Arican (2015).
List of 2
$ q.matrix:'data.frame': 31 obs. of 13 variables:
..$ N1 : num [1:31] 1 0 0 1 1 0 0 0 0 0 ...
..$ N2 : num [1:31] 1 1 0 0 1 0 0 0 0 0 ...
..$ N3 : num [1:31] 0 0 0 0 1 0 0 0 0 0 ...
..$ A4 : num [1:31] 0 0 1 0 0 1 1 1 0 0 ...
..$ A5 : num [1:31] 0 0 0 0 0 1 0 1 0 0 ...
..$ A6 : num [1:31] 0 0 0 0 0 0 0 0 0 0 ...
..$ A7 : num [1:31] 0 0 1 0 0 0 0 0 0 0 ...
..$ G8 : num [1:31] 0 0 0 0 0 0 0 0 1 1 ...
..$ G9 : num [1:31] 0 0 0 0 0 0 0 0 1 1 ...
..$ G10: num [1:31] 0 0 0 0 0 0 0 0 1 1 ...
..$ G11: num [1:31] 0 0 0 0 0 1 0 0 0 0 ...
..$ D12: num [1:31] 0 0 0 0 0 0 0 0 0 0 ...
..$ D13: num [1:31] 0 0 0 0 0 0 0 0 0 0 ...
$ skills : Named chr [1:13] "Possesses understanding of" __truncated__ ...
..- attr(*, "names")=chr [1:13] "N1" "N2" "N3" "A4" ...
George, A. C., & Robitzsch, A. (2014). Multiple group cognitive diagnosis models, with an emphasis on differential item functioning. Psychological Test and Assessment Modeling, 56(4), 405-432.
George, A. C., & Robitzsch, A. (2015) Cognitive diagnosis models in R: A didactic. The Quantitative Methods for Psychology, 11, 189-205.
George, A. C., & Robitzsch, A. (2018). Focusing on interactions between content and cognition: A new perspective on gender differences in mathematical sub-competencies. Applied Measurement in Education, 31(1), 79-97.
Sedat, S. E. N., & Arican, M. (2015). A diagnostic comparison of Turkish and Korean students' Mathematics performances on the TIMSS 2011 assessment. Journal of Measurement and Evaluation in Education and Psychology, 6(2), 238-253.
Computes the variance of a nonlinear parameter using the delta method.
deltaMethod(derived.pars, est, Sigma, h=1e-05)
deltaMethod(derived.pars, est, Sigma, h=1e-05)
derived.pars |
Vector of derived parameters written in R formula framework (see Examples). |
est |
Vector of parameter estimates |
Sigma |
Covariance matrix of parameters |
h |
Numerical differentiation parameter |
coef |
Vector of nonlinear parameters |
vcov |
Covariance matrix of nonlinear parameters |
se |
Vector of standard errors |
A |
First derivative of nonlinear transformation |
univarTest |
Data frame containing univariate summary of nonlinear parameters |
WaldTest |
Multivariate parameter test for nonlinear parameter |
See car::deltaMethod
or msm::deltamethod
.
############################################################################# # EXAMPLE 1: Nonlinear parameter ############################################################################# #-- parameter estimate est <- c( 510.67, 102.57) names(est) <- c("mu", "sigma") #-- covariance matrix Sigma <- matrix( c(5.83, 0.45, 0.45, 3.21 ), nrow=2, ncol=2 ) colnames(Sigma) <- rownames(Sigma) <- names(est) #-- define derived nonlinear parameters derived.pars <- list( "d"=~ I( ( mu - 508 ) / sigma ), "dsig"=~ I( sigma / 100 - 1) ) #*** apply delta method res <- CDM::deltaMethod( derived.pars, est, Sigma ) res
############################################################################# # EXAMPLE 1: Nonlinear parameter ############################################################################# #-- parameter estimate est <- c( 510.67, 102.57) names(est) <- c("mu", "sigma") #-- covariance matrix Sigma <- matrix( c(5.83, 0.45, 0.45, 3.21 ), nrow=2, ncol=2 ) colnames(Sigma) <- rownames(Sigma) <- names(est) #-- define derived nonlinear parameters derived.pars <- list( "d"=~ I( ( mu - 508 ) / sigma ), "dsig"=~ I( sigma / 100 - 1) ) #*** apply delta method res <- CDM::deltaMethod( derived.pars, est, Sigma ) res
din
provides parameter estimation for cognitive
diagnosis models of the types “DINA”, “DINO” and “mixed DINA
and DINO”.
din(data, q.matrix, skillclasses=NULL, conv.crit=0.001, dev.crit=10^(-5), maxit=500, constraint.guess=NULL, constraint.slip=NULL, guess.init=rep(0.2, ncol(data)), slip.init=guess.init, guess.equal=FALSE, slip.equal=FALSE, zeroprob.skillclasses=NULL, weights=rep(1, nrow(data)), rule="DINA", wgt.overrelax=0, wgtest.overrelax=FALSE, param.history=FALSE, seed=0, progress=TRUE, guess.min=0, slip.min=0, guess.max=1, slip.max=1) ## S3 method for class 'din' print(x, ...)
din(data, q.matrix, skillclasses=NULL, conv.crit=0.001, dev.crit=10^(-5), maxit=500, constraint.guess=NULL, constraint.slip=NULL, guess.init=rep(0.2, ncol(data)), slip.init=guess.init, guess.equal=FALSE, slip.equal=FALSE, zeroprob.skillclasses=NULL, weights=rep(1, nrow(data)), rule="DINA", wgt.overrelax=0, wgtest.overrelax=FALSE, param.history=FALSE, seed=0, progress=TRUE, guess.min=0, slip.min=0, guess.max=1, slip.max=1) ## S3 method for class 'din' print(x, ...)
data |
A required |
q.matrix |
A required binary |
skillclasses |
An optional matrix for determining the skill space.
The argument can be used if a user wants less than |
conv.crit |
A numeric which defines the termination criterion of iterations in the parameter estimation process. Iteration ends if the maximal change in parameter estimates is below this value. |
dev.crit |
A numeric value which defines the termination criterion of iterations in relative change in deviance. |
maxit |
An integer which defines the maximum number of iterations in the estimation process. |
constraint.guess |
An optional matrix of fixed guessing parameters. The first column of this matrix indicates the numbers of the items whose guessing parameters are fixed and the second column the values the guessing parameters are fixed to. |
constraint.slip |
An optional matrix of fixed slipping parameters. The first column of this matrix indicates the numbers of the items whose slipping parameters are fixed and the second column the values the slipping parameters are fixed to. |
guess.init |
An optional initial vector of guessing parameters. Guessing parameters are bounded between 0 and 1. |
slip.init |
An optional initial vector of slipping parameters. Slipping parameters are bounded between 0 and 1. |
guess.equal |
An optional logical indicating if all guessing parameters
are equal to each other. Default is |
slip.equal |
An optional logical indicating if all slipping parameters
are equal to each other. Default is |
zeroprob.skillclasses |
An optional vector of integers which indicates
which skill classes should have zero probability. Default is |
weights |
An optional vector of weights for the response pattern. Non-integer weights allow for different sampling schemes. |
rule |
An optional character string or vector of character strings
specifying the model rule that is used. The character strings must be
of |
wgt.overrelax |
A parameter which is relevant when an overrelaxation algorithm is used |
wgtest.overrelax |
A logical which indicates if the overrelexation parameter being estimated during iterations |
param.history |
A logical which indicates if the parameter history during
iterations should be saved. The default is |
seed |
Simulation seed for initial parameters. A value of zero corresponds
to deterministic starting values, an integer value different from
zero to random initial values with |
progress |
An optional logical indicating whether the function should print the progress of iteration in the estimation process. |
guess.min |
Minimum value of guessing parameters to be estimated. |
slip.min |
Minimum value of slipping parameters to be estimated. |
guess.max |
Maximum value of guessing parameters to be estimated. |
slip.max |
Maximum value of slipping parameters to be estimated. |
x |
Object of class |
... |
Further arguments to be passed |
In the CDM DINA (deterministic-input, noisy-and-gate; de la Torre &
Douglas, 2004) and DINO (deterministic-input, noisy-or-gate; Templin &
Henson, 2006) models endorsement probabilities are modeled
based on guessing and slipping parameters, given the different skill
classes. The probability of respondent (or corresponding respondents class
)
for solving item
is calculated as a function of the
respondent's latent response
and the guessing and slipping rates
and
for item
conditional on the respondent's skill class
:
The respondent's latent response (class) is a binary number,
0 or 1, where 1 indicates presence of all (
rule="DINO"
)
or at least one (rule="DINO"
) required skill(s) for
item , respectively.
DINA and DINO parameter estimation is performed by maximization of the marginal likelihood of the data. The a priori distribution of the skill vectors is a uniform distribution. The implementation follows the EM algorithm by de la Torre (2009).
The function din
returns an object of the class
din
(see ‘Value’), for which plot
,
print
, and summary
methods are provided;
plot.din
, print.din
, and
summary.din
, respectively.
coef |
Estimated model parameters. Note that only freely estimated parameters are included. |
item |
A data frame giving for each item condensation rule, the estimated guessing and slipping parameters and their standard errors. All entries are rounded to 3 digits. |
guess |
A data frame giving the estimated guessing parameters and their standard errors for each item. |
slip |
A data frame giving the estimated slipping parameters and their standard errors for each item. |
IDI |
A matrix giving the item discrimination
index (IDI; Lee, de la Torre & Park, 2012) for each item
where a high IDI corresponds to good test items
which have both low guessing and slipping rates. Note that
a negative IDI indicates violation of the monotonicity condition
|
itemfit.rmsea |
The RMSEA item fit index (see |
mean.rmsea |
Mean of RMSEA item fit indexes. |
loglike |
A numeric giving the value of the maximized log likelihood. |
AIC |
A numeric giving the AIC value of the model. |
BIC |
A numeric giving the BIC value of the model. |
Npars |
Number of estimated parameters |
posterior |
A matrix given the posterior skill distribution
for all respondents. The nth row of the matrix gives the probabilities for
respondent n to possess any of the |
like |
A matrix giving the values of the maximized likelihood for all respondents. |
data |
The input matrix of binary response data. |
q.matrix |
The input matrix of the required attributes. |
pattern |
A matrix giving the skill classes leading to highest endorsement
probability for the respective response pattern ( |
attribute.patt |
A data frame giving the estimated occurrence probabilities of the skill classes and the expected frequency of the attribute classes given the model. |
skill.patt |
A matrix given the population prevalences of the skills. |
subj.pattern |
A vector of strings indicating the item response pattern for each subject. |
attribute.patt.splitted |
A dataframe giving the skill class of the respondents. |
display |
A character giving the model specified under
|
item.patt.split |
A matrix giving the splitted response pattern. |
item.patt.freq |
A numeric vector given the frequencies of the response
pattern in |
seed |
Used simulation seed for initial parameters |
partable |
Parameter table which is used for |
vcov.derived |
Design matrix for extended set of parameters in
|
converged |
Logical indicating whether convergence was achieved. |
control |
Optimization parameters used in estimation |
The calculation of standard errors using sampling weights which represent multistage sampling schemes is not correct. Please use replication methods (like Jackknife) instead.
de la Torre, J. (2009). DINA model parameter estimation: A didactic. Journal of Educational and Behavioral Statistics, 34, 115–130.
de la Torre, J., & Douglas, J. (2004). Higher-order latent trait models for cognitive diagnosis. Psychometrika, 69, 333–353.
Lee, Y.-S., de la Torre, J., & Park, Y. S. (2012). Relationships between cognitive diagnosis, CTT, and IRT indices: An empirical investigation. Asia Pacific Educational Research, 13, 333-345.
Rupp, A. A., Templin, J., & Henson, R. A. (2010). Diagnostic Measurement: Theory, Methods, and Applications. New York: The Guilford Press.
Templin, J., & Henson, R. (2006). Measurement of psychological disorders using cognitive diagnosis models. Psychological Methods, 11, 287–305.
plot.din
, the S3 method for plotting objects of
the class din
; print.din
, the S3 method
for printing objects of the class din
;
summary.din
, the S3 method for summarizing objects
of the class din
, which creates objects of the class
summary.din
; din
, the main function for
DINA and DINO parameter estimation, which creates objects of the class
din
.
See the gdina
function for the estimation of
the generalized DINA (GDINA) model.
For assessment of model fit see modelfit.cor.din
and
anova.din
.
See itemfit.sx2
for item fit statistics.
See discrim.index
for computing discrimination indices.
See also CDM-package
for general
information about this package.
See the NPCD::JMLE
function in the NPCD package for
joint maximum likelihood estimation
of the DINA, DINO and NIDA model.
See the dina::DINA_Gibbs
function in the dina
package for MCMC based estimation of the DINA model.
############################################################################# # EXAMPLE 1: Examples based on dataset fractions.subtraction.data ############################################################################# ## dataset fractions.subtraction.data and corresponding Q-Matrix head(fraction.subtraction.data) fraction.subtraction.qmatrix ## Misspecification in parameter specification for method CDM::din() ## leads to warnings and terminates estimation procedure. E.g., # See Q-Matrix specification fractions.dina.warning1 <- CDM::din(data=fraction.subtraction.data, q.matrix=t(fraction.subtraction.qmatrix)) # See guess.init specification fractions.dina.warning2 <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, guess.init=rep(1.2, ncol(fraction.subtraction.data))) # See rule specification fractions.dina.warning3 <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, rule=c(rep("DINA", 10), rep("DINO", 9))) ## Parameter estimation of DINA model # rule="DINA" is default fractions.dina <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, rule="DINA") attributes(fractions.dina) str(fractions.dina) ## For instance assessing the guessing parameters through ## assignment fractions.dina$guess ## corresponding summaries, including IDI, ## most frequent skill classes and information ## criteria AIC and BIC summary(fractions.dina) ## In particular, assessing detailed summary through assignment detailed.summary.fs <- summary(fractions.dina) str(detailed.summary.fs) ## Item discrimination index of item 8 is too low. This is also ## visualized in the first plot plot(fractions.dina) ## The reason therefore is a high guessing parameter round(fractions.dina$guess[,1], 2) ## Estimate DINA model with different random initial parameters using seed=1345 fractions.dina1 <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, rule="DINA", seed=1345) ## Fix the guessing parameters of items 5, 8 and 9 equal to .20 # define a constraint.guess matrix constraint.guess <- matrix(c(5,8,9, rep(0.2, 3)), ncol=2) fractions.dina.fixed <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, constraint.guess=constraint.guess) ## The second plot shows the expected (MAP) and observed skill ## probabilities. The third plot visualizes the skill class ## occurrence probabilities; Only the 'top.n.skill.classes' most frequent ## skill classes are labeled; it is obvious that the skill class '11111111' ## (all skills are mastered) is the most probable in this population. ## The fourth plot shows the skill probabilities conditional on response ## patterns; in this population the skills 3 and 6 seem to be ## mastered easier than the others. The fourth plot shows the ## skill probabilities conditional on a specified response ## pattern; it is shown whether a skill is mastered (above ## .5+'uncertainty') unclassifiable (within the boundaries) or ## not mastered (below .5-'uncertainty'). In this case, the ## 527th respondent was chosen; if no response pattern is ## specified, the plot will not be shown (of course) pattern <- paste(fraction.subtraction.data[527, ], collapse="") plot(fractions.dina, pattern=pattern, display.nr=4) #uncertainty=0.1, top.n.skill.classes=6 are default plot(fractions.dina.fixed, uncertainty=0.1, top.n.skill.classes=6, pattern=pattern) ## Not run: ############################################################################# # EXAMPLE 2: Examples based on dataset sim.dina ############################################################################# # DINA Model d1 <- CDM::din(sim.dina, q.matr=sim.qmatrix, rule="DINA", conv.crit=0.01, maxit=500, progress=TRUE) summary(d1) # DINA model with hierarchical skill classes (Hierarchical DINA model) # 1st step: estimate an initial full model to look at the indexing # of skill classes d0 <- CDM::din(sim.dina, q.matr=sim.qmatrix, maxit=1) d0$attribute.patt.splitted # [,1] [,2] [,3] # [1,] 0 0 0 # [2,] 1 0 0 # [3,] 0 1 0 # [4,] 0 0 1 # [5,] 1 1 0 # [6,] 1 0 1 # [7,] 0 1 1 # [8,] 1 1 1 # # In this example, following hierarchical skill classes are only allowed: # 000, 001, 011, 111 # We define therefore a vector of indices for skill classes with # zero probabilities (see entries in the rows of the matrix # d0$attribute.patt.splitted above) zeroprob.skillclasses <- c(2,3,5,6) # classes 100, 010, 110, 101 # estimate the hierarchical DINA model d1a <- CDM::din(sim.dina, q.matr=sim.qmatrix, zeroprob.skillclasses=zeroprob.skillclasses ) summary(d1a) # Mixed DINA and DINO Model d1b <- CDM::din(sim.dina, q.matr=sim.qmatrix, rule= c(rep("DINA", 7), rep("DINO", 2)), conv.crit=0.01, maxit=500, progress=FALSE) summary(d1b) # DINO Model d2 <- CDM::din(sim.dina, q.matr=sim.qmatrix, rule="DINO", conv.crit=0.01, maxit=500, progress=FALSE) summary(d2) # Comparison of DINA and DINO estimates lapply(list("guessing"=rbind("DINA"=d1$guess[,1], "DINO"=d2$guess[,1]), "slipping"=rbind("DINA"= d1$slip[,1], "DINO"=d2$slip[,1])), round, 2) # Comparison of the information criteria c("DINA"=d1$AIC, "MIXED"=d1b$AIC, "DINO"=d2$AIC) # following estimates: d1$coef # guessing and slipping parameter d1$guess # guessing parameter d1$slip # slipping parameter d1$skill.patt # probabilities for skills d1$attribute.patt # skill classes with probabilities d1$subj.pattern # pattern per subject # posterior probabilities for every response pattern d1$posterior # Equal guessing parameters d2a <- CDM::din( data=sim.dina, q.matrix=sim.qmatrix, guess.equal=TRUE, slip.equal=FALSE ) d2a$coef # Equal guessing and slipping parameters d2b <- CDM::din( data=sim.dina, q.matrix=sim.qmatrix, guess.equal=TRUE, slip.equal=TRUE ) d2b$coef ############################################################################# # EXAMPLE 3: Examples based on dataset sim.dino ############################################################################# # DINO Estimation d3 <- CDM::din(sim.dino, q.matr=sim.qmatrix, rule="DINO", conv.crit=0.005, progress=FALSE) # Mixed DINA and DINO Model d3b <- CDM::din(sim.dino, q.matr=sim.qmatrix, rule=c(rep("DINA", 4), rep("DINO", 5)), conv.crit=0.001, progress=FALSE) # DINA Estimation d4 <- CDM::din(sim.dino, q.matr=sim.qmatrix, rule="DINA", conv.crit=0.005, progress=FALSE) # Comparison of DINA and DINO estimates lapply(list("guessing"=rbind("DINO"=d3$guess[,1], "DINA"=d4$guess[,1]), "slipping"=rbind("DINO"=d3$slip[,1], "DINA"=d4$slip[,1])), round, 2) # Comparison of the information criteria c("DINO"=d3$AIC, "MIXED"=d3b$AIC, "DINA"=d4$AIC) ############################################################################# # EXAMPLE 4: Example estimation with weights based on dataset sim.dina ############################################################################# # Here, a weighted maximum likelihood estimation is used # This could be useful for survey data. # i.e. first 200 persons have weight 2, the other have weight 1 (weights <- c(rep(2, 200), rep(1, 200))) d5 <- CDM::din(sim.dina, sim.qmatrix, rule="DINA", conv.crit= 0.005, weights=weights, progress=FALSE) # Comparison of the information criteria c("DINA"=d1$AIC, "WEIGHTS"=d5$AIC) ############################################################################# # EXAMPLE 5: Example estimation within a balanced incomplete ## block (BIB) design generated on dataset sim.dina ############################################################################# # generate BIB data # The next example shows that the din function works for # (relatively arbitrary) missing value pattern # Here, a missing by design is generated in the dataset dinadat.bib sim.dina.bib <- sim.dina sim.dina.bib[1:100, 1:3] <- NA sim.dina.bib[101:300, 4:8] <- NA sim.dina.bib[301:400, c(1,2,9)] <- NA d6 <- CDM::din(sim.dina.bib, sim.qmatrix, rule="DINA", conv.crit=0.0005, weights=weights, maxit=200) d7 <- CDM::din(sim.dina.bib, sim.qmatrix, rule="DINO", conv.crit=0.005, weights=weights) # Comparison of DINA and DINO estimates lapply(list("guessing"=rbind("DINA"=d6$guess[,1], "DINO"=d7$guess[,1]), "slipping"=rbind("DINA"= d6$slip[,1], "DINO"=d7$slip[,1])), round, 2) ############################################################################# # EXAMPLE 6: DINA model with attribute hierarchy ############################################################################# set.seed(987) # assumed skill distribution: P(000)=P(100)=P(110)=P(111)=.245 and # "deviant pattern": P(010)=.02 K <- 3 # number of skills # define alpha alpha <- scan() 0 0 0 1 0 0 1 1 0 1 1 1 0 1 0 alpha <- matrix( alpha, length(alpha)/K, K, byrow=TRUE ) alpha <- alpha[ c( rep(1:4,each=245), rep(5,20) ), ] # define Q-matrix q.matrix <- scan() 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 q.matrix <- matrix( q.matrix, nrow=length(q.matrix)/K, ncol=K, byrow=TRUE ) # simulate DINA data dat <- CDM::sim.din( alpha=alpha, q.matrix=q.matrix )$dat #*** Model 1: estimate DINA model | no skill space restriction mod1 <- CDM::din( dat, q.matrix ) #*** Model 2: DINA model | hierarchy A2 > A3 B <- "A2 > A3" skill.names <- paste0("A",1:3) skillspace <- CDM::skillspace.hierarchy( B, skill.names )$skillspace.reduced mod2 <- CDM::din( dat, q.matrix, skillclasses=skillspace ) #*** Model 3: DINA model | linear hierarchy A1 > A2 > A3 # This is a misspecied model because due to P(010)=.02 the relation A1>A2 # does not hold. B <- "A1 > A2 A2 > A3" skill.names <- paste0("A",1:3) skillspace <- CDM::skillspace.hierarchy( B, skill.names )$skillspace.reduced mod3 <- CDM::din( dat, q.matrix, skillclasses=skillspace ) #*** Model 4: 2PL model in gdm mod4 <- CDM::gdm( dat, theta.k=seq(-5,5,len=21), decrease.increments=TRUE, skillspace="normal" ) summary(mod4) anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -7052.460 14104.92 29 14162.92 14305.24 0.9174 2 0.63211 ## 1 Model 1 -7052.001 14104.00 31 14166.00 14318.14 NA NA NA anova(mod2,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -7059.058 14118.12 27 14172.12 14304.63 13.19618 2 0.00136 ## 1 Model 1 -7052.460 14104.92 29 14162.92 14305.24 NA NA NA anova(mod2,mod4) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -7220.05 14440.10 24 14488.10 14605.89 335.1805 5 0 ## 1 Model 1 -7052.46 14104.92 29 14162.92 14305.24 NA NA NA # compare fit statistics summary( CDM::modelfit.cor.din( mod2 ) ) summary( CDM::modelfit.cor.din( mod4 ) ) ############################################################################# # EXAMPLE 7: Fitting the basic local independence model (BLIM) with din ############################################################################# library(pks) data(DoignonFalmagne7, package="pks") ## str(DoignonFalmagne7) ## $ K : int [1:9, 1:5] 0 1 0 1 1 1 1 1 1 0 ... ## ..- attr(*, "dimnames")=List of 2 ## .. ..$ : chr [1:9] "00000" "10000" "01000" "11000" ... ## .. ..$ : chr [1:5] "a" "b" "c" "d" ... ## $ N.R: Named int [1:32] 80 92 89 3 2 1 89 16 18 10 ... ## ..- attr(*, "names")=chr [1:32] "00000" "10000" "01000" "00100" ... # The idea is to fit the local independence model with the din function. # This can be accomplished by specifying a DINO model with # prespecified skill classes. # extract dataset dat <- as.numeric( unlist( sapply( names(DoignonFalmagne7$N.R), FUN=function( ll){ strsplit( ll, split="") } ) ) ) dat <- matrix( dat, ncol=5, byrow=TRUE ) colnames(dat) <- colnames(DoignonFalmagne7$K) rownames(dat) <- names(DoignonFalmagne7$N.R) # sample weights weights <- DoignonFalmagne7$N.R # define Q-matrix q.matrix <- t(DoignonFalmagne7$K) v1 <- colnames(q.matrix) <- paste0("S", colnames(q.matrix)) q.matrix <- q.matrix[, - 1] # remove S00000 # define skill classes SC <- ncol(q.matrix) skillclasses <- matrix( 0, nrow=SC+1, ncol=SC) colnames(skillclasses) <- colnames(q.matrix) rownames(skillclasses) <- v1 skillclasses[ cbind( 2:(SC+1), 1:SC ) ] <- 1 # estimate BLIM with din function mod1 <- CDM::din(data=dat, q.matrix=q.matrix, skillclasses=skillclasses, rule="DINO", weights=weights ) summary(mod1) ## Item parameters ## item guess slip IDI rmsea ## a a 0.158 0.162 0.680 0.011 ## b b 0.145 0.159 0.696 0.009 ## c c 0.008 0.181 0.811 0.001 ## d d 0.012 0.129 0.859 0.001 ## e e 0.025 0.146 0.828 0.007 # estimate basic local independence model with pks package mod2 <- pks::blim(K, N.R, method="ML") # maximum likelihood estimation by EM algorithm mod2 ## Error and guessing parameters ## beta eta ## a 0.164871 0.103065 ## b 0.163113 0.095074 ## c 0.188839 0.000004 ## d 0.079835 0.000003 ## e 0.088648 0.019910 ## End(Not run)
############################################################################# # EXAMPLE 1: Examples based on dataset fractions.subtraction.data ############################################################################# ## dataset fractions.subtraction.data and corresponding Q-Matrix head(fraction.subtraction.data) fraction.subtraction.qmatrix ## Misspecification in parameter specification for method CDM::din() ## leads to warnings and terminates estimation procedure. E.g., # See Q-Matrix specification fractions.dina.warning1 <- CDM::din(data=fraction.subtraction.data, q.matrix=t(fraction.subtraction.qmatrix)) # See guess.init specification fractions.dina.warning2 <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, guess.init=rep(1.2, ncol(fraction.subtraction.data))) # See rule specification fractions.dina.warning3 <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, rule=c(rep("DINA", 10), rep("DINO", 9))) ## Parameter estimation of DINA model # rule="DINA" is default fractions.dina <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, rule="DINA") attributes(fractions.dina) str(fractions.dina) ## For instance assessing the guessing parameters through ## assignment fractions.dina$guess ## corresponding summaries, including IDI, ## most frequent skill classes and information ## criteria AIC and BIC summary(fractions.dina) ## In particular, assessing detailed summary through assignment detailed.summary.fs <- summary(fractions.dina) str(detailed.summary.fs) ## Item discrimination index of item 8 is too low. This is also ## visualized in the first plot plot(fractions.dina) ## The reason therefore is a high guessing parameter round(fractions.dina$guess[,1], 2) ## Estimate DINA model with different random initial parameters using seed=1345 fractions.dina1 <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, rule="DINA", seed=1345) ## Fix the guessing parameters of items 5, 8 and 9 equal to .20 # define a constraint.guess matrix constraint.guess <- matrix(c(5,8,9, rep(0.2, 3)), ncol=2) fractions.dina.fixed <- CDM::din(data=fraction.subtraction.data, q.matrix=fraction.subtraction.qmatrix, constraint.guess=constraint.guess) ## The second plot shows the expected (MAP) and observed skill ## probabilities. The third plot visualizes the skill class ## occurrence probabilities; Only the 'top.n.skill.classes' most frequent ## skill classes are labeled; it is obvious that the skill class '11111111' ## (all skills are mastered) is the most probable in this population. ## The fourth plot shows the skill probabilities conditional on response ## patterns; in this population the skills 3 and 6 seem to be ## mastered easier than the others. The fourth plot shows the ## skill probabilities conditional on a specified response ## pattern; it is shown whether a skill is mastered (above ## .5+'uncertainty') unclassifiable (within the boundaries) or ## not mastered (below .5-'uncertainty'). In this case, the ## 527th respondent was chosen; if no response pattern is ## specified, the plot will not be shown (of course) pattern <- paste(fraction.subtraction.data[527, ], collapse="") plot(fractions.dina, pattern=pattern, display.nr=4) #uncertainty=0.1, top.n.skill.classes=6 are default plot(fractions.dina.fixed, uncertainty=0.1, top.n.skill.classes=6, pattern=pattern) ## Not run: ############################################################################# # EXAMPLE 2: Examples based on dataset sim.dina ############################################################################# # DINA Model d1 <- CDM::din(sim.dina, q.matr=sim.qmatrix, rule="DINA", conv.crit=0.01, maxit=500, progress=TRUE) summary(d1) # DINA model with hierarchical skill classes (Hierarchical DINA model) # 1st step: estimate an initial full model to look at the indexing # of skill classes d0 <- CDM::din(sim.dina, q.matr=sim.qmatrix, maxit=1) d0$attribute.patt.splitted # [,1] [,2] [,3] # [1,] 0 0 0 # [2,] 1 0 0 # [3,] 0 1 0 # [4,] 0 0 1 # [5,] 1 1 0 # [6,] 1 0 1 # [7,] 0 1 1 # [8,] 1 1 1 # # In this example, following hierarchical skill classes are only allowed: # 000, 001, 011, 111 # We define therefore a vector of indices for skill classes with # zero probabilities (see entries in the rows of the matrix # d0$attribute.patt.splitted above) zeroprob.skillclasses <- c(2,3,5,6) # classes 100, 010, 110, 101 # estimate the hierarchical DINA model d1a <- CDM::din(sim.dina, q.matr=sim.qmatrix, zeroprob.skillclasses=zeroprob.skillclasses ) summary(d1a) # Mixed DINA and DINO Model d1b <- CDM::din(sim.dina, q.matr=sim.qmatrix, rule= c(rep("DINA", 7), rep("DINO", 2)), conv.crit=0.01, maxit=500, progress=FALSE) summary(d1b) # DINO Model d2 <- CDM::din(sim.dina, q.matr=sim.qmatrix, rule="DINO", conv.crit=0.01, maxit=500, progress=FALSE) summary(d2) # Comparison of DINA and DINO estimates lapply(list("guessing"=rbind("DINA"=d1$guess[,1], "DINO"=d2$guess[,1]), "slipping"=rbind("DINA"= d1$slip[,1], "DINO"=d2$slip[,1])), round, 2) # Comparison of the information criteria c("DINA"=d1$AIC, "MIXED"=d1b$AIC, "DINO"=d2$AIC) # following estimates: d1$coef # guessing and slipping parameter d1$guess # guessing parameter d1$slip # slipping parameter d1$skill.patt # probabilities for skills d1$attribute.patt # skill classes with probabilities d1$subj.pattern # pattern per subject # posterior probabilities for every response pattern d1$posterior # Equal guessing parameters d2a <- CDM::din( data=sim.dina, q.matrix=sim.qmatrix, guess.equal=TRUE, slip.equal=FALSE ) d2a$coef # Equal guessing and slipping parameters d2b <- CDM::din( data=sim.dina, q.matrix=sim.qmatrix, guess.equal=TRUE, slip.equal=TRUE ) d2b$coef ############################################################################# # EXAMPLE 3: Examples based on dataset sim.dino ############################################################################# # DINO Estimation d3 <- CDM::din(sim.dino, q.matr=sim.qmatrix, rule="DINO", conv.crit=0.005, progress=FALSE) # Mixed DINA and DINO Model d3b <- CDM::din(sim.dino, q.matr=sim.qmatrix, rule=c(rep("DINA", 4), rep("DINO", 5)), conv.crit=0.001, progress=FALSE) # DINA Estimation d4 <- CDM::din(sim.dino, q.matr=sim.qmatrix, rule="DINA", conv.crit=0.005, progress=FALSE) # Comparison of DINA and DINO estimates lapply(list("guessing"=rbind("DINO"=d3$guess[,1], "DINA"=d4$guess[,1]), "slipping"=rbind("DINO"=d3$slip[,1], "DINA"=d4$slip[,1])), round, 2) # Comparison of the information criteria c("DINO"=d3$AIC, "MIXED"=d3b$AIC, "DINA"=d4$AIC) ############################################################################# # EXAMPLE 4: Example estimation with weights based on dataset sim.dina ############################################################################# # Here, a weighted maximum likelihood estimation is used # This could be useful for survey data. # i.e. first 200 persons have weight 2, the other have weight 1 (weights <- c(rep(2, 200), rep(1, 200))) d5 <- CDM::din(sim.dina, sim.qmatrix, rule="DINA", conv.crit= 0.005, weights=weights, progress=FALSE) # Comparison of the information criteria c("DINA"=d1$AIC, "WEIGHTS"=d5$AIC) ############################################################################# # EXAMPLE 5: Example estimation within a balanced incomplete ## block (BIB) design generated on dataset sim.dina ############################################################################# # generate BIB data # The next example shows that the din function works for # (relatively arbitrary) missing value pattern # Here, a missing by design is generated in the dataset dinadat.bib sim.dina.bib <- sim.dina sim.dina.bib[1:100, 1:3] <- NA sim.dina.bib[101:300, 4:8] <- NA sim.dina.bib[301:400, c(1,2,9)] <- NA d6 <- CDM::din(sim.dina.bib, sim.qmatrix, rule="DINA", conv.crit=0.0005, weights=weights, maxit=200) d7 <- CDM::din(sim.dina.bib, sim.qmatrix, rule="DINO", conv.crit=0.005, weights=weights) # Comparison of DINA and DINO estimates lapply(list("guessing"=rbind("DINA"=d6$guess[,1], "DINO"=d7$guess[,1]), "slipping"=rbind("DINA"= d6$slip[,1], "DINO"=d7$slip[,1])), round, 2) ############################################################################# # EXAMPLE 6: DINA model with attribute hierarchy ############################################################################# set.seed(987) # assumed skill distribution: P(000)=P(100)=P(110)=P(111)=.245 and # "deviant pattern": P(010)=.02 K <- 3 # number of skills # define alpha alpha <- scan() 0 0 0 1 0 0 1 1 0 1 1 1 0 1 0 alpha <- matrix( alpha, length(alpha)/K, K, byrow=TRUE ) alpha <- alpha[ c( rep(1:4,each=245), rep(5,20) ), ] # define Q-matrix q.matrix <- scan() 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 1 0 0 0 1 1 1 0 1 0 1 0 1 1 q.matrix <- matrix( q.matrix, nrow=length(q.matrix)/K, ncol=K, byrow=TRUE ) # simulate DINA data dat <- CDM::sim.din( alpha=alpha, q.matrix=q.matrix )$dat #*** Model 1: estimate DINA model | no skill space restriction mod1 <- CDM::din( dat, q.matrix ) #*** Model 2: DINA model | hierarchy A2 > A3 B <- "A2 > A3" skill.names <- paste0("A",1:3) skillspace <- CDM::skillspace.hierarchy( B, skill.names )$skillspace.reduced mod2 <- CDM::din( dat, q.matrix, skillclasses=skillspace ) #*** Model 3: DINA model | linear hierarchy A1 > A2 > A3 # This is a misspecied model because due to P(010)=.02 the relation A1>A2 # does not hold. B <- "A1 > A2 A2 > A3" skill.names <- paste0("A",1:3) skillspace <- CDM::skillspace.hierarchy( B, skill.names )$skillspace.reduced mod3 <- CDM::din( dat, q.matrix, skillclasses=skillspace ) #*** Model 4: 2PL model in gdm mod4 <- CDM::gdm( dat, theta.k=seq(-5,5,len=21), decrease.increments=TRUE, skillspace="normal" ) summary(mod4) anova(mod1,mod2) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -7052.460 14104.92 29 14162.92 14305.24 0.9174 2 0.63211 ## 1 Model 1 -7052.001 14104.00 31 14166.00 14318.14 NA NA NA anova(mod2,mod3) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -7059.058 14118.12 27 14172.12 14304.63 13.19618 2 0.00136 ## 1 Model 1 -7052.460 14104.92 29 14162.92 14305.24 NA NA NA anova(mod2,mod4) ## Model loglike Deviance Npars AIC BIC Chisq df p ## 2 Model 2 -7220.05 14440.10 24 14488.10 14605.89 335.1805 5 0 ## 1 Model 1 -7052.46 14104.92 29 14162.92 14305.24 NA NA NA # compare fit statistics summary( CDM::modelfit.cor.din( mod2 ) ) summary( CDM::modelfit.cor.din( mod4 ) ) ############################################################################# # EXAMPLE 7: Fitting the basic local independence model (BLIM) with din ############################################################################# library(pks) data(DoignonFalmagne7, package="pks") ## str(DoignonFalmagne7) ## $ K : int [1:9, 1:5] 0 1 0 1 1 1 1 1 1 0 ... ## ..- attr(*, "dimnames")=List of 2 ## .. ..$ : chr [1:9] "00000" "10000" "01000" "11000" ... ## .. ..$ : chr [1:5] "a" "b" "c" "d" ... ## $ N.R: Named int [1:32] 80 92 89 3 2 1 89 16 18 10 ... ## ..- attr(*, "names")=chr [1:32] "00000" "10000" "01000" "00100" ... # The idea is to fit the local independence model with the din function. # This can be accomplished by specifying a DINO model with # prespecified skill classes. # extract dataset dat <- as.numeric( unlist( sapply( names(DoignonFalmagne7$N.R), FUN=function( ll){ strsplit( ll, split="") } ) ) ) dat <- matrix( dat, ncol=5, byrow=TRUE ) colnames(dat) <- colnames(DoignonFalmagne7$K) rownames(dat) <- names(DoignonFalmagne7$N.R) # sample weights weights <- DoignonFalmagne7$N.R # define Q-matrix q.matrix <- t(DoignonFalmagne7$K) v1 <- colnames(q.matrix) <- paste0("S", colnames(q.matrix)) q.matrix <- q.matrix[, - 1] # remove S00000 # define skill classes SC <- ncol(q.matrix) skillclasses <- matrix( 0, nrow=SC+1, ncol=SC) colnames(skillclasses) <- colnames(q.matrix) rownames(skillclasses) <- v1 skillclasses[ cbind( 2:(SC+1), 1:SC ) ] <- 1 # estimate BLIM with din function mod1 <- CDM::din(data=dat, q.matrix=q.matrix, skillclasses=skillclasses, rule="DINO", weights=weights ) summary(mod1) ## Item parameters ## item guess slip IDI rmsea ## a a 0.158 0.162 0.680 0.011 ## b b 0.145 0.159 0.696 0.009 ## c c 0.008 0.181 0.811 0.001 ## d d 0.012 0.129 0.859 0.001 ## e e 0.025 0.146 0.828 0.007 # estimate basic local independence model with pks package mod2 <- pks::blim(K, N.R, method="ML") # maximum likelihood estimation by EM algorithm mod2 ## Error and guessing parameters ## beta eta ## a 0.164871 0.103065 ## b 0.163113 0.095074 ## c 0.188839 0.000004 ## d 0.079835 0.000003 ## e 0.088648 0.019910 ## End(Not run)
Check necessary and sufficient identifiability conditions of the DINA model according Gu and Xu (xxxx) for a given Q-matrix.
din_identifiability(q.matrix) ## S3 method for class 'din_identifiability' summary(object, ...)
din_identifiability(q.matrix) ## S3 method for class 'din_identifiability' summary(object, ...)
q.matrix |
Q-matrix |
object |
Object of class |
... |
Further arguments to be passed |
List with values
dina_identified |
Logical indicating whether the DINA model is identified |
index_single |
Condition 1: vector of logicals indicating whether skills are measured by at least one item with a single loading |
is_three_items |
Condition 2: vector of logicals indicating whether skills are measured by at least three items |
submat_distinct |
Condition 3: logical indicating whether all columns
of the submatrix |
Gu, Y., & Xu, G. (2018). The sufficient and necessary condition for the identifiability and estimability of the DINA model. Psychometrika, xx(xx), xxx-xxx. https://doi.org/10.1007/s11336-018-9619-8
See din.equivalent.class
for equivalent (i.e., non-distinguishable)
skill classes in the DINA model.
############################################################################# # EXAMPLE 1: Some examples of Gu and Xu (2019) ############################################################################# #* Matrix 1 in Equation (5) of Gu & Xu (2019) Q1 <- diag(3) Q2 <- matrix( scan(text="1 1 0 1 0 1 1 1 1 1 1 1"), ncol=3, byrow=TRUE) Q <- rbind(Q1, Q2) res <- CDM::din_identifiability(q.matrix=Q) summary(res) # remove two items res <- CDM::din_identifiability(q.matrix=Q[-c(2,5),]) summary(res) #* Matrix 1 in Equation (6) of Gu & Xu (2019) Q1 <- diag(3) Q2 <- matrix( c(1,1,1), nrow=4, ncol=3, byrow=TRUE) Q <- rbind(Q1, Q2) res <- CDM::din_identifiability(q.matrix=Q) summary(res)
############################################################################# # EXAMPLE 1: Some examples of Gu and Xu (2019) ############################################################################# #* Matrix 1 in Equation (5) of Gu & Xu (2019) Q1 <- diag(3) Q2 <- matrix( scan(text="1 1 0 1 0 1 1 1 1 1 1 1"), ncol=3, byrow=TRUE) Q <- rbind(Q1, Q2) res <- CDM::din_identifiability(q.matrix=Q) summary(res) # remove two items res <- CDM::din_identifiability(q.matrix=Q[-c(2,5),]) summary(res) #* Matrix 1 in Equation (6) of Gu & Xu (2019) Q1 <- diag(3) Q2 <- matrix( c(1,1,1), nrow=4, ncol=3, byrow=TRUE) Q <- rbind(Q1, Q2) res <- CDM::din_identifiability(q.matrix=Q) summary(res)
This function allows the estimation of the mixed DINA/DINO model by joint maximum likelihood and a deterministic classification based on ideal latent responses.
din.deterministic(dat, q.matrix, rule="DINA", method="JML", conv=0.001, maxiter=300, increment.factor=1.05, progress=TRUE)
din.deterministic(dat, q.matrix, rule="DINA", method="JML", conv=0.001, maxiter=300, increment.factor=1.05, progress=TRUE)
dat |
Data frame of dichotomous item responses |
q.matrix |
Q-matrix with binary entries (see |
rule |
The condensation rule (see |
method |
Estimation method. The default is joint maximum likelihood estimation
( |
conv |
Convergence criterion for guessing and slipping parameters |
maxiter |
Maximum number of iterations |
increment.factor |
A numeric value of at least one which could help to improve convergence behavior and decreases parameter increments in every iteration. This option is disabled by setting this argument to 1. |
progress |
An optional logical indicating whether the function should print the progress of iteration in the estimation process. |
A list with following entries
attr.est |
Estimated attribute patterns |
criterion |
Criterion of the classification function. For joint maximum likelihood it is the deviance. |
guess |
Estimated guessing parameters |
slip |
Estimated slipping parameters |
prederror |
Average individual prediction error |
q.matrix |
Used Q-matrix |
dat |
Used data frame |
Chiu, C. Y., & Douglas, J. (2013). A nonparametric approach to cognitive diagnosis by proximity to ideal response patterns. Journal of Classification, 30, 225-250.
For estimating the mixed DINA/DINO model using marginal maximum
likelihood estimation see din
.
See also the NPCD::JMLE
function in the NPCD package for
joint maximum likelihood estimation of the DINA or the DINO model.
############################################################################# # EXAMPLE 1: 13 items and 3 attributes ############################################################################# set.seed(679) N <- 3000 # specify true Q-matrix q.matrix <- matrix( 0, 13, 3 ) q.matrix[1:3,1] <- 1 q.matrix[4:6,2] <- 1 q.matrix[7:9,3] <- 1 q.matrix[10,] <- c(1,1,0) q.matrix[11,] <- c(1,0,1) q.matrix[12,] <- c(0,1,1) q.matrix[13,] <- c(1,1,1) q.matrix <- rbind( q.matrix, q.matrix ) colnames(q.matrix) <- paste0("Attr",1:ncol(q.matrix)) # simulate data according to the DINA model dat <- CDM::sim.din( N=N, q.matrix)$dat # Joint maximum likelihood estimation (the default: method="JML") res1 <- CDM::din.deterministic( dat, q.matrix ) # Adaptive estimation of guessing and slipping parameters res <- CDM::din.deterministic( dat, q.matrix, method="adaptive" ) # Classification using Hamming distance res <- CDM::din.deterministic( dat, q.matrix, method="hamming" ) # Classification using weighted Hamming distance res <- CDM::din.deterministic( dat, q.matrix, method="weighted.hamming" ) ## Not run: #********* load NPCD library for JML estimation library(NPCD) # DINA model res <- NPCD::JMLE( Y=dat[1:100,], Q=q.matrix, model="DINA" ) as.data.frame(res$par.est ) # item parameters res$alpha.est # skill classifications # RRUM model res <- NPCD::JMLE( Y=dat[1:100,], Q=q.matrix, model="RRUM" ) as.data.frame(res$par.est ) ## End(Not run)
############################################################################# # EXAMPLE 1: 13 items and 3 attributes ############################################################################# set.seed(679) N <- 3000 # specify true Q-matrix q.matrix <- matrix( 0, 13, 3 ) q.matrix[1:3,1] <- 1 q.matrix[4:6,2] <- 1 q.matrix[7:9,3] <- 1 q.matrix[10,] <- c(1,1,0) q.matrix[11,] <- c(1,0,1) q.matrix[12,] <- c(0,1,1) q.matrix[13,] <- c(1,1,1) q.matrix <- rbind( q.matrix, q.matrix ) colnames(q.matrix) <- paste0("Attr",1:ncol(q.matrix)) # simulate data according to the DINA model dat <- CDM::sim.din( N=N, q.matrix)$dat # Joint maximum likelihood estimation (the default: method="JML") res1 <- CDM::din.deterministic( dat, q.matrix ) # Adaptive estimation of guessing and slipping parameters res <- CDM::din.deterministic( dat, q.matrix, method="adaptive" ) # Classification using Hamming distance res <- CDM::din.deterministic( dat, q.matrix, method="hamming" ) # Classification using weighted Hamming distance res <- CDM::din.deterministic( dat, q.matrix, method="weighted.hamming" ) ## Not run: #********* load NPCD library for JML estimation library(NPCD) # DINA model res <- NPCD::JMLE( Y=dat[1:100,], Q=q.matrix, model="DINA" ) as.data.frame(res$par.est ) # item parameters res$alpha.est # skill classifications # RRUM model res <- NPCD::JMLE( Y=dat[1:100,], Q=q.matrix, model="RRUM" ) as.data.frame(res$par.est ) ## End(Not run)
This function computes indistinguishable skill classes for the DINA and DINO model (Gross & George, 2014; Zhang, DeCarlo & Ying, 2013).
din.equivalent.class(q.matrix, rule="DINA")
din.equivalent.class(q.matrix, rule="DINA")
q.matrix |
The Q-matrix (see |
rule |
The condensation rule. If it is a string, then the rule applies
to all items. If it is a vector, then for each item |
A list with following entries:
latent.responseM |
Matrix of latent responses |
latent.response |
Latent responses represented as a string |
S |
Matrix containing all skill classes |
gini |
Gini coefficient of the frequency distribution of identifiable skill classes which result in the same latent response |
skillclasses |
Data frame with skill class ( |
Gross, J. & George, A. C. (2014). On prerequisite relations between attributes in noncompensatory diagnostic classification. Methodology, 10(3), 100-107.
Zhang, S. S., DeCarlo, L. T., & Ying, Z. (2013). Non-identifiability, equivalence classes, and attribute-specific classification in Q-matrix based cognitive diagnosis models. arXiv preprint, arXiv:1303.0426.
############################################################################# # EXAMPLE 1: Equivalency classes for DINA model for fraction subtraction data ############################################################################# #-- DINA models data(data.fraction2, package="CDM") # first Q-matrix Q1 <- data.fraction2$q.matrix1 m1 <- CDM::din.equivalent.class( q.matrix=Q1, rule="DINA" ) ## 8 Skill classes | 5 distinguishable skill classes | Gini coefficient=0.3 # second Q-matrix Q1 <- data.fraction2$q.matrix2 m1 <- CDM::din.equivalent.class( q.matrix=Q1, rule="DINA" ) ## 32 Skill classes | 9 distinguishable skill classes | Gini coefficient=0.5 # third Q-matrix Q1 <- data.fraction2$q.matrix3 m1 <- CDM::din.equivalent.class( q.matrix=Q1, rule="DINA" ) ## 8 Skill classes | 8 distinguishable skill classes | Gini coefficient=0 # original fraction subtraction data m1 <- CDM::din.equivalent.class( q.matrix=CDM::fraction.subtraction.qmatrix, rule="DINA") ## 256 Skill classes | 58 distinguishable skill classes | Gini coefficient=0.659
############################################################################# # EXAMPLE 1: Equivalency classes for DINA model for fraction subtraction data ############################################################################# #-- DINA models data(data.fraction2, package="CDM") # first Q-matrix Q1 <- data.fraction2$q.matrix1 m1 <- CDM::din.equivalent.class( q.matrix=Q1, rule="DINA" ) ## 8 Skill classes | 5 distinguishable skill classes | Gini coefficient=0.3 # second Q-matrix Q1 <- data.fraction2$q.matrix2 m1 <- CDM::din.equivalent.class( q.matrix=Q1, rule="DINA" ) ## 32 Skill classes | 9 distinguishable skill classes | Gini coefficient=0.5 # third Q-matrix Q1 <- data.fraction2$q.matrix3 m1 <- CDM::din.equivalent.class( q.matrix=Q1, rule="DINA" ) ## 8 Skill classes | 8 distinguishable skill classes | Gini coefficient=0 # original fraction subtraction data m1 <- CDM::din.equivalent.class( q.matrix=CDM::fraction.subtraction.qmatrix, rule="DINA") ## 256 Skill classes | 58 distinguishable skill classes | Gini coefficient=0.659
Q-matrix entries can be modified by the Q-matrix validation method
of de la Torre (2008). After estimating a mixed DINA/DINO model
using the din
function, item parameters and the item
discrimination parameters are recalculated. Q-matrix rows
are determined by maximizing the estimated item discrimination index
.
din.validate.qmatrix(object, IDI_diff=.02, print=TRUE)
din.validate.qmatrix(object, IDI_diff=.02, print=TRUE)
object |
Object of class |
IDI_diff |
Minimum difference in IDI values for choosing a new Q-matrix vector |
print |
An optional logical indicating whether the function should print the progress of iteration in the estimation process. |
A list with following entries:
coef.modified |
Estimated parameters by applying Q-matrix modifications |
coef.modified.short |
A shortened matrix of |
q.matrix.prop |
The proposed Q-matrix by Q-matrix validation. |
Chiu, C. Y. (2013). Statistical refinement of the Q-matrix in cognitive diagnosis. Applied Psychological Measurement, 37, 598-618.
de la Torre, J. (2008). An empirically based method of Q-matrix validation for the DINA model: Development and applications. Journal of Educational Measurement, 45, 343-362.
The mixed DINA/DINO model can be estimated with din
.
See Chiu (2013) for an alternative estimation approach based on
residual sum of squares which is implemented
NPCD::Qrefine
function in the NPCD package.
See the GDINA::Qval
function in the
GDINA package for extended functionality.
############################################################################# # EXAMPLE 1: Detection of a mis-specified Q-matrix ############################################################################# set.seed(679) # specify true Q-matrix q.matrix <- matrix( 0, 12, 3 ) q.matrix[1:3,1] <- 1 q.matrix[4:6,2] <- 1 q.matrix[7:9,3] <- 1 q.matrix[10,] <- c(1,1,0) q.matrix[11,] <- c(1,0,1) q.matrix[12,] <- c(0,1,1) # simulate data dat <- CDM::sim.din( N=4000, q.matrix)$dat # incorrectly modify Q-matrix rows 1 and 10 Q1 <- q.matrix Q1[1,] <- c(1,1,0) Q1[10,] <- c(1,0,0) # estimate DINA model mod <- CDM::din( dat, q.matr=Q1, rule="DINA") # apply Q-matrix validation res <- CDM::din.validate.qmatrix( mod ) ## item itemindex Skill1 Skill2 Skill3 guess slip IDI qmatrix.orig IDI.orig delta.IDI max.IDI ## I001 1 1 0 0 0.309 0.251 0.440 0 0.431 0.009 0.440 ## I010 10 1 1 0 0.235 0.329 0.437 0 0.320 0.117 0.437 ## I010 10 1 1 1 0.296 0.301 0.403 0 0.320 0.083 0.437 ## ## Proposed Q-matrix: ## ## Skill1 Skill2 Skill3 ## Item1 1 0 0 ## Item2 1 0 0 ## Item3 1 0 0 ## Item4 0 1 0 ## Item5 0 1 0 ## Item6 0 1 0 ## Item7 0 0 1 ## Item8 0 0 1 ## Item9 0 0 1 ## Item10 1 1 0 ## Item11 1 0 1 ## Item12 0 1 1 ## Not run: #***************** # Q-matrix estimation ('Qrefine') in the NPCD package # See Chiu (2013, APM). #***************** library(NPCD) Qrefine.out <- NPCD::Qrefine( dat, Q1, gate="AND", max.ite=50) print(Qrefine.out) ## The modified Q-matrix ## Attribute 1 Attribute 2 Attribute 3 ## Item 1 1 0 0 ## Item 2 1 0 0 ## Item 3 1 0 0 ## Item 4 0 1 0 ## Item 5 0 1 0 ## Item 6 0 1 0 ## Item 7 0 0 1 ## Item 8 0 0 1 ## Item 9 0 0 1 ## Item 10 1 1 0 ## Item 11 1 0 1 ## Item 12 0 1 1 ## ## The modified entries ## Item Attribute ## [1,] 1 2 ## [2,] 10 2 plot(Qrefine.out) ## End(Not run)
############################################################################# # EXAMPLE 1: Detection of a mis-specified Q-matrix ############################################################################# set.seed(679) # specify true Q-matrix q.matrix <- matrix( 0, 12, 3 ) q.matrix[1:3,1] <- 1 q.matrix[4:6,2] <- 1 q.matrix[7:9,3] <- 1 q.matrix[10,] <- c(1,1,0) q.matrix[11,] <- c(1,0,1) q.matrix[12,] <- c(0,1,1) # simulate data dat <- CDM::sim.din( N=4000, q.matrix)$dat # incorrectly modify Q-matrix rows 1 and 10 Q1 <- q.matrix Q1[1,] <- c(1,1,0) Q1[10,] <- c(1,0,0) # estimate DINA model mod <- CDM::din( dat, q.matr=Q1, rule="DINA") # apply Q-matrix validation res <- CDM::din.validate.qmatrix( mod ) ## item itemindex Skill1 Skill2 Skill3 guess slip IDI qmatrix.orig IDI.orig delta.IDI max.IDI ## I001 1 1 0 0 0.309 0.251 0.440 0 0.431 0.009 0.440 ## I010 10 1 1 0 0.235 0.329 0.437 0 0.320 0.117 0.437 ## I010 10 1 1 1 0.296 0.301 0.403 0 0.320 0.083 0.437 ## ## Proposed Q-matrix: ## ## Skill1 Skill2 Skill3 ## Item1 1 0 0 ## Item2 1 0 0 ## Item3 1 0 0 ## Item4 0 1 0 ## Item5 0 1 0 ## Item6 0 1 0 ## Item7 0 0 1 ## Item8 0 0 1 ## Item9 0 0 1 ## Item10 1 1 0 ## Item11 1 0 1 ## Item12 0 1 1 ## Not run: #***************** # Q-matrix estimation ('Qrefine') in the NPCD package # See Chiu (2013, APM). #***************** library(NPCD) Qrefine.out <- NPCD::Qrefine( dat, Q1, gate="AND", max.ite=50) print(Qrefine.out) ## The modified Q-matrix ## Attribute 1 Attribute 2 Attribute 3 ## Item 1 1 0 0 ## Item 2 1 0 0 ## Item 3 1 0 0 ## Item 4 0 1 0 ## Item 5 0 1 0 ## Item 6 0 1 0 ## Item 7 0 0 1 ## Item 8 0 0 1 ## Item 9 0 0 1 ## Item 10 1 1 0 ## Item 11 1 0 1 ## Item 12 0 1 1 ## ## The modified entries ## Item Attribute ## [1,] 1 2 ## [2,] 10 2 plot(Qrefine.out) ## End(Not run)
Computes discrimination indices at the probability metric (de la Torre, 2008; Henson, DiBello & Stout, 2018).
discrim.index(object, ...) ## S3 method for class 'din' discrim.index(object, ...) ## S3 method for class 'gdina' discrim.index(object, ...) ## S3 method for class 'mcdina' discrim.index(object, ...) ## S3 method for class 'discrim.index' summary(object, file=NULL, digits=3, ...)
discrim.index(object, ...) ## S3 method for class 'din' discrim.index(object, ...) ## S3 method for class 'gdina' discrim.index(object, ...) ## S3 method for class 'mcdina' discrim.index(object, ...) ## S3 method for class 'discrim.index' summary(object, file=NULL, digits=3, ...)
object |
|
file |
Optional file name for a file in which the summary output should be sunk |
digits |
Number of digits for rounding |
... |
Further arguments to be passed |
If item possesses
categories, the item-attribute
specific discrimination for attribute
according to Henson et al. (2018) is defined as
where and
differ only
in attribute
. The index
can be found as the
value
discrim_item_attribute
. The test-level discrimination index
is defined as
and can be found
in discrim_test
.
According to de la Torre (2008) and de la Torre, Rossi and van der Ark (2018), the item discrimination index (IDI) is defined as
and can be found as idi
in the values list.
A list with following entries
discrim_item_attribute |
Discrimination indices |
idi |
Item discrimination index |
discrim_test |
Discrimination index at test level |
de la Torre, J. (2008). An empirically based method of Q-matrix validation
for the DINA model: Development and applications.
Journal of Educational Measurement, 45, 343-362.
http://dx.doi.org/10.1111/j.1745-3984.2008.00069.x
de la Torre, J., van der Ark, L. A., & Rossi, G. (2018). Analysis of clinical data from a cognitive diagnosis modeling framework. Measurement and Evaluation in Counseling and Development, 51(4), 281-296. https://doi.org/10.1080/07481756.2017.1327286
Henson, R., DiBello, L., & Stout, B. (2018). A generalized approach to defining item
discrimination for DCMs.
Measurement: Interdisciplinary Research and Perspectives, 16(1), 18-29.
http://dx.doi.org/10.1080/15366367.2018.1436855
See cdi.kli
for discrimination indices based on the
Kullback-Leibler information.
For a fitted model mod
in the GDINA package, discrimination indices can be
extracted by the method extract(mod,"discrim")
(GDINA::extract
).
## Not run: ############################################################################# # EXAMPLE 1: DINA and GDINA model ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") #-- fit GDINA and DINA model mod1 <- CDM::gdina( sim.dina, q.matrix=sim.qmatrix ) mod2 <- CDM::din( sim.dina, q.matrix=sim.qmatrix ) #-- compute discrimination indices dimod1 <- CDM::discrim.index(mod1) dimod2 <- CDM::discrim.index(mod2) summary(dimod1) summary(dimod2) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: DINA and GDINA model ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") #-- fit GDINA and DINA model mod1 <- CDM::gdina( sim.dina, q.matrix=sim.qmatrix ) mod2 <- CDM::din( sim.dina, q.matrix=sim.qmatrix ) #-- compute discrimination indices dimod1 <- CDM::discrim.index(mod1) dimod2 <- CDM::discrim.index(mod2) summary(dimod1) summary(dimod2) ## End(Not run)
Computes test-specific and item-specific entropy as test-diagnostic criteria of cognitive diagnostic models (Asparouhov & Muthen, 2014).
entropy.lca(object) ## S3 method for class 'entropy.lca' summary(object, digits=2, ...)
entropy.lca(object) ## S3 method for class 'entropy.lca' summary(object, digits=2, ...)
object |
Object of class |
digits |
Number of digits to round |
... |
Further arguments to be passed |
A list with the data frame entropy
as an entry.
Asparouhov, T. & Muthen, B. (2014). Variable-specific entropy contribution. Technical Appendix. http://www.statmodel.com/7_3_papers.shtml
See cdi.kli
for test diagnostic indices based on the
Kullback-Leibler information and cdm.est.class.accuracy
for calculating the classification accuracy.
############################################################################# # EXAMPLE 1: Entropy for DINA model ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # fit DINA Model mod1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix, rule="DINA") summary(mod1) # compute entropy for test and items emod1 <- CDM::entropy.lca( mod1 ) summary(emod1) ## Not run: ############################################################################# # EXAMPLE 2: Entropy for polytomous GDINA model ############################################################################# data(data.pgdina, package="CDM") dat <- data.pgdina$dat q.matrix <- data.pgdina$q.matrix # pGDINA model with "DINA rule" mod1 <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA") summary(mod1) # compute entropy emod1 <- CDM::entropy.lca( mod1 ) summary(emod1) ############################################################################# # EXAMPLE 3: Entropy for MCDINA model ############################################################################# data(data.cdm02, package="CDM") dat <- data.cdm02$data q.matrix <- data.cdm02$q.matrix # estimate model with polytomous atribute mod1 <- CDM::mcdina( dat, q.matrix=q.matrix ) summary(mod1) # computre entropy emod1 <- CDM::entropy.lca( mod1 ) summary(emod1) ## End(Not run)
############################################################################# # EXAMPLE 1: Entropy for DINA model ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # fit DINA Model mod1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix, rule="DINA") summary(mod1) # compute entropy for test and items emod1 <- CDM::entropy.lca( mod1 ) summary(emod1) ## Not run: ############################################################################# # EXAMPLE 2: Entropy for polytomous GDINA model ############################################################################# data(data.pgdina, package="CDM") dat <- data.pgdina$dat q.matrix <- data.pgdina$q.matrix # pGDINA model with "DINA rule" mod1 <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA") summary(mod1) # compute entropy emod1 <- CDM::entropy.lca( mod1 ) summary(emod1) ############################################################################# # EXAMPLE 3: Entropy for MCDINA model ############################################################################# data(data.cdm02, package="CDM") dat <- data.cdm02$data q.matrix <- data.cdm02$q.matrix # estimate model with polytomous atribute mod1 <- CDM::mcdina( dat, q.matrix=q.matrix ) summary(mod1) # computre entropy emod1 <- CDM::entropy.lca( mod1 ) summary(emod1) ## End(Not run)
This function determines a statistically equivalent DINA model given a Q-matrix using the method of von Davier (2014). Thereby, the dimension of the skill space is expanded, but in the reparameterized version, the Q-matrix has a simple structure or the IRT model is no longer be conjuctive (like in DINA) due to a redefinition of the skill space.
equivalent.dina(q.matrix, reparameterization="B")
equivalent.dina(q.matrix, reparameterization="B")
q.matrix |
The Q-matrix (see |
reparameterization |
The used reparameterization (see von Davier, 2014). |
A list with following entries
q.matrix |
Original Q-matrix |
q.matrix.ast |
Reparameterized Q-matrix |
alpha |
Original skill space |
alpha.ast |
Reparameterized skill space |
von Davier, M. (2014). The DINA model as a constrained general diagnostic model: Two variants of a model equivalency. British Journal of Mathematical and Statistical Psychology, 67, 49-71.
############################################################################# # EXAMPLE 1: Toy example ############################################################################# # define a Q-matrix Q <- matrix( c( 1,0,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1 ), byrow=TRUE, ncol=3 ) Q <- Q[ rep(1:(nrow(Q)),each=2), ] # equivalent DINA model (using the default reparameterization B) res1 <- CDM::equivalent.dina( q.matrix=Q ) res1 # equivalent DINA model (reparametrization A) res2 <- CDM::equivalent.dina( q.matrix=Q, reparameterization="A") res2 ## Not run: ############################################################################# # EXAMPLE 2: Estimation with two equivalent DINA models ############################################################################# # simulate data set.seed(789) D <- ncol(Q) mean.alpha <- c( -.5, .5, 0 ) r1 <- .5 Sigma.alpha <- matrix( r1, D, D ) + diag(1-r1,D) dat1 <- CDM::sim.din( N=2000, q.matrix=Q, mean=mean.alpha, Sigma=Sigma.alpha ) # estimate DINA model mod1 <- CDM::din( dat1$dat, q.matrix=Q ) # estimate equivalent DINA model mod2 <- CDM::din( dat1$dat, q.matrix=res1$q.matrix.ast, skillclasses=res1$alpha.ast) # restricted skill space must be defined by using the argument 'skillclasses' # compare model summaries summary(mod2) summary(mod1) # compare estimated item parameters cbind( mod2$coef, mod1$coef ) # compare estimated skill class probabilities round( cbind( mod2$attribute.patt, mod1$attribute.patt ), 4 ) ############################################################################# # EXAMPLE 3: Examples from von Davier (2014) ############################################################################# # define Q-matrix Q <- matrix( 0, nrow=8, ncol=3 ) Q[2, ] <- c(1,0,0) Q[3, ] <- c(0,1,0) Q[4, ] <- c(1,1,0) Q[5, ] <- c(0,0,1) # Q[6, ] <- c(1,0,1) Q[6, ] <- c(0,0,1) Q[7, ] <- c(0,1,1) Q[8, ] <- c(1,1,1) #- parametrization A res1 <- CDM::equivalent.dina(q.matrix=Q, reparameterization="A") res1 #- parametrization B res2 <- CDM::equivalent.dina(q.matrix=Q, reparameterization="B") res2 ## End(Not run)
############################################################################# # EXAMPLE 1: Toy example ############################################################################# # define a Q-matrix Q <- matrix( c( 1,0,0, 0,1,0, 0,0,1, 1,0,1, 1,1,1 ), byrow=TRUE, ncol=3 ) Q <- Q[ rep(1:(nrow(Q)),each=2), ] # equivalent DINA model (using the default reparameterization B) res1 <- CDM::equivalent.dina( q.matrix=Q ) res1 # equivalent DINA model (reparametrization A) res2 <- CDM::equivalent.dina( q.matrix=Q, reparameterization="A") res2 ## Not run: ############################################################################# # EXAMPLE 2: Estimation with two equivalent DINA models ############################################################################# # simulate data set.seed(789) D <- ncol(Q) mean.alpha <- c( -.5, .5, 0 ) r1 <- .5 Sigma.alpha <- matrix( r1, D, D ) + diag(1-r1,D) dat1 <- CDM::sim.din( N=2000, q.matrix=Q, mean=mean.alpha, Sigma=Sigma.alpha ) # estimate DINA model mod1 <- CDM::din( dat1$dat, q.matrix=Q ) # estimate equivalent DINA model mod2 <- CDM::din( dat1$dat, q.matrix=res1$q.matrix.ast, skillclasses=res1$alpha.ast) # restricted skill space must be defined by using the argument 'skillclasses' # compare model summaries summary(mod2) summary(mod1) # compare estimated item parameters cbind( mod2$coef, mod1$coef ) # compare estimated skill class probabilities round( cbind( mod2$attribute.patt, mod1$attribute.patt ), 4 ) ############################################################################# # EXAMPLE 3: Examples from von Davier (2014) ############################################################################# # define Q-matrix Q <- matrix( 0, nrow=8, ncol=3 ) Q[2, ] <- c(1,0,0) Q[3, ] <- c(0,1,0) Q[4, ] <- c(1,1,0) Q[5, ] <- c(0,0,1) # Q[6, ] <- c(1,0,1) Q[6, ] <- c(0,0,1) Q[7, ] <- c(0,1,1) Q[8, ] <- c(1,1,1) #- parametrization A res1 <- CDM::equivalent.dina(q.matrix=Q, reparameterization="A") res1 #- parametrization B res2 <- CDM::equivalent.dina(q.matrix=Q, reparameterization="B") res2 ## End(Not run)
The function eval_likelihood
evaluates the likelihood given item
responses and item response probabilities.
The function prep_data_long_format
stores the matrix of
item responses in a long format omitted all missing responses.
eval_likelihood(data, irfprob, prior=NULL, normalization=FALSE, N=NULL) prep_data_long_format(data)
eval_likelihood(data, irfprob, prior=NULL, normalization=FALSE, N=NULL) prep_data_long_format(data)
data |
Dataset containing item responses in wide format or long format
(generated by |
irfprob |
Array containing item responses probabilities, format
see |
prior |
Optional prior (matrix or vector) |
normalization |
Logical indicating whether posterior should be normalized |
N |
Number of persons (optional) |
Numeric matrix
## Not run: ############################################################################# # EXAMPLE 1: Likelihood data.ecpe ############################################################################# data(data.ecpe, package="CDM") dat <- data.ecpe$dat[,-1] Q <- data.ecpe$q.matrix #*** store data matrix in long format data_long <- CDM::prep_data_long_format(data) str(data_long) #** estimate GDINA model mod <- CDM::gdina(dat, q.matrix=Q) summary(mod) #** extract data, item response functions and prior data <- CDM::IRT.data(mod) irfprob <- CDM::IRT.irfprob(mod) prob_theta <- attr( irfprob, "prob.theta") #** compute likelihood lmod <- CDM::eval_likelihood(data=data, irfprob=irfprob) max( abs( lmod - CDM::IRT.likelihood(mod) )) #** compute posterior pmod <- CDM::eval_likelihood(data=data, irfprob=irfprob, prior=prob.theta, normalization=TRUE) max( abs( pmod - CDM::IRT.posterior(mod) )) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Likelihood data.ecpe ############################################################################# data(data.ecpe, package="CDM") dat <- data.ecpe$dat[,-1] Q <- data.ecpe$q.matrix #*** store data matrix in long format data_long <- CDM::prep_data_long_format(data) str(data_long) #** estimate GDINA model mod <- CDM::gdina(dat, q.matrix=Q) summary(mod) #** extract data, item response functions and prior data <- CDM::IRT.data(mod) irfprob <- CDM::IRT.irfprob(mod) prob_theta <- attr( irfprob, "prob.theta") #** compute likelihood lmod <- CDM::eval_likelihood(data=data, irfprob=irfprob) max( abs( lmod - CDM::IRT.likelihood(mod) )) #** compute posterior pmod <- CDM::eval_likelihood(data=data, irfprob=irfprob, prior=prob.theta, normalization=TRUE) max( abs( pmod - CDM::IRT.posterior(mod) )) ## End(Not run)
Tatsuoka's (1984) fraction subtraction data set is comprised of
responses to fraction subtraction test items from
middle school students.
data(fraction.subtraction.data)
data(fraction.subtraction.data)
The fraction.subtraction.data
data frame consists of 536
rows and 20 columns, representing the responses of the
students to each of the
test items. Each row in the data set
corresponds to the responses of a particular student. Thereby a "1"
denotes that a correct response was recorded, while "0" denotes an
incorrect response. The other way round, each column corresponds
to all responses to a particular item.
The items used for the fraction subtraction test originally appeared
in Tatsuoka (1984) and are published in Tatsuoka (2002). They
can also be found in DeCarlo (2011). All test items are based on 8
attributes (e.g. convert a whole number to a fraction, separate a whole
number from a fraction or simplify before subtracting). The complete
list of skills can be found in fraction.subtraction.qmatrix
.
The Royal Statistical Society Datasets Website, Series C,
Applied Statistics, Data analytic methods for latent partially
ordered classification models:
URL: http://www.blackwellpublishing.com/rss/Volumes/Cv51p2_read2.htm
DeCarlo, L. T. (2011). On the analysis of fraction subtraction data: The DINA Model, classification, latent class sizes, and the Q-Matrix. Applied Psychological Measurement, 35, 8–26.
Tatsuoka, C. (2002). Data analytic methods for latent partially ordered classification models. Journal of the Royal Statistical Society, Series C, Applied Statistics, 51, 337–350.
Tatsuoka, K. (1984). Analysis of errors in fraction addition and subtraction problems. Final Report for NIE-G-81-0002, University of Illinois, Urbana-Champaign.
fraction.subtraction.qmatrix
for the corresponding Q-matrix.
The Q-Matrix corresponding to Tatsuoka (1984) fraction subtraction data set.
data(fraction.subtraction.qmatrix)
data(fraction.subtraction.qmatrix)
The fraction.subtraction.qmatrix
data frame consists of
rows and
columns, specifying the attributes that are believed to be
involved in solving the items. Each row in the data frame represents an item
and the entries in the row indicate whether an attribute is needed to master
the item (denoted by a "1") or not (denoted by a "0"). The attributes for the
fraction subtraction data set are the following:
alpha1
convert a whole number to a fraction,
alpha2
separate a whole number from a fraction,
alpha3
simplify before subtracting,
alpha4
find a common denominator,
alpha5
borrow from whole number part,
alpha6
column borrow to subtract the second numerator from the first,
alpha7
subtract numerators,
alpha8
reduce answers to simplest form.
This Q-matrix can be found in DeCarlo (2011). It is the same used by de la Torre and Douglas (2004).
DeCarlo, L. T. (2011). On the analysis of fraction subtraction data: The DINA Model, classification, latent class sizes, and the Q-Matrix. Applied Psychological Measurement, 35, 8–26.
de la Torre, J. and Douglas, J. (2004). Higher-order latent trait models for cognitive diagnosis. Psychometrika, 69, 333–353.
Tatsuoka, C. (2002). Data analytic methods for latent partially ordered classification models. Journal of the Royal Statistical Society, Series C, Applied Statistics, 51, 337–350.
Tatsuoka, K. (1984) Analysis of errors in fraction addition and subtraction problems. Final Report for NIE-G-81-0002, University of Illinois, Urbana-Champaign.
Performs the generalized distance discriminating method (GDD; Sun, Xin, Zhang, & de la Torre, 2013) for dichotomous data which is a method for classifying students into skill profiles based on a preliminary unidimensional calibration.
gdd(data, q.matrix, theta, b, a, skillclasses=NULL)
gdd(data, q.matrix, theta, b, a, skillclasses=NULL)
data |
Data frame with |
q.matrix |
The Q-matrix |
theta |
Estimated person ability |
b |
Estimated item intercept from a 2PL model (see Details) |
a |
Estimated item slope from a 2PL model (see Details) |
skillclasses |
Optional matrix of skill classes used for estimation |
Note that the parameters in the arguments follow the item response model
which is employed in the gdm
function.
A list with following entries
skillclass.est |
Estimated skill class |
distmatrix |
Distances for every person and every skill class |
skillspace |
Used skill space for estimation |
theta |
Used person parameter estimate |
Sun, J., Xin, T., Zhang, S., & de la Torre, J. (2013). A polytomous extension of the generalized distance discriminating method. Applied Psychological Measurement, 37, 503-521.
############################################################################# # EXAMPLE 1: GDD for sim.dina ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") data <- sim.dina q.matrix <- sim.qmatrix # estimate 1PL (use irtmodel="2PL" for 2PL estimation) mod <- CDM::gdm( data, irtmodel="1PL", theta.k=seq(-6,6,len=21), decrease.increments=TRUE, conv=.001, globconv=.001) # extract item parameters in parametrization b + a*theta b <- mod$b[,1] a <- mod$a[,,1] # extract person parameter estimate theta <- mod$person$EAP.F1 # generalized distance discriminating method res <- CDM::gdd( data, q.matrix, theta=theta, b=b, a=a )
############################################################################# # EXAMPLE 1: GDD for sim.dina ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") data <- sim.dina q.matrix <- sim.qmatrix # estimate 1PL (use irtmodel="2PL" for 2PL estimation) mod <- CDM::gdm( data, irtmodel="1PL", theta.k=seq(-6,6,len=21), decrease.increments=TRUE, conv=.001, globconv=.001) # extract item parameters in parametrization b + a*theta b <- mod$b[,1] a <- mod$a[,,1] # extract person parameter estimate theta <- mod$person$EAP.F1 # generalized distance discriminating method res <- CDM::gdd( data, q.matrix, theta=theta, b=b, a=a )
This function implements the generalized DINA model for dichotomous
attributes (GDINA; de la Torre, 2011) and polytomous attributes
(pGDINA; Chen & de la Torre, 2013, 2018).
In addition, multiple group estimation
is also possible using the gdina
function. This function also
allows for the estimation of a higher order GDINA model
(de la Torre & Douglas, 2004).
Polytomous item responses are treated by specifying a sequential
GDINA model (Ma & de la Torre, 2016; Tutz, 1997).
The simulataneous modeling of skills and misconceptions (bugs) can be
also estimated within the GDINA framework (see Kuo, Chen & de la Torre, 2018;
see argument rule
).
The estimation can also be conducted by posing monotonocity
constraints (Hong, Chang, & Tsai, 2016) using the argument mono.constr
.
Moreover, regularization methods SCAD, lasso, ridge, SCAD-L2 and
truncated penalty (TLP) for item parameters
can be employed (Xu & Shang, 2018).
Normally distributed priors can be specified for item parameters (item intercepts and item slopes). Note that (for convenience) the prior specification holds simultaneously for all items.
gdina(data, q.matrix, skillclasses=NULL, conv.crit=0.0001, dev.crit=.1, maxit=1000, linkfct="identity", Mj=NULL, group=NULL, invariance=TRUE,method=NULL, delta.init=NULL, delta.fixed=NULL, delta.designmatrix=NULL, delta.basispar.lower=NULL, delta.basispar.upper=NULL, delta.basispar.init=NULL, zeroprob.skillclasses=NULL, attr.prob.init=NULL, attr.prob.fixed=NULL, reduced.skillspace=NULL, reduced.skillspace.method=2, HOGDINA=-1, Z.skillspace=NULL, weights=rep(1, nrow(data)), rule="GDINA", bugs=NULL, regular_lam=0, regular_type="none", regular_alpha=NA, regular_tau=NA, regular_weights=NULL, mono.constr=FALSE, prior_intercepts=NULL, prior_slopes=NULL, progress=TRUE, progress.item=FALSE, mstep_iter=10, mstep_conv=1E-4, increment.factor=1.01, fac.oldxsi=0, max.increment=.3, avoid.zeroprobs=FALSE, seed=0, save.devmin=TRUE, calc.se=TRUE, se_version=1, PEM=TRUE, PEM_itermax=maxit, cd=FALSE, cd_steps=1, mono_maxiter=10, freq_weights=FALSE, optimizer="CDM", ...) ## S3 method for class 'gdina' summary(object, digits=4, file=NULL, ...) ## S3 method for class 'gdina' plot(x, ask=FALSE, ...) ## S3 method for class 'gdina' print(x, ...)
gdina(data, q.matrix, skillclasses=NULL, conv.crit=0.0001, dev.crit=.1, maxit=1000, linkfct="identity", Mj=NULL, group=NULL, invariance=TRUE,method=NULL, delta.init=NULL, delta.fixed=NULL, delta.designmatrix=NULL, delta.basispar.lower=NULL, delta.basispar.upper=NULL, delta.basispar.init=NULL, zeroprob.skillclasses=NULL, attr.prob.init=NULL, attr.prob.fixed=NULL, reduced.skillspace=NULL, reduced.skillspace.method=2, HOGDINA=-1, Z.skillspace=NULL, weights=rep(1, nrow(data)), rule="GDINA", bugs=NULL, regular_lam=0, regular_type="none", regular_alpha=NA, regular_tau=NA, regular_weights=NULL, mono.constr=FALSE, prior_intercepts=NULL, prior_slopes=NULL, progress=TRUE, progress.item=FALSE, mstep_iter=10, mstep_conv=1E-4, increment.factor=1.01, fac.oldxsi=0, max.increment=.3, avoid.zeroprobs=FALSE, seed=0, save.devmin=TRUE, calc.se=TRUE, se_version=1, PEM=TRUE, PEM_itermax=maxit, cd=FALSE, cd_steps=1, mono_maxiter=10, freq_weights=FALSE, optimizer="CDM", ...) ## S3 method for class 'gdina' summary(object, digits=4, file=NULL, ...) ## S3 method for class 'gdina' plot(x, ask=FALSE, ...) ## S3 method for class 'gdina' print(x, ...)
data |
A required |
q.matrix |
A required integer |
skillclasses |
An optional matrix for determining the skill space.
The argument can be used if a user wants less than |
conv.crit |
Convergence criterion for maximum absolute change in item parameters |
dev.crit |
Convergence criterion for maximum absolute change in deviance |
maxit |
Maximum number of iterations |
linkfct |
A string which indicates the link function for the GDINA model.
Options are |
Mj |
A list of design matrices and labels for each item.
The definition of |
group |
A vector of group identifiers for multiple group
estimation. Default is |
invariance |
Logical indicating whether invariance of item parameters
is assumed for multiple group models. If a subset of items should
be treated as noninvariant, then |
method |
Estimation method for item parameters (see)
(de la Torre, 2011). The default |
delta.init |
List with initial |
delta.fixed |
List with fixed |
delta.designmatrix |
A design matrix for restrictions on delta. See Example 4. |
delta.basispar.lower |
Lower bounds for delta basis parameters. |
delta.basispar.upper |
Upper bounds for delta basis parameters. |
delta.basispar.init |
An optional vector of starting values for the basis parameters of delta.
This argument only applies when using a designmatrix for delta,
i.e. |
zeroprob.skillclasses |
An optional vector of integers which indicates which skill classes should have zero probability. Default is NULL (no skill classes with zero probability). |
attr.prob.init |
Initial probabilities of skill distribution. |
attr.prob.fixed |
Vector or matrix with fixed probabilities of skill distribution. |
reduced.skillspace |
A logical which indicates if the latent class skill space dimension
should be reduced (see Xu & von Davier, 2008). The default is |
reduced.skillspace.method |
Computation method for skill space reduction
in case of |
HOGDINA |
Values of -1, 0 or 1 indicating if a higher order GDINA model (see Details) should be estimated. The default value of -1 corresponds to the case that no higher order factor is assumed to exist. A value of 0 corresponds to independent attributes. A value of 1 assumes the existence of a higher order factor. |
Z.skillspace |
A user specified design matrix for the skill space reduction as described in Xu and von Davier (2008). See in the Examples section for applications. See Example 6. |
weights |
An optional vector of sample weights. |
rule |
A string or a vector of itemwise condensation rules. Allowed entries are
|
bugs |
Character vector indicating which columns in the Q-matrix
refer to bugs (misconceptions). This is only available if some |
regular_lam |
Regularization parameter |
regular_type |
Type of regularization. Can be |
regular_alpha |
Regularization parameter |
regular_tau |
Regularization parameter |
regular_weights |
Optional list of item parameter weights used for penalties in regularized estimation (see Example 13) |
mono.constr |
Logical indicating whether monotonicity constraints should be fulfilled in estimation (implemented by the increasing penalty method; see Nash, 2014, p. 156). |
prior_intercepts |
Vector with mean and standard deviation for prior of random intercepts (applies to all items) |
prior_slopes |
Vector with mean and standard deviation for prior of random slopes (applies to all items and all parameters) |
progress |
An optional logical indicating whether the function should print the progress of iteration in the estimation process. |
progress.item |
An optional logical indicating whether item wise progress should be displayed |
mstep_iter |
Number of iterations in M-step if |
mstep_conv |
Convergence criterion in M-step if |
increment.factor |
A factor larger than 1 (say 1.1) to control maximum increments in item parameters. This parameter can be used in case of nonconvergence. |
fac.oldxsi |
A convergence acceleration factor between 0 and 1 which defines the weight of previously estimated values in current parameter updates. |
max.increment |
Maximum size of change in increments in M steps
of EM algorithm when |
avoid.zeroprobs |
An optional logical indicating whether for estimating
item parameters probabilities occur. Especially if
not a skill classes are used, it is recommended to switch
the argument to |
seed |
Simulation seed for initial parameters. A value of zero corresponds
to deterministic starting values, an integer value different from
zero to random initial values with |
save.devmin |
An optional logical indicating whether intermediate
estimates should be saved corresponding to minimal deviance.
Setting the argument to |
calc.se |
Optional logical indicating whether standard errors should be calculated. |
se_version |
Integer for calculation method of standard errors.
|
PEM |
Logical indicating whether the P-EM acceleration should be applied (Berlinet & Roland, 2012). |
PEM_itermax |
Number of iterations in which the P-EM method should be applied. |
cd |
Logical indicating whether coordinate descent algorithm should be used. |
cd_steps |
Number of steps for each parameter in coordinate descent algorithm |
mono_maxiter |
Maximum number of iterations for fulfilling the monotonicity constraint |
freq_weights |
Logical indicating whether frequency weights should
be used. Default is |
optimizer |
String indicating which optimizer should be used in
M-step estimation in case of |
object |
A required object of class |
digits |
Number of digits after decimal separator to display. |
file |
Optional file name for a file in which |
x |
A required object of class |
ask |
A logical indicating whether every separate item should
be displayed in |
... |
Optional parameters to be passed to or from other methods will be ignored. |
The estimation is based on an EM algorithm as described in de la Torre (2011).
Item parameters are contained in the delta
vector which is a list where
the th entry corresponds to item parameters of the
th item.
The following description refers to the case of dichotomous attributes.
For using polytomous attributes see Chen and de la Torre (2013) and
Example 7 for a definition of the Q-matrix. In this case,
means that the
th item requires the mastery (at least) of level
of attribute
.
Assume that two skills and
are required for
mastering item
. Then the GDINA model can be written as
which is a two-way GDINA-model (the rule="GDINA2"
specification) with a
link function (which can be the identity, logit or logarithmic link).
If the specification
ACDM
is chosen, then .
The DINA model (
rule="DINA"
) assumes .
For the reduced RUM model (rule="RRUM"
), the item response model is
From this equation, it is obvious, that
this model is equivalent to an additive model (rule="ACDM"
) with
a logarithmic link function (linkfct="log"
).
If a reduced skillspace (reduced.skillspace=TRUE
) is employed, then the
logarithm of probability distribution of the attributes is modeled as a
log-linear model:
If a higher order DINA model is assumed (HOGDINA=1
), then a higher order
factor for the attributes is assumed:
For HOGDINA=0
, all attributes are assumed to be
independent of each other:
Note that the noncompensatory reduced RUM (NC-RRUM) according
to Rupp and Templin (2008) is the GDINA model with the arguments
rule="ACDM"
and linkfct="log"
. NC-RRUM can also be
obtained by choosing rule="RRUM"
.
The compensatory RUM (C-RRUM) can be obtained by using the arguments
rule="ACDM"
and linkfct="logit"
.
The cognitive diagnosis model for identifying
skills and misconceptions (SISM; Kuo, Chen & de la Torre, 2018) can be
estimated with rule="SISM"
(see Example 12).
The gdina
function internally parameterizes the GDINA model as
with item-specific design matrices and item parameters
. Only those attributes are modelled which correspond
to non-zero entries in the Q-matrix. Because the Q-matrix (in
q.matrix
)
and the design matrices (in M_j
; see Example 3) can be
specified by the user, several
cognitive diagnosis models can be estimated. Therefore, some additional extensions
of the DINA model can also be estimated using the gdina
function.
These models include the DINA model with multiple strategies
(Huo & de la Torre, 2014)
An object of class gdina
with following entries
coef |
Data frame of item parameters |
delta |
List with basis item parameters |
se.delta |
Standard errors of basis item parameters |
probitem |
Data frame with model implied conditional item probabilities
|
itemfit.rmsea |
The RMSEA item fit index (see |
mean.rmsea |
Mean of RMSEA item fit indexes. |
loglike |
Log-likelihood |
deviance |
Deviance |
G |
Number of groups |
N |
Sample size |
AIC |
AIC |
BIC |
BIC |
CAIC |
CAIC |
Npars |
Total number of parameters |
Nipar |
Number of item parameters |
Nskillpar |
Number of parameters for skill class distribution |
Nskillclasses |
Number of skill classes |
varmat.delta |
Covariance matrix of |
posterior |
Individual posterior distribution |
like |
Individual likelihood |
data |
Original data |
q.matrix |
Used Q-matrix |
pattern |
Individual patterns, individual MLE and MAP classifications and their corresponding probabilities |
attribute.patt |
Probabilities of skill classes |
skill.patt |
Marginal skill probabilities |
subj.pattern |
Individual subject pattern |
attribute.patt.splitted |
Splitted attribute pattern |
pjk |
Array of item response probabilities |
Mj |
Design matrix |
Aj |
Design matrix |
rule |
Used condensation rules |
linkfct |
Used link function |
delta.designmatrix |
Designmatrix for item parameters |
reduced.skillspace |
A logical if skillspace reduction was performed |
Z.skillspace |
Design matrix for skillspace reduction |
beta |
Parameters |
covbeta |
Standard errors of |
iter |
Number of iterations |
rrum.params |
Parameters in the parametrization of the reduced RUM model
if |
group.stat |
Group statistics (sample sizes, group labels) |
HOGDINA |
The used value of |
mono.constr |
Monotonicity constraint |
regularization |
Logical indicating whether regularization is used |
regular_lam |
Regularization parameter |
numb_bound_mono |
Number of items with parameters at boundary of monotonicity constraints |
numb_regular_pars |
Number of regularized item parameters |
delta_regularized |
List indicating which item parameters are regularized |
cd_algorithm |
Logical indicating whether coordinate descent algorithm is used |
cd_steps |
Number of steps for each parameter in coordinate descent algorithm |
seed |
Used simulation seed |
a.attr |
Attribute parameters |
b.attr |
Attribute parameters |
attr.rf |
Attribute response functions. This matrix contains all
|
converged |
Logical indicating whether convergence was achieved. |
control |
Optimization parameters used in estimation |
partable |
Parameter table for |
polychor |
Group-wise matrices with polychoric correlations |
sequential |
Logical indicating whether a sequential GDINA model is applied for polytomous item responses |
... |
Further values |
The function din
does not allow for multiple group estimation.
Use this gdina
function instead and choose the appropriate rule="DINA"
as an argument.
Standard error calculation in analyses which use sample weights or
designmatrix for delta parameters (delta.designmatrix!=NULL
) is not yet
correctly implemented. Please use replication methods instead.
Berlinet, A. F., & Roland, C. (2012). Acceleration of the EM algorithm: P-EM versus epsilon algorithm. Computational Statistics & Data Analysis, 56(12), 4122-4137.
Chen, J., & de la Torre, J. (2013). A general cognitive diagnosis model for expert-defined polytomous attributes. Applied Psychological Measurement, 37, 419-437.
Chen, J., & de la Torre, J. (2018). Introducing the general polytomous diagnosis modeling framework. Frontiers in Psychology | Quantitative Psychology and Measurement, 9(1474).
de la Torre, J., & Douglas, J. A. (2004). Higher-order latent trait models for cognitive diagnosis. Psychometrika, 69, 333-353.
de la Torre, J. (2011). The generalized DINA model framework. Psychometrika, 76, 179-199.
Hong, C. Y., Chang, Y. W., & Tsai, R. C. (2016). Estimation of generalized DINA model with order restrictions. Journal of Classification, 33(3), 460-484.
Huo, Y., de la Torre, J. (2014). Estimating a cognitive diagnostic model for multiple strategies via the EM algorithm. Applied Psychological Measurement, 38, 464-485.
Kuo, B.-C., Chen, C.-H., & de la Torre, J. (2018). A cognitive diagnosis model for identifying coexisting skills and misconceptions. Applied Psychological Measurement, 42(3), 179-191.
Ma, W., & de la Torre, J. (2016). A sequential cognitive diagnosis model for polytomous responses. British Journal of Mathematical and Statistical Psychology, 69(3), 253-275.
Nash, J. C. (2014). Nonlinear parameter optimization using R tools. West Sussex: Wiley.
Rupp, A. A., & Templin, J. (2008). Unique characteristics of diagnostic classification models: A comprehensive review of the current state-of-the-art. Measurement: Interdisciplinary Research and Perspectives, 6, 219-262.
Shen, X., Pan, W., & Zhu, Y. (2012). Likelihood-based selection and sharp parameter estimation. Journal of the American Statistical Association, 107, 223-232.
Tutz, G. (1997). Sequential models for ordered responses. In W. van der Linden & R. K. Hambleton. Handbook of modern item response theory (pp. 139-152). New York: Springer.
Xu, G., & Shang, Z. (2018). Identifying latent structures in restricted latent class models. Journal of the American Statistical Association, 523, 1284-1295.
Xu, X., & von Davier, M. (2008). Fitting the structured general diagnostic model to NAEP data. ETS Research Report ETS RR-08-27. Princeton, ETS.
Zeng, L., & Xie, J. (2014). Group variable selection via
SCAD-. Statistics, 48, 49-66.
Zhang, C.-H. (2010). Nearly unbiased variable selection under minimax concave penalty. Annals of Statistics, 38, 894-942.
See also the din
function (for DINA and DINO estimation).
For assessment of model fit see modelfit.cor.din
and
anova.gdina
.
See itemfit.sx2
for item fit statistics.
See sim.gdina
for simulating the GDINA model.
See gdina.wald
for a Wald test for testing the DINA and ACDM
rules at the item-level.
See gdina.dif
for assessing differential item
functioning.
See discrim.index
for computing discrimination indices.
See the GDINA::GDINA
function in the
GDINA package for similar functionality.
############################################################################# # EXAMPLE 1: Simulated DINA data | different condensation rules ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dina Q <- sim.qmatrix #*** # Model 1: estimation of the GDINA model (identity link) mod1 <- CDM::gdina( data=dat, q.matrix=Q) summary(mod1) plot(mod1) # apply plot function ## Not run: # Model 1a: estimate model with different simulation seed mod1a <- CDM::gdina( data=dat, q.matrix=Q, seed=9089) summary(mod1a) # Model 1b: estimate model with some fixed delta parameters delta.fixed <- as.list( rep(NA,9) ) # List for parameters of 9 items delta.fixed[[2]] <- c( 0, .15, .15, .45 ) delta.fixed[[6]] <- c( .25, .25 ) mod1b <- CDM::gdina( data=dat, q.matrix=Q, delta.fixed=delta.fixed) summary(mod1b) # Model 1c: fix all delta parameters to previously fitted model mod1c <- CDM::gdina( data=dat, q.matrix=Q, delta.fixed=mod1$delta) summary(mod1c) # Model 1d: estimate GDINA model with GDINA package mod1d <- GDINA::GDINA( dat=dat, Q=Q, model="GDINA" ) summary(mod1d) # extract item parameters GDINA::itemparm(mod1d) GDINA::itemparm(mod1d, what="delta") # compare likelihood logLik(mod1) logLik(mod1d) #*** # Model 2: estimation of the DINA model with gdina function mod2 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINA") summary(mod2) plot(mod2) #*** # Model 2b: compare results with din function mod2b <- CDM::din( data=dat, q.matrix=Q, rule="DINA") summary(mod2b) # Model 2: estimation of the DINO model with gdina function mod3 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINO") summary(mod3) #*** # Model 4: DINA model with logit link mod4 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINA", linkfct="logit" ) summary(mod4) #*** # Model 5: DINA model log link mod5 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINA", linkfct="log") summary(mod5) #*** # Model 6: RRUM model mod6 <- CDM::gdina( data=dat, q.matrix=Q, rule="RRUM") summary(mod6) #*** # Model 7: Higher order GDINA model mod7 <- CDM::gdina( data=dat, q.matrix=Q, HOGDINA=1) summary(mod7) #*** # Model 8: GDINA model with independent attributes mod8 <- CDM::gdina( data=dat, q.matrix=Q, HOGDINA=0) summary(mod8) #*** # Model 9: Estimating the GDINA model with monotonicity constraints mod9 <- CDM::gdina( data=dat, q.matrix=Q, rule="GDINA", mono.constr=TRUE, linkfct="logit") summary(mod9) #*** # Model 10: Estimating the ACDM model with SCAD penalty and regularization # parameter of .05 mod10 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", linkfct="logit", regular_type="scad", regular_lam=.05 ) summary(mod10) #*** # Model 11: Estimation of GDINA model with prior distributions # N(0,10^2) prior for item intercepts prior_intercepts <- c(0,10) # N(0,1^2) prior for item slopes prior_slopes <- c(0,1) # estimate model mod11 <- CDM::gdina( data=dat, q.matrix=Q, rule="GDINA", prior_intercepts=prior_intercepts, prior_slopes=prior_slopes) summary(mod11) ############################################################################# # EXAMPLE 2: Simulated DINO data # additive cognitive diagnosis model with different link functions ############################################################################# data(sim.dino, package="CDM") data(sim.matrix, package="CDM") dat <- sim.dino Q <- sim.qmatrix #*** # Model 1: additive cognitive diagnosis model (ACDM; identity link) mod1 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM") summary(mod1) #*** # Model 2: ACDM logit link mod2 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", linkfct="logit") summary(mod2) #*** # Model 3: ACDM log link mod3 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", linkfct="log") summary(mod3) #*** # Model 4: Different condensation rules per item I <- 9 # number of items rule <- rep( "GDINA", I ) rule[1] <- "DINO" # 1st item: DINO model rule[7] <- "GDINA2" # 7th item: GDINA model with first- and second-order interactions rule[8] <- "ACDM" # 8ht item: additive CDM rule[9] <- "DINA" # 9th item: DINA model mod4 <- CDM::gdina( data=dat, q.matrix=Q, rule=rule ) summary(mod4) ############################################################################# # EXAMPLE 3: Model with user-specified design matrices ############################################################################# data(sim.dino, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dino Q <- sim.qmatrix # do a preliminary analysis and modify obtained design matrices mod0 <- CDM::gdina( data=dat, q.matrix=Q, maxit=1) # extract default design matrices Mj <- mod0$Mj Mj.user <- Mj # these user defined design matrices are modified. #~~~ For the second item, the following model should hold # X1 ~ V2 + V2*V3 mj <- Mj[[2]][[1]] mj.lab <- Mj[[2]][[2]] mj <- mj[,-3] mj.lab <- mj.lab[-3] Mj.user[[2]] <- list( mj, mj.lab ) # [[1]] # [,1] [,2] [,3] # [1,] 1 0 0 # [2,] 1 1 0 # [3,] 1 0 0 # [4,] 1 1 1 # [[2]] # [1] "0" "1" "1-2" #~~~ For the eight item an equality constraint should hold # X8 ~ a*V2 + a*V3 + V2*V3 mj <- Mj[[8]][[1]] mj.lab <- Mj[[8]][[2]] mj[,2] <- mj[,2] + mj[,3] mj <- mj[,-3] mj.lab <- c("0", "1=2", "1-2" ) Mj.user[[8]] <- list( mj, mj.lab ) Mj.user[[8]] ## [[1]] ## [,1] [,2] [,3] ## [1,] 1 0 0 ## [2,] 1 1 0 ## [3,] 1 1 0 ## [4,] 1 2 1 ## ## [[2]] ## [1] "0" "1=2" "1-2" mod <- CDM::gdina( data=dat, q.matrix=Q, Mj=Mj.user, maxit=200 ) summary(mod) ############################################################################# # EXAMPLE 4: Design matrix for delta parameters ############################################################################# data(sim.dino, package="CDM") data(sim.qmatrix, package="CDM") #~~~ estimate an initial model mod0 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", maxit=1) # extract coefficients c0 <- mod0$coef I <- 9 # number of items delta.designmatrix <- matrix( 0, nrow=nrow(c0), ncol=nrow(c0) ) diag( delta.designmatrix) <- 1 # set intercept of item 1 and item 3 equal to each other delta.designmatrix[ 7, 1 ] <- 1 ; delta.designmatrix[,7] <- 0 # set loading of V1 of item1 and item 3 equal delta.designmatrix[ 8, 2 ] <- 1 ; delta.designmatrix[,8] <- 0 delta.designmatrix <- delta.designmatrix[, -c(7:8) ] # exclude original parameters with indices 7 and 8 #*** # Model 1: ACDM with designmatrix mod1 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", delta.designmatrix=delta.designmatrix ) summary(mod1) #*** # Model 2: Same model, but with logit link instead of identity link function mod2 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", delta.designmatrix=delta.designmatrix, linkfct="logit") summary(mod2) ############################################################################# # EXAMPLE 5: Multiple group estimation ############################################################################# # simulate data set.seed(9279) N1 <- 200 ; N2 <- 100 # group sizes I <- 10 # number of items q.matrix <- matrix(0,I,2) # create Q-matrix q.matrix[1:7,1] <- 1 ; q.matrix[ 5:10,2] <- 1 # simulate first group dat1 <- CDM::sim.din(N1, q.matrix=q.matrix, mean=c(0,0) )$dat # simulate second group dat2 <- CDM::sim.din(N2, q.matrix=q.matrix, mean=c(-.3, -.7) )$dat # merge data dat <- rbind( dat1, dat2 ) # group indicator group <- c( rep(1,N1), rep(2,N2) ) # estimate GDINA model with multiple groups assuming invariant item parameters mod1 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group) summary(mod1) # estimate DINA model with multiple groups assuming invariant item parameters mod2 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, rule="DINA") summary(mod2) # estimate GDINA model with noninvariant item parameters mod3 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, invariance=FALSE) summary(mod3) # estimate GDINA model with some invariant item parameters (I001, I006, I008) mod4 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, invariance=c("I001", "I006","I008") ) #--- model comparison IRT.compareModels(mod1,mod2,mod3,mod4) # estimate GDINA model with non-invariant item parameters except for the # items I001, I006, I008 mod5 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, invariance=setdiff( colnames(dat), c("I001", "I006","I008") ) ) ############################################################################# # EXAMPLE 6: User specified reduced skill space ############################################################################# # Some correlations between attributes should be set to zero. q.matrix <- expand.grid( c(0,1), c(0,1), c(0,1), c(0,1) ) colnames(q.matrix) <- colnames( paste("Attr", 1:4,sep="")) q.matrix <- q.matrix[ -1, ] Sigma <- matrix( .5, nrow=4, ncol=4 ) diag(Sigma) <- 1 Sigma[3,2] <- Sigma[2,3] <- 0 # set correlation of attribute A2 and A3 to zero dat <- CDM::sim.din( N=1000, q.matrix=q.matrix, Sigma=Sigma)$dat #~~~ Step 1: initial estimation mod1a <- CDM::gdina( data=dat, q.matrix=q.matrix, maxit=1, rule="DINA") # estimate also "full" model mod1 <- CDM::gdina( data=dat, q.matrix=q.matrix, rule="DINA") #~~~ Step 2: modify designmatrix for reduced skillspace Z.skillspace <- data.frame( mod1a$Z.skillspace ) # set correlations of A2/A4 and A3/A4 to zero vars <- c("A2_A3","A2_A4") for (vv in vars){ Z.skillspace[,vv] <- NULL } #~~~ Step 3: estimate model with reduced skillspace mod2 <- CDM::gdina( data=dat, q.matrix=q.matrix, Z.skillspace=Z.skillspace, rule="DINA") #~~~ eliminate all covariances Z.skillspace <- data.frame( mod1$Z.skillspace ) colnames(Z.skillspace) Z.skillspace <- Z.skillspace[, -grep( "_", colnames(Z.skillspace),fixed=TRUE)] colnames(Z.skillspace) mod3 <- CDM::gdina( data=dat, q.matrix=q.matrix, Z.skillspace=Z.skillspace, rule="DINA") summary(mod1) summary(mod2) summary(mod3) ############################################################################# # EXAMPLE 7: Polytomous GDINA model (Chen & de la Torre, 2013) ############################################################################# data(data.pgdina, package="CDM") dat <- data.pgdina$dat q.matrix <- data.pgdina$q.matrix # pGDINA model with "DINA rule" mod1 <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA") summary(mod1) # no reduced skill space mod1a <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA",reduced.skillspace=FALSE) summary(mod1) # pGDINA model with "GDINA rule" mod2 <- CDM::gdina( dat, q.matrix=q.matrix, rule="GDINA") summary(mod2) ############################################################################# # EXAMPLE 8: Fraction subtraction data: DINA and HO-DINA model ############################################################################# data(fraction.subtraction.data, package="CDM") data(fraction.subtraction.qmatrix, package="CDM") dat <- fraction.subtraction.data Q <- fraction.subtraction.qmatrix # Model 1: DINA model mod1 <- CDM::gdina( dat, q.matrix=Q, rule="DINA") summary(mod1) # Model 2: HO-DINA model mod2 <- CDM::gdina( dat, q.matrix=Q, HOGDINA=1, rule="DINA") summary(mod2) ############################################################################# # EXAMPLE 9: Skill space approximation data.jang ############################################################################# data(data.jang, package="CDM") data <- data.jang$data q.matrix <- data.jang$q.matrix #*** Model 1: Reduced RUM model mod1 <- CDM::gdina( data, q.matrix, rule="RRUM", conv.crit=.001, maxit=500 ) #*** Model 2: Reduced RUM model with skill space approximation # use 300 instead of 2^9=512 skill classes skillspace <- CDM::skillspace.approximation( L=300, K=ncol(q.matrix) ) mod2 <- CDM::gdina( data, q.matrix, rule="RRUM", conv.crit=.001, skillclasses=skillspace ) ## > logLik(mod1) ## 'log Lik.' -30318.08 (df=153) ## > logLik(mod2) ## 'log Lik.' -30326.52 (df=153) ############################################################################# # EXAMPLE 10: CDM with a linear hierarchy ############################################################################# # This model is equivalent to a unidimensional IRT model with an ordered # ordinal latent trait and is actually a probabilistic Guttman model. set.seed(789) # define 3 competency levels alpha <- scan() 0 0 0 1 0 0 1 1 0 1 1 1 # define skill class distribution K <- 3 skillspace <- alpha <- matrix( alpha, K + 1, K, byrow=TRUE ) alpha <- alpha[ rep( 1:4, c(300,300,200,200) ), ] # P(000)=P(100)=.3, P(110)=P(111)=.2 # define Q-matrix Q <- scan() 1 0 0 1 1 0 1 1 1 Q <- matrix( Q, nrow=K, ncol=K, byrow=TRUE ) Q <- Q[ rep(1:K, each=4 ), ] colnames(skillspace) <- colnames(Q) <- paste0("A",1:K) I <- nrow(Q) # define guessing and slipping parameters guess <- stats::runif( I, 0, .3 ) slip <- stats::runif( I, 0, .2 ) # simulate data dat <- CDM::sim.din( q.matrix=Q, alpha=alpha, slip=slip, guess=guess )$dat #*** Model 1: DINA model with linear hierarchy mod1 <- CDM::din( dat, q.matrix=Q, rule="DINA", skillclasses=skillspace ) summary(mod1) #*** Model 2: pGDINA model with 3 levels # The multidimensional CDM with a linear hierarchy is a unidimensional # polytomous GDINA model. Q2 <- matrix( rowSums(Q), nrow=I, ncol=1 ) mod2 <- CDM::gdina( dat, q.matrix=Q2, rule="DINA" ) summary(mod2) #*** Model 3: estimate probabilistic Guttman model in sirt # Proctor, C. H. (1970). A probabilistic formulation and statistical # analysis for Guttman scaling. Psychometrika, 35, 73-78. library(sirt) mod3 <- sirt::prob.guttman( dat, itemlevel=Q2[,1] ) summary(mod3) # -> The three models result in nearly equivalent fit. ############################################################################# # EXAMPLE 11: Sequential GDINA model (Ma & de la Torre, 2016) ############################################################################# data(data.cdm04, package="CDM") #** attach dataset dat <- data.cdm04$data # polytomous item responses q.matrix1 <- data.cdm04$q.matrix1 q.matrix2 <- data.cdm04$q.matrix2 #-- DINA model with first Q-matrix mod1 <- CDM::gdina( dat, q.matrix=q.matrix1, rule="DINA") summary(mod1) #-- DINA model with second Q-matrix mod2 <- CDM::gdina( dat, q.matrix=q.matrix2, rule="DINA") #-- GDINA model mod3 <- CDM::gdina( dat, q.matrix=q.matrix2, rule="GDINA") #** model comparison IRT.compareModels(mod1,mod2,mod3) ############################################################################# # EXAMPLE 12: Simulataneous modeling of skills and misconceptions (Kuo et al., 2018) ############################################################################# data(data.cdm08, package="CDM") dat <- data.cdm08$data q.matrix <- data.cdm08$q.matrix #*** estimate model mod <- CDM::gdina( dat0, q.matrix, rule="SISM", bugs=colnames(q.matrix)[5:7] ) summary(mod) ############################################################################# # EXAMPLE 13: Regularized estimation in GDINA model data.dtmr ############################################################################# data(data.dtmr, package="CDM") dat <- data.dtmr$data q.matrix <- data.dtmr$q.matrix #***** LASSO regularization with lambda parameter of .02 mod1 <- CDM::gdina(dat, q.matrix=q.matrix, rule="GDINA", regular_lam=.02, regular_type="lasso") summary(mod1) mod$delta_regularized #***** using starting values from previuos estimation delta.init <- mod1$delta attr.prob.init <- mod1$attr.prob mod2 <- CDM::gdina(dat, q.matrix=q.matrix, rule="GDINA", regular_lam=.02, regular_type="lasso", delta.init=delta.init, attr.prob.init=attr.prob.init) summary(mod2) #***** final estimation fixing regularized estimates to zero and estimate all other #***** item parameters unregularized regular_weights <- mod2$delta_regularized delta.init <- mod2$delta attr.prob.init <- mod2$attr.prob mod3 <- CDM::gdina(dat, q.matrix=q.matrix, rule="GDINA", regular_lam=1E5, regular_type="lasso", delta.init=delta.init, attr.prob.init=attr.prob.init, regular_weights=regular_weights) summary(mod3) ## End(Not run)
############################################################################# # EXAMPLE 1: Simulated DINA data | different condensation rules ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dina Q <- sim.qmatrix #*** # Model 1: estimation of the GDINA model (identity link) mod1 <- CDM::gdina( data=dat, q.matrix=Q) summary(mod1) plot(mod1) # apply plot function ## Not run: # Model 1a: estimate model with different simulation seed mod1a <- CDM::gdina( data=dat, q.matrix=Q, seed=9089) summary(mod1a) # Model 1b: estimate model with some fixed delta parameters delta.fixed <- as.list( rep(NA,9) ) # List for parameters of 9 items delta.fixed[[2]] <- c( 0, .15, .15, .45 ) delta.fixed[[6]] <- c( .25, .25 ) mod1b <- CDM::gdina( data=dat, q.matrix=Q, delta.fixed=delta.fixed) summary(mod1b) # Model 1c: fix all delta parameters to previously fitted model mod1c <- CDM::gdina( data=dat, q.matrix=Q, delta.fixed=mod1$delta) summary(mod1c) # Model 1d: estimate GDINA model with GDINA package mod1d <- GDINA::GDINA( dat=dat, Q=Q, model="GDINA" ) summary(mod1d) # extract item parameters GDINA::itemparm(mod1d) GDINA::itemparm(mod1d, what="delta") # compare likelihood logLik(mod1) logLik(mod1d) #*** # Model 2: estimation of the DINA model with gdina function mod2 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINA") summary(mod2) plot(mod2) #*** # Model 2b: compare results with din function mod2b <- CDM::din( data=dat, q.matrix=Q, rule="DINA") summary(mod2b) # Model 2: estimation of the DINO model with gdina function mod3 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINO") summary(mod3) #*** # Model 4: DINA model with logit link mod4 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINA", linkfct="logit" ) summary(mod4) #*** # Model 5: DINA model log link mod5 <- CDM::gdina( data=dat, q.matrix=Q, rule="DINA", linkfct="log") summary(mod5) #*** # Model 6: RRUM model mod6 <- CDM::gdina( data=dat, q.matrix=Q, rule="RRUM") summary(mod6) #*** # Model 7: Higher order GDINA model mod7 <- CDM::gdina( data=dat, q.matrix=Q, HOGDINA=1) summary(mod7) #*** # Model 8: GDINA model with independent attributes mod8 <- CDM::gdina( data=dat, q.matrix=Q, HOGDINA=0) summary(mod8) #*** # Model 9: Estimating the GDINA model with monotonicity constraints mod9 <- CDM::gdina( data=dat, q.matrix=Q, rule="GDINA", mono.constr=TRUE, linkfct="logit") summary(mod9) #*** # Model 10: Estimating the ACDM model with SCAD penalty and regularization # parameter of .05 mod10 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", linkfct="logit", regular_type="scad", regular_lam=.05 ) summary(mod10) #*** # Model 11: Estimation of GDINA model with prior distributions # N(0,10^2) prior for item intercepts prior_intercepts <- c(0,10) # N(0,1^2) prior for item slopes prior_slopes <- c(0,1) # estimate model mod11 <- CDM::gdina( data=dat, q.matrix=Q, rule="GDINA", prior_intercepts=prior_intercepts, prior_slopes=prior_slopes) summary(mod11) ############################################################################# # EXAMPLE 2: Simulated DINO data # additive cognitive diagnosis model with different link functions ############################################################################# data(sim.dino, package="CDM") data(sim.matrix, package="CDM") dat <- sim.dino Q <- sim.qmatrix #*** # Model 1: additive cognitive diagnosis model (ACDM; identity link) mod1 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM") summary(mod1) #*** # Model 2: ACDM logit link mod2 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", linkfct="logit") summary(mod2) #*** # Model 3: ACDM log link mod3 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", linkfct="log") summary(mod3) #*** # Model 4: Different condensation rules per item I <- 9 # number of items rule <- rep( "GDINA", I ) rule[1] <- "DINO" # 1st item: DINO model rule[7] <- "GDINA2" # 7th item: GDINA model with first- and second-order interactions rule[8] <- "ACDM" # 8ht item: additive CDM rule[9] <- "DINA" # 9th item: DINA model mod4 <- CDM::gdina( data=dat, q.matrix=Q, rule=rule ) summary(mod4) ############################################################################# # EXAMPLE 3: Model with user-specified design matrices ############################################################################# data(sim.dino, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dino Q <- sim.qmatrix # do a preliminary analysis and modify obtained design matrices mod0 <- CDM::gdina( data=dat, q.matrix=Q, maxit=1) # extract default design matrices Mj <- mod0$Mj Mj.user <- Mj # these user defined design matrices are modified. #~~~ For the second item, the following model should hold # X1 ~ V2 + V2*V3 mj <- Mj[[2]][[1]] mj.lab <- Mj[[2]][[2]] mj <- mj[,-3] mj.lab <- mj.lab[-3] Mj.user[[2]] <- list( mj, mj.lab ) # [[1]] # [,1] [,2] [,3] # [1,] 1 0 0 # [2,] 1 1 0 # [3,] 1 0 0 # [4,] 1 1 1 # [[2]] # [1] "0" "1" "1-2" #~~~ For the eight item an equality constraint should hold # X8 ~ a*V2 + a*V3 + V2*V3 mj <- Mj[[8]][[1]] mj.lab <- Mj[[8]][[2]] mj[,2] <- mj[,2] + mj[,3] mj <- mj[,-3] mj.lab <- c("0", "1=2", "1-2" ) Mj.user[[8]] <- list( mj, mj.lab ) Mj.user[[8]] ## [[1]] ## [,1] [,2] [,3] ## [1,] 1 0 0 ## [2,] 1 1 0 ## [3,] 1 1 0 ## [4,] 1 2 1 ## ## [[2]] ## [1] "0" "1=2" "1-2" mod <- CDM::gdina( data=dat, q.matrix=Q, Mj=Mj.user, maxit=200 ) summary(mod) ############################################################################# # EXAMPLE 4: Design matrix for delta parameters ############################################################################# data(sim.dino, package="CDM") data(sim.qmatrix, package="CDM") #~~~ estimate an initial model mod0 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", maxit=1) # extract coefficients c0 <- mod0$coef I <- 9 # number of items delta.designmatrix <- matrix( 0, nrow=nrow(c0), ncol=nrow(c0) ) diag( delta.designmatrix) <- 1 # set intercept of item 1 and item 3 equal to each other delta.designmatrix[ 7, 1 ] <- 1 ; delta.designmatrix[,7] <- 0 # set loading of V1 of item1 and item 3 equal delta.designmatrix[ 8, 2 ] <- 1 ; delta.designmatrix[,8] <- 0 delta.designmatrix <- delta.designmatrix[, -c(7:8) ] # exclude original parameters with indices 7 and 8 #*** # Model 1: ACDM with designmatrix mod1 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", delta.designmatrix=delta.designmatrix ) summary(mod1) #*** # Model 2: Same model, but with logit link instead of identity link function mod2 <- CDM::gdina( data=dat, q.matrix=Q, rule="ACDM", delta.designmatrix=delta.designmatrix, linkfct="logit") summary(mod2) ############################################################################# # EXAMPLE 5: Multiple group estimation ############################################################################# # simulate data set.seed(9279) N1 <- 200 ; N2 <- 100 # group sizes I <- 10 # number of items q.matrix <- matrix(0,I,2) # create Q-matrix q.matrix[1:7,1] <- 1 ; q.matrix[ 5:10,2] <- 1 # simulate first group dat1 <- CDM::sim.din(N1, q.matrix=q.matrix, mean=c(0,0) )$dat # simulate second group dat2 <- CDM::sim.din(N2, q.matrix=q.matrix, mean=c(-.3, -.7) )$dat # merge data dat <- rbind( dat1, dat2 ) # group indicator group <- c( rep(1,N1), rep(2,N2) ) # estimate GDINA model with multiple groups assuming invariant item parameters mod1 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group) summary(mod1) # estimate DINA model with multiple groups assuming invariant item parameters mod2 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, rule="DINA") summary(mod2) # estimate GDINA model with noninvariant item parameters mod3 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, invariance=FALSE) summary(mod3) # estimate GDINA model with some invariant item parameters (I001, I006, I008) mod4 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, invariance=c("I001", "I006","I008") ) #--- model comparison IRT.compareModels(mod1,mod2,mod3,mod4) # estimate GDINA model with non-invariant item parameters except for the # items I001, I006, I008 mod5 <- CDM::gdina( data=dat, q.matrix=q.matrix, group=group, invariance=setdiff( colnames(dat), c("I001", "I006","I008") ) ) ############################################################################# # EXAMPLE 6: User specified reduced skill space ############################################################################# # Some correlations between attributes should be set to zero. q.matrix <- expand.grid( c(0,1), c(0,1), c(0,1), c(0,1) ) colnames(q.matrix) <- colnames( paste("Attr", 1:4,sep="")) q.matrix <- q.matrix[ -1, ] Sigma <- matrix( .5, nrow=4, ncol=4 ) diag(Sigma) <- 1 Sigma[3,2] <- Sigma[2,3] <- 0 # set correlation of attribute A2 and A3 to zero dat <- CDM::sim.din( N=1000, q.matrix=q.matrix, Sigma=Sigma)$dat #~~~ Step 1: initial estimation mod1a <- CDM::gdina( data=dat, q.matrix=q.matrix, maxit=1, rule="DINA") # estimate also "full" model mod1 <- CDM::gdina( data=dat, q.matrix=q.matrix, rule="DINA") #~~~ Step 2: modify designmatrix for reduced skillspace Z.skillspace <- data.frame( mod1a$Z.skillspace ) # set correlations of A2/A4 and A3/A4 to zero vars <- c("A2_A3","A2_A4") for (vv in vars){ Z.skillspace[,vv] <- NULL } #~~~ Step 3: estimate model with reduced skillspace mod2 <- CDM::gdina( data=dat, q.matrix=q.matrix, Z.skillspace=Z.skillspace, rule="DINA") #~~~ eliminate all covariances Z.skillspace <- data.frame( mod1$Z.skillspace ) colnames(Z.skillspace) Z.skillspace <- Z.skillspace[, -grep( "_", colnames(Z.skillspace),fixed=TRUE)] colnames(Z.skillspace) mod3 <- CDM::gdina( data=dat, q.matrix=q.matrix, Z.skillspace=Z.skillspace, rule="DINA") summary(mod1) summary(mod2) summary(mod3) ############################################################################# # EXAMPLE 7: Polytomous GDINA model (Chen & de la Torre, 2013) ############################################################################# data(data.pgdina, package="CDM") dat <- data.pgdina$dat q.matrix <- data.pgdina$q.matrix # pGDINA model with "DINA rule" mod1 <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA") summary(mod1) # no reduced skill space mod1a <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA",reduced.skillspace=FALSE) summary(mod1) # pGDINA model with "GDINA rule" mod2 <- CDM::gdina( dat, q.matrix=q.matrix, rule="GDINA") summary(mod2) ############################################################################# # EXAMPLE 8: Fraction subtraction data: DINA and HO-DINA model ############################################################################# data(fraction.subtraction.data, package="CDM") data(fraction.subtraction.qmatrix, package="CDM") dat <- fraction.subtraction.data Q <- fraction.subtraction.qmatrix # Model 1: DINA model mod1 <- CDM::gdina( dat, q.matrix=Q, rule="DINA") summary(mod1) # Model 2: HO-DINA model mod2 <- CDM::gdina( dat, q.matrix=Q, HOGDINA=1, rule="DINA") summary(mod2) ############################################################################# # EXAMPLE 9: Skill space approximation data.jang ############################################################################# data(data.jang, package="CDM") data <- data.jang$data q.matrix <- data.jang$q.matrix #*** Model 1: Reduced RUM model mod1 <- CDM::gdina( data, q.matrix, rule="RRUM", conv.crit=.001, maxit=500 ) #*** Model 2: Reduced RUM model with skill space approximation # use 300 instead of 2^9=512 skill classes skillspace <- CDM::skillspace.approximation( L=300, K=ncol(q.matrix) ) mod2 <- CDM::gdina( data, q.matrix, rule="RRUM", conv.crit=.001, skillclasses=skillspace ) ## > logLik(mod1) ## 'log Lik.' -30318.08 (df=153) ## > logLik(mod2) ## 'log Lik.' -30326.52 (df=153) ############################################################################# # EXAMPLE 10: CDM with a linear hierarchy ############################################################################# # This model is equivalent to a unidimensional IRT model with an ordered # ordinal latent trait and is actually a probabilistic Guttman model. set.seed(789) # define 3 competency levels alpha <- scan() 0 0 0 1 0 0 1 1 0 1 1 1 # define skill class distribution K <- 3 skillspace <- alpha <- matrix( alpha, K + 1, K, byrow=TRUE ) alpha <- alpha[ rep( 1:4, c(300,300,200,200) ), ] # P(000)=P(100)=.3, P(110)=P(111)=.2 # define Q-matrix Q <- scan() 1 0 0 1 1 0 1 1 1 Q <- matrix( Q, nrow=K, ncol=K, byrow=TRUE ) Q <- Q[ rep(1:K, each=4 ), ] colnames(skillspace) <- colnames(Q) <- paste0("A",1:K) I <- nrow(Q) # define guessing and slipping parameters guess <- stats::runif( I, 0, .3 ) slip <- stats::runif( I, 0, .2 ) # simulate data dat <- CDM::sim.din( q.matrix=Q, alpha=alpha, slip=slip, guess=guess )$dat #*** Model 1: DINA model with linear hierarchy mod1 <- CDM::din( dat, q.matrix=Q, rule="DINA", skillclasses=skillspace ) summary(mod1) #*** Model 2: pGDINA model with 3 levels # The multidimensional CDM with a linear hierarchy is a unidimensional # polytomous GDINA model. Q2 <- matrix( rowSums(Q), nrow=I, ncol=1 ) mod2 <- CDM::gdina( dat, q.matrix=Q2, rule="DINA" ) summary(mod2) #*** Model 3: estimate probabilistic Guttman model in sirt # Proctor, C. H. (1970). A probabilistic formulation and statistical # analysis for Guttman scaling. Psychometrika, 35, 73-78. library(sirt) mod3 <- sirt::prob.guttman( dat, itemlevel=Q2[,1] ) summary(mod3) # -> The three models result in nearly equivalent fit. ############################################################################# # EXAMPLE 11: Sequential GDINA model (Ma & de la Torre, 2016) ############################################################################# data(data.cdm04, package="CDM") #** attach dataset dat <- data.cdm04$data # polytomous item responses q.matrix1 <- data.cdm04$q.matrix1 q.matrix2 <- data.cdm04$q.matrix2 #-- DINA model with first Q-matrix mod1 <- CDM::gdina( dat, q.matrix=q.matrix1, rule="DINA") summary(mod1) #-- DINA model with second Q-matrix mod2 <- CDM::gdina( dat, q.matrix=q.matrix2, rule="DINA") #-- GDINA model mod3 <- CDM::gdina( dat, q.matrix=q.matrix2, rule="GDINA") #** model comparison IRT.compareModels(mod1,mod2,mod3) ############################################################################# # EXAMPLE 12: Simulataneous modeling of skills and misconceptions (Kuo et al., 2018) ############################################################################# data(data.cdm08, package="CDM") dat <- data.cdm08$data q.matrix <- data.cdm08$q.matrix #*** estimate model mod <- CDM::gdina( dat0, q.matrix, rule="SISM", bugs=colnames(q.matrix)[5:7] ) summary(mod) ############################################################################# # EXAMPLE 13: Regularized estimation in GDINA model data.dtmr ############################################################################# data(data.dtmr, package="CDM") dat <- data.dtmr$data q.matrix <- data.dtmr$q.matrix #***** LASSO regularization with lambda parameter of .02 mod1 <- CDM::gdina(dat, q.matrix=q.matrix, rule="GDINA", regular_lam=.02, regular_type="lasso") summary(mod1) mod$delta_regularized #***** using starting values from previuos estimation delta.init <- mod1$delta attr.prob.init <- mod1$attr.prob mod2 <- CDM::gdina(dat, q.matrix=q.matrix, rule="GDINA", regular_lam=.02, regular_type="lasso", delta.init=delta.init, attr.prob.init=attr.prob.init) summary(mod2) #***** final estimation fixing regularized estimates to zero and estimate all other #***** item parameters unregularized regular_weights <- mod2$delta_regularized delta.init <- mod2$delta attr.prob.init <- mod2$attr.prob mod3 <- CDM::gdina(dat, q.matrix=q.matrix, rule="GDINA", regular_lam=1E5, regular_type="lasso", delta.init=delta.init, attr.prob.init=attr.prob.init, regular_weights=regular_weights) summary(mod3) ## End(Not run)
This function assesses item-wise differential item functioning in the GDINA model by using the Wald test (de la Torre, 2011; Hou, de la Torre & Nandakumar, 2014). It is necessary that a multiple group GDINA model is previously fitted.
gdina.dif(object) ## S3 method for class 'gdina.dif' summary(object, ...)
gdina.dif(object) ## S3 method for class 'gdina.dif' summary(object, ...)
object |
Object of class |
... |
Further arguments to be passed |
The p values are also calculated by a Holm adjustment
for multiple comparisons (see p.holm
in
output difstats
).
In the case of two groups, an effect size of differential item functioning
(labeled as UA
(unsigned area) in difstats
value) is defined as
the weighted absolute difference of item response functions. The DIF measure
for item is defined as
where .
A list with following entries
difstats |
Data frame containing results of item-wise Wald tests |
coef |
Data frame containing all (group-wise) item parameters |
delta_all |
List of |
varmat_all |
List of covariance matrices of all
|
prob.exp.group |
List with groups and items containing expected latent class sizes and expected probabilities for each group and each item. Based on this information, effect sizes of differential item functioning can be calculated. |
de la Torre, J. (2011). The generalized DINA model framework. Psychometrika, 76, 179-199.
Hou, L., de la Torre, J., & Nandakumar, R. (2014). Differential item functioning assessment in cognitive diagnostic modeling: Application of the Wald test to investigate DIF in the DINA model. Journal of Educational Measurement, 51, 98-125.
See the GDINA::dif
function in the
GDINA package for similar functionality.
## Not run: ############################################################################# # EXAMPLE 1: DIF for DINA simulated data ############################################################################# # simulate some data set.seed(976) N <- 2000 # number of persons in a group I <- 9 # number of items q.matrix <- matrix( 0, 9,2 ) q.matrix[1:3,1] <- 1 q.matrix[4:6,2] <- 1 q.matrix[7:9,c(1,2)] <- 1 # simulate first group guess <- rep( .2, I ) slip <- rep(.1, I) dat1 <- CDM::sim.din( N=N, q.matrix=q.matrix, guess=guess, slip=slip, mean=c(0,0) )$dat # simulate second group with some DIF items (items 1, 7 and 8) guess[ c(1,7)] <- c(.3, .35 ) slip[8] <- .25 dat2 <- CDM::sim.din( N=N, q.matrix=q.matrix, guess=guess, slip=slip, mean=c(0.4,.25) )$dat group <- rep(1:2, each=N ) dat <- rbind( dat1, dat2 ) #*** estimate multiple group GDINA model mod1 <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA", group=group ) summary(mod1) #*** assess differential item functioning dmod1 <- CDM::gdina.dif( mod1) summary(dmod1) ## item X2 df p p.holm UA ## 1 I001 10.1711 2 0.0062 0.0495 0.0428 ## 2 I002 1.9933 2 0.3691 1.0000 0.0276 ## 3 I003 0.0313 2 0.9845 1.0000 0.0040 ## 4 I004 0.0290 2 0.9856 1.0000 0.0044 ## 5 I005 2.3230 2 0.3130 1.0000 0.0142 ## 6 I006 1.8330 2 0.3999 1.0000 0.0159 ## 7 I007 40.6851 2 0.0000 0.0000 0.1184 ## 8 I008 6.7912 2 0.0335 0.2346 0.0710 ## 9 I009 1.1538 2 0.5616 1.0000 0.0180 ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: DIF for DINA simulated data ############################################################################# # simulate some data set.seed(976) N <- 2000 # number of persons in a group I <- 9 # number of items q.matrix <- matrix( 0, 9,2 ) q.matrix[1:3,1] <- 1 q.matrix[4:6,2] <- 1 q.matrix[7:9,c(1,2)] <- 1 # simulate first group guess <- rep( .2, I ) slip <- rep(.1, I) dat1 <- CDM::sim.din( N=N, q.matrix=q.matrix, guess=guess, slip=slip, mean=c(0,0) )$dat # simulate second group with some DIF items (items 1, 7 and 8) guess[ c(1,7)] <- c(.3, .35 ) slip[8] <- .25 dat2 <- CDM::sim.din( N=N, q.matrix=q.matrix, guess=guess, slip=slip, mean=c(0.4,.25) )$dat group <- rep(1:2, each=N ) dat <- rbind( dat1, dat2 ) #*** estimate multiple group GDINA model mod1 <- CDM::gdina( dat, q.matrix=q.matrix, rule="DINA", group=group ) summary(mod1) #*** assess differential item functioning dmod1 <- CDM::gdina.dif( mod1) summary(dmod1) ## item X2 df p p.holm UA ## 1 I001 10.1711 2 0.0062 0.0495 0.0428 ## 2 I002 1.9933 2 0.3691 1.0000 0.0276 ## 3 I003 0.0313 2 0.9845 1.0000 0.0040 ## 4 I004 0.0290 2 0.9856 1.0000 0.0044 ## 5 I005 2.3230 2 0.3130 1.0000 0.0142 ## 6 I006 1.8330 2 0.3999 1.0000 0.0159 ## 7 I007 40.6851 2 0.0000 0.0000 0.1184 ## 8 I008 6.7912 2 0.0335 0.2346 0.0710 ## 9 I009 1.1538 2 0.5616 1.0000 0.0180 ## End(Not run)
This function tests with a Wald test for the GDINA model whether a DINA or a ACDM
condensation rule leads to a sufficient item fit compared
to the saturated GDINA rule (de la Torre & Lee, 2013). The Wald test
is accompanied by the RMSEA fit and weighted and unweighted
distance measures (wgtdist
, uwgtdist
), see Details
(compare Ma, Iaconangelo, & de la Torre, 2016).
gdina.wald(object) ## S3 method for class 'gdina.wald' summary(object, digits=3, vars=c("X2", "p", "sig", "RMSEA", "wgtdist"), ...)
gdina.wald(object) ## S3 method for class 'gdina.wald' summary(object, digits=3, vars=c("X2", "p", "sig", "RMSEA", "wgtdist"), ...)
object |
A fitted |
digits |
Number of digits after decimal used for rounding. |
vars |
Vector including variables which should
be displayed in |
... |
Further arguments to be passed |
Let the estimated item response function for the
GDINA model and
the item response
model for the approximated model (DINA, DINO or ACDM).
The unweighted distance
uwgtdist
as a measure of misfit is defined as
The weighted distance wgtdist
measures the discrepancy
with respected to the probabilities of estimated
skill classes
stats |
Data frame with Wald statistic for every item, corresponding p values and a RMSEA fit statistic |
de la Torre, J., & Lee, Y. S. (2013). Evaluating the Wald test for item-level comparison of saturated and reduced models in cognitive diagnosis. Journal of Educational Measurement, 50, 355-373.
Ma, W., Iaconangelo, C., & de la Torre, J. (2016). Model similarity, model selection, and attribute classification. Applied Psychological Measurement, 40(3), 200-217.
See the GDINA::modelcomp
function in the
GDINA package for similar functionality.
## Not run: ############################################################################# # EXAMPLE 1: Wald test for DINA simulated data sim.dina ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # Model 1: estimate GDINA model mod1 <- CDM::gdina( sim.dina, q.matrix=sim.qmatrix, rule="GDINA") summary(mod1) # perform Wald test res1 <- CDM::gdina.wald( mod1 ) summary(res1) # -> results show that all but one item fit according to the DINA rule # select some output summary(res1, vars=c("wgtdist", "p") ) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Wald test for DINA simulated data sim.dina ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # Model 1: estimate GDINA model mod1 <- CDM::gdina( sim.dina, q.matrix=sim.qmatrix, rule="GDINA") summary(mod1) # perform Wald test res1 <- CDM::gdina.wald( mod1 ) summary(res1) # -> results show that all but one item fit according to the DINA rule # select some output summary(res1, vars=c("wgtdist", "p") ) ## End(Not run)
This function estimates the general diagnostic model (von Davier, 2008; Xu & von Davier, 2008) which handles multidimensional item response models with ordered discrete or continuous latent variables for polytomous item responses.
gdm( data, theta.k, irtmodel="2PL", group=NULL, weights=rep(1, nrow(data)), Qmatrix=NULL, thetaDes=NULL, skillspace="loglinear", b.constraint=NULL, a.constraint=NULL, mean.constraint=NULL, Sigma.constraint=NULL, delta.designmatrix=NULL, standardized.latent=FALSE, centered.latent=FALSE, centerintercepts=FALSE, centerslopes=FALSE, maxiter=1000, conv=1e-5, globconv=1e-5, msteps=4, convM=.0005, decrease.increments=FALSE, use.freqpatt=FALSE, progress=TRUE, PEM=FALSE, PEM_itermax=maxiter, ...) ## S3 method for class 'gdm' summary(object, file=NULL, ...) ## S3 method for class 'gdm' print(x, ...) ## S3 method for class 'gdm' plot(x, perstype="EAP", group=1, barwidth=.1, histcol=1, cexcor=3, pchpers=16, cexpers=.7, ... )
gdm( data, theta.k, irtmodel="2PL", group=NULL, weights=rep(1, nrow(data)), Qmatrix=NULL, thetaDes=NULL, skillspace="loglinear", b.constraint=NULL, a.constraint=NULL, mean.constraint=NULL, Sigma.constraint=NULL, delta.designmatrix=NULL, standardized.latent=FALSE, centered.latent=FALSE, centerintercepts=FALSE, centerslopes=FALSE, maxiter=1000, conv=1e-5, globconv=1e-5, msteps=4, convM=.0005, decrease.increments=FALSE, use.freqpatt=FALSE, progress=TRUE, PEM=FALSE, PEM_itermax=maxiter, ...) ## S3 method for class 'gdm' summary(object, file=NULL, ...) ## S3 method for class 'gdm' print(x, ...) ## S3 method for class 'gdm' plot(x, perstype="EAP", group=1, barwidth=.1, histcol=1, cexcor=3, pchpers=16, cexpers=.7, ... )
data |
An |
theta.k |
In the one-dimensional case it must be a vector.
For multidimensional models it has to be a list
of skill vectors if the theta grid differs between
dimensions. If not, a vector input can be supplied.
If an estimated skillspace ( |
irtmodel |
The default |
group |
An optional vector of group identifiers for
multiple group estimation.
For |
weights |
An optional vector of sample weights |
Qmatrix |
An optional array of dimension |
thetaDes |
A design matrix for specifying nonlinear item response functions (see Example 1, Models 4 and 5) |
skillspace |
The parametric assumption of the skillspace.
If |
b.constraint |
In this optional matrix with |
a.constraint |
In this optional matrix with |
mean.constraint |
A |
Sigma.constraint |
A |
delta.designmatrix |
The design matrix of |
standardized.latent |
A logical indicating whether in a uni- or multidimensional
model all latent variables of the first group should be normally distributed
and standardized. The default is |
centered.latent |
A logical indicating whether in a uni- or multidimensional
model all latent variables of the first group should be normally
distributed and do have zero means? The default is |
centerintercepts |
A logical indicating whether intercepts should be centered to have a mean of 0 for all dimensions. This argument does not (yet) work properly for varying numbers of item categories. |
centerslopes |
A logical indicating whether item slopes should be centered to have
a mean of 1 for all dimensions. This argument only works for
|
maxiter |
Maximum number of iterations |
conv |
Convergence criterion for item parameters and distribution parameters |
globconv |
Global deviance convergence criterion |
msteps |
Maximum number of M steps in estimating |
convM |
Convergence criterion in M step |
decrease.increments |
Should in the M step the increments
of |
use.freqpatt |
A logical indicating whether frequencies of unique item response patterns
should be used. In case of large data set |
progress |
An optional logical indicating whether the function should print the progress of iteration in the estimation process. |
PEM |
Logical indicating whether the P-EM acceleration should be applied (Berlinet & Roland, 2012). |
PEM_itermax |
Number of iterations in which the P-EM method should be applied. |
object |
A required object of class |
file |
Optional file name for a file in which |
x |
A required object of class |
perstype |
Person parameter estimate type. Can be either
|
barwidth |
Bar width in |
histcol |
Color of histogram bars in |
cexcor |
Font size for print of correlation in |
pchpers |
Point type for scatter plot of person
parameters in |
cexpers |
Point size for scatter plot of person
parameters in |
... |
Optional parameters to be passed to or from other methods will be ignored. |
Case irtmodel="1PL"
:
Equal item slopes of 1 are assumed in this model. Therefore,
it corresponds to a generalized multidimensional Rasch model.
The Q-matrix entries are pre-specified by the user.
Case irtmodel="2PL"
:
For each item and each dimension, different item slopes
are estimated:
Case irtmodel="2PLcat"
:
For each item, each dimension and each category,
different item slopes
are estimated:
Note that this model can be generalized to include terms of
any transformation of the
vector (e.g. quadratic terms,
step functions or interaction) such that the model can be formulated as
In general, the number of functions will be
larger than the
dimension of
.
The estimation follows an EM algorithm as described in von Davier and Yamamoto (2004) and von Davier (2008).
In case of skillspace="est"
, the vectors
(the grid of the theta distribution) are estimated (Bartolucci, 2007;
Bacci, Bartolucci & Gnaldi, 2012). This model is called a multidimensional
latent class item response model.
An object of class gdm
. The list contains the
following entries:
item |
Data frame with item parameters |
person |
Data frame with person parameters:
|
EAP.rel |
Reliability of the EAP |
deviance |
Deviance |
ic |
Information criteria, number of estimated parameters |
b |
Item intercepts |
se.b |
Standard error of item intercepts |
a |
Item slopes |
se.a |
Standard error of item slopes |
itemfit.rmsea |
The RMSEA item fit index (see |
mean.rmsea |
Mean of RMSEA item fit indexes. |
Qmatrix |
Used Q-matrix |
pi.k |
Trait distribution |
mean.trait |
Means of trait distribution |
sd.trait |
Standard deviations of trait distribution |
skewness.trait |
Skewnesses of trait distribution |
correlation.trait |
List of correlation matrices of trait distribution corresponding to each group |
pjk |
Item response probabilities evaluated at grid |
n.ik |
An array of expected counts |
G |
Number of groups |
D |
Number of dimension of |
I |
Number of items |
N |
Number of persons |
delta |
Parameter estimates for skillspace representation |
covdelta |
Covariance matrix of parameter estimates for skillspace representation |
data |
Original data frame |
group.stat |
Group statistics (sample sizes, group labels) |
p.xi.aj |
Individual likelihood |
posterior |
Individual posterior distribution |
skill.levels |
Number of skill levels per dimension |
K.item |
Maximal category per item |
theta.k |
Used theta design or estimated theta trait distribution
in case of |
thetaDes |
Used theta design for item responses |
se.theta.k |
Estimated standard errors of |
time |
Info about computation time |
skillspace |
Used skillspace parametrization |
iter |
Number of iterations |
converged |
Logical indicating whether convergence was achieved. |
object |
Object of class |
x |
Object of class |
perstype |
Person paramter estimate type. Can be either
|
group |
Group which should be used for |
barwidth |
Bar width in |
histcol |
Color of histogram bars in |
cexcor |
Font size for print of correlation in |
pchpers |
Point type for scatter plot of person
parameters in |
cexpers |
Point size for scatter plot of person
parameters in |
... |
Optional parameters to be passed to or from other methods will be ignored. |
Bacci, S., Bartolucci, F., & Gnaldi, M. (2012). A class of multidimensional latent class IRT models for ordinal polytomous item responses. arXiv preprint, arXiv:1201.4667.
Bartolucci, F. (2007). A class of multidimensional IRT models for testing unidimensionality and clustering items. Psychometrika, 72, 141-157.
Berlinet, A. F., & Roland, C. (2012). Acceleration of the EM algorithm: P-EM versus epsilon algorithm. Computational Statistics & Data Analysis, 56(12), 4122-4137.
von Davier, M. (2008). A general diagnostic model applied to language testing data. British Journal of Mathematical and Statistical Psychology, 61, 287-307.
von Davier, M., & Yamamoto, K. (2004). Partially observed mixtures of IRT models: An extension of the generalized partial-credit model. Applied Psychological Measurement, 28, 389-406.
Xu, X., & von Davier, M. (2008). Fitting the structured general diagnostic model to NAEP data. ETS Research Report ETS RR-08-27. Princeton, ETS.
Cognitive diagnostic models for dichotomous data can be estimated
with din
(DINA or DINO model) or gdina
(GDINA model, which contains many CDMs as special cases).
For assessment of model fit see modelfit.cor.din
and
anova.gdm
.
See itemfit.sx2
for item fit statistics.
For the estimation of the multidimensional
latent class item response model see the MultiLCIRT package
and sirt package (function sirt::rasch.mirtlc
).
############################################################################# # EXAMPLE 1: Fraction Dataset 1 # Unidimensional Models for dichotomous data ############################################################################# data(data.fraction1, package="CDM") dat <- data.fraction1$data theta.k <- seq( -6, 6, len=15 ) # discretized ability #*** # Model 1: Rasch model (normal distribution) mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE) summary(mod1) plot(mod1) #*** # Model 2: Rasch model (log-linear smoothing) # set the item difficulty of the 8th item to zero b.constraint <- matrix( c(8,1,0), 1, 3 ) mod2 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="loglinear", b.constraint=b.constraint ) summary(mod2) #*** # Model 3: 2PL model mod3 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, skillspace="normal", standardized.latent=TRUE ) summary(mod3) ## Not run: #*** # Model 4: include quadratic term in item response function # using the argument decrease.increments=TRUE leads to a more # stable estimate thetaDes <- cbind( theta.k, theta.k^2 ) colnames(thetaDes) <- c( "F1", "F1q" ) mod4 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, thetaDes=thetaDes, skillspace="normal", standardized.latent=TRUE, decrease.increments=TRUE) summary(mod4) #*** # Model 5: step function for ICC # two different probabilities theta < 0 and theta > 0 thetaDes <- matrix( 1*(theta.k>0), ncol=1 ) colnames(thetaDes) <- c( "Fgrm1" ) mod5 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, thetaDes=thetaDes, skillspace="normal" ) summary(mod5) #*** # Model 6: DINA model with din function mod6 <- CDM::din( dat, q.matrix=matrix( 1, nrow=ncol(dat),ncol=1 ) ) summary(mod6) #*** # Model 7: Estimating a version of the DINA model with gdm theta.k <- c(-.5,.5) mod7 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, skillspace="loglinear" ) summary(mod7) ############################################################################# # EXAMPLE 2: Cultural Activities - data.Students # Unidimensional Models for polytomous data ############################################################################# data(data.Students, package="CDM") dat <- data.Students dat <- dat[, grep( "act", colnames(dat) ) ] theta.k <- seq( -4, 4, len=11 ) # discretized ability #*** # Model 1: Partial Credit Model (PCM) mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE) summary(mod1) plot(mod1) #*** # Model 1b: PCM using frequency patterns mod1b <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE, use.freqpatt=TRUE) summary(mod1b) #*** # Model 2: PCM with two groups mod2 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, group=CDM::data.Students$urban + 1, skillspace="normal", centered.latent=TRUE) summary(mod2) #*** # Model 3: PCM with loglinear smoothing b.constraint <- matrix( c(1,2,0), ncol=3 ) mod3 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="loglinear", b.constraint=b.constraint ) summary(mod3) #*** # Model 4: Model with pre-specified item weights in Q-matrix Qmatrix <- array( 1, dim=c(5,1,2) ) Qmatrix[,1,2] <- 2 # default is score 2 for category 2 # now change the scoring of category 2: Qmatrix[c(2,4),1,1] <- .74 Qmatrix[c(2,4),1,2] <- 2.3 # for items 2 and 4 the score for category 1 is .74 and for category 2 it is 2.3 mod4 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, skillspace="normal", centered.latent=TRUE) summary(mod4) #*** # Model 5: Generalized partial credit model mod5 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, skillspace="normal", standardized.latent=TRUE ) summary(mod5) #*** # Model 6: Item-category slope estimation mod6 <- CDM::gdm( dat, irtmodel="2PLcat", theta.k=theta.k, skillspace="normal", standardized.latent=TRUE, decrease.increments=TRUE) summary(mod6) #*** # Models 7: items with different number of categories dat0 <- dat dat0[ paste(dat0[,1])==2, 1 ] <- 1 # 1st item has only two categories dat0[ paste(dat0[,3])==2, 3 ] <- 1 # 3rd item has only two categories # Model 7a: PCM mod7a <- CDM::gdm( dat0, irtmodel="1PL", theta.k=theta.k, centered.latent=TRUE ) summary(mod7a) # Model 7b: Item category slopes mod7b <- CDM::gdm( dat0, irtmodel="2PLcat", theta.k=theta.k, standardized.latent=TRUE, decrease.increments=TRUE ) summary(mod7b) ############################################################################# # EXAMPLE 3: Fraction Dataset 2 # Multidimensional Models for dichotomous data ############################################################################# data(data.fraction2, package="CDM") dat <- data.fraction2$data Qmatrix <- data.fraction2$q.matrix3 #*** # Model 1: One-dimensional Rasch model theta.k <- seq( -4, 4, len=11 ) # discretized ability mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, centered.latent=TRUE) summary(mod1) plot(mod1) #*** # Model 2: One-dimensional 2PL model mod2 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, standardized.latent=TRUE) summary(mod2) plot(mod2) #*** # Model 3: 3-dimensional Rasch Model (normal distribution) mod3 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, centered.latent=TRUE, globconv=5*1E-3, conv=1E-4 ) summary(mod3) #*** # Model 4: 3-dimensional Rasch model (loglinear smoothing) # set some item parameters of items 4,1 and 2 to zero b.constraint <- cbind( c(4,1,2), 1, 0 ) mod4 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, b.constraint=b.constraint, skillspace="loglinear" ) summary(mod4) #*** # Model 5: define a different theta grid for each dimension theta.k <- list( "Dim1"=seq( -5, 5, len=11 ), "Dim2"=seq(-5,5,len=8), "Dim3"=seq( -3,3,len=6) ) mod5 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, b.constraint=b.constraint, skillspace="loglinear") summary(mod5) #*** # Model 6: multdimensional 2PL model (normal distribution) theta.k <- seq( -5, 5, len=13 ) a.constraint <- cbind( c(8,1,3), 1:3, 1, 1 ) # fix some slopes to 1 mod6 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, Qmatrix=Qmatrix, centered.latent=TRUE, a.constraint=a.constraint, decrease.increments=TRUE, skillspace="normal") summary(mod6) #*** # Model 7: multdimensional 2PL model (loglinear distribution) a.constraint <- cbind( c(8,1,3), 1:3, 1, 1 ) b.constraint <- cbind( c(8,1,3), 1, 0 ) mod7 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, Qmatrix=Qmatrix, b.constraint=b.constraint, a.constraint=a.constraint, decrease.increments=FALSE, skillspace="loglinear") summary(mod7) ############################################################################# # EXAMPLE 4: Unidimensional latent class 1PL IRT model ############################################################################# # simulate data set.seed(754) I <- 20 # number of items N <- 2000 # number of persons theta <- c( -2, 0, 1, 2 ) theta <- rep( theta, c(N/4,N/4, 3*N/8, N/8) ) b <- seq(-2,2,len=I) library(sirt) # use function sim.raschtype from sirt package dat <- sirt::sim.raschtype( theta=theta, b=b ) theta.k <- seq(-1, 1, len=4) # initial vector of theta # estimate model mod1 <- CDM::gdm( dat, theta.k=theta.k, skillspace="est", irtmodel="1PL", centerintercepts=TRUE, maxiter=200) summary(mod1) ## Estimated Skill Distribution ## F1 pi.k ## 1 -1.988 0.24813 ## 2 -0.055 0.23313 ## 3 0.940 0.40059 ## 4 2.000 0.11816 ############################################################################# # EXAMPLE 5: Multidimensional latent class IRT model ############################################################################# # We simulate a two-dimensional IRT model in which theta vectors # are observed at a fixed discrete grid (see below). # simulate data set.seed(754) I <- 13 # number of items N <- 2400 # number of persons # simulate Dimension 1 at 4 discrete theta points theta <- c( -2, 0, 1, 2 ) theta <- rep( theta, c(N/4,N/4, 3*N/8, N/8) ) b <- seq(-2,2,len=I) library(sirt) # use simulation function from sirt package dat1 <- sirt::sim.raschtype( theta=theta, b=b ) # simulate Dimension 2 at 4 discrete theta points theta <- c( -3, 0, 1.5, 2 ) theta <- rep( theta, c(N/4,N/4, 3*N/8, N/8) ) dat2 <- sirt::sim.raschtype( theta=theta, b=b ) colnames(dat2) <- gsub( "I", "U", colnames(dat2)) dat <- cbind( dat1, dat2 ) # define Q-matrix Qmatrix <- matrix(0,2*I,2) Qmatrix[ cbind( 1:(2*I), rep(1:2, each=I) ) ] <- 1 theta.k <- seq(-1, 1, len=4) # initial matrix theta.k <- cbind( theta.k, theta.k ) colnames(theta.k) <- c("Dim1","Dim2") # estimate model mod2 <- CDM::gdm( dat, theta.k=theta.k, skillspace="est", irtmodel="1PL", Qmatrix=Qmatrix, centerintercepts=TRUE) summary(mod2) ## Estimated Skill Distribution ## theta.k.Dim1 theta.k.Dim2 pi.k ## 1 -2.022 -3.035 0.25010 ## 2 0.016 0.053 0.24794 ## 3 0.956 1.525 0.36401 ## 4 1.958 1.919 0.13795 ############################################################################# # EXAMPLE 6: Large-scale dataset data.mg ############################################################################# data(data.mg, package="CDM") dat <- data.mg[, paste0("I", 1:11 ) ] theta.k <- seq(-6,6,len=21) #*** # Model 1: Generalized partial credit model with multiple groups mod1 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, group=CDM::data.mg$group, skillspace="normal", standardized.latent=TRUE) summary(mod1) ## End(Not run)
############################################################################# # EXAMPLE 1: Fraction Dataset 1 # Unidimensional Models for dichotomous data ############################################################################# data(data.fraction1, package="CDM") dat <- data.fraction1$data theta.k <- seq( -6, 6, len=15 ) # discretized ability #*** # Model 1: Rasch model (normal distribution) mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE) summary(mod1) plot(mod1) #*** # Model 2: Rasch model (log-linear smoothing) # set the item difficulty of the 8th item to zero b.constraint <- matrix( c(8,1,0), 1, 3 ) mod2 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="loglinear", b.constraint=b.constraint ) summary(mod2) #*** # Model 3: 2PL model mod3 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, skillspace="normal", standardized.latent=TRUE ) summary(mod3) ## Not run: #*** # Model 4: include quadratic term in item response function # using the argument decrease.increments=TRUE leads to a more # stable estimate thetaDes <- cbind( theta.k, theta.k^2 ) colnames(thetaDes) <- c( "F1", "F1q" ) mod4 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, thetaDes=thetaDes, skillspace="normal", standardized.latent=TRUE, decrease.increments=TRUE) summary(mod4) #*** # Model 5: step function for ICC # two different probabilities theta < 0 and theta > 0 thetaDes <- matrix( 1*(theta.k>0), ncol=1 ) colnames(thetaDes) <- c( "Fgrm1" ) mod5 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, thetaDes=thetaDes, skillspace="normal" ) summary(mod5) #*** # Model 6: DINA model with din function mod6 <- CDM::din( dat, q.matrix=matrix( 1, nrow=ncol(dat),ncol=1 ) ) summary(mod6) #*** # Model 7: Estimating a version of the DINA model with gdm theta.k <- c(-.5,.5) mod7 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, skillspace="loglinear" ) summary(mod7) ############################################################################# # EXAMPLE 2: Cultural Activities - data.Students # Unidimensional Models for polytomous data ############################################################################# data(data.Students, package="CDM") dat <- data.Students dat <- dat[, grep( "act", colnames(dat) ) ] theta.k <- seq( -4, 4, len=11 ) # discretized ability #*** # Model 1: Partial Credit Model (PCM) mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE) summary(mod1) plot(mod1) #*** # Model 1b: PCM using frequency patterns mod1b <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE, use.freqpatt=TRUE) summary(mod1b) #*** # Model 2: PCM with two groups mod2 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, group=CDM::data.Students$urban + 1, skillspace="normal", centered.latent=TRUE) summary(mod2) #*** # Model 3: PCM with loglinear smoothing b.constraint <- matrix( c(1,2,0), ncol=3 ) mod3 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="loglinear", b.constraint=b.constraint ) summary(mod3) #*** # Model 4: Model with pre-specified item weights in Q-matrix Qmatrix <- array( 1, dim=c(5,1,2) ) Qmatrix[,1,2] <- 2 # default is score 2 for category 2 # now change the scoring of category 2: Qmatrix[c(2,4),1,1] <- .74 Qmatrix[c(2,4),1,2] <- 2.3 # for items 2 and 4 the score for category 1 is .74 and for category 2 it is 2.3 mod4 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, skillspace="normal", centered.latent=TRUE) summary(mod4) #*** # Model 5: Generalized partial credit model mod5 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, skillspace="normal", standardized.latent=TRUE ) summary(mod5) #*** # Model 6: Item-category slope estimation mod6 <- CDM::gdm( dat, irtmodel="2PLcat", theta.k=theta.k, skillspace="normal", standardized.latent=TRUE, decrease.increments=TRUE) summary(mod6) #*** # Models 7: items with different number of categories dat0 <- dat dat0[ paste(dat0[,1])==2, 1 ] <- 1 # 1st item has only two categories dat0[ paste(dat0[,3])==2, 3 ] <- 1 # 3rd item has only two categories # Model 7a: PCM mod7a <- CDM::gdm( dat0, irtmodel="1PL", theta.k=theta.k, centered.latent=TRUE ) summary(mod7a) # Model 7b: Item category slopes mod7b <- CDM::gdm( dat0, irtmodel="2PLcat", theta.k=theta.k, standardized.latent=TRUE, decrease.increments=TRUE ) summary(mod7b) ############################################################################# # EXAMPLE 3: Fraction Dataset 2 # Multidimensional Models for dichotomous data ############################################################################# data(data.fraction2, package="CDM") dat <- data.fraction2$data Qmatrix <- data.fraction2$q.matrix3 #*** # Model 1: One-dimensional Rasch model theta.k <- seq( -4, 4, len=11 ) # discretized ability mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, centered.latent=TRUE) summary(mod1) plot(mod1) #*** # Model 2: One-dimensional 2PL model mod2 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, standardized.latent=TRUE) summary(mod2) plot(mod2) #*** # Model 3: 3-dimensional Rasch Model (normal distribution) mod3 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, centered.latent=TRUE, globconv=5*1E-3, conv=1E-4 ) summary(mod3) #*** # Model 4: 3-dimensional Rasch model (loglinear smoothing) # set some item parameters of items 4,1 and 2 to zero b.constraint <- cbind( c(4,1,2), 1, 0 ) mod4 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, b.constraint=b.constraint, skillspace="loglinear" ) summary(mod4) #*** # Model 5: define a different theta grid for each dimension theta.k <- list( "Dim1"=seq( -5, 5, len=11 ), "Dim2"=seq(-5,5,len=8), "Dim3"=seq( -3,3,len=6) ) mod5 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, Qmatrix=Qmatrix, b.constraint=b.constraint, skillspace="loglinear") summary(mod5) #*** # Model 6: multdimensional 2PL model (normal distribution) theta.k <- seq( -5, 5, len=13 ) a.constraint <- cbind( c(8,1,3), 1:3, 1, 1 ) # fix some slopes to 1 mod6 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, Qmatrix=Qmatrix, centered.latent=TRUE, a.constraint=a.constraint, decrease.increments=TRUE, skillspace="normal") summary(mod6) #*** # Model 7: multdimensional 2PL model (loglinear distribution) a.constraint <- cbind( c(8,1,3), 1:3, 1, 1 ) b.constraint <- cbind( c(8,1,3), 1, 0 ) mod7 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, Qmatrix=Qmatrix, b.constraint=b.constraint, a.constraint=a.constraint, decrease.increments=FALSE, skillspace="loglinear") summary(mod7) ############################################################################# # EXAMPLE 4: Unidimensional latent class 1PL IRT model ############################################################################# # simulate data set.seed(754) I <- 20 # number of items N <- 2000 # number of persons theta <- c( -2, 0, 1, 2 ) theta <- rep( theta, c(N/4,N/4, 3*N/8, N/8) ) b <- seq(-2,2,len=I) library(sirt) # use function sim.raschtype from sirt package dat <- sirt::sim.raschtype( theta=theta, b=b ) theta.k <- seq(-1, 1, len=4) # initial vector of theta # estimate model mod1 <- CDM::gdm( dat, theta.k=theta.k, skillspace="est", irtmodel="1PL", centerintercepts=TRUE, maxiter=200) summary(mod1) ## Estimated Skill Distribution ## F1 pi.k ## 1 -1.988 0.24813 ## 2 -0.055 0.23313 ## 3 0.940 0.40059 ## 4 2.000 0.11816 ############################################################################# # EXAMPLE 5: Multidimensional latent class IRT model ############################################################################# # We simulate a two-dimensional IRT model in which theta vectors # are observed at a fixed discrete grid (see below). # simulate data set.seed(754) I <- 13 # number of items N <- 2400 # number of persons # simulate Dimension 1 at 4 discrete theta points theta <- c( -2, 0, 1, 2 ) theta <- rep( theta, c(N/4,N/4, 3*N/8, N/8) ) b <- seq(-2,2,len=I) library(sirt) # use simulation function from sirt package dat1 <- sirt::sim.raschtype( theta=theta, b=b ) # simulate Dimension 2 at 4 discrete theta points theta <- c( -3, 0, 1.5, 2 ) theta <- rep( theta, c(N/4,N/4, 3*N/8, N/8) ) dat2 <- sirt::sim.raschtype( theta=theta, b=b ) colnames(dat2) <- gsub( "I", "U", colnames(dat2)) dat <- cbind( dat1, dat2 ) # define Q-matrix Qmatrix <- matrix(0,2*I,2) Qmatrix[ cbind( 1:(2*I), rep(1:2, each=I) ) ] <- 1 theta.k <- seq(-1, 1, len=4) # initial matrix theta.k <- cbind( theta.k, theta.k ) colnames(theta.k) <- c("Dim1","Dim2") # estimate model mod2 <- CDM::gdm( dat, theta.k=theta.k, skillspace="est", irtmodel="1PL", Qmatrix=Qmatrix, centerintercepts=TRUE) summary(mod2) ## Estimated Skill Distribution ## theta.k.Dim1 theta.k.Dim2 pi.k ## 1 -2.022 -3.035 0.25010 ## 2 0.016 0.053 0.24794 ## 3 0.956 1.525 0.36401 ## 4 1.958 1.919 0.13795 ############################################################################# # EXAMPLE 6: Large-scale dataset data.mg ############################################################################# data(data.mg, package="CDM") dat <- data.mg[, paste0("I", 1:11 ) ] theta.k <- seq(-6,6,len=21) #*** # Model 1: Generalized partial credit model with multiple groups mod1 <- CDM::gdm( dat, irtmodel="2PL", theta.k=theta.k, group=CDM::data.mg$group, skillspace="normal", standardized.latent=TRUE) summary(mod1) ## End(Not run)
This function computes the ideal response pattern which is the latent
item response for a person
with skill profile
at item
.
ideal.response.pattern(q.matrix, skillspace=NULL, rule="DINA")
ideal.response.pattern(q.matrix, skillspace=NULL, rule="DINA")
q.matrix |
The Q-matrix |
skillspace |
An optional skill space matrix. If it is not provided, then all skill classes are used for creating an ideal response pattern. |
rule |
Chosen condensation rule for the CDM. Can be |
A list with following entries
idealresp |
A matrix with ideal response patterns |
skillspace |
Used skill space |
############################################################################# # EXAMPLE 1: Ideal response pattern sim.qmatrix ############################################################################# data(sim.qmatrix, package="CDM") q.matrix <- sim.qmatrix #- ideal response pattern for DINA model CDM::ideal.response.pattern(q.matrix) #- ideal response pattern for DINO model CDM::ideal.response.pattern( q.matrix, rule="DINO" ) # compute ideal responses for a reduced skill space skillspace <- matrix( c( 0,1,0, 1,1,0 ), 2,3, byrow=TRUE ) CDM::ideal.response.pattern( q.matrix, skillspace=skillspace)
############################################################################# # EXAMPLE 1: Ideal response pattern sim.qmatrix ############################################################################# data(sim.qmatrix, package="CDM") q.matrix <- sim.qmatrix #- ideal response pattern for DINA model CDM::ideal.response.pattern(q.matrix) #- ideal response pattern for DINO model CDM::ideal.response.pattern( q.matrix, rule="DINO" ) # compute ideal responses for a reduced skill space skillspace <- matrix( c( 0,1,0, 1,1,0 ), 2,3, byrow=TRUE ) CDM::ideal.response.pattern( q.matrix, skillspace=skillspace)
This is a helper function for conducting likelihood ratio tests
and can be generally used for objects for which the
logLik
method is defined.
IRT.anova(object, ...)
IRT.anova(object, ...)
object |
Object for which the |
... |
A further object to be passed |
See also IRT.compareModels
for model comparisons
of several models.
See also as anova.din
.
Computes individual classifications based on a fitted model.
IRT.classify(object, type="MLE")
IRT.classify(object, type="MLE")
object |
Fitted model for which methods |
type |
Type of classification: |
List with entries
class_theta |
Individual classification |
class_index |
Class index of individual classification |
class_maxval |
Maximum value corresponding to individual classification |
See IRT.factor.scores
for similar functionality.
## Not run: ############################################################################# # EXAMPLE 1: Individual classification data.ecpe ############################################################################# data(data.ecpe, package="CDM") dat <- data.ecpe$dat[,-1] Q <- data.ecpe$q.matrix #** estimate GDINA model mod <- CDM::gdina(dat, q.matrix=Q) summary(mod) #** classify individuals cmod <- CDM::IRT.classify(mod) str(cmod) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Individual classification data.ecpe ############################################################################# data(data.ecpe, package="CDM") dat <- data.ecpe$dat[,-1] Q <- data.ecpe$q.matrix #** estimate GDINA model mod <- CDM::gdina(dat, q.matrix=Q) summary(mod) #** classify individuals cmod <- CDM::IRT.classify(mod) str(cmod) ## End(Not run)
Performs model comparisons based on information criteria and likelihood
ratio test. This function allows all objects for which the
logLik
(stats) S3 method is defined.
The output of IRT.modelfit
can also be used as
input for this function.
IRT.compareModels(object, ...) ## S3 method for class 'IRT.compareModels' summary(object, extended=TRUE, ...)
IRT.compareModels(object, ...) ## S3 method for class 'IRT.compareModels' summary(object, extended=TRUE, ...)
object |
Object |
extended |
Optional logical indicating whether all or or only a subset of fit statistics should be printed. |
... |
Further objects to be passed. |
A list with following entries
IC |
Data frame with information criteria |
LRtest |
Data frame with all (useful) pairwise likelihood ratio tests |
The function is based on IRT.IC
.
For comparing two models see anova.din
.
For computing absolute model fit see IRT.modelfit
.
## Not run: ############################################################################# # EXAMPLE 1: Model comparison sim.dina dataset ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dina q.matrix <- sim.qmatrix #*** Model 0: DINA model with equal guessing and slipping parameters mod0 <- CDM::din( dat, q.matrix, guess.equal=TRUE, slip.equal=TRUE ) summary(mod0) #*** Model 1: DINA model mod1 <- CDM::din( dat, q.matrix ) summary(mod1) #*** Model 2: DINO model mod2 <- CDM::din( dat, q.matrix, rule="DINO") summary(mod2) #*** Model 3: Additive GDINA model mod3 <- CDM::gdina( dat, q.matrix, rule="ACDM") summary(mod3) #*** Model 4: GDINA model mod4 <- CDM::gdina( dat, q.matrix, rule="GDINA") summary(mod4) # model comparisons res <- CDM::IRT.compareModels( mod0, mod1, mod2, mod3, mod4 ) res ## > res ## $IC ## Model loglike Deviance Npars Nobs AIC BIC AIC3 AICc CAIC ## 1 mod0 -2176.482 4352.963 9 400 4370.963 4406.886 4379.963 4371.425 4415.886 ## 2 mod1 -2042.378 4084.756 25 400 4134.756 4234.543 4159.756 4138.232 4259.543 ## 3 mod2 -2086.805 4173.610 25 400 4223.610 4323.396 4248.610 4227.086 4348.396 ## 4 mod3 -2048.233 4096.466 32 400 4160.466 4288.193 4192.466 4166.221 4320.193 ## 5 mod4 -2026.633 4053.266 41 400 4135.266 4298.917 4176.266 4144.887 4339.917 ## # -> The DINA model (mod1) performed best in terms of AIC. ## $LRtest ## Model1 Model2 Chi2 df p ## 1 mod0 mod1 268.20713 16 0.000000e+00 ## 2 mod0 mod2 179.35362 16 0.000000e+00 ## 3 mod0 mod3 256.49745 23 0.000000e+00 ## 4 mod0 mod4 299.69671 32 0.000000e+00 ## 5 mod1 mod3 -11.70967 7 1.000000e+00 ## 6 mod1 mod4 31.48959 16 1.164415e-02 ## 7 mod2 mod3 77.14383 7 5.262457e-14 ## 8 mod2 mod4 120.34309 16 0.000000e+00 ## 9 mod3 mod4 43.19926 9 1.981445e-06 ## # -> The GDINA model (mod4) was superior to the other models in terms # of the likelihood ratio test. # get an overview with summary summary(res) summary(res,extended=FALSE) #******************* # applying model comparison for objects of class IRT.modelfit # compute model fit statistics fmod0 <- CDM::IRT.modelfit(mod0) fmod1 <- CDM::IRT.modelfit(mod1) fmod4 <- CDM::IRT.modelfit(mod4) # model comparison res <- CDM::IRT.compareModels( fmod0, fmod1, fmod4 ) res ## $IC ## Model loglike Deviance Npars Nobs AIC BIC AIC3 ## mod0 mod0 -2176.482 4352.963 9 400 4370.963 4406.886 4379.963 ## mod1 mod1 -2042.378 4084.756 25 400 4134.756 4234.543 4159.756 ## mod4 mod4 -2026.633 4053.266 41 400 4135.266 4298.917 4176.266 ## AICc CAIC maxX2 p_maxX2 MADcor SRMSR ## mod0 4371.425 4415.886 118.172707 0.0000000 0.09172287 0.10941300 ## mod1 4138.232 4259.543 8.728248 0.1127943 0.03025354 0.03979948 ## mod4 4144.887 4339.917 2.397241 1.0000000 0.02284029 0.02989669 ## X100.MADRESIDCOV MADQ3 MADaQ3 ## mod0 1.9749936 0.08840892 0.08353917 ## mod1 0.6713952 0.06184332 0.05923058 ## mod4 0.5148707 0.07477337 0.07145600 ## ## $LRtest ## Model1 Model2 Chi2 df p ## 1 mod0 mod1 268.20713 16 0.00000000 ## 2 mod0 mod4 299.69671 32 0.00000000 ## 3 mod1 mod4 31.48959 16 0.01164415 ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Model comparison sim.dina dataset ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dina q.matrix <- sim.qmatrix #*** Model 0: DINA model with equal guessing and slipping parameters mod0 <- CDM::din( dat, q.matrix, guess.equal=TRUE, slip.equal=TRUE ) summary(mod0) #*** Model 1: DINA model mod1 <- CDM::din( dat, q.matrix ) summary(mod1) #*** Model 2: DINO model mod2 <- CDM::din( dat, q.matrix, rule="DINO") summary(mod2) #*** Model 3: Additive GDINA model mod3 <- CDM::gdina( dat, q.matrix, rule="ACDM") summary(mod3) #*** Model 4: GDINA model mod4 <- CDM::gdina( dat, q.matrix, rule="GDINA") summary(mod4) # model comparisons res <- CDM::IRT.compareModels( mod0, mod1, mod2, mod3, mod4 ) res ## > res ## $IC ## Model loglike Deviance Npars Nobs AIC BIC AIC3 AICc CAIC ## 1 mod0 -2176.482 4352.963 9 400 4370.963 4406.886 4379.963 4371.425 4415.886 ## 2 mod1 -2042.378 4084.756 25 400 4134.756 4234.543 4159.756 4138.232 4259.543 ## 3 mod2 -2086.805 4173.610 25 400 4223.610 4323.396 4248.610 4227.086 4348.396 ## 4 mod3 -2048.233 4096.466 32 400 4160.466 4288.193 4192.466 4166.221 4320.193 ## 5 mod4 -2026.633 4053.266 41 400 4135.266 4298.917 4176.266 4144.887 4339.917 ## # -> The DINA model (mod1) performed best in terms of AIC. ## $LRtest ## Model1 Model2 Chi2 df p ## 1 mod0 mod1 268.20713 16 0.000000e+00 ## 2 mod0 mod2 179.35362 16 0.000000e+00 ## 3 mod0 mod3 256.49745 23 0.000000e+00 ## 4 mod0 mod4 299.69671 32 0.000000e+00 ## 5 mod1 mod3 -11.70967 7 1.000000e+00 ## 6 mod1 mod4 31.48959 16 1.164415e-02 ## 7 mod2 mod3 77.14383 7 5.262457e-14 ## 8 mod2 mod4 120.34309 16 0.000000e+00 ## 9 mod3 mod4 43.19926 9 1.981445e-06 ## # -> The GDINA model (mod4) was superior to the other models in terms # of the likelihood ratio test. # get an overview with summary summary(res) summary(res,extended=FALSE) #******************* # applying model comparison for objects of class IRT.modelfit # compute model fit statistics fmod0 <- CDM::IRT.modelfit(mod0) fmod1 <- CDM::IRT.modelfit(mod1) fmod4 <- CDM::IRT.modelfit(mod4) # model comparison res <- CDM::IRT.compareModels( fmod0, fmod1, fmod4 ) res ## $IC ## Model loglike Deviance Npars Nobs AIC BIC AIC3 ## mod0 mod0 -2176.482 4352.963 9 400 4370.963 4406.886 4379.963 ## mod1 mod1 -2042.378 4084.756 25 400 4134.756 4234.543 4159.756 ## mod4 mod4 -2026.633 4053.266 41 400 4135.266 4298.917 4176.266 ## AICc CAIC maxX2 p_maxX2 MADcor SRMSR ## mod0 4371.425 4415.886 118.172707 0.0000000 0.09172287 0.10941300 ## mod1 4138.232 4259.543 8.728248 0.1127943 0.03025354 0.03979948 ## mod4 4144.887 4339.917 2.397241 1.0000000 0.02284029 0.02989669 ## X100.MADRESIDCOV MADQ3 MADaQ3 ## mod0 1.9749936 0.08840892 0.08353917 ## mod1 0.6713952 0.06184332 0.05923058 ## mod4 0.5148707 0.07477337 0.07145600 ## ## $LRtest ## Model1 Model2 Chi2 df p ## 1 mod0 mod1 268.20713 16 0.00000000 ## 2 mod0 mod4 299.69671 32 0.00000000 ## 3 mod1 mod4 31.48959 16 0.01164415 ## End(Not run)
This S3 method extracts the used dataset with item responses.
IRT.data(object, ...) ## S3 method for class 'din' IRT.data(object, ...) ## S3 method for class 'gdina' IRT.data(object, ...) ## S3 method for class 'gdm' IRT.data(object, ...) ## S3 method for class 'mcdina' IRT.data(object, ...) ## S3 method for class 'reglca' IRT.data(object, ...) ## S3 method for class 'slca' IRT.data(object, ...)
IRT.data(object, ...) ## S3 method for class 'din' IRT.data(object, ...) ## S3 method for class 'gdina' IRT.data(object, ...) ## S3 method for class 'gdm' IRT.data(object, ...) ## S3 method for class 'mcdina' IRT.data(object, ...) ## S3 method for class 'reglca' IRT.data(object, ...) ## S3 method for class 'slca' IRT.data(object, ...)
object |
|
... |
More arguments to be passed. |
A matrix (or data frame) with item responses and group identifier and weights vector as attributes.
## Not run: ############################################################################# # EXAMPLE 1: Several models for sim.dina data ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dina q.matrix <- sim.qmatrix #--- Model 1: GDINA model mod1 <- CDM::gdina( data=dat, q.matrix=q.matrix) summary(mod1) dmod1 <- CDM::IRT.data(mod1) str(dmod1) #--- Model 2: DINA model mod2 <- CDM::din( data=dat, q.matrix=q.matrix) summary(mod2) dmod2 <- CDM::IRT.data(mod2) #--- Model 3: Rasch model with gdm function mod3 <- CDM::gdm( data=dat, irtmodel="1PL", theta.k=seq(-4,4,length=11), centered.latent=TRUE ) summary(mod3) dmod3 <- CDM::IRT.data(mod3) #--- Model 4: Latent class model with two classes dat <- sim.dina I <- ncol(dat) # define design matrices TP <- 2 # two classes # The idea is that latent classes refer to two different "dimensions". # Items load on latent class indicators 1 and 2, see below. Xdes <- array(0, dim=c(I,2,2,2*I) ) items <- colnames(dat) dimnames(Xdes)[[4]] <- c(paste0( colnames(dat), "Class", 1), paste0( colnames(dat), "Class", 2) ) # items, categories, classes, parameters # probabilities for correct solution for (ii in 1:I){ Xdes[ ii, 2, 1, ii ] <- 1 # probabilities class 1 Xdes[ ii, 2, 2, ii+I ] <- 1 # probabilities class 2 } # estimate model mod4 <- CDM::slca( dat, Xdes=Xdes) summary(mod4) dmod4 <- CDM::IRT.data(mod4) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Several models for sim.dina data ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") dat <- sim.dina q.matrix <- sim.qmatrix #--- Model 1: GDINA model mod1 <- CDM::gdina( data=dat, q.matrix=q.matrix) summary(mod1) dmod1 <- CDM::IRT.data(mod1) str(dmod1) #--- Model 2: DINA model mod2 <- CDM::din( data=dat, q.matrix=q.matrix) summary(mod2) dmod2 <- CDM::IRT.data(mod2) #--- Model 3: Rasch model with gdm function mod3 <- CDM::gdm( data=dat, irtmodel="1PL", theta.k=seq(-4,4,length=11), centered.latent=TRUE ) summary(mod3) dmod3 <- CDM::IRT.data(mod3) #--- Model 4: Latent class model with two classes dat <- sim.dina I <- ncol(dat) # define design matrices TP <- 2 # two classes # The idea is that latent classes refer to two different "dimensions". # Items load on latent class indicators 1 and 2, see below. Xdes <- array(0, dim=c(I,2,2,2*I) ) items <- colnames(dat) dimnames(Xdes)[[4]] <- c(paste0( colnames(dat), "Class", 1), paste0( colnames(dat), "Class", 2) ) # items, categories, classes, parameters # probabilities for correct solution for (ii in 1:I){ Xdes[ ii, 2, 1, ii ] <- 1 # probabilities class 1 Xdes[ ii, 2, 2, ii+I ] <- 1 # probabilities class 2 } # estimate model mod4 <- CDM::slca( dat, Xdes=Xdes) summary(mod4) dmod4 <- CDM::IRT.data(mod4) ## End(Not run)
This S3 method extracts expected counts from model output.
IRT.expectedCounts(object, ...) ## S3 method for class 'din' IRT.expectedCounts(object, ...) ## S3 method for class 'gdina' IRT.expectedCounts(object, ...) ## S3 method for class 'gdm' IRT.expectedCounts(object, ...) ## S3 method for class 'mcdina' IRT.expectedCounts(object, ...) ## S3 method for class 'slca' IRT.expectedCounts(object, ...) ## S3 method for class 'reglca' IRT.expectedCounts(object, ...)
IRT.expectedCounts(object, ...) ## S3 method for class 'din' IRT.expectedCounts(object, ...) ## S3 method for class 'gdina' IRT.expectedCounts(object, ...) ## S3 method for class 'gdm' IRT.expectedCounts(object, ...) ## S3 method for class 'mcdina' IRT.expectedCounts(object, ...) ## S3 method for class 'slca' IRT.expectedCounts(object, ...) ## S3 method for class 'reglca' IRT.expectedCounts(object, ...)
object |
|
... |
More arguments to be passed. |
An array with expected counts. The dimensions are items, categories, latent classes and groups.
## Not run: ############################################################################# # EXAMPLE 1: Expected counts gdm function ############################################################################# data(data.fraction1, package="CDM") dat <- data.fraction1$data theta.k <- seq( -6, 6, len=11 ) # discretized ability #--- Model 1: Rasch model mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE ) emod1 <- CDM::IRT.expectedCounts(mod1) str(emod1) ############################################################################# # EXAMPLE 2: Expected counts gdina function ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") #--- Model 1: estimation of the GDINA model mod1 <- CDM::gdina( data=sim.dina, q.matrix=sim.qmatrix) summary(mod1) emod1 <- CDM::IRT.expectedCounts(mod1) str(emod1) #--- Model 2: GDINA model with two groups mod2 <- CDM::gdina( data=CDM::sim.dina, q.matrix=CDM::sim.qmatrix, group=rep(1:2, each=200) ) summary(mod2) emod2 <- CDM::IRT.expectedCounts( mod2 ) str(emod2) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Expected counts gdm function ############################################################################# data(data.fraction1, package="CDM") dat <- data.fraction1$data theta.k <- seq( -6, 6, len=11 ) # discretized ability #--- Model 1: Rasch model mod1 <- CDM::gdm( dat, irtmodel="1PL", theta.k=theta.k, skillspace="normal", centered.latent=TRUE ) emod1 <- CDM::IRT.expectedCounts(mod1) str(emod1) ############################################################################# # EXAMPLE 2: Expected counts gdina function ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") #--- Model 1: estimation of the GDINA model mod1 <- CDM::gdina( data=sim.dina, q.matrix=sim.qmatrix) summary(mod1) emod1 <- CDM::IRT.expectedCounts(mod1) str(emod1) #--- Model 2: GDINA model with two groups mod2 <- CDM::gdina( data=CDM::sim.dina, q.matrix=CDM::sim.qmatrix, group=rep(1:2, each=200) ) summary(mod2) emod2 <- CDM::IRT.expectedCounts( mod2 ) str(emod2) ## End(Not run)
This S3 method extracts factor scores or skill classifications.
IRT.factor.scores(object, ...) ## S3 method for class 'din' IRT.factor.scores(object, type="MLE", ...) ## S3 method for class 'gdina' IRT.factor.scores(object, type="MLE", ...) ## S3 method for class 'mcdina' IRT.factor.scores(object, type="MLE", ...) ## S3 method for class 'gdm' IRT.factor.scores(object, type="EAP", ...) ## S3 method for class 'slca' IRT.factor.scores(object, type="MLE", ...)
IRT.factor.scores(object, ...) ## S3 method for class 'din' IRT.factor.scores(object, type="MLE", ...) ## S3 method for class 'gdina' IRT.factor.scores(object, type="MLE", ...) ## S3 method for class 'mcdina' IRT.factor.scores(object, type="MLE", ...) ## S3 method for class 'gdm' IRT.factor.scores(object, type="EAP", ...) ## S3 method for class 'slca' IRT.factor.scores(object, type="MLE", ...)
object |
|
type |
Type of estimated factor score. This can be
|
... |
More arguments to be passed. |
A matrix or a vector with classified scores.
For extracting the individual likelihood or the individual posterior see
IRT.likelihood
or IRT.posterior
.
############################################################################# # EXAMPLE 1: Extracting factor scores in the DINA model ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # estimate DINA model mod1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix) summary(mod1) # MLE fsc1a <- CDM::IRT.factor.scores(mod1) # MAP fsc1b <- CDM::IRT.factor.scores(mod1, type="MAP") # EAP fsc1c <- CDM::IRT.factor.scores(mod1, type="EAP") # compare classification for skill 1 stats::xtabs( ~ fsc1a[,1] + fsc1b[,1] ) graphics::boxplot( fsc1c[,1] ~ fsc1a[,1] )
############################################################################# # EXAMPLE 1: Extracting factor scores in the DINA model ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # estimate DINA model mod1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix) summary(mod1) # MLE fsc1a <- CDM::IRT.factor.scores(mod1) # MAP fsc1b <- CDM::IRT.factor.scores(mod1, type="MAP") # EAP fsc1c <- CDM::IRT.factor.scores(mod1, type="EAP") # compare classification for skill 1 stats::xtabs( ~ fsc1a[,1] + fsc1b[,1] ) graphics::boxplot( fsc1c[,1] ~ fsc1a[,1] )
This S3 method computes observed and expected frequencies for univariate and bivariate distributions.
IRT.frequencies(object, ...) IRT_frequencies_default(data, post, probs, weights=NULL) IRT_frequencies_wrapper(object, ...) ## S3 method for class 'din' IRT.frequencies(object, ...) ## S3 method for class 'gdina' IRT.frequencies(object, ...) ## S3 method for class 'mcdina' IRT.frequencies(object, ...) ## S3 method for class 'gdm' IRT.frequencies(object, ...) ## S3 method for class 'slca' IRT.frequencies(object, ...)
IRT.frequencies(object, ...) IRT_frequencies_default(data, post, probs, weights=NULL) IRT_frequencies_wrapper(object, ...) ## S3 method for class 'din' IRT.frequencies(object, ...) ## S3 method for class 'gdina' IRT.frequencies(object, ...) ## S3 method for class 'mcdina' IRT.frequencies(object, ...) ## S3 method for class 'gdm' IRT.frequencies(object, ...) ## S3 method for class 'slca' IRT.frequencies(object, ...)
object |
|
... |
More arguments to be passed. |
data |
Item response data as extracted by |
post |
Individual posterior distribution as extracted by |
probs |
Individual posterior distribution as extracted by |
weights |
Optional vector of weights as included as the attribute |
List with following entries
uni_obs |
Univariate observed distribution |
uni_exp |
Univariate expected distribution |
M_obs |
Univariate observed means |
M_exp |
Univariate expected means |
SD_obs |
Univariate observed standard deviations |
SD_exp |
Univariate expected standard deviations |
biv_obs |
Bivariate observed frequencies |
biv_exp |
Bivariate expected frequencies |
biv_N |
Bivariate sample size |
cov_obs |
Observed covariances |
cov_cor |
Expected covariances |
cor_obs |
Observed correlations |
cor_exp |
Expected correlations |
chisq |
Chi square statistic of local independence |
## Not run: ############################################################################# # EXAMPLE 1: Usage IRT.frequencies ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # estimate GDINA model mod1 <- CDM::gdina( data=sim.dina, q.matrix=sim.qmatrix) summary(mod1) # direct usage of IRT.frequencies fres1 <- CDM::IRT.frequencies(mod1) # use of the default function with input data data <- CDM::IRT.data(object) post <- CDM::IRT.posterior(object) probs <- CDM::IRT.irfprob(object) fres2 <- CDM::IRT_frequencies_default(data=data, post=post, probs=probs) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Usage IRT.frequencies ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") # estimate GDINA model mod1 <- CDM::gdina( data=sim.dina, q.matrix=sim.qmatrix) summary(mod1) # direct usage of IRT.frequencies fres1 <- CDM::IRT.frequencies(mod1) # use of the default function with input data data <- CDM::IRT.data(object) post <- CDM::IRT.posterior(object) probs <- CDM::IRT.irfprob(object) fres2 <- CDM::IRT_frequencies_default(data=data, post=post, probs=probs) ## End(Not run)
Computes several information criteria for objects which do have
the logLik
(stats) S3 method
(e.g. din
, gdina
, gdm
, ...) .
IRT.IC(object)
IRT.IC(object)
object |
Objects which do have the |
A vector with deviance and several information criteria.
See also anova.din
for model comparisons.
A general method is defined in IRT.compareModels
.
############################################################################# # EXAMPLE 1: DINA example information criteria ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") #*** Model 1: DINA model mod1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix ) summary(mod1) IRT.IC(mod1)
############################################################################# # EXAMPLE 1: DINA example information criteria ############################################################################# data(sim.dina, package="CDM") data(sim.qmatrix, package="CDM") #*** Model 1: DINA model mod1 <- CDM::din( sim.dina, q.matrix=sim.qmatrix ) summary(mod1) IRT.IC(mod1)
This S3 method extracts item response functions evaluated
at a grid of abilities (skills). Item response functions can
be plotted using the IRT.irfprobPlot
function.
IRT.irfprob(object, ...) ## S3 method for class 'din' IRT.irfprob(object, ...) ## S3 method for class 'gdina' IRT.irfprob(object, ...) ## S3 method for class 'gdm' IRT.irfprob(object, ...) ## S3 method for class 'mcdina' IRT.irfprob(object, ...) ## S3 method for class 'reglca' IRT.irfprob(object, ...) ## S3 method for class 'slca' IRT.irfprob(object, ...)
IRT.irfprob(object, ...) ## S3 method for class 'din' IRT.irfprob(object, ...) ## S3 method for class 'gdina' IRT.irfprob(object, ...) ## S3 method for class 'gdm' IRT.irfprob(object, ...) ## S3 method for class 'mcdina' IRT.irfprob(object, ...) ## S3 method for class 'reglca' IRT.irfprob(object, ...) ## S3 method for class 'slca' IRT.irfprob(object, ...)
object |
|
... |
More arguments to be passed. |
An array with item response probabilities (items
categories
skill classes [
group]) and attributes
theta |
Uni- or multidimensional skill space (theta grid in item response models). |
prob.theta |
Probability distribution of |
skillspace |
Design matrix and estimated parameters for
skill space distribution (only for |
G |
Number of groups |
Plot functions for item response curves: IRT.irfprobPlot
.
For extracting the individual likelihood or posterior see
IRT.likelihood
or IRT.posterior
.
## Not run: ############################################################################# # EXAMPLE 1: Extracting item response functions mcdina model ############################################################################# data(data.cdm02, package="CDM") dat <- data.cdm02$data q.matrix <- data.cdm02$q.matrix #-- estimate model mod1 <- CDM::mcdina( dat, q.matrix=q.matrix) #-- extract item response functions prmod1 <- CDM::IRT.irfprob(mod1) str(prmod1) ## End(Not run)
## Not run: ############################################################################# # EXAMPLE 1: Extracting item response functions mcdina model ############################################################################# data(data.cdm02, package="CDM") dat <- data.cdm02$data q.matrix <- data.cdm02$q.matrix #-- estimate model mod1 <- CDM::mcdina( dat, q.matrix=q.matrix) #-- extract item response functions prmod1 <- CDM::IRT.irfprob(mod1) str(prmod1) ## End(Not run)
This function plots item response functions for fitted
item response models for which the IRT.irfprob
method is defined.
IRT.irfprobPlot( object, items=NULL, min.theta=-4, max.theta=4, cumul=FALSE, smooth=TRUE, ask=TRUE, n.theta=40, package="lattice",... )
IRT.irfprobPlot( object, items=NULL, min.theta=-4, max.theta=4, cumul=FALSE, smooth=TRUE, ask=TRUE, n.theta=40, package="lattice",... )
object |
Fitted item response model for which the |
items |
Vector of indices of selected items. |
min.theta |
Minimum theta to be displayed. |
max.theta |
Maximum theta to be displayed. |
cumul |
Optional logical indicating whether cumulated
item response functions |
smooth |
Optional logical indicating whether item response functions should be smoothed for plotting. |
ask |
Logical for asking for a new plot. |
n.theta |
Number of theta points if |
package |
String indicating which package should be used for plotting
the item response curves. Options are |
... |
More arguments to be passed for the plot in lattice. |
## Not run:
#############################################################################
# EXAMPLE 1: Plot item response functions from a unidimensional model
#############################################################################
data(data.Students, package="CDM")
dat <- data.Students
resp <- dat[, paste0("sc",1:4) ]
resp[ paste(resp[,1])==3,1] <- 2
psych::describe(resp)
#--- Model 1: PCM in CDM::gdm
theta.k <- seq( -5, 5, len=21 )
mod1 <- CDM::gdm( dat=resp, irtmodel="1PL", theta.k=theta.k, skillspace="normal",
centered.latent=TRUE)
summary(mod1)
# plot
IRT.irfprobPlot( mod1 )
# plot in graphics package (which comes with R base version)
IRT.irfprobPlot( mod1, package="graphics")
# plot first and third ite