diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 86ec859..02f667b 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -1,10 +1,13 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: branches: [main, master] pull_request: - branches: [main, master] -name: R-CMD-check +name: R-CMD-check.yaml + +permissions: read-all jobs: R-CMD-check: @@ -16,25 +19,24 @@ jobs: fail-fast: false matrix: config: - - {os: macOS-latest, r: 'release', rtools: ''} - - {os: windows-latest, r: 'release', rtools: '43'} - - {os: ubuntu-latest, r: 'devel', rtools: '', http-user-agent: 'release'} - - {os: ubuntu-latest, r: 'release', rtools: ''} - - {os: ubuntu-latest, r: 'oldrel-1', rtools: ''} + - {os: macOS-latest, r: 'release'} + - {os: windows-latest, r: 'release'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} R_KEEP_PKG_SOURCE: yes steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-pandoc@v2 - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} - rtools-version: ${{ matrix.config.rtools }} http-user-agent: ${{ matrix.config.http-user-agent }} use-public-rspm: true extra-repositories: https://mc-stan.org/r-packages/ @@ -57,3 +59,4 @@ jobs: - uses: r-lib/actions/check-r-package@v2 with: upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 4404a0a..7bdd6b8 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -1,19 +1,21 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: branches: [main, master] pull_request: - branches: [main, master] -name: lint +name: lint.yaml + +permissions: read-all jobs: lint: runs-on: ubuntu-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 with: diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index cefa6af..a64cab4 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -1,13 +1,16 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: branches: [main, master] pull_request: - branches: [main, master] release: types: [published] workflow_dispatch: -name: pkgdown +name: pkgdown.yaml + +permissions: read-all jobs: pkgdown: @@ -17,9 +20,10 @@ jobs: group: pkgdown-${{ github.event_name != 'pull_request' || github.run_id }} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - + permissions: + contents: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-pandoc@v2 @@ -43,7 +47,7 @@ jobs: - name: Deploy to GitHub pages 🚀 if: github.event_name != 'pull_request' - uses: JamesIves/github-pages-deploy-action@v4.4.1 + uses: JamesIves/github-pages-deploy-action@v4.5.0 with: clean: false branch: gh-pages diff --git a/.github/workflows/pr-commands.yaml b/.github/workflows/pr-commands.yaml index 200e084..2edd93f 100644 --- a/.github/workflows/pr-commands.yaml +++ b/.github/workflows/pr-commands.yaml @@ -1,8 +1,12 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: issue_comment: types: [created] -name: Commands +name: pr-commands.yaml + +permissions: read-all jobs: document: @@ -11,9 +15,10 @@ jobs: runs-on: ubuntu-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - + permissions: + contents: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/pr-fetch@v2 with: @@ -22,7 +27,6 @@ jobs: - uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true - extra-repositories: https://mc-stan.org/r-packages/ - uses: r-lib/actions/setup-r-dependencies@v2 with: @@ -50,9 +54,10 @@ jobs: runs-on: ubuntu-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} - + permissions: + contents: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/pr-fetch@v2 with: diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 5e40254..91f2e47 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -1,11 +1,14 @@ +# Workflow derived from https://github.com/r-lib/actions/tree/v2/examples +# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help on: push: branches: [main, master] pull_request: - branches: [main, master] name: test-coverage +permissions: read-all + jobs: test-coverage: runs-on: ubuntu-latest @@ -13,7 +16,7 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 with: @@ -25,6 +28,7 @@ jobs: cache-version: 3 extra-packages: | any::covr + any::xml2 github::stan-dev/cmdstanr upgrade: 'TRUE' needs: coverage @@ -37,7 +41,7 @@ jobs: - name: Test coverage run: | - covr::codecov( + cov <- covr::package_coverage( quiet = FALSE, clean = FALSE, line_exclusions = list("src/stanExports_gqs_loglik.h", @@ -50,6 +54,15 @@ jobs: ) shell: Rscript {0} + - uses: codecov/codecov-action@v4 + with: + # Fail if error if not on PR, or if on PR and token is given + fail_ci_if_error: ${{ github.event_name != 'pull_request' || secrets.CODECOV_TOKEN }} + file: ./cobertura.xml + plugin: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + - name: Show testthat output if: always() run: | @@ -59,7 +72,7 @@ jobs: - name: Upload test results if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: coverage-test-failures path: ${{ runner.temp }}/package diff --git a/.github/workflows/update-citation-cff.yaml b/.github/workflows/update-citation-cff.yaml index 6c6004f..033ccc4 100644 --- a/.github/workflows/update-citation-cff.yaml +++ b/.github/workflows/update-citation-cff.yaml @@ -18,7 +18,7 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 with: diff --git a/DESCRIPTION b/DESCRIPTION index 0f52c43..04cbe94 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -64,11 +64,13 @@ Suggests: testthat (>= 3.0.0) Additional_repositories: https://mc-stan.org/r-packages/ Config/testthat/edition: 3 -Config/Needs/website: wjakethompson/wjake, showtext, ggdist, english +Config/Needs/website: r-dcm/rdcmtemplate, wjakethompson/wjake, showtext, ggdist, english +Config/Needs/documentation: openpharma/roxylint +Config/roxylint: list(linters = roxylint::tidy) Encoding: UTF-8 Language: en-US LazyData: true -Roxygen: list(markdown = TRUE) +Roxygen: list(markdown = TRUE, roclets = c("namespace", "rd", "roxylint::roxylint")) RoxygenNote: 7.3.2 Biarch: true SystemRequirements: GNU make diff --git a/R/data.R b/R/data.R index 0fda6ad..ba7dabd 100644 --- a/R/data.R +++ b/R/data.R @@ -1,6 +1,7 @@ -#' Examination for the Certificate of Proficiency in English (ECPE) +#' Examination for the Certificate of Proficiency in English #' -#' This is data from the grammar section of the ECPE, administered annually by +#' This is data from the grammar section of the Examination for the Certificate +#' of Proficiency in English (\acronym{ECPE}), administered annually by #' the English Language Institute at the University of Michigan. This data #' contains responses to 28 questions from 2,922 respondents, which ask #' respondents to complete a sentence with the correct word. This data set has @@ -21,6 +22,8 @@ #' * `resp_id`: Respondent identifier #' * `E1`-`E28`: Dichotomous item responses to the 28 ECPE items #' +#' @concept Examination for the Certificate of Proficiency in English +#' #' @references Buck, G., & Tatsuoka, K. K. (1998). Application of the rule-space #' procedure to language testing: Examining attributes of a free response #' listening test. *Language Testing, 15*(2), 119-157. @@ -52,7 +55,7 @@ "ecpe_qmatrix" -#' MacReady & Dayton (1977) Multiplication Data +#' MacReady & Dayton (1977) multiplication data #' #' This is a small data set of multiplication item responses. This data contains #' responses to 4 items from 142 respondents, which ask respondents to complete @@ -64,6 +67,9 @@ #' * `respondent`: Respondent identifier #' * `mdm1`-`mdm4`: Dichotomous item responses to the 4 multiplication items #' +#' @concept MacReady +#' @concept Dayton +#' #' @references MacReady, G. B., & Dayton, C. M. (1977). The use of probabilistic #' models in the assessment of mastery. *Journal of Educational Statistics, #' 2*(2), 99-120. \doi{10.2307/1164802} diff --git a/R/discrimination.R b/R/discrimination.R index e533846..427b63e 100644 --- a/R/discrimination.R +++ b/R/discrimination.R @@ -1,10 +1,10 @@ #' Item, attribute, and test-level discrimination indices #' -#' The cognitive diagnostic index (CDI) is a measure of how well an assessment -#' is able to distinguish between attribute profiles. The index was originally -#' proposed by Henson & Douglas (2005) for item- and test-level discrimination, -#' and then expanded by Henson et al. (2008) to include attribute-level -#' discrimination indices. +#' The cognitive diagnostic index (\acronym{CDI}) is a measure of how well an +#' assessment is able to distinguish between attribute profiles. +#' The index was originally proposed by Henson & Douglas (2005) for item- and +#' test-level discrimination, and then expanded by Henson et al. (2008) to +#' include attribute-level discrimination indices. #' #' @param model The estimated model to be evaluated. #' @param weight_prevalence Logical indicating whether the discrimination @@ -29,9 +29,11 @@ #' #' @return A list with two elements: #' * `item_discrimination`: A [tibble][tibble::tibble-package] with one row -#' per item containing the CDI for the item and any relevant attributes. +#' per item containing the \acronym{CDI} for the item and any relevant +#' attributes. #' * `test_discrimination`: A [tibble][tibble::tibble-package] with one row -#' containing the total CDI for the assessment and for each attribute. +#' containing the total \acronym{CDI} for the assessment and for each +#' attribute. #' @export #' #' @references Henson, R., & Douglas, J. (2005). Test construction for cognitive diff --git a/R/extract.R b/R/extract.R index 60ab6b4..9ee6ec1 100644 --- a/R/extract.R +++ b/R/extract.R @@ -1,4 +1,4 @@ -#' Extract components of a `measrfit` object. +#' Extract components of a `measrfit` object #' #' @param model The estimated to extract information from. #' @param ... Additional arguments passed to specific methods. @@ -18,8 +18,8 @@ measr_extract <- function(model, ...) { #' For `what = "odds_ratio_flags"` and #' `what = "conditional_prob_flags"`, the compatibility interval used for #' determining model fit flags to return. For example, a `ppmc_interval` of -#' 0.95 (the default) will return any PPMCs where the posterior predictive -#' *p*-value (ppp) is less than 0.025 or greater than 0.975. +#' 0.95 (the default) will return any \acronym{PPMC}s where the posterior +#' predictive *p*-value (ppp) is less than 0.025 or greater than 0.975. #' #' * `agreement`: #' @@ -100,6 +100,11 @@ measr_extract <- function(model, ...) { #' Reliability information must first be added to the model using #' [add_reliability()]. #' +#' @concept Sinharay +#' @concept Goodman +#' @concept Templin +#' @concept Bradshaw +#' #' @return The extracted information. The specific structure will vary depending #' on what is being extracted, but usually the returned object is a #' [tibble][tibble::tibble-package] with the requested information. diff --git a/R/fit-dcm.R b/R/fit-dcm.R index 1cc59fe..9c0e13b 100644 --- a/R/fit-dcm.R +++ b/R/fit-dcm.R @@ -1,13 +1,13 @@ #' Fit Bayesian diagnostic classification models #' -#' Estimate diagnostic classification models (DCMs; also known as cognitive +#' Estimate diagnostic classification models (\acronym{DCM}s; also known as cognitive #' diagnostic models) using 'Stan'. Models can be estimated using Stan's -#' optimizer, or full Markov chain Monte Carlo (MCMC). +#' optimizer, or full Markov chain Monte Carlo (\acronym{MCMC}). #' #' @param data Response data. A data frame with 1 row per respondent and 1 #' column per item. -#' @param missing An R expression specifying how missing data in `data` is coded -#' (e.g., `NA`, `"."`, `-99`, etc.). The default is `NA`. +#' @param missing An `R` expression specifying how missing data in `data` is +#' coded (e.g., `NA`, `"."`, `-99`, etc.). The default is `NA`. #' @param qmatrix The Q-matrix. A data frame with 1 row per item and 1 column #' per attribute. All cells should be either 0 (item does not measure the #' attribute) or 1 (item does measure the attribute). @@ -22,7 +22,7 @@ #' identifiers. `NULL` also assumes that the order of the rows in the Q-matrix #' is the same as the order of the columns in `data` (i.e., the item in row 1 #' of `qmatrix` is the item in column 1 of `data`, excluding `resp_id`). -#' @param type Type of DCM to estimate. Must be one of +#' @param type Type of \acronym{DCM} to estimate. Must be one of #' `r glue::glue_collapse(dcm_choices(), sep = ", ", last = ", or ")`. #' @param max_interaction If `type = "lcdm"`, the highest level of interaction #' to estimate. The default is to estimate all possible interactions. For @@ -42,19 +42,19 @@ #' are used, as specified by [default_dcm_priors()]. #' @param backend Character string naming the package to use as the backend for #' fitting the Stan model. Options are `"rstan"` (the default) or -#' `"cmdstanr"`. Can be set globally for the current R session via the -#' "measr.backend" option (see [options()]). Details on the **rstan** and -#' **cmdstanr** packages are available at \url{https://mc-stan.org/rstan/} and +#' `"cmdstanr"`. Can be set globally for the current `R` session via the +#' "measr.backend" option (see [options()]). Details on the rstan and +#' cmdstanr packages are available at \url{https://mc-stan.org/rstan/} and #' \url{https://mc-stan.org/cmdstanr/}, respectively. #' @param file Either `NULL` (the default) or a character string. If a character #' string, the fitted model object is saved as an `.rds` object using #' [saveRDS()] using the supplied character string. The `.rds` extension -#' is automatically added. If the specified file already exists, **measr** +#' is automatically added. If the specified file already exists, measr #' will load the previously saved model. Unless `file_refit` is specified, the #' model will not be refit. #' @param file_refit Controls when a saved model is refit. Options are #' `"never"`, `"always"`, and `"on_change"`. Can be set globally for the -#' current R session via the "measr.file_refit" option (see [options()]). +#' current `R` session via the "measr.file_refit" option (see [options()]). #' * For `"never"` (the default), the fitted model is always loaded if the #' `file` exists, and model fitting is skipped. #' * For `"always"`, the model is always refitted, regardless of whether or @@ -72,6 +72,9 @@ #' [CmdStanModel](https://mc-stan.org/cmdstanr/reference/CmdStanModel.html) #' class. #' +#' @concept Bayesian +#' @concept Stan +#' #' @return A [measrfit] object. #' @export #' @examplesIf measr_examples() diff --git a/R/loo-methods.R b/R/loo-methods.R index fa8174b..79b6d60 100644 --- a/R/loo-methods.R +++ b/R/loo-methods.R @@ -10,17 +10,18 @@ loo::waic #' @export loo::loo_compare -#' Efficient approximate leave-one-out cross-validation (LOO) +#' Efficient approximate leave-one-out cross-validation (\acronym{LOO}) #' #' A [loo::loo()] method that is customized for `measrfit` objects. This is a -#' simple wrapper around [loo::loo.array()]. See the **loo** package +#' simple wrapper around [loo::loo.array()]. See the loo package #' [vignettes](https://mc-stan.org/loo/articles/) for details. #' #' @inheritParams loo::loo #' @param x A [measrfit] object. #' @param ... Additional arguments passed to [loo::loo.array()]. -#' @param force If the LOO criterion has already been added to the model object -#' with [add_criterion()], should it be recalculated. Default is `FALSE`. +#' @param force If the \acronym{LOO} criterion has already been added to the +#' model object with [add_criterion()], should it be recalculated. Default is +#' `FALSE`. #' #' @return The object returned by [loo::loo.array()]. #' @@ -43,16 +44,17 @@ loo.measrfit <- function(x, ..., r_eff = NA, force = FALSE) { #nolint loo::loo(log_lik_array, r_eff = r_eff, ...) } -#' Widely applicable information criterion (WAIC) +#' Widely applicable information criterion (\acronym{WAIC}) #' #' A [loo::waic()] method that is customized for `measrfit` objects. This is a -#' simple wrapper around [loo::waic.array()]. See the **loo** package +#' simple wrapper around [loo::waic.array()]. See the loo package #' [vignettes](https://mc-stan.org/loo/articles/) for details. #' #' @param x A [measrfit] object. #' @param ... Additional arguments passed to [loo::waic.array()]. -#' @param force If the WAIC criterion has already been added to the model object -#' with [add_criterion()], should it be recalculated. Default is `FALSE`. +#' @param force If the \acronym{WAIC} criterion has already been added to the +#' model object with [add_criterion()], should it be recalculated. Default is +#' `FALSE`. #' #' @return The object returned by [loo::waic.array()]. #' @@ -78,7 +80,7 @@ waic.measrfit <- function(x, ..., force = FALSE) { #nolint #' Relative model fit comparisons #' #' A [loo::loo_compare()] method that is customized for `measrfit` objects. See -#' the **loo** package [vignettes](https://mc-stan.org/loo/articles/) for +#' the loo package [vignettes](https://mc-stan.org/loo/articles/) for #' details. #' #' @param x A [measrfit] object. diff --git a/R/measrfit-class.R b/R/measrfit-class.R index 4d117b2..fc8f372 100644 --- a/R/measrfit-class.R +++ b/R/measrfit-class.R @@ -1,15 +1,15 @@ #' Create a `measrfit` object #' -#' Models fitted with **measr** are represented as a `measrfit` object. If a -#' model is estimated with *Stan*, but not **measr**, a `measrfit` object can be -#' created in order to access other functionality in **measr** (e.g., model fit, +#' Models fitted with [`measr`] are represented as a `measrfit` object. If a +#' model is estimated with *Stan*, but not [`measr`], a `measrfit` object can be +#' created in order to access other functionality in measr (e.g., model fit, #' reliability). #' #' @param data The data and Q-matrix used to estimate the model. -#' @param type The type of DCM that was estimated. +#' @param type The type of \acronym{DCM} that was estimated. #' @param prior A [measrprior][measrprior()] object containing information on #' the priors used in the model. -#' @param stancode The model code in **Stan** language. +#' @param stancode The model code in *Stan* language. #' @param method The method used to fit the model. #' @param algorithm The name of the algorithm used to fit the model. #' @param backend The name of the backend used to fit the model. @@ -27,14 +27,17 @@ #' fitting the model. #' @param file Optional name of a file which the model objects was saved to #' or loaded from. -#' @param version The versions of **measr**, **Stan**, **rstan** and/or -#' **cmdstanr** that were used to fit the model. +#' @param version The versions of measr, *Stan*, and rstan or cmdstanr that were +#' used to fit the model. #' @param class Additional classes to be added (e.g., `measrdcm` for a #' diagnostic classification model). #' -#' @return A [measrfit][measrfit-class] object. +#' @concept Stan +#' +#' @return A [`measrfit`][`measrfit-class`] object. #' @export -#' @seealso [measrfit-class], [as_measrfit()], [is_measrfit()] +#' +#' @seealso See [`measrfit-class`], [`as_measrfit()`], [`is_measrfit()`]. #' @examplesIf measr_examples() #' rstn_mdm_lcdm <- measr_dcm( #' data = mdm_data, missing = NA, qmatrix = mdm_qmatrix, @@ -92,7 +95,7 @@ measrfit <- function(data = list(), type = character(), #' #' @return An object of class [measrfit-class]. #' @export -#' @seealso [measrfit-class], [measrfit()], [is_measrfit()] +#' @seealso See [measrfit-class], [measrfit()], [is_measrfit()]. #' #' @examplesIf measr_examples() #' rstn_mdm_lcdm <- measr_dcm( @@ -129,9 +132,9 @@ as_measrfit.default <- function(x, class = character()) { } -#' Class `measrfit` of models fitted with the **measr** package +#' Class `measrfit` of models fitted with the measr package #' -#' Models fitted with the **measr** package are represented as a `measrfit` +#' Models fitted with the measr package are represented as a `measrfit` #' object, which contains the posterior draws, Stan code, priors, and other #' relevant information. #' @@ -142,7 +145,7 @@ as_measrfit.default <- function(x, class = character()) { #' @slot type The type of DCM that was estimated. #' @slot prior A [measrprior][measrprior()] object containing information on the #' priors used in the model. -#' @slot stancode The model code in **Stan** language. +#' @slot stancode The model code in *Stan* language. #' @slot method The method used to fit the model. #' @slot algorithm The name of the algorithm used to fit the model. #' @slot backend The name of the backend used to fit the model. @@ -160,10 +163,10 @@ as_measrfit.default <- function(x, class = character()) { #' fitting the model. #' @slot file Optional name of a file which the model objects was saved to #' or loaded from. -#' @slot version The versions of **measr**, **Stan**, **rstan** and/or -#' **cmdstanr** that were used to fit the model. +#' @slot version The versions of measr, *Stan*, and rstan or cmdstanr that were +#' used to fit the model. #' -#' @seealso [measrfit()], [as_measrfit()], [is_measrfit()] +#' @seealso See [measrfit()], [as_measrfit()], [is_measrfit()]. NULL @@ -226,13 +229,13 @@ validate_measrfit <- function(x) { } -#' Check if argument is a `measrfit` object +#' Check if argument is a [`measrfit`] object #' -#' @param x An object to be checked +#' @param x An object to be checked. #' -#' @return A logical indicating is `x` is a `measrfit` object. +#' @return A logical indicating is `x` is a [`measrfit`] object. #' @export -#' @seealso [measrfit-class], [measrfit()], [as_measrfit()] +#' @seealso See [measrfit-class], [measrfit()], [as_measrfit()]. #' #' @examplesIf measr_examples() #' rstn_mdm_lcdm <- measr_dcm( diff --git a/R/methods.R b/R/methods.R index 36effa6..0375c85 100644 --- a/R/methods.R +++ b/R/methods.R @@ -14,12 +14,12 @@ #' identifiers are present in the data, and row numbers will be used as #' identifiers. If `newdata` is not specified and the data used to estimate #' the model is scored, the `resp_id` is taken from the original data. -#' @param missing An R expression specifying how missing data in `data` is coded -#' (e.g., `NA`, `"."`, `-99`, etc.). The default is `NA`. +#' @param missing An `R` expression specifying how missing data in `data` is +#' coded (e.g., `NA`, `"."`, `-99`, etc.). The default is `NA`. #' @param summary Should summary statistics be returned instead of the raw #' posterior draws? Only relevant if the model was estimated with #' `method = "mcmc"`. Default is `FALSE`. -#' @param probs The percentiles to be computed by the `[stats::quantile()]` +#' @param probs The percentiles to be computed by the [stats::quantile()] #' function. Only relevant if the model was estimated with `method = "mcmc"`. #' Only used if `summary` is `TRUE`. #' @param force If respondent estimates have already been added to the model diff --git a/R/model-evaluation.R b/R/model-evaluation.R index 0b06b3f..51ffeeb 100644 --- a/R/model-evaluation.R +++ b/R/model-evaluation.R @@ -13,7 +13,7 @@ #' object. #' @param method A vector of model fit methods to evaluate and add to the model #' object. -#' @param probs The percentiles to be computed by the `[stats::quantile()]` +#' @param probs The percentiles to be computed by the [stats::quantile()] #' function to summarize the posterior distributions of each person parameter. #' Only relevant if `method = "mcmc"` was used to estimate the model. #' @param overwrite Logical. Indicates whether specified elements that have @@ -21,9 +21,9 @@ #' `FALSE`. #' @param save Logical. Only relevant if a file was specified in the #' [measrfit] object passed to `x`. If `TRUE` (the default), the model is -#' re-saved to the specified file when new criteria are added to the R object. -#' If `FALSE`, the new criteria will be added to the R object, but the saved -#' file will not be updated. +#' re-saved to the specified file when new criteria are added to the `R` +#' object. If `FALSE`, the new criteria will be added to the `R` object, but +#' the saved file will not be updated. #' @param ... Additional arguments passed relevant methods. See Details. #' #' @details @@ -41,9 +41,10 @@ #' For `add_criterion()`, relative fit criteria are added to the `$criteria` #' element of the fitted model. This function wraps [loo()] and/or [waic()], #' depending on which criteria are specified, to calculate the leave-one-out -#' (LOO; Vehtari et al., 2017) and/or widely applicable information criteria -#' (WAIC; Watanabe, 2010) to fitted model objects. Additional arguments supplied -#' to `...` are passed to [loo::loo.array()] or [loo::waic.array()]. +#' (\acronym{LOO}; Vehtari et al., 2017) and/or widely applicable information +#' criteria (\acronym{WAIC}; Watanabe, 2010) to fitted model objects. +#' Additional arguments supplied to `...` are passed to [loo::loo.array()] or +#' [loo::waic.array()]. #' #' For `add_reliability()`, reliability information is added to the #' `$reliability` element of the fitted model. Pattern level reliability is diff --git a/R/ppmc.R b/R/ppmc.R index 2b68c88..10157b1 100644 --- a/R/ppmc.R +++ b/R/ppmc.R @@ -9,7 +9,7 @@ #' less than or equal to the total number of posterior draws retained in the #' estimated model. If `NULL` (the default) the total number from the #' estimated model is used. -#' @param probs The percentiles to be computed by the `[stats::quantile()]` +#' @param probs The percentiles to be computed by the [stats::quantile()] #' function for summarizing the posterior distributions of the specified fit #' statistics. #' @param return_draws Proportion of posterior draws for each specified fit @@ -28,8 +28,9 @@ #' Multiple checks can be provided in order to calculate more than one check #' simultaneously (e.g., `item_fit = c("conditional_prob", "odds_ratio")`). #' See details. -#' @param force If all requested PPMCs have already been added to the model -#' object using [add_fit()], should they be recalculated. Default is `FALSE`. +#' @param force If all requested \acronym{PPMC}s have already been added to the +#' model object using [add_fit()], should they be recalculated. Default is +#' `FALSE`. #' #' @details #' Posterior predictive model checks (PPMCs) use the posterior distribution of @@ -55,26 +56,30 @@ #' @return A list with two elements, "model_fit" and "item_fit". If either #' `model_fit = NULL` or `item_fit = NULL` in the function call, this will be #' a one-element list, with the null criteria excluded. Each list element, is -#' itself a list with one element for each specified PPMC containing a -#' [tibble][tibble::tibble-package]. For example if +#' itself a list with one element for each specified \acronym{PPMC} containing +#' a [tibble][tibble::tibble-package]. For example if #' `item_fit = c("conditional_prob", "odds_ratio")`, the "item_fit" element #' will be a list of length two, where each element is a tibble containing the -#' results of the PPMC. All tibbles follow the same general structure: +#' results of the \acronym{PPMC}. All tibbles follow the same general +#' structure: #' -#' * `obs_{ppmc}`: The value of the relevant statistic in the observed data. -#' * `ppmc_mean`: The mean of the `ndraws` posterior samples calculated for -#' the given statistic. -#' * Quantile columns: 1 column for each value of `probs`, providing the +#' \itemize{ +#' \item `obs_{ppmc}`: The value of the relevant statistic in the observed +#' data. +#' \item `ppmc_mean`: The mean of the `ndraws` posterior samples calculated +#' for the given statistic. +#' \item Quantile columns: 1 column for each value of `probs`, providing the #' corresponding quantiles of the `ndraws` posterior samples calculated for #' the given statistic. -#' * `samples`: A list column, where each element contains a vector of length -#' `(ndraws * return_draws)`, representing samples from the posterior -#' distribution of the calculated statistic. This column is excluded if -#' `return_draws = 0`. -#' * `ppp`: The posterior predictive p-value. This is the proportion of +#' \item `samples`: A list column, where each element contains a vector of +#' length `(ndraws * return_draws)`, representing samples from the +#' posterior distribution of the calculated statistic. This column is +#' excluded if `return_draws = 0`. +#' \item `ppp`: The posterior predictive p-value. This is the proportion of #' posterior samples for calculated statistic that are greater than the #' observed value. Values very close to 0 or 1 indicate incompatibility #' between the fitted model and the observed data. +#' } #' #' @references Park, J. Y., Johnson, M. S., Lee, Y-S. (2015). Posterior #' predictive model checks for cognitive diagnostic models. *International diff --git a/R/priors.R b/R/priors.R index 26c90b5..1565b11 100644 --- a/R/priors.R +++ b/R/priors.R @@ -1,20 +1,23 @@ -#' Prior definitions for **measr** models +#' Prior definitions for measr models #' #' Create prior definitions for classes of parameters, or specific parameters. #' -#' @param prior A character string defining a distribution in **Stan** language. -#' A list of all distributions supported by **Stan** can be found in *Stan +#' @param prior A character string defining a distribution in *Stan* language. +#' A list of all distributions supported by *Stan* can be found in *Stan #' Language Functions Reference* at #' \url{https://mc-stan.org/users/documentation/}. #' @param class The parameter class. Defaults to `"intercept"`. Must be one of -#' `"intercept"`, `"maineffect"`, `"interaction"` for the LCDM, or one of -#' `"slip"` or `"guess"` for DINA or DINO models. +#' `"intercept"`, `"maineffect"`, `"interaction"` for the \acronym{LCDM}, or +#' one of `"slip"` or `"guess"` for \acronym{DINA} or \acronym{DINO} models. #' @param coef Name of a specific parameter within the defined class. If not #' defined, the prior is applied to all parameters within the class. #' @param lb Lower bound for parameter restriction. Defaults to no restriction. #' @param ub Upper bound for parameter restriction. Defaults to no restriction. #' @param ... Additional arguments passed to `measrprior()`. #' +#' @concept Stan +#' @concept Stan Language Functions Reference +#' #' @return A [tibble][tibble::tibble-package] of class `measrprior`. #' @export #' @@ -193,7 +196,7 @@ validate_measrprior <- function(x) { #' Checks if argument is a `measrprior` object #' -#' @param x An object to be checked +#' @param x An object to be checked. #' #' @return A logical indicating if `x` is a `measrprior` object. #' diff --git a/R/utils-priors.R b/R/utils-priors.R index 98be150..f8687c8 100644 --- a/R/utils-priors.R +++ b/R/utils-priors.R @@ -28,7 +28,7 @@ as_string <- function(x) { #' #' Creates a named list using the object names. #' -#' @param ... +#' @param ... Additional arguments. #' #' @return A named list. #' @noRd diff --git a/R/utils.R b/R/utils.R index 4cdeb00..882c830 100644 --- a/R/utils.R +++ b/R/utils.R @@ -155,11 +155,11 @@ get_parameters <- function(qmatrix, item_id = NULL, rename_att = FALSE, #' Evaluate an expression without printing output or messages #' -#' @param expr expression to be evaluated -#' @param type type of output to be suppressed (see ?sink) -#' @param try wrap evaluation of expr in 'try' and +#' @param expr Expression to be evaluated. +#' @param type Type of output to be suppressed (see ?sink). +#' @param try Wrap evaluation of expr in 'try' and #' not suppress outputs if evaluation fails? -#' @param silent actually evaluate silently? +#' @param silent Actually evaluate silently?. #' #' @noRd eval_silent <- function(expr, type = "output", try = FALSE, diff --git a/pkgdown/_pkgdown.yml b/_pkgdown.yml similarity index 66% rename from pkgdown/_pkgdown.yml rename to _pkgdown.yml index 10934d5..57a96f2 100644 --- a/pkgdown/_pkgdown.yml +++ b/_pkgdown.yml @@ -3,10 +3,8 @@ url: https://measr.info home: title: Estimate Diagnostic Classification Models with Stan -development: - mode: auto - template: + package: rdcmtemplate bootstrap: 5 opengraph: image: @@ -16,43 +14,6 @@ template: creator: "@wjakethompson" site: "@atlas4learning" card: summary_large_image - bslib: - base_font: - google: "Open Sans" - heading_font: - google: "Playfair Display" - code_font: - google: "Fira Code" - bg: "#FFFFFF" - fg: "#333" - includes: - after_body: > - - -authors: - footer: - roles: [cre] - sidebar: - roles: [aut] - W. Jake Thompson: - href: https://wjakethompson.com - University of Kansas: - href: https://ku.edu - Institute of Education Sciences: - href: https://ies.ed.gov/funding/grantsearch/details.asp?ID=4546 - -footer: - structure: - left: developed_by - right: [ies] - components: - ies: | - The research reported here was supported by the Institute of Education - Sciences, U.S. Department of Education, through Grant - [R305D210045](https://ies.ed.gov/funding/grantsearch/details.asp?ID=4546) - to the University of Kansas. The opinions expressed are those of the - authors and do not represent the views of the Institute or the U.S. - Department of Education. reference: - title: Data sets diff --git a/man/as_measrfit.Rd b/man/as_measrfit.Rd index 165298b..5f5c7f3 100644 --- a/man/as_measrfit.Rd +++ b/man/as_measrfit.Rd @@ -33,5 +33,5 @@ new_obj <- as_measrfit(rstn_mdm_lcdm, class = "measrdcm") \dontshow{\}) # examplesIf} } \seealso{ -\linkS4class{measrfit}, \code{\link[=measrfit]{measrfit()}}, \code{\link[=is_measrfit]{is_measrfit()}} +See \linkS4class{measrfit}, \code{\link[=measrfit]{measrfit()}}, \code{\link[=is_measrfit]{is_measrfit()}}. } diff --git a/man/cdi.Rd b/man/cdi.Rd index f2317e3..df96cbd 100644 --- a/man/cdi.Rd +++ b/man/cdi.Rd @@ -17,17 +17,19 @@ details for additional information.} A list with two elements: \itemize{ \item \code{item_discrimination}: A \link[tibble:tibble-package]{tibble} with one row -per item containing the CDI for the item and any relevant attributes. +per item containing the \acronym{CDI} for the item and any relevant +attributes. \item \code{test_discrimination}: A \link[tibble:tibble-package]{tibble} with one row -containing the total CDI for the assessment and for each attribute. +containing the total \acronym{CDI} for the assessment and for each +attribute. } } \description{ -The cognitive diagnostic index (CDI) is a measure of how well an assessment -is able to distinguish between attribute profiles. The index was originally -proposed by Henson & Douglas (2005) for item- and test-level discrimination, -and then expanded by Henson et al. (2008) to include attribute-level -discrimination indices. +The cognitive diagnostic index (\acronym{CDI}) is a measure of how well an +assessment is able to distinguish between attribute profiles. +The index was originally proposed by Henson & Douglas (2005) for item- and +test-level discrimination, and then expanded by Henson et al. (2008) to +include attribute-level discrimination indices. } \details{ Henson et al. (2008) described two attribute-level discrimination indices, diff --git a/man/default_dcm_priors.Rd b/man/default_dcm_priors.Rd index 7a3360e..ceb11d6 100644 --- a/man/default_dcm_priors.Rd +++ b/man/default_dcm_priors.Rd @@ -7,7 +7,7 @@ default_dcm_priors(type = "lcdm", attribute_structure = "unconstrained") } \arguments{ -\item{type}{Type of DCM to estimate. Must be one of +\item{type}{Type of \acronym{DCM} to estimate. Must be one of lcdm, dina, dino, or crum.} \item{attribute_structure}{Structural model specification. Must be one of diff --git a/man/ecpe.Rd b/man/ecpe.Rd index 973ddc5..d9243c7 100644 --- a/man/ecpe.Rd +++ b/man/ecpe.Rd @@ -4,7 +4,7 @@ \name{ecpe_data} \alias{ecpe_data} \alias{ecpe_qmatrix} -\title{Examination for the Certificate of Proficiency in English (ECPE)} +\title{Examination for the Certificate of Proficiency in English} \format{ \code{ecpe_data} is a \link[tibble:tibble-package]{tibble} containing ECPE response data with 2,922 rows and 29 variables. @@ -31,7 +31,8 @@ ecpe_data ecpe_qmatrix } \description{ -This is data from the grammar section of the ECPE, administered annually by +This is data from the grammar section of the Examination for the Certificate +of Proficiency in English (\acronym{ECPE}), administered annually by the English Language Institute at the University of Michigan. This data contains responses to 28 questions from 2,922 respondents, which ask respondents to complete a sentence with the correct word. This data set has @@ -69,4 +70,5 @@ classification models: A family of models for estimating and testing attribute hierarchies. \emph{Psychometrika, 79}(2), 317-339. \doi{10.1007/s11336-013-9362-0} } +\concept{Examination for the Certificate of Proficiency in English} \keyword{datasets} diff --git a/man/figures/measr-timeline.png b/man/figures/measr-timeline.png deleted file mode 100644 index ac21bd2..0000000 Binary files a/man/figures/measr-timeline.png and /dev/null differ diff --git a/man/fit_ppmc.Rd b/man/fit_ppmc.Rd index 61dc060..d4606aa 100644 --- a/man/fit_ppmc.Rd +++ b/man/fit_ppmc.Rd @@ -22,7 +22,7 @@ less than or equal to the total number of posterior draws retained in the estimated model. If \code{NULL} (the default) the total number from the estimated model is used.} -\item{probs}{The percentiles to be computed by the \verb{[stats::quantile()]} +\item{probs}{The percentiles to be computed by the \code{\link[stats:quantile]{stats::quantile()}} function for summarizing the posterior distributions of the specified fit statistics.} @@ -45,29 +45,33 @@ Multiple checks can be provided in order to calculate more than one check simultaneously (e.g., \code{item_fit = c("conditional_prob", "odds_ratio")}). See details.} -\item{force}{If all requested PPMCs have already been added to the model -object using \code{\link[=add_fit]{add_fit()}}, should they be recalculated. Default is \code{FALSE}.} +\item{force}{If all requested \acronym{PPMC}s have already been added to the +model object using \code{\link[=add_fit]{add_fit()}}, should they be recalculated. Default is +\code{FALSE}.} } \value{ A list with two elements, "model_fit" and "item_fit". If either \code{model_fit = NULL} or \code{item_fit = NULL} in the function call, this will be a one-element list, with the null criteria excluded. Each list element, is -itself a list with one element for each specified PPMC containing a -\link[tibble:tibble-package]{tibble}. For example if +itself a list with one element for each specified \acronym{PPMC} containing +a \link[tibble:tibble-package]{tibble}. For example if \code{item_fit = c("conditional_prob", "odds_ratio")}, the "item_fit" element will be a list of length two, where each element is a tibble containing the -results of the PPMC. All tibbles follow the same general structure: +results of the \acronym{PPMC}. All tibbles follow the same general +structure: + \itemize{ -\item \verb{obs_\{ppmc\}}: The value of the relevant statistic in the observed data. -\item \code{ppmc_mean}: The mean of the \code{ndraws} posterior samples calculated for -the given statistic. +\item \verb{obs_\{ppmc\}}: The value of the relevant statistic in the observed +data. +\item \code{ppmc_mean}: The mean of the \code{ndraws} posterior samples calculated +for the given statistic. \item Quantile columns: 1 column for each value of \code{probs}, providing the corresponding quantiles of the \code{ndraws} posterior samples calculated for the given statistic. -\item \code{samples}: A list column, where each element contains a vector of length -\code{(ndraws * return_draws)}, representing samples from the posterior -distribution of the calculated statistic. This column is excluded if -\code{return_draws = 0}. +\item \code{samples}: A list column, where each element contains a vector of +length \code{(ndraws * return_draws)}, representing samples from the +posterior distribution of the calculated statistic. This column is +excluded if \code{return_draws = 0}. \item \code{ppp}: The posterior predictive p-value. This is the proportion of posterior samples for calculated statistic that are greater than the observed value. Values very close to 0 or 1 indicate incompatibility diff --git a/man/get_parameters.Rd b/man/get_parameters.Rd index feb12e4..a11e225 100644 --- a/man/get_parameters.Rd +++ b/man/get_parameters.Rd @@ -28,7 +28,7 @@ generic, but consistent names (e.g., "att1", "att2", "att3").} \item{rename_item}{Should item names from the \code{qmatrix} be replaced with generic, but consistent names (e.g., 1, 2, 3).} -\item{type}{Type of DCM to estimate. Must be one of +\item{type}{Type of \acronym{DCM} to estimate. Must be one of lcdm, dina, dino, or crum.} \item{attribute_structure}{Structural model specification. Must be one of diff --git a/man/is_measrfit.Rd b/man/is_measrfit.Rd index eb94880..1bc6a75 100644 --- a/man/is_measrfit.Rd +++ b/man/is_measrfit.Rd @@ -2,18 +2,18 @@ % Please edit documentation in R/measrfit-class.R \name{is_measrfit} \alias{is_measrfit} -\title{Check if argument is a \code{measrfit} object} +\title{Check if argument is a \code{\link{measrfit}} object} \usage{ is_measrfit(x) } \arguments{ -\item{x}{An object to be checked} +\item{x}{An object to be checked.} } \value{ -A logical indicating is \code{x} is a \code{measrfit} object. +A logical indicating is \code{x} is a \code{\link{measrfit}} object. } \description{ -Check if argument is a \code{measrfit} object +Check if argument is a \code{\link{measrfit}} object } \examples{ \dontshow{if (measr_examples()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} @@ -27,5 +27,5 @@ is_measrfit(rstn_mdm_lcdm) \dontshow{\}) # examplesIf} } \seealso{ -\linkS4class{measrfit}, \code{\link[=measrfit]{measrfit()}}, \code{\link[=as_measrfit]{as_measrfit()}} +See \linkS4class{measrfit}, \code{\link[=measrfit]{measrfit()}}, \code{\link[=as_measrfit]{as_measrfit()}}. } diff --git a/man/is_measrprior.Rd b/man/is_measrprior.Rd index 541435e..8b4346d 100644 --- a/man/is_measrprior.Rd +++ b/man/is_measrprior.Rd @@ -7,7 +7,7 @@ is_measrprior(x) } \arguments{ -\item{x}{An object to be checked} +\item{x}{An object to be checked.} } \value{ A logical indicating if \code{x} is a \code{measrprior} object. diff --git a/man/loo.measrfit.Rd b/man/loo.measrfit.Rd index c6f473c..f8a1789 100644 --- a/man/loo.measrfit.Rd +++ b/man/loo.measrfit.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/loo-methods.R \name{loo.measrfit} \alias{loo.measrfit} -\title{Efficient approximate leave-one-out cross-validation (LOO)} +\title{Efficient approximate leave-one-out cross-validation (\acronym{LOO})} \usage{ \method{loo}{measrfit}(x, ..., r_eff = NA, force = FALSE) } @@ -23,14 +23,15 @@ for all observations) or a vector with length equal to the number of observations. The default value is 1. See the \code{\link[loo:relative_eff]{relative_eff()}} helper functions for help computing \code{r_eff}.} -\item{force}{If the LOO criterion has already been added to the model object -with \code{\link[=add_criterion]{add_criterion()}}, should it be recalculated. Default is \code{FALSE}.} +\item{force}{If the \acronym{LOO} criterion has already been added to the +model object with \code{\link[=add_criterion]{add_criterion()}}, should it be recalculated. Default is +\code{FALSE}.} } \value{ The object returned by \code{\link[loo:loo]{loo::loo.array()}}. } \description{ A \code{\link[loo:loo]{loo::loo()}} method that is customized for \code{measrfit} objects. This is a -simple wrapper around \code{\link[loo:loo]{loo::loo.array()}}. See the \strong{loo} package +simple wrapper around \code{\link[loo:loo]{loo::loo.array()}}. See the loo package \href{https://mc-stan.org/loo/articles/}{vignettes} for details. } diff --git a/man/loo_compare.measrfit.Rd b/man/loo_compare.measrfit.Rd index ce43f5a..484d738 100644 --- a/man/loo_compare.measrfit.Rd +++ b/man/loo_compare.measrfit.Rd @@ -23,6 +23,6 @@ The object returned by \code{\link[loo:loo_compare]{loo::loo_compare()}}. } \description{ A \code{\link[loo:loo_compare]{loo::loo_compare()}} method that is customized for \code{measrfit} objects. See -the \strong{loo} package \href{https://mc-stan.org/loo/articles/}{vignettes} for +the loo package \href{https://mc-stan.org/loo/articles/}{vignettes} for details. } diff --git a/man/mdm.Rd b/man/mdm.Rd index c0f5ec0..1e67db9 100644 --- a/man/mdm.Rd +++ b/man/mdm.Rd @@ -4,7 +4,7 @@ \name{mdm_data} \alias{mdm_data} \alias{mdm_qmatrix} -\title{MacReady & Dayton (1977) Multiplication Data} +\title{MacReady & Dayton (1977) multiplication data} \format{ \code{mdm_data} is a \link[tibble:tibble-package]{tibble} containing responses to multiplication items, as described in MacReady & Dayton (1977). There are @@ -41,4 +41,6 @@ MacReady, G. B., & Dayton, C. M. (1977). The use of probabilistic models in the assessment of mastery. \emph{Journal of Educational Statistics, 2}(2), 99-120. \doi{10.2307/1164802} } +\concept{Dayton} +\concept{MacReady} \keyword{datasets} diff --git a/man/measr_dcm.Rd b/man/measr_dcm.Rd index 3747e7c..435b392 100644 --- a/man/measr_dcm.Rd +++ b/man/measr_dcm.Rd @@ -25,8 +25,8 @@ measr_dcm( \item{data}{Response data. A data frame with 1 row per respondent and 1 column per item.} -\item{missing}{An R expression specifying how missing data in \code{data} is coded -(e.g., \code{NA}, \code{"."}, \code{-99}, etc.). The default is \code{NA}.} +\item{missing}{An \code{R} expression specifying how missing data in \code{data} is +coded (e.g., \code{NA}, \code{"."}, \code{-99}, etc.). The default is \code{NA}.} \item{qmatrix}{The Q-matrix. A data frame with 1 row per item and 1 column per attribute. All cells should be either 0 (item does not measure the @@ -45,7 +45,7 @@ identifiers. \code{NULL} also assumes that the order of the rows in the Q-matrix is the same as the order of the columns in \code{data} (i.e., the item in row 1 of \code{qmatrix} is the item in column 1 of \code{data}, excluding \code{resp_id}).} -\item{type}{Type of DCM to estimate. Must be one of +\item{type}{Type of \acronym{DCM} to estimate. Must be one of lcdm, dina, dino, or crum.} \item{max_interaction}{If \code{type = "lcdm"}, the highest level of interaction @@ -70,21 +70,21 @@ are used, as specified by \code{\link[=default_dcm_priors]{default_dcm_priors()} \item{backend}{Character string naming the package to use as the backend for fitting the Stan model. Options are \code{"rstan"} (the default) or -\code{"cmdstanr"}. Can be set globally for the current R session via the -"measr.backend" option (see \code{\link[=options]{options()}}). Details on the \strong{rstan} and -\strong{cmdstanr} packages are available at \url{https://mc-stan.org/rstan/} and +\code{"cmdstanr"}. Can be set globally for the current \code{R} session via the +"measr.backend" option (see \code{\link[=options]{options()}}). Details on the rstan and +cmdstanr packages are available at \url{https://mc-stan.org/rstan/} and \url{https://mc-stan.org/cmdstanr/}, respectively.} \item{file}{Either \code{NULL} (the default) or a character string. If a character string, the fitted model object is saved as an \code{.rds} object using \code{\link[=saveRDS]{saveRDS()}} using the supplied character string. The \code{.rds} extension -is automatically added. If the specified file already exists, \strong{measr} +is automatically added. If the specified file already exists, measr will load the previously saved model. Unless \code{file_refit} is specified, the model will not be refit.} \item{file_refit}{Controls when a saved model is refit. Options are \code{"never"}, \code{"always"}, and \code{"on_change"}. Can be set globally for the -current R session via the "measr.file_refit" option (see \code{\link[=options]{options()}}). +current \code{R} session via the "measr.file_refit" option (see \code{\link[=options]{options()}}). \itemize{ \item For \code{"never"} (the default), the fitted model is always loaded if the \code{file} exists, and model fitting is skipped. @@ -111,9 +111,9 @@ class. A \link{measrfit} object. } \description{ -Estimate diagnostic classification models (DCMs; also known as cognitive +Estimate diagnostic classification models (\acronym{DCM}s; also known as cognitive diagnostic models) using 'Stan'. Models can be estimated using Stan's -optimizer, or full Markov chain Monte Carlo (MCMC). +optimizer, or full Markov chain Monte Carlo (\acronym{MCMC}). } \examples{ \dontshow{if (measr_examples()) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} @@ -124,3 +124,5 @@ rstn_mdm_lcdm <- measr_dcm( ) \dontshow{\}) # examplesIf} } +\concept{Bayesian} +\concept{Stan} diff --git a/man/measr_extract.Rd b/man/measr_extract.Rd index a6fb900..a312806 100644 --- a/man/measr_extract.Rd +++ b/man/measr_extract.Rd @@ -3,7 +3,7 @@ \name{measr_extract} \alias{measr_extract} \alias{measr_extract.measrdcm} -\title{Extract components of a \code{measrfit} object.} +\title{Extract components of a \code{measrfit} object} \usage{ measr_extract(model, ...) @@ -19,8 +19,8 @@ measr_extract(model, ...) For \code{what = "odds_ratio_flags"} and \code{what = "conditional_prob_flags"}, the compatibility interval used for determining model fit flags to return. For example, a \code{ppmc_interval} of -0.95 (the default) will return any PPMCs where the posterior predictive -\emph{p}-value (ppp) is less than 0.025 or greater than 0.975. +0.95 (the default) will return any \acronym{PPMC}s where the posterior +predictive \emph{p}-value (ppp) is less than 0.025 or greater than 0.975. \item \code{agreement}: For \code{what = "classification_reliability"}, additional @@ -48,7 +48,7 @@ on what is being extracted, but usually the returned object is a \link[tibble:tibble-package]{tibble} with the requested information. } \description{ -Extract components of a \code{measrfit} object. +Extract components of a \code{measrfit} object Extract components of an estimated diagnostic classification model } @@ -153,3 +153,7 @@ Templin, J., & Bradshaw, L. (2013). Measuring the reliability of diagnostic classification model examinee estimates. \emph{Journal of Classification, 30}(2), 251-275. \doi{10.1007/s00357-013-9129-4} } +\concept{Bradshaw} +\concept{Goodman} +\concept{Sinharay} +\concept{Templin} diff --git a/man/measrfit-class.Rd b/man/measrfit-class.Rd index f32e9b8..ba9df74 100644 --- a/man/measrfit-class.Rd +++ b/man/measrfit-class.Rd @@ -3,9 +3,9 @@ \docType{class} \name{measrfit-class} \alias{measrfit-class} -\title{Class \code{measrfit} of models fitted with the \strong{measr} package} +\title{Class \code{measrfit} of models fitted with the measr package} \description{ -Models fitted with the \strong{measr} package are represented as a \code{measrfit} +Models fitted with the measr package are represented as a \code{measrfit} object, which contains the posterior draws, Stan code, priors, and other relevant information. } @@ -19,7 +19,7 @@ relevant information. \item{\code{prior}}{A \link[=measrprior]{measrprior} object containing information on the priors used in the model.} -\item{\code{stancode}}{The model code in \strong{Stan} language.} +\item{\code{stancode}}{The model code in \emph{Stan} language.} \item{\code{method}}{The method used to fit the model.} @@ -47,10 +47,10 @@ fitting the model.} \item{\code{file}}{Optional name of a file which the model objects was saved to or loaded from.} -\item{\code{version}}{The versions of \strong{measr}, \strong{Stan}, \strong{rstan} and/or -\strong{cmdstanr} that were used to fit the model.} +\item{\code{version}}{The versions of measr, \emph{Stan}, and rstan or cmdstanr that were +used to fit the model.} }} \seealso{ -\code{\link[=measrfit]{measrfit()}}, \code{\link[=as_measrfit]{as_measrfit()}}, \code{\link[=is_measrfit]{is_measrfit()}} +See \code{\link[=measrfit]{measrfit()}}, \code{\link[=as_measrfit]{as_measrfit()}}, \code{\link[=is_measrfit]{is_measrfit()}}. } diff --git a/man/measrfit.Rd b/man/measrfit.Rd index 4855665..9f14eab 100644 --- a/man/measrfit.Rd +++ b/man/measrfit.Rd @@ -25,12 +25,12 @@ measrfit( \arguments{ \item{data}{The data and Q-matrix used to estimate the model.} -\item{type}{The type of DCM that was estimated.} +\item{type}{The type of \acronym{DCM} that was estimated.} \item{prior}{A \link[=measrprior]{measrprior} object containing information on the priors used in the model.} -\item{stancode}{The model code in \strong{Stan} language.} +\item{stancode}{The model code in \emph{Stan} language.} \item{method}{The method used to fit the model.} @@ -58,19 +58,19 @@ fitting the model.} \item{file}{Optional name of a file which the model objects was saved to or loaded from.} -\item{version}{The versions of \strong{measr}, \strong{Stan}, \strong{rstan} and/or -\strong{cmdstanr} that were used to fit the model.} +\item{version}{The versions of measr, \emph{Stan}, and rstan or cmdstanr that were +used to fit the model.} \item{class}{Additional classes to be added (e.g., \code{measrdcm} for a diagnostic classification model).} } \value{ -A \link[=measrfit-class]{measrfit} object. +A \code{\link[=measrfit-class]{measrfit}} object. } \description{ -Models fitted with \strong{measr} are represented as a \code{measrfit} object. If a -model is estimated with \emph{Stan}, but not \strong{measr}, a \code{measrfit} object can be -created in order to access other functionality in \strong{measr} (e.g., model fit, +Models fitted with \code{\link{measr}} are represented as a \code{measrfit} object. If a +model is estimated with \emph{Stan}, but not \code{\link{measr}}, a \code{measrfit} object can be +created in order to access other functionality in measr (e.g., model fit, reliability). } \examples{ @@ -101,5 +101,6 @@ new_obj <- measrfit( \dontshow{\}) # examplesIf} } \seealso{ -\linkS4class{measrfit}, \code{\link[=as_measrfit]{as_measrfit()}}, \code{\link[=is_measrfit]{is_measrfit()}} +See \code{\linkS4class{measrfit}}, \code{\link[=as_measrfit]{as_measrfit()}}, \code{\link[=is_measrfit]{is_measrfit()}}. } +\concept{Stan} diff --git a/man/measrprior.Rd b/man/measrprior.Rd index 8973b1d..2a4e369 100644 --- a/man/measrprior.Rd +++ b/man/measrprior.Rd @@ -5,7 +5,7 @@ \alias{prior} \alias{prior_} \alias{prior_string} -\title{Prior definitions for \strong{measr} models} +\title{Prior definitions for measr models} \usage{ measrprior( prior, @@ -22,14 +22,14 @@ prior_(prior, ...) prior_string(prior, ...) } \arguments{ -\item{prior}{A character string defining a distribution in \strong{Stan} language. -A list of all distributions supported by \strong{Stan} can be found in \emph{Stan +\item{prior}{A character string defining a distribution in \emph{Stan} language. +A list of all distributions supported by \emph{Stan} can be found in \emph{Stan Language Functions Reference} at \url{https://mc-stan.org/users/documentation/}.} \item{class}{The parameter class. Defaults to \code{"intercept"}. Must be one of -\code{"intercept"}, \code{"maineffect"}, \code{"interaction"} for the LCDM, or one of -\code{"slip"} or \code{"guess"} for DINA or DINO models.} +\code{"intercept"}, \code{"maineffect"}, \code{"interaction"} for the \acronym{LCDM}, or +one of \code{"slip"} or \code{"guess"} for \acronym{DINA} or \acronym{DINO} models.} \item{coef}{Name of a specific parameter within the defined class. If not defined, the prior is applied to all parameters within the class.} @@ -77,3 +77,5 @@ prior(beta(5, 25), class = "slip") # Or for a specific item (e.g., just the slipping parameter for item 7) prior(beta(5, 25), class = "slip", coef = "slip[7]") } +\concept{Stan} +\concept{Stan Language Functions Reference} diff --git a/man/model_evaluation.Rd b/man/model_evaluation.Rd index e47222d..73860d0 100644 --- a/man/model_evaluation.Rd +++ b/man/model_evaluation.Rd @@ -47,9 +47,9 @@ already been added to the estimated model should be overwritten. Default is \item{save}{Logical. Only relevant if a file was specified in the \link{measrfit} object passed to \code{x}. If \code{TRUE} (the default), the model is -re-saved to the specified file when new criteria are added to the R object. -If \code{FALSE}, the new criteria will be added to the R object, but the saved -file will not be updated.} +re-saved to the specified file when new criteria are added to the \code{R} +object. If \code{FALSE}, the new criteria will be added to the \code{R} object, but +the saved file will not be updated.} \item{...}{Additional arguments passed relevant methods. See Details.} @@ -70,7 +70,7 @@ object.} \item{ci}{The confidence interval for the RMSEA, computed from the M2} -\item{probs}{The percentiles to be computed by the \verb{[stats::quantile()]} +\item{probs}{The percentiles to be computed by the \code{\link[stats:quantile]{stats::quantile()}} function to summarize the posterior distributions of each person parameter. Only relevant if \code{method = "mcmc"} was used to estimate the model.} } @@ -100,9 +100,10 @@ arguments supplied to \code{...} are passed to \code{\link[=fit_ppmc]{fit_ppmc() For \code{add_criterion()}, relative fit criteria are added to the \verb{$criteria} element of the fitted model. This function wraps \code{\link[=loo]{loo()}} and/or \code{\link[=waic]{waic()}}, depending on which criteria are specified, to calculate the leave-one-out -(LOO; Vehtari et al., 2017) and/or widely applicable information criteria -(WAIC; Watanabe, 2010) to fitted model objects. Additional arguments supplied -to \code{...} are passed to \code{\link[loo:loo]{loo::loo.array()}} or \code{\link[loo:waic]{loo::waic.array()}}. +(\acronym{LOO}; Vehtari et al., 2017) and/or widely applicable information +criteria (\acronym{WAIC}; Watanabe, 2010) to fitted model objects. +Additional arguments supplied to \code{...} are passed to \code{\link[loo:loo]{loo::loo.array()}} or +\code{\link[loo:waic]{loo::waic.array()}}. For \code{add_reliability()}, reliability information is added to the \verb{$reliability} element of the fitted model. Pattern level reliability is diff --git a/man/predict.measrdcm.Rd b/man/predict.measrdcm.Rd index 0056430..4d91e99 100644 --- a/man/predict.measrdcm.Rd +++ b/man/predict.measrdcm.Rd @@ -29,14 +29,14 @@ identifiers are present in the data, and row numbers will be used as identifiers. If \code{newdata} is not specified and the data used to estimate the model is scored, the \code{resp_id} is taken from the original data.} -\item{missing}{An R expression specifying how missing data in \code{data} is coded -(e.g., \code{NA}, \code{"."}, \code{-99}, etc.). The default is \code{NA}.} +\item{missing}{An \code{R} expression specifying how missing data in \code{data} is +coded (e.g., \code{NA}, \code{"."}, \code{-99}, etc.). The default is \code{NA}.} \item{summary}{Should summary statistics be returned instead of the raw posterior draws? Only relevant if the model was estimated with \code{method = "mcmc"}. Default is \code{FALSE}.} -\item{probs}{The percentiles to be computed by the \verb{[stats::quantile()]} +\item{probs}{The percentiles to be computed by the \code{\link[stats:quantile]{stats::quantile()}} function. Only relevant if the model was estimated with \code{method = "mcmc"}. Only used if \code{summary} is \code{TRUE}.} diff --git a/man/waic.measrfit.Rd b/man/waic.measrfit.Rd index 26885d3..0d49452 100644 --- a/man/waic.measrfit.Rd +++ b/man/waic.measrfit.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/loo-methods.R \name{waic.measrfit} \alias{waic.measrfit} -\title{Widely applicable information criterion (WAIC)} +\title{Widely applicable information criterion (\acronym{WAIC})} \usage{ \method{waic}{measrfit}(x, ..., force = FALSE) } @@ -11,14 +11,15 @@ \item{...}{Additional arguments passed to \code{\link[loo:waic]{loo::waic.array()}}.} -\item{force}{If the WAIC criterion has already been added to the model object -with \code{\link[=add_criterion]{add_criterion()}}, should it be recalculated. Default is \code{FALSE}.} +\item{force}{If the \acronym{WAIC} criterion has already been added to the +model object with \code{\link[=add_criterion]{add_criterion()}}, should it be recalculated. Default is +\code{FALSE}.} } \value{ The object returned by \code{\link[loo:waic]{loo::waic.array()}}. } \description{ A \code{\link[loo:waic]{loo::waic()}} method that is customized for \code{measrfit} objects. This is a -simple wrapper around \code{\link[loo:waic]{loo::waic.array()}}. See the \strong{loo} package +simple wrapper around \code{\link[loo:waic]{loo::waic.array()}}. See the loo package \href{https://mc-stan.org/loo/articles/}{vignettes} for details. } diff --git a/pkgdown/extra.css b/pkgdown/extra.css deleted file mode 100644 index af16a35..0000000 --- a/pkgdown/extra.css +++ /dev/null @@ -1,228 +0,0 @@ -@import url("https://fonts.googleapis.com/css?family=Ubuntu:400,700"); - -:root { - --nav-bkg: #023047; /* nav bar background */ - --nav-link: #8ecae6; /* nav bar link color */ - --nav-higl: #219ebc; /* nav active and highlight */ - --ver-norm: #219ebc; /* pkg version background - release version */ - --ver-devp: #d7263d; /* pkg version background - dev version */ - - --pg-header: #023047; /* heading color & text links */ - --text-link: #d7263d; /* hyperlinks in text */ - --a-hover: #219ebc; /* hyperlink hover */ - - --sdb-link: #d7263d; /* hyperlinks in sidebar */ - --sdb-hover: #219ebc; /* hyperlink hover in sidebar*/ - --sdb-roles: #00000094; /* author roles */ - - --toc-link: #023047; /* table of contents links */ - --toc-bkg: #8ecae6; /* table of contents active background */ - - --btn-color: #023047; /* copy button color */ - --btn-hover: #219ebc; /* copy button hover */ - - --col-bullt: #023047; /* color for colored list */ - --thb-captn: #023047; /* thumbnail caption */ -} - - -/* Navbar ------------------------------------------------------------------- */ -/* Navbar color */ -.bg-light { - background-color: var(--nav-bkg) !important; -} - -/* package name in navbar */ -.navbar-brand { - font-family: Ubuntu; - font-weight: 700; - font-size: 1.7rem; - color: var(--nav-link) !important; -} - -/* Package version */ -small.text-danger { - color: var(--ver-devp) !important; -} - -small.text-muted { - color: var(--ver-norm) !important; -} - -/* Color of links in navbar and hover links */ -.nav-link { - color: var(--nav-link) !important; -} - -.navbar-light .navbar-nav .nav-link:hover { - color: var(--nav-higl) !important; -} - -.navbar-light .navbar-nav .nav-item>.nav-link:hover { - background: var(--nav-bkg); -} - -.navbar-light .navbar-nav .active > .nav-link:hover { - color: var(--nav-higl) !important; -} - -/* active navbar link */ -.navbar-light .navbar-nav .active > .nav-link { - background: var(--nav-link); - color: var(--nav-bkg) !important; - border-radius: 1rem; -} - -/* dropdown menu */ -.dropdown-menu { - background-color: var(--nav-bkg); - border-color: var(--nav-link); -} - -.dropdown-item, .dropdown-menu > li > a { - background-color: var(--nav-bkg); - color: var(--nav-link); -} - -.dropdown-item:hover, .dropdown-menu > li > a:hover, -.dropdown-item:focus, .dropdown-menu > li > a:focus { - color: var(--nav-higl); - text-decoration: none; - background-color: var(--nav-bkg); -} - -span.navbar-toggler-icon { - filter: brightness(0) saturate(100%) invert(68%) sepia(34%) saturate(366%) hue-rotate(154deg) brightness(107%) contrast(88%); -} - -h6.dropdown-header { - color: var(--nav-higl); -} - -.dropdown-divider { - border-top: 1px solid var(--nav-link); -} - - -/* sidebar ------------------------------------------------------------------ */ -#pkgdown-sidebar a { - color: var(--sdb-link); - text-decoration: none; -} - -#pkgdown-sidebar a:hover { - text-decoration: underline; - color: var(--sdb-hover); -} - -h2[data-toc-skip], #pkgdown-sidebar h2[data-toc-skip] { - font-size: 1.2em; - /* text-transform: uppercase; */ -} - -#pkgdown-sidebar small.roles { - font-size: 0.75em; - color: var(--sdb-roles); -} - - -/* footer ------------------------------------------------------------------- */ -footer .pkgdown-footer-right { - flex: 5; -} - - -/* Format text -------------------------------------------------------------- */ -/* link colors */ -a { - color: var(--text-link); -} - -a:hover { - color: var(--a-hover); -} - -/* add underline to links in paragraphs */ -p a { - text-decoration: underline var(--text-link) dotted; - text-decoration-skip-ink: none; - text-decoration-thickness: from-font; -} - -/* headers */ -.template-home .page-header { - min-height: 50px; -} - -h1 { - font-size: 2.0em; - font-weight: 400; - color: var(--pg-header); - letter-spacing: .08em; -} -h2 { - font-size: 1.7em; - text-transform: none; - font-weight: 300; - color: var(--pg-header); - letter-spacing: .08em; -} -h3 { - font-size: 1.2em; - text-transform: none; - font-weight: 200; - color: var(--pg-header); - letter-spacing: .1em; -} -h4 { - font-size: 1.2em; - text-transform: none; - font-weight: 600; - color: var(--pg-header); - letter-spacing: .05em; -} - - -/* Copy Buttons ------------------------------------------------------------- */ -.btn-primary { - background-color: var(--btn-color); - border-color: var(--btn-color); -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active:hover { - background-color: var(--btn-hover); - border-color: var(--btn-hover); -} - -/* table of contents -------------------------------------------------------- */ -nav[data-toggle="toc"] .nav > li > a { - color: var(--toc-link) !important; - padding-left: 0.5rem; - border-radius: 1rem; - border: white solid; -} - -/* Under hover */ -nav[data-toggle="toc"] .nav > li > a:hover, -nav[data-toggle="toc"] .nav > li > a:focus, -/* Current */ -nav[data-toggle="toc"] .nav-link.active, -nav[data-toggle="toc"] .nav-link.active:hover, -nav[data-toggle="toc"] .nav-link.active:focus -{ - background-color: var(--toc-bkg) !important; -} - -/* Nav: second level (shown on .active) */ -nav[data-toggle="toc"] .nav-link + ul { - display: none; -} -nav[data-toggle="toc"] .nav-link.active + ul { - display: block; -} -nav[data-toggle="toc"] .nav .nav > li > a { - margin-left: 0.5rem; -} - diff --git a/pkgdown/favicon/apple-touch-icon-120x120.png b/pkgdown/favicon/apple-touch-icon-120x120.png deleted file mode 100644 index fd8ecb2..0000000 Binary files a/pkgdown/favicon/apple-touch-icon-120x120.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-152x152.png b/pkgdown/favicon/apple-touch-icon-152x152.png deleted file mode 100644 index 1220a12..0000000 Binary files a/pkgdown/favicon/apple-touch-icon-152x152.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-180x180.png b/pkgdown/favicon/apple-touch-icon-180x180.png deleted file mode 100644 index 51a2d58..0000000 Binary files a/pkgdown/favicon/apple-touch-icon-180x180.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-60x60.png b/pkgdown/favicon/apple-touch-icon-60x60.png deleted file mode 100644 index 9c4e139..0000000 Binary files a/pkgdown/favicon/apple-touch-icon-60x60.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-76x76.png b/pkgdown/favicon/apple-touch-icon-76x76.png deleted file mode 100644 index f39b026..0000000 Binary files a/pkgdown/favicon/apple-touch-icon-76x76.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon.png b/pkgdown/favicon/apple-touch-icon.png index 67ac53b..7597892 100644 Binary files a/pkgdown/favicon/apple-touch-icon.png and b/pkgdown/favicon/apple-touch-icon.png differ diff --git a/pkgdown/favicon/favicon-16x16.png b/pkgdown/favicon/favicon-16x16.png deleted file mode 100644 index e2d7424..0000000 Binary files a/pkgdown/favicon/favicon-16x16.png and /dev/null differ diff --git a/pkgdown/favicon/favicon-32x32.png b/pkgdown/favicon/favicon-32x32.png deleted file mode 100644 index fe5c84c..0000000 Binary files a/pkgdown/favicon/favicon-32x32.png and /dev/null differ diff --git a/pkgdown/favicon/favicon-96x96.png b/pkgdown/favicon/favicon-96x96.png new file mode 100644 index 0000000..73ae86f Binary files /dev/null and b/pkgdown/favicon/favicon-96x96.png differ diff --git a/pkgdown/favicon/favicon.ico b/pkgdown/favicon/favicon.ico index 419771d..4bba7b3 100644 Binary files a/pkgdown/favicon/favicon.ico and b/pkgdown/favicon/favicon.ico differ diff --git a/pkgdown/favicon/favicon.svg b/pkgdown/favicon/favicon.svg new file mode 100644 index 0000000..1e611b4 --- /dev/null +++ b/pkgdown/favicon/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/pkgdown/favicon/site.webmanifest b/pkgdown/favicon/site.webmanifest new file mode 100644 index 0000000..4ebda26 --- /dev/null +++ b/pkgdown/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/pkgdown/favicon/web-app-manifest-192x192.png b/pkgdown/favicon/web-app-manifest-192x192.png new file mode 100644 index 0000000..7bf413e Binary files /dev/null and b/pkgdown/favicon/web-app-manifest-192x192.png differ diff --git a/pkgdown/favicon/web-app-manifest-512x512.png b/pkgdown/favicon/web-app-manifest-512x512.png new file mode 100644 index 0000000..635e3c4 Binary files /dev/null and b/pkgdown/favicon/web-app-manifest-512x512.png differ diff --git a/vignettes/articles/fits/ecpe-lcdm.rds b/vignettes/articles/fits/ecpe-lcdm.rds index e0432e2..fdfca1d 100644 Binary files a/vignettes/articles/fits/ecpe-lcdm.rds and b/vignettes/articles/fits/ecpe-lcdm.rds differ diff --git a/vignettes/fits/ecpe-optim-lcdm.rds b/vignettes/fits/ecpe-optim-lcdm.rds index 3fcfee1..0a960ad 100644 Binary files a/vignettes/fits/ecpe-optim-lcdm.rds and b/vignettes/fits/ecpe-optim-lcdm.rds differ