philchalmers / mirt

Multidimensional item response theory
199 stars 75 forks source link

`fscores` does not retain latent factors' names #217

Closed netique closed 2 years ago

netique commented 2 years ago

Hi,

in the latest release 1.35.1, fscores no longer retain names specified in the mirt model. For one-dimensional models, it prints out F1, F1_SE as it used previously, but for multidimensional one, the function returns an unnamed matrix. Is it deliberate or is it a bug introduced by an update? Version 1.34 outputs as expected.

Many thanks and keep up the good work! Jan

philchalmers commented 2 years ago

Can you provide a reproducible example of this? I don't see the change you're referring to. Thanks.

library(mirt)
#> Warning: package 'mirt' was built under R version 4.0.5
#> Loading required package: stats4
#> Loading required package: lattice
#> Warning: package 'lattice' was built under R version 4.0.5
mod <- mirt(Science, 2, TOL=.01)
fs <- fscores(mod)
head(fs)
#>               F1         F2
#> [1,] -0.35204296  0.6606722
#> [2,] -0.01449952  0.1201497
#> [3,]  0.57747572 -1.0050485
#> [4,]  0.57747572 -1.0050485
#> [5,] -0.08768448  1.0232843
#> [6,] -0.75955060  0.8650403

model <- 'this = 1-3
          that = 2-4'
mod2 <- mirt(Science, model, TOL=.01)
fs2 <- fscores(mod2)
head(fs2)
#>             this        that
#> [1,]  0.87822600 -0.38884876
#> [2,] -0.04466289  0.10589125
#> [3,] -0.88730995 -0.60420773
#> [4,] -0.88730995 -0.60420773
#> [5,]  1.13280708  0.37017709
#> [6,]  0.67229000  0.05898098

Created on 2022-01-03 by the reprex package (v2.0.1)

netique commented 2 years ago

Sorry for the absent reprex. In meanwhile, I discovered that this issue is only present when there are completely empty rows in the data:

library(mirt)
#> Loading required package: stats4
#> Loading required package: lattice

# introduce empty row
Science[sample(nrow(Science), 1), ] <- NA

mod <- mirt(Science, 1, TOL = .01)
#> Warning: data contains response patterns with only NAs
#> Iteration: 1, Log-Lik: -1625.876, Max-Change: 0.48834Iteration: 2, Log-Lik: -1613.767, Max-Change: 0.24061Iteration: 3, Log-Lik: -1609.221, Max-Change: 0.17940Iteration: 4, Log-Lik: -1606.734, Max-Change: 0.10320Iteration: 5, Log-Lik: -1606.210, Max-Change: 0.09513Iteration: 6, Log-Lik: -1605.898, Max-Change: 0.07813Iteration: 7, Log-Lik: -1605.311, Max-Change: 0.03422Iteration: 8, Log-Lik: -1605.271, Max-Change: 0.03069Iteration: 9, Log-Lik: -1605.244, Max-Change: 0.02644Iteration: 10, Log-Lik: -1605.176, Max-Change: 0.01442Iteration: 11, Log-Lik: -1605.172, Max-Change: 0.00908
fs <- fscores(mod)
head(fs)
#>             [,1]
#> [1,]  0.40245938
#> [2,]  0.05130783
#> [3,] -0.89092054
#> [4,] -0.89092054
#> [5,]  0.76282310
#> [6,]  0.67152043

mod2 <- "this = 1-3
          that = 2-4"
mod2 <- mirt(Science, mod2, TOL = .01)
#> Warning: data contains response patterns with only NAs
#> Iteration: 1, Log-Lik: -1636.290, Max-Change: 0.35303Iteration: 2, Log-Lik: -1626.232, Max-Change: 0.15746Iteration: 3, Log-Lik: -1623.878, Max-Change: 0.17703Iteration: 4, Log-Lik: -1621.088, Max-Change: 0.08666Iteration: 5, Log-Lik: -1620.768, Max-Change: 0.06429Iteration: 6, Log-Lik: -1620.622, Max-Change: 0.06059Iteration: 7, Log-Lik: -1620.402, Max-Change: 0.05045Iteration: 8, Log-Lik: -1620.366, Max-Change: 0.04481Iteration: 9, Log-Lik: -1620.338, Max-Change: 0.04012Iteration: 10, Log-Lik: -1620.232, Max-Change: 0.02663Iteration: 11, Log-Lik: -1620.222, Max-Change: 0.02430Iteration: 12, Log-Lik: -1620.214, Max-Change: 0.02673Iteration: 13, Log-Lik: -1620.182, Max-Change: 0.01006Iteration: 14, Log-Lik: -1620.176, Max-Change: 0.01410Iteration: 15, Log-Lik: -1620.172, Max-Change: 0.01480Iteration: 16, Log-Lik: -1620.158, Max-Change: 0.01524Iteration: 17, Log-Lik: -1620.156, Max-Change: 0.00436
fs2 <- fscores(mod2)
head(fs2)
#>             [,1]        [,2]
#> [1,]  0.88919756 -0.38737883
#> [2,] -0.04477272  0.10392385
#> [3,] -0.88273333 -0.61129919
#> [4,] -0.88273333 -0.61129919
#> [5,]  1.12612844  0.37932512
#> [6,]  0.68469179  0.05696166

Created on 2022-01-03 by the reprex package (v2.0.1)

Session info ``` r sessioninfo::session_info() #> - Session info --------------------------------------------------------------- #> setting value #> version R version 4.1.2 (2021-11-01) #> os Windows 10 x64 (build 22000) #> system x86_64, mingw32 #> ui RTerm #> language (EN) #> collate Czech_Czechia.1250 #> ctype Czech_Czechia.1250 #> tz Europe/Prague #> date 2022-01-03 #> pandoc 2.14.0.3 @ C:/Program Files/RStudio/bin/pandoc/ (via rmarkdown) #> #> - Packages ------------------------------------------------------------------- #> package * version date (UTC) lib source #> backports 1.4.1 2021-12-13 [1] CRAN (R 4.1.2) #> cli 3.1.0 2021-10-27 [1] CRAN (R 4.1.2) #> cluster 2.1.2 2021-04-17 [2] CRAN (R 4.1.2) #> crayon 1.4.2 2021-10-29 [1] CRAN (R 4.1.1) #> dcurver 0.9.2 2020-11-04 [1] CRAN (R 4.1.1) #> Deriv 4.1.3 2021-02-24 [1] CRAN (R 4.1.1) #> digest 0.6.29 2021-12-01 [1] CRAN (R 4.1.2) #> ellipsis 0.3.2 2021-04-29 [1] CRAN (R 4.1.1) #> evaluate 0.14 2019-05-28 [1] CRAN (R 4.1.1) #> fansi 0.5.0 2021-05-25 [1] CRAN (R 4.1.1) #> fastmap 1.1.0 2021-01-25 [1] CRAN (R 4.1.1) #> fs 1.5.2 2021-12-08 [1] CRAN (R 4.1.2) #> glue 1.6.0 2021-12-17 [1] CRAN (R 4.1.2) #> GPArotation 2014.11-1 2014-11-25 [1] CRAN (R 4.1.1) #> gridExtra 2.3 2017-09-09 [1] CRAN (R 4.1.1) #> gtable 0.3.0 2019-03-25 [1] CRAN (R 4.1.1) #> highr 0.9 2021-04-16 [1] CRAN (R 4.1.1) #> htmltools 0.5.2 2021-08-25 [1] CRAN (R 4.1.1) #> knitr 1.37 2021-12-16 [1] CRAN (R 4.1.2) #> lattice * 0.20-45 2021-09-22 [2] CRAN (R 4.1.2) #> lifecycle 1.0.1 2021-09-24 [1] CRAN (R 4.1.2) #> magrittr 2.0.1 2020-11-17 [1] CRAN (R 4.1.1) #> MASS 7.3-54 2021-05-03 [2] CRAN (R 4.1.2) #> Matrix 1.3-4 2021-06-01 [2] CRAN (R 4.1.2) #> mgcv 1.8-38 2021-10-06 [2] CRAN (R 4.1.2) #> mirt * 1.35.1 2021-12-08 [1] CRAN (R 4.1.2) #> nlme 3.1-153 2021-09-07 [2] CRAN (R 4.1.2) #> permute 0.9-5 2019-03-12 [1] CRAN (R 4.1.1) #> pillar 1.6.4 2021-10-18 [1] CRAN (R 4.1.1) #> pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.1.2) #> purrr 0.3.4 2020-04-17 [1] CRAN (R 4.1.1) #> R.cache 0.15.0 2021-04-30 [1] CRAN (R 4.1.1) #> R.methodsS3 1.8.1 2020-08-26 [1] CRAN (R 4.1.1) #> R.oo 1.24.0 2020-08-26 [1] CRAN (R 4.1.1) #> R.utils 2.11.0 2021-09-26 [1] CRAN (R 4.1.1) #> Rcpp 1.0.7 2021-07-07 [1] CRAN (R 4.1.1) #> reprex 2.0.1 2021-08-05 [1] CRAN (R 4.1.1) #> rlang 0.4.12 2021-10-18 [1] CRAN (R 4.1.2) #> rmarkdown 2.11 2021-09-14 [1] CRAN (R 4.1.1) #> rstudioapi 0.13 2020-11-12 [1] CRAN (R 4.1.1) #> sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.1.2) #> stringi 1.7.6 2021-11-29 [1] CRAN (R 4.1.2) #> stringr 1.4.0 2019-02-10 [1] CRAN (R 4.1.1) #> styler 1.6.2 2021-09-23 [1] CRAN (R 4.1.1) #> tibble 3.1.6 2021-11-07 [1] CRAN (R 4.1.2) #> utf8 1.2.2 2021-07-24 [1] CRAN (R 4.1.1) #> vctrs 0.3.8 2021-04-29 [1] CRAN (R 4.1.1) #> vegan 2.5-7 2020-11-28 [1] CRAN (R 4.1.1) #> withr 2.4.3 2021-11-30 [1] CRAN (R 4.1.2) #> xfun 0.29 2021-12-14 [1] CRAN (R 4.1.2) #> yaml 2.2.1 2020-02-01 [1] CRAN (R 4.1.1) #> #> [1] C:/Users/netik/Documents/R/win-library/4.1 #> [2] C:/Program Files/R/R-4.1.2/library #> #> ------------------------------------------------------------------------------ ```
philchalmers commented 2 years ago

Confirmed; the column names were not being preserved when adding the NA placeholders for completely missing vectors. Should be patched now; thanks for the report!