Changelog
Source:NEWS.md
easyRasch2 0.8.0
Visual consistency across all plot output
- Every
RM*function that returns aggplotnow applies three shared internal theme helpers:-
er2_axis_margins()— extra breathing room around the x and y axis titles. -
er2_plot_caption()— left-aligned 9 pt plot caption. When the optionalggtextpackage is installed (new in Suggests), the caption renders viaggtext::element_markdown()so the APA-conventional italic “Note.” prefix can sit alongside roman body text. Withoutggtext, it falls back to a plainelement_text(face = "italic")and a plain “Note.” prefix — no markdown asterisks ever leak through to the rendered text. -
er2_caption()— builds the caption string with the “Note.” prefix and wraps long captions at 90 characters viastrwrap()so they no longer run off the right edge of the plot. The body text is wrapped first then prefixed, so the prefix is never broken by a line break.
-
- All three helpers are internal (
@noRd) and not exported.
New function
-
RMitemCatProb()plots model-implied category-response probability curves per item, similar toeRm::plotICC()ormirttrace plots but with aggplot2/ viridis output. Each item gets its own facet panel; one curve per response category is coloured from low to high using a continuous viridis palette. Polytomous items are fit witheRm::PCM(); dichotomous items fall back toeRm::RM()(recovering the standard two-category logistic ICC). Optional descriptiveitem_labelsandcategory_labelsmake the output report-ready.- Optional
label_curves = "path"mode (requires the optionalgeomtextpathpackage, in Suggests) writes each category’s label along its own curve in the classic IRT trace-plot style. Single-item only — pass the full multi-item dataset and use theitemargument to choose which item’s curves to plot. The model is still fit on all items (CML threshold estimation needs the full dataset); only the rendering is filtered. Each category’s label is positioned at that curve’s modal theta (the peak of its bell for middle categories; the relevant edge for the monotone extreme categories), clamped a small margin in from the plot edges to prevent clipping.
- Optional
Function renaming for consistency
This release renames 22 exported functions under a consistent domain-prefix → method → variant-suffix scheme so that autocompletion on a prefix (RMdif, RMlocdep, RMitem, RMdim, RMplot) surfaces every related function. No semantic changes; only names.
A complete mapping is on the new ?easyRasch2-renaming help page. The short version:
| Domain | Prefix | Examples |
|---|---|---|
| DIF | RMdif |
RMdifGamma(), RMdifGammaCutoff(), RMdifGammaPlot(), RMdifLR(), RMdifTree()
|
| Local dependence | RMlocdep |
RMlocdepQ3(), RMlocdepQ3Cutoff(), RMlocdepQ3Plot(), RMlocdepGamma(), RMlocdepGammaCutoff(), RMlocdepGammaPlot()
|
| Item statistics | RMitem |
RMitemInfit(), RMitemInfitCutoff(), RMitemInfitCutoffPlot(), RMitemInfitMI(), RMitemInfitCutoffMI(), RMitemRestscore(), RMitemRestscoreBoot(), RMitemICCPlot(), RMitemHierarchy()
|
| Dimensionality | RMdim |
RMdimResidualPCA(), RMdimResidualPCACutoff(), RMdimCFACutoff(), RMdimCFAPlot(), RMdimMartinLof(), RMdimMartinLofResiduals()
|
| Descriptive plot | RMplot |
RMplotTile(), RMplotBar(), RMplotStackedbar()
|
Unchanged: RMreliability(), RMUreliability(), RMtargeting(), RMscoreSE().
Breaking change. No deprecation aliases are shipped — existing scripts will need a search-and-replace. See ?easyRasch2-renaming for the full table.
easyRasch2 0.7.1
- New
RMlocdepQ3plot()for visualising per-pair simulated Q3 distributions against observed Q3 values, mirroring the design ofRMpgLDplot()andRMpgDIFplot(). Supportsitemsandn_pairsfilters; withdatasupplied, ranksn_pairsby|observed Q3 - median(simulated Q3 per pair)|. -
RMlocdepQ3cutoff()now retains per-pair iteration-level data: the returned list gainspair_results,pair_cutoffs,item_names,cutoff_method, andhdci_width. Existing scalar outputs (suggested_cutoffetc.) are unchanged. New argumentscutoff_method("hdci"/"quantile") andhdci_width(default0.99) control how per-pair credible intervals are computed. -
RMlocdepQ3()can now be called with the full list returned byRMlocdepQ3cutoff()(it auto-extracts$suggested_cutoff), matching the partial-gamma family convention. Numeric scalar still works. -
RMpartgamLD()andRMpgLDplot()gain ann_pairsargument to keep only the top-N pairs by|gamma|(LD) or by|observed - median(sim)|deviation (plot). -
RMpartgamLD(),RMpartgamDIF(), andRMitemrestscore()now use consistent column headers:Adj. p-value (BH)and a newp-value sign.star-string column.RMitemrestscore()’s formerAbsolute_differencecolumn is now a signedDifference(observed − expected), so over- and underfit are visually distinguishable at a glance.
easyRasch2 0.7.0
- New
RMbarplot()andRMstackedbarplot()joinRMtileplot()for easy visualization of item response data distributions. - New
RMciccPlot()for conditional item characteristic curves plot, also includes DIF analysis for categorical DIF variables. - New
RMitemHierarchy(), which outputs a plot illustrating the item hierarchy with item thresholds and confidence intervals. - Modified
RMcfaCutoff()to only use .scaled metrics for RMSEA and CFI, for stability. See documentation for more details. - Bug fix for
RMmartinLof()with dichotomous items. - Bug fix for
RMitemHierarchy()making optionitem_labelswork as intended. - Tests written for all functions, preparing for CRAN submission in the nearish future.
- Drafted a package intro/vignette
easyRasch2 0.6.0
- New
RMcfaCutoff()for testing unidimensionality against simulation-based cutoff values for model fit metrics.-
RMcfaPlot()shows figure with distribution of simulation results and observed model fit values.
-
easyRasch2 0.5.8
- New
RMdifTree()for testing DIF with continuous variables, such as age in years, as well as combinations of DIF variables (DIF interactions).- Also implements use of
stablelearner, as recommended by Henninger et al.- to assess stability of tree-based results.
- Borrows from
- raschtreeMH (https://github.com/mirka-henninger/raschtreeMH)
- effecttree (https://github.com/mirka-henninger/effecttree)
- See these two papers (and
?RMdifTree) for more details:- Henninger, M., Debelak, R., & Strobl, C. (2023). A new stopping criterion for Rasch trees based on the Mantel-Haenszel effect size measure for DIF. Educational Psychological Measurement, 83, 181-212. doi:10.1177/00131644221077135
- Henninger, M., Radek, J., Debelak, R., & Strobl, C. (2025). Partial credit trees meet the partial gamma coefficient for quantifying DIF and DSF in polytomous items. Behaviormetrika, 52, 221-257.
- Also implements use of
easyRasch2 0.5.7
- New
RMdifLR()for testing DIF of categorical variables using Andersens’s Likelihood Ratio test as implemented in packageeRm - Visualization of response data using a tile plot with
RMtileplot().- Optional
groupfaceting, which is useful for DIF-analyses.
- Optional
- Added Martin-Löf test of dimensionality
RMmartinLof()based on Christensen & Kreiner (2007, doi: 10.1177/0146621605286204), for both dichotomous and polytomous (PCM) items.- Also added post-processing function
RMmartinLofresiduals().
- Also added post-processing function
easyRasch2 0.5.6
- Added
RMresidualPCA()for evaluating patterns in the standardized residuals from the RM/PCM. Outputs either a table with eigenvalues and explained variance or a figure with standardized loadings on the first residual contrast and item locations. - Added
RMpcaCutoff()to determine a simulation-based critical value for the largest eigenvalue.
easyRasch2 0.5.5
- Added
RMbootRestscore()for use with large sample sizes. See https://pgmj.github.io/rasch_itemfit/ for more details. - Added
RMscoreSE()that produces a transformation table (or figure) from ordinal sum scores to WLE (Weighted Likelihood Estimation) interval scores. - Modified
RMlocdepQ3cutoff()to improve speed.
easyRasch2 0.5.4
-
RMtargeting()for Wright map style plots. - New functions for handling missing data with conditional item infit MSQ by multiple imputation using package
mice.-
RMinfitcutoff_mi()uses themidsobject containing multiple imputated datasets (output bymice::mice()) to run simulations on each datasets and combines the results. Splits iterations across imputations (e.g. 250 total / 5 imputations = 50 each). -
RMiteminfit_mi()calculates and pools conditional infit from the imputated datasets and optionally uses theRMinfitcutoff_mi()output for cutoff values. - Works with existing
RMinfitcutoffPlot()
-
easyRasch2 0.5.3
- New functions
RMpartgamLD()andRMpgLDcutoff()for evaluating local dependency of item pairs in both directions.- Plot function
RMpgLDplot(), similar toRMpgDIFplot() - NOTE: The simulation-based cutoffs have not yet been evaluated in a systematic way. Default choices may not be sensible, please try different numbers of iterations and hdci_width.
- Plot function
easyRasch2 0.5.2
- New functions
RMpartgamDIF()andRMpgDIFcutoff()for evaluating DIF of categorical external variables.- Also with plot function
RMpgDIFplot(), similar toRMinfitcutoffPlot() - NOTE: The simulation-based cutoffs have not yet been evaluated in a systematic way. Default choices may not be sensible, please try different numbers of iterations and hdci_width.
- Also with plot function
easyRasch2 0.5.1
- New function
RMinfitcutoffPlot()to illustrate distribution of simulated conditional item infit MSQ values together with the observed value.
easyRasch2 0.5.0
RMinfitcutoff()gainscutoff_methodandhdci_widthparameters: By default (cutoff_method = "hdci",hdci_width = 0.999), per-item cutoff intervals are now computed using the Highest Density Interval viaggdist::hdci()(99.9% HDCI). Setcutoff_method = "quantile"to restore the previous behaviour (2.5th/97.5th percentiles). Theggdistpackage is only required whencutoff_method = "hdci"(added to Suggests). The returned list now also includescutoff_methodandhdci_widthfields.RMiteminfit()caption updated: Whencutoffis the return value ofRMinfitcutoff(), the kable caption now states the cutoff method, e.g."Cutoff values based on 250 simulation iterations (99.9% HDCI)."or"Cutoff values based on 250 simulation iterations (2.5th/97.5th percentile).".
easyRasch2 0.4.0
RMiteminfit()gains optionalcutoffparameter: Accepts the return value ofRMinfitcutoff()(or its$item_cutoffsdata.frame directly). When provided, per-item cutoff boundaries (Infit_low,Infit_high) and a logicalFlaggedcolumn are added to both"dataframe"and"kable"output. The kable caption includes the number of simulation iterations when available.New
RMinfitcutoff(): Simulation-based (parametric bootstrap) cutoff determination for [RMiteminfit()]. Supports both dichotomous and polytomous data. Optional parallel processing viamirai(falls back to sequential if not installed). Returns per-item 2.5th and 97.5th percentiles of simulated infit and outfit MSQ distributions ($item_cutoffs), together with the full iteration-level results ($results). Requires theiarmpackage (Suggests).
easyRasch2 0.3.0
New
RMiteminfit(): Computes conditional infit MSQ statistics for each item viaiarm::out_infit(), enriched with item locations relative to the sample mean person location. Supports both dichotomous (Rasch model viaeRm::RM()) and polytomous (Partial Credit Model viaeRm::PCM()) data. Requires theiarmpackage (Suggests). Output options:"kable"(default, plain-textknitr::kable()) or"dataframe". Optionalsort = "infit"sorts by infit MSQ descending. Only complete cases are used for conditional fit calculation.New
RMitemrestscore(): Computes observed and model-expected item-restscore correlations viaiarm::item_restscore(), enriched with absolute differences between observed and expected values, item average locations, and item locations relative to the sample mean person location. Supports both dichotomous (Rasch model viaeRm::RM()) and polytomous (Partial Credit Model viaeRm::PCM()) data. Requires theiarmpackage (Suggests). Output options:"kable"(default, plain-textknitr::kable()) or"dataframe". Optionalsort = "diff"sorts by absolute difference descending.
easyRasch2 0.2.0
-
RMlocdepQ3():cutoffis now optional (defaultNULL). When omitted, the raw Q3 residual correlation matrix is returned without any dynamic cut-off applied. When provided, the dynamic cut-off (mean Q3 + cutoff) is shown in the kable caption as before. Supersedes the requirement to always supply a cutoff value (PRs #2 and #3). -
New
RMlocdepQ3cutoff(): Simulation-based (parametric bootstrap) cutoff determination forRMlocdepQ3(). Supports both dichotomous and polytomous data. Optional parallel processing viamirai(falls back to sequential if not installed). The$suggested_cutoffis the 99th percentile of the simulated Q3 max–mean distribution. -
New internal helpers in
R/utils-simulation.R:sim_poly_item(),sim_partial_score(), andextract_item_thresholds(). -
Dependencies:
eRm,psychotools (>= 0.7-3),parallel, andutilsmoved/added to Imports.miraiadded to Suggests.
easyRasch2 0.1.0
- Initial package structure.
- Added
RMlocdepQ3()for Yen’s Q3 residual correlation analysis of local dependence.