diff --git a/.Rbuildignore b/.Rbuildignore index b85d639..17bd785 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -16,4 +16,4 @@ ^task_agent_mapping\.json$ ^\.gitleaks\.toml$ ^\.jules$ -^\.jules/.* +^\.jules/.*$ diff --git a/.jules/bolt.md b/.jules/bolt.md new file mode 100644 index 0000000..5df8872 --- /dev/null +++ b/.jules/bolt.md @@ -0,0 +1,3 @@ +## 2024-10-24 - [Avoid Redundant MAP Estimations in aFIPC.R] +**Learning:** The `fscores()` function for MAP estimation is an expensive operation in `mirt`. In `R/aFIPC.R`, these were being calculated twice consecutively: once inline for `mirt::expected.test()` and once immediately after for assignment to output variables. +**Action:** When calculating expected scores using MAP thetas, always pre-calculate the thetas and reuse the variables rather than calling `fscores()` multiple times. diff --git a/R/aFIPC.R b/R/aFIPC.R index ac34996..ecb5d05 100644 --- a/R/aFIPC.R +++ b/R/aFIPC.R @@ -1010,28 +1010,28 @@ autoFIPC <- # stop('Estimation failed. Please check test quality.') # } + # calculate theta + ThetaOldform <- fscores(oldFormModel, method = 'MAP') + ThetaLinkedform <- fscores(LinkedModel, method = 'MAP') + ThetaNewform <- fscores(newFormModel, method = 'MAP') + # calculate expected score ExpectedScoreOldform <- mirt::expected.test( x = oldFormModel, - Theta = fscores(oldFormModel, method = 'MAP') + Theta = ThetaOldform ) ExpectedScoreLinkedform <- mirt::expected.test( x = LinkedModel, - Theta = fscores(LinkedModel, method = 'MAP') + Theta = ThetaLinkedform ) ExpectedScoreNewform <- mirt::expected.test( x = newFormModel, - Theta = fscores(newFormModel, method = 'MAP') + Theta = ThetaNewform ) - # calculate theta - ThetaOldform <- fscores(oldFormModel, method = 'MAP') - ThetaLinkedform <- fscores(LinkedModel, method = 'MAP') - ThetaNewform <- fscores(newFormModel, method = 'MAP') - # save results as object modelReturn <- new.env() modelReturn$oldFormModel <- oldFormModel