Skip to contents

Introduction

This tutorial is created using R markdown and knitr. It illustrates how to use the GDINA R package (version 2.12.1) for model-data fit evaluation.

We use the ECPE data for illustration and fit the GDINA model to the data first.

Model Estimation

The following code estimates the G-DINA model.

## GDINA R Package (version 2.12.1; 2026-07-05)
## For tutorials, see https://wenchao-ma.github.io/GDINA
dat <- realdata_ECPE$dat
Q <- realdata_ECPE$Q

# Estimating GDINA model
est <- GDINA(dat = dat, Q = Q, model = "GDINA", mono.constraint = TRUE)
## Iter = 1  Max. abs. change = 0.55686  Deviance  = 104532.86                                                                                  Iter = 2  Max. abs. change = 0.11088  Deviance  = 86976.20                                                                                  Iter = 3  Max. abs. change = 0.05206  Deviance  = 86497.72                                                                                  Iter = 4  Max. abs. change = 0.04996  Deviance  = 86216.54                                                                                  Iter = 5  Max. abs. change = 0.04826  Deviance  = 86028.82                                                                                  Iter = 6  Max. abs. change = 0.04407  Deviance  = 85896.92                                                                                  Iter = 7  Max. abs. change = 0.03953  Deviance  = 85801.84                                                                                  Iter = 8  Max. abs. change = 0.03524  Deviance  = 85731.99                                                                                  Iter = 9  Max. abs. change = 0.03131  Deviance  = 85679.83                                                                                  Iter = 10  Max. abs. change = 0.02774  Deviance  = 85640.31                                                                                  Iter = 11  Max. abs. change = 0.02453  Deviance  = 85609.98                                                                                  Iter = 12  Max. abs. change = 0.02166  Deviance  = 85586.45                                                                                  Iter = 13  Max. abs. change = 0.01914  Deviance  = 85567.96                                                                                  Iter = 14  Max. abs. change = 0.01692  Deviance  = 85553.37                                                                                  Iter = 15  Max. abs. change = 0.01500  Deviance  = 85541.72                                                                                  Iter = 16  Max. abs. change = 0.01335  Deviance  = 85532.33                                                                                  Iter = 17  Max. abs. change = 0.01194  Deviance  = 85524.70                                                                                  Iter = 18  Max. abs. change = 0.01071  Deviance  = 85518.45                                                                                  Iter = 19  Max. abs. change = 0.00963  Deviance  = 85513.30                                                                                  Iter = 20  Max. abs. change = 0.00872  Deviance  = 85509.02                                                                                  Iter = 21  Max. abs. change = 0.00792  Deviance  = 85505.43                                                                                  Iter = 22  Max. abs. change = 0.00723  Deviance  = 85502.39                                                                                  Iter = 23  Max. abs. change = 0.00663  Deviance  = 85499.81                                                                                  Iter = 24  Max. abs. change = 0.00610  Deviance  = 85497.61                                                                                  Iter = 25  Max. abs. change = 0.00563  Deviance  = 85495.70                                                                                  Iter = 26  Max. abs. change = 0.00521  Deviance  = 85494.05                                                                                  Iter = 27  Max. abs. change = 0.00484  Deviance  = 85492.62                                                                                  Iter = 28  Max. abs. change = 0.00450  Deviance  = 85491.36                                                                                  Iter = 29  Max. abs. change = 0.00420  Deviance  = 85490.25                                                                                  Iter = 30  Max. abs. change = 0.00393  Deviance  = 85489.28                                                                                  Iter = 31  Max. abs. change = 0.00368  Deviance  = 85488.41                                                                                  Iter = 32  Max. abs. change = 0.00346  Deviance  = 85487.63                                                                                  Iter = 33  Max. abs. change = 0.00325  Deviance  = 85486.94                                                                                  Iter = 34  Max. abs. change = 0.00307  Deviance  = 85486.32                                                                                  Iter = 35  Max. abs. change = 0.00290  Deviance  = 85485.76                                                                                  Iter = 36  Max. abs. change = 0.00274  Deviance  = 85485.26                                                                                  Iter = 37  Max. abs. change = 0.00260  Deviance  = 85484.80                                                                                  Iter = 38  Max. abs. change = 0.00247  Deviance  = 85484.39                                                                                  Iter = 39  Max. abs. change = 0.00235  Deviance  = 85484.01                                                                                  Iter = 40  Max. abs. change = 0.00224  Deviance  = 85483.67                                                                                  Iter = 41  Max. abs. change = 0.00212  Deviance  = 85483.36                                                                                  Iter = 42  Max. abs. change = 0.00202  Deviance  = 85483.07                                                                                  Iter = 43  Max. abs. change = 0.00194  Deviance  = 85482.81                                                                                  Iter = 44  Max. abs. change = 0.00188  Deviance  = 85482.56                                                                                  Iter = 45  Max. abs. change = 0.00182  Deviance  = 85482.34                                                                                  Iter = 46  Max. abs. change = 0.00175  Deviance  = 85482.14                                                                                  Iter = 47  Max. abs. change = 0.00172  Deviance  = 85481.96                                                                                  Iter = 48  Max. abs. change = 0.00166  Deviance  = 85481.79                                                                                  Iter = 49  Max. abs. change = 0.00161  Deviance  = 85481.63                                                                                  Iter = 50  Max. abs. change = 0.00156  Deviance  = 85481.49                                                                                  Iter = 51  Max. abs. change = 0.00150  Deviance  = 85481.36                                                                                  Iter = 52  Max. abs. change = 0.00144  Deviance  = 85481.24                                                                                  Iter = 53  Max. abs. change = 0.00139  Deviance  = 85481.12                                                                                  Iter = 54  Max. abs. change = 0.00133  Deviance  = 85481.02                                                                                  Iter = 55  Max. abs. change = 0.00128  Deviance  = 85480.92                                                                                  Iter = 56  Max. abs. change = 0.00121  Deviance  = 85480.83                                                                                  Iter = 57  Max. abs. change = 0.00116  Deviance  = 85480.75                                                                                  Iter = 58  Max. abs. change = 0.00109  Deviance  = 85480.67                                                                                  Iter = 59  Max. abs. change = 0.00106  Deviance  = 85480.59                                                                                  Iter = 60  Max. abs. change = 0.00102  Deviance  = 85480.53                                                                                  Iter = 61  Max. abs. change = 0.00098  Deviance  = 85480.46                                                                                  Iter = 62  Max. abs. change = 0.00094  Deviance  = 85480.40                                                                                  Iter = 63  Max. abs. change = 0.00090  Deviance  = 85480.35                                                                                  Iter = 64  Max. abs. change = 0.00086  Deviance  = 85480.29                                                                                  Iter = 65  Max. abs. change = 0.00044  Deviance  = 85480.24                                                                                  Iter = 66  Max. abs. change = 0.00087  Deviance  = 85480.20                                                                                  Iter = 67  Max. abs. change = 0.00082  Deviance  = 85480.16                                                                                  Iter = 68  Max. abs. change = 0.00036  Deviance  = 85480.12                                                                                  Iter = 69  Max. abs. change = 0.00082  Deviance  = 85480.08                                                                                  Iter = 70  Max. abs. change = 0.00031  Deviance  = 85480.04                                                                                  Iter = 71  Max. abs. change = 0.00080  Deviance  = 85480.01                                                                                  Iter = 72  Max. abs. change = 0.00029  Deviance  = 85479.98                                                                                  Iter = 73  Max. abs. change = 0.00077  Deviance  = 85479.95                                                                                  Iter = 74  Max. abs. change = 0.00026  Deviance  = 85479.92                                                                                  Iter = 75  Max. abs. change = 0.00074  Deviance  = 85479.90                                                                                  Iter = 76  Max. abs. change = 0.00024  Deviance  = 85479.87                                                                                  Iter = 77  Max. abs. change = 0.00025  Deviance  = 85479.85                                                                                  Iter = 78  Max. abs. change = 0.00023  Deviance  = 85479.83                                                                                  Iter = 79  Max. abs. change = 0.00022  Deviance  = 85479.81                                                                                  Iter = 80  Max. abs. change = 0.00022  Deviance  = 85479.79                                                                                  Iter = 81  Max. abs. change = 0.00076  Deviance  = 85479.77                                                                                  Iter = 82  Max. abs. change = 0.00032  Deviance  = 85479.75                                                                                  Iter = 83  Max. abs. change = 0.00070  Deviance  = 85479.74                                                                                  Iter = 84  Max. abs. change = 0.00032  Deviance  = 85479.72                                                                                  Iter = 85  Max. abs. change = 0.00019  Deviance  = 85479.71                                                                                  Iter = 86  Max. abs. change = 0.00025  Deviance  = 85479.69                                                                                  Iter = 87  Max. abs. change = 0.00068  Deviance  = 85479.68                                                                                  Iter = 88  Max. abs. change = 0.00015  Deviance  = 85479.67                                                                                  Iter = 89  Max. abs. change = 0.00060  Deviance  = 85479.66                                                                                  Iter = 90  Max. abs. change = 0.00030  Deviance  = 85479.64                                                                                  Iter = 91  Max. abs. change = 0.00056  Deviance  = 85479.63                                                                                  Iter = 92  Max. abs. change = 0.00014  Deviance  = 85479.62                                                                                  Iter = 93  Max. abs. change = 0.00052  Deviance  = 85479.61                                                                                  Iter = 94  Max. abs. change = 0.00026  Deviance  = 85479.61                                                                                  Iter = 95  Max. abs. change = 0.00025  Deviance  = 85479.60                                                                                  Iter = 96  Max. abs. change = 0.00051  Deviance  = 85479.59                                                                                  Iter = 97  Max. abs. change = 0.00011  Deviance  = 85479.58                                                                                  Iter = 98  Max. abs. change = 0.00011  Deviance  = 85479.57                                                                                  Iter = 99  Max. abs. change = 0.00020  Deviance  = 85479.57                                                                                  Iter = 100  Max. abs. change = 0.00012  Deviance  = 85479.56                                                                                  Iter = 101  Max. abs. change = 0.00010  Deviance  = 85479.55                                                                                  Iter = 102  Max. abs. change = 0.00010  Deviance  = 85479.55

Model fit at test-level

The model-data fit at test level can be obtained using modelfit() function. This function calculates M2M_2 statistic for G-DINA model with dichotmous responses (Liu, Tian, & Xin, 2016; Hansen, Cai, Monroe, & Li, 2016) and for sequential G-DINA model with graded responses (Ma, 2020). It also calculates SRMSR and RMSEA2.

## Test-level Model Fit Evaluation
## 
## Relative fit statistics: 
##  -2 log likelihood =  85479.54  ( number of parameters =  81 )
##  AIC  =  85641.54  BIC =  86125.93 
##  CAIC =  86206.93  SABIC =  85868.56 
## 
## Absolute fit statistics: 
##  M2 =  505.956  df =  325  p =  0 
##  RMSEA2 =  0.0138  with  90 % CI: [ 0.0114 , 0.0161 ]
##  SRMSR =  0.0317

Interestingly, itemfit() also provide model-data fit at test level. By default, it prints the maximum z statistics for transformed correlation and log odds ratio for item-pairs, which quantify the “worst” fit.

itemfit(est)
## Summary of Item Fit Analysis
## 
## Call:
## itemfit(GDINA.obj = est)
## 
##                         mean[stats] max[stats] max[z.stats] p-value adj.p-value
## Item mean score              0.0008     0.0023       0.2957  0.7675           1
## Transformed correlation      0.0255     0.1175       6.3507  0.0000           0
## Log odds ratio               0.1344     0.5346       6.5320  0.0000           0
## Note: p-value and adj.p-value are associated with max[z.stats].
##       adj.p-values are based on the holm method.

Model-data fit at item-pair level

itemfit() also provide model-data fit at item-pair level. The heatmap plots for transformed correlation and log odds ratio show the p-values of test statistics for all item pairs. A significant (red) test statistic indicates some misfit.

ift <- itemfit(est)
plot(ift)

Model data fit at item level

Model data fit can also be evaluated at item level. The code below gives the maximum z statistics for transformed correlation and log odds ratio at item level and thus can be viewed as the “worst” fit for item pairs related to that specific item.

ift <- itemfit(est)
ift$max.itemlevel.fit
##         z.prop pvalue[z.prop] max[z.r] pvalue.max[z.r] adj.pvalue.max[z.r]
## Item 1  0.1237         0.9016   2.9270          0.0034              0.0924
## Item 2  0.2957         0.7675   2.7867          0.0053              0.1438
## Item 3  0.0450         0.9641   2.6031          0.0092              0.2494
## Item 4  0.2033         0.8389   3.8789          0.0001              0.0028
## Item 5  0.1021         0.9187   2.9541          0.0031              0.0847
## Item 6  0.0689         0.9451   3.8416          0.0001              0.0033
## Item 7  0.0696         0.9445   4.0594          0.0000              0.0013
## Item 8  0.0297         0.9763   3.6019          0.0003              0.0085
## Item 9  0.0601         0.9521   6.3507          0.0000              0.0000
## Item 10 0.2612         0.7939   4.1447          0.0000              0.0009
## Item 11 0.1286         0.8977   2.8119          0.0049              0.1330
## Item 12 0.1269         0.8990   3.8341          0.0001              0.0034
## Item 13 0.1686         0.8661   5.5811          0.0000              0.0000
## Item 14 0.1396         0.8890   3.8789          0.0001              0.0028
## Item 15 0.0475         0.9622   4.0594          0.0000              0.0013
## Item 16 0.0104         0.9917   3.4300          0.0006              0.0163
## Item 17 0.1718         0.8636   3.2008          0.0014              0.0370
## Item 18 0.0322         0.9743   3.7131          0.0002              0.0055
## Item 19 0.0280         0.9777   5.2098          0.0000              0.0000
## Item 20 0.0923         0.9265   2.9925          0.0028              0.0747
## Item 21 0.0456         0.9637   3.6700          0.0002              0.0065
## Item 22 0.0723         0.9424   5.5811          0.0000              0.0000
## Item 23 0.1219         0.9030   3.7131          0.0002              0.0055
## Item 24 0.0371         0.9704   2.5920          0.0095              0.2577
## Item 25 0.0348         0.9722   3.1154          0.0018              0.0496
## Item 26 0.0659         0.9474   2.8096          0.0050              0.1339
## Item 27 0.2550         0.7987   6.3507          0.0000              0.0000
## Item 28 0.0702         0.9440   5.2098          0.0000              0.0000
##         max[z.logOR] pvalue.max[z.logOR] adj.pvalue.max[z.logOR]
## Item 1        2.6655              0.0077                  0.2075
## Item 2        2.7087              0.0068                  0.1824
## Item 3        2.5780              0.0099                  0.2683
## Item 4        3.7650              0.0002                  0.0045
## Item 5        2.5767              0.0100                  0.2693
## Item 6        3.6250              0.0003                  0.0078
## Item 7        3.6175              0.0003                  0.0080
## Item 8        2.9915              0.0028                  0.0749
## Item 9        6.5320              0.0000                  0.0000
## Item 10       4.0180              0.0001                  0.0016
## Item 11       2.6752              0.0075                  0.2016
## Item 12       3.9309              0.0001                  0.0023
## Item 13       5.3708              0.0000                  0.0000
## Item 14       3.7650              0.0002                  0.0045
## Item 15       3.6175              0.0003                  0.0080
## Item 16       3.1674              0.0015                  0.0415
## Item 17       2.6478              0.0081                  0.2187
## Item 18       3.2149              0.0013                  0.0352
## Item 19       5.1644              0.0000                  0.0000
## Item 20       3.0657              0.0022                  0.0586
## Item 21       3.3901              0.0007                  0.0189
## Item 22       5.3708              0.0000                  0.0000
## Item 23       3.2149              0.0013                  0.0352
## Item 24       2.5664              0.0103                  0.2774
## Item 25       3.0553              0.0022                  0.0607
## Item 26       2.6655              0.0077                  0.2075
## Item 27       6.5320              0.0000                  0.0000
## Item 28       4.6889              0.0000                  0.0001

Item fit can also be evaluated using itemfitPD() function. This function calculate item fit statistics from the power-divergence family (Najera, Ma, Sorrel and Abad, 2025). This function can use bootstrap methods with Stone correction. Parallel computing is supported on computers with multiple cores.

ipd <- itemfitPD(est, bootstrap = TRUE, Stone = TRUE, R = 1000, cores=10)
ipd
## ======================================================
## Item fit indices from the power-divergence (PD) family
## ======================================================
## Bootstrapping = TRUE
##   Stone's method = TRUE
##   # of bootstrapped samples = 1000
##   # of cores used = 10
## Time used = 1.092189
## p-value adjustment method = holm
## -------------------------------------
## Items flagged for misfit (at .05 nominal level):
##   Based on X2:  4, 6, 9, 10, 13, 14, 19, 22, 27, 28 
##   Based on G2:  4, 6, 9, 10, 13, 14, 19, 22, 27, 28 
##   Based on PD:  4, 6, 9, 10, 13, 14, 19, 22, 27, 28

To find the test statistics and p-value, the following code can be used:

ipd$PD
##    item    stat     p  adjp
## 1     1  0.8917 0.238 1.000
## 2     2  1.6997 0.275 1.000
## 3     3  1.4434 0.038 0.532
## 4     4 10.0010 0.000 0.000
## 5     5  0.8789 0.680 1.000
## 6     6  7.9035 0.000 0.000
## 7     7  0.2729 0.526 1.000
## 8     8  1.1988 0.410 1.000
## 9     9 24.3739 0.000 0.000
## 10   10  6.6309 0.001 0.021
## 11   11  0.3386 0.565 1.000
## 12   12  0.2168 0.700 1.000
## 13   13 22.9105 0.000 0.000
## 14   14 10.5711 0.001 0.021
## 15   15  5.7099 0.007 0.126
## 16   16  1.0051 0.088 1.000
## 17   17  2.7390 0.020 0.300
## 18   18  3.5967 0.051 0.663
## 19   19 11.9975 0.000 0.000
## 20   20  0.7102 0.221 1.000
## 21   21  0.5420 0.358 1.000
## 22   22 15.7013 0.000 0.000
## 23   23  1.8662 0.102 1.000
## 24   24  3.6344 0.014 0.224
## 25   25  2.7058 0.111 1.000
## 26   26  5.2976 0.008 0.136
## 27   27  6.8122 0.002 0.038
## 28   28  6.5452 0.000 0.000
## R version 4.6.1 (2026-06-24)
## Platform: aarch64-apple-darwin23
## Running under: macOS Tahoe 26.5.1
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRblas.0.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.6/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.1
## 
## locale:
## [1] C.UTF-8/C.UTF-8/C.UTF-8/C/C.UTF-8/C.UTF-8
## 
## time zone: America/Chicago
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] GDINA_2.12.1
## 
## loaded via a namespace (and not attached):
##  [1] generics_0.1.4       sass_0.4.10          future_1.70.0       
##  [4] listenv_1.0.0        digest_0.6.39        magrittr_2.0.5      
##  [7] RColorBrewer_1.1-3   evaluate_1.0.5       grid_4.6.1          
## [10] iterators_1.0.14     fastmap_1.2.0        foreach_1.5.2       
## [13] jsonlite_2.0.0       promises_1.5.0       scales_1.4.0        
## [16] truncnorm_1.0-9      codetools_0.2-20     numDeriv_2016.8-1.1 
## [19] textshaping_1.0.5    jquerylib_0.1.4      shinydashboard_0.7.3
## [22] cli_3.6.6            shiny_1.14.0         rlang_1.3.0         
## [25] parallelly_1.48.0    future.apply_1.20.2  withr_3.0.3         
## [28] cachem_1.1.0         yaml_2.3.12          otel_0.2.0          
## [31] tools_4.6.1          parallel_4.6.1       nloptr_2.2.1        
## [34] dplyr_1.2.1          ggplot2_4.0.3        httpuv_1.6.17       
## [37] globals_0.19.1       vctrs_0.7.3          R6_2.6.1            
## [40] mime_0.13            lifecycle_1.0.5      fs_2.1.0            
## [43] htmlwidgets_1.6.4    MASS_7.3-65          Rsolnp_2.0.1        
## [46] ragg_1.5.2           pkgconfig_2.0.3      desc_1.4.3          
## [49] pillar_1.11.1        pkgdown_2.2.0        bslib_0.11.0        
## [52] later_1.4.8          gtable_0.3.6         glue_1.8.1          
## [55] Rcpp_1.1.2           systemfonts_1.3.2    tidyselect_1.2.1    
## [58] tibble_3.3.1         xfun_0.59            knitr_1.51          
## [61] farver_2.1.2         xtable_1.8-8         htmltools_0.5.9     
## [64] labeling_0.4.3       rmarkdown_2.31       compiler_4.6.1      
## [67] S7_0.2.2             alabama_2025.1.0

References

Chen, J., de la Torre, J., & Zhang, Z. (2013). Relative and Absolute Fit Evaluation in Cognitive Diagnosis Modeling. Journal of Educational Measurement, 50, 123-140.

Hansen, M., Cai, L., Monroe, S., & Li, Z. (2016). Limited-information goodness-of-fit testing of diagnostic classification item response models. British Journal of Mathematical and Statistical Psychology. 69, 225–252.

Liu, Y., Tian, W., & Xin, T. (2016). An Application of M2 Statistic to Evaluate the Fit of Cognitive Diagnostic Models. Journal of Educational and Behavioral Statistics, 41, 3-26.

Ma, W. (2020). Evaluating the fit of sequential G-DINA model using limited-information measures. Applied Psychological Measurement, 44, 167-181.

Ma, W., & de la Torre, J. (2020). GDINA: An R Package for Cognitive Diagnosis Modeling. Journal of Statistical Software, 93(14), 1-26.

Maydeu-Olivares, A. (2013). Goodness-of-Fit Assessment of Item Response Theory Models. Measurement, 11, 71-101.

Nájera, P., Ma, W., Sorrel, M.A. et al. Assessing item-level fit for the sequential G-DINA model. Behaviormetrika (2025). https://doi.org/10.1007/s41237-025-00263-8