Changelog
Source:NEWS.md
easyRasch2 1.1.0
CRAN release: 2026-07-14
Bug fixes
Respondents with no responses at all (all-
NArows) no longer crash the functions that fit a CML model on data retaining missing values.psychotools::pcmodel()errors on all-NA rows with an opaque “invalid argument type” (andpsychotools::raschmodel()segfaults), so such rows are now dropped up front — with the standard “N respondent(s) with no responses dropped.” message — inRMlocdepQ3Cutoff(),RMitemInfit(),RMitemRestscore(),RMitemRestscoreBoot(),RMreliability(), and the observed-data overlays ofRMlocdepQ3Plot()andRMitemInfitPlot().RMdifLR()now drops such rows too (jointly withdif_var) instead of failing witheRm::LRtest()’s error. Functions that already used complete cases or called.drop_empty_respondents()are unaffected.RMlocdepQ3Cutoff()’ssample_nnow counts the respondents actually used (all-NA rows excluded, incomplete responses still retained) andsample_n_totalthe raw input rows, matchingRMlocdepQ3()and the other*Cutoff()objects; previously the two were documented as always equal. Captions in the affected functions keep reporting the raw total in then = X of Y respondentsform.RMdimMartinLof()/RMdimMartinLofResiduals(): corrected the category weights in the Monte Carlo null sampler and the expected-count computation (present in 1.0.0). The item parameters were passed topsychotools::elementary_symmetric_functions()with the wrong sign convention (it weights categories byexp(-par)), so the gamma functions used sign-inverted weights while the sampler’s numerator used the correct ones. Consequences of the bug: simulated null datasets did not follow the fitted model, the Monte Carlo null distribution (and hence the p-value) depended systematically on the column order of the data, and the residual table’s expected counts were wrong. The fixed sampler reproduces the exact conditional pattern distribution (verified against brute-force enumeration), and expected counts match enumeration exactly. Martin-Löf p-values and residuals change relative to 1.0.0 — typically the corrected null distribution sits lower, so rejections become somewhat clearer. In addition, items are now processed in a fixed (alphabetical) internal order, so the same seed reproduces the same p-value regardless of how the data’s columns are arranged.RMreliability()is now fully reproducible with the sameseed: the RMU estimate previously varied slightly between identical calls becausemirt’s Metropolis-Hastings plausible-value sampler leaves the R random-number stream in a nondeterministic state (the draws themselves are reproducible), which perturbed the RMU split-half column assignments downstream. The function now re-seeds before the RMU iterations.
Changes
RMdimMartinLof()now returnsp_value_floor(1 / (actual_iterations + 1)), the smallest attainable Monte Carlo p-value; the documentation explains that a p-value equal to the floor means no simulated statistic reached the observed one and should be read as “p < floor” (increaseiterationsfor finer resolution). The vignette’s Martin-Löf example now sets a seed and discusses this.RMdifTree()gainsoutput = "list", returning both the tidy effect-size table ($table) and the augmented tree object ($tree) from a single fit (used by the jamovi module).RMpersonFit()gainsoutput = "list", returning both the per-person data.frame ($fit) and the named list of person-fit maps ($plots) from a single computation — avoiding a second resampling run when both views are needed (used by the jamovi module).output = "dataframe"now returns unrounded values across the package; rounding is a presentation concern and now happens only when rendering the kable (whose displayed precision is unchanged). Affected functions:RMitemInfit(),RMitemInfitMI(),RMitemRestscore(),RMitemRestscoreBoot(),RMlocdepQ3()(the$pairstable),RMdifGamma(),RMlocdepGamma(),RMdimResidualPCA(),RMdimCFA()(both$fitand$loadings),RMreliability(),RMdifLR(),RMdifTree()(including the stability summary attribute),RMdimMartinLof()(thewle_correlationelement),RMdimMartinLofResiduals(),RMpersonParameters()(dataframe and file/CSV output),RMpersonFit(), andRMitemParameters()(dataframe and file/CSV output; previously rounded to 4 decimals, which also made the wide format’s meanlocationdiffer from the mean of its rounded threshold columns in the 5th decimal).RMscoreSE()already followed this convention.Consequently,
Flaggedlabels and sorting are now always computed on the exact (unrounded) values. Items or pairs sitting exactly on a rounded boundary could in principle change flag relative to earlier releases; displayed tables are otherwise identical.Deliberately unchanged: the infit simulation workers still round the per-iteration statistics to 3 decimals before the cutoff computation, so simulation-based expected ranges reproduce earlier releases exactly.
Minor layout changes for
RMtargeting()regarding number of bins if not set by user. Earlier it was sum score + 1, now it is sum score divided by 2.RMitemICCPlot()gets slightly larger points and thicker error bars.
Improvements
-
RMitemICCPlot()gains two grouping methods for the observed means, alongside the existing quantile grouping (method = "cut"is now a legacy alias formethod = "quantile"):method = "width"for equal-width intervals on the total-score scale, andmethod = "manual"with the newscore_breaksargument – the total scores at which a new group starts (the concept of RASCHplot’slower.groups, without the leading zero). The documentation of the grouping rules and of theerror_band(the model-implied interval for the observed mean per total score) was substantially expanded. -
RMplotTile()gains atext_sizeargument for the cell labels (default 4, matchingRMitemCatProb()), and cells with zero responses are now visually distinct: they are taken off the colour scale and shown unfilled with a light grey outline (zero_fill = "white", set toNULLfor the previous behaviour), so the absence of data reads as absence rather than as the darkest end of the fill scale, wheren = 0was nearly indistinguishable fromn = 1. The caption notes the convention when empty cells are present. -
RMlocdepGamma()’soutput = "dataframe"tables now include these,lower, andupper(95% Wald CI) columns for each pair, matchingRMdifGamma(); the formatted kable output is unchanged.
easyRasch2 1.0.0
CRAN release: 2026-07-05
A large consolidation release. The headline change is that the whole package now runs on a single estimation engine — conditional maximum likelihood (CML) item parameters via psychotools and Warm’s weighted-likelihood (WLE) person locations — replacing the previous mix of eRm (MLE) and mirt (MML/EAP). On top of that: new CFA loading diagnostics, three new functions for person+item parameters and person fit, bootstrap p-values with multiplicity correction, and a round of naming/output consistency fixes. After this release eRm is used only by RMdifLR() (Andersen’s LR test) and mirt only for the RMU plausible values (RMitemInfitPlot()’s observed-fit overlay moved from an eRm fit to psychotools::pcmodel(), matching RMitemInfitCutoff(); values agree to ~1e-6). Accordingly, eRm has moved from Imports to Suggests: RMdifLR() errors with an install hint when it is absent.
Many items below shift reported numbers slightly: the underlying statistics are unchanged, only the estimation engine (WLE locations are finite at extreme scores, so extreme-score cases are now retained rather than dropped).
Unified CML/WLE estimation engine
-
Observed item statistics —
RMitemRestscore(),RMitemInfit(),RMitemCatProb(),RMitemHierarchy(),RMtargeting()— moved to CML (psychotools) + WLE. The conditionaliarmstatistics are engine-invariant; only minor things move on the common grand-mean-zero scale (Relative_locationvia the WLE person mean; threshold SEs ~few %; polytomous ICC curve position; the targeting person distribution).RMdifLR()deliberately stays oneRm::LRtest(). -
Parameter / score functions — the shared
.rasch_fit_cml()behindRMitemParameters(),RMpersonParameters(),RMscoreSE()now fits by CML viapsychotools. Locations, person estimates and score SEs are unchanged (matcheRmto ~5e-5); onlyRMitemParameters()’s threshold SEs shift slightly (psychotoolsvcovvs the eRm delta method, ~few %). -
RMscoreSE()— the WLE method now reports the information-based SE1/sqrt(I(theta))(matchingRMpersonParameters(),catR,TAM); point estimates unchanged, SEs differ (larger) at the score extremes, and the WLE solver/centring is now shared withRMpersonParameters(). -
RMreliability()— empirical reliability is replaced by a native marginal reliability (Green 1984; the “Empirical” row is now “Marginal”), Whilemirt::marginal_rxx()usesN(0,1), this integrates over the estimated latent variance, so it is correct on the Rasch logit scale; and the PSI is now the WLE-based separation reliability (1 - mean(SEM^2)/Var(theta), excluding extreme scorers), replacingeRm::SepRel()+mirt. The bootstrap is now fully native (nomirtper resample). PSI can differ noticeably for scales with many extreme scorers; alpha and RMU are unchanged. -
Simulation-based tools now both generate and refit on the CML/WLE engine:
RMlocdepQ3()/RMlocdepQ3Cutoff(),RMitemInfitCutoff(),RMitemInfitMI()/RMitemInfitCutoffMI(),RMitemRestscoreBoot(),RMdimResidualPCA()/RMdimResidualPCACutoff(),RMdimCFACutoff(),RMdimMartinLof(),RMdifGammaCutoff(),RMlocdepGammaCutoff(). The eRm-based internalextract_item_thresholds()helper is removed. Conditional / scale-invariant statistics (infit/outfit, item-restscore classification, the Martin-Löf Monte-Carlo p-value, pooled MI infit MSQ/SE) are unchanged; residual-based and simulated quantities shift slightly — Q3 values/cut-offs/flags (the statistic is unchanged; observed-vs-old-MML correlation is typically >0.95), PCA eigenvalues / variance partition / cut-off, and the gamma cut-offs. -
RMlocdepQ3()/RMlocdepQ3Cutoff()keep the previous engine available viaestimator = "MML"(default"CML"); the estimator is stored in the cutoff object and reused byRMlocdepQ3()/RMlocdepQ3Plot()(a mismatch is overridden with a warning).RMitemInfitMI()’s pooled-SE caveat (Müller 2020) is now documented.
New functions
-
RMpersonFit()— per-respondent conditional infit/outfit MSQ and the standardized log-likelihoodlz, computed per response pattern (handles partial missingness, no biased person estimate in the residual). Significance is by Monte-Carlo resampling under the fitted model, not the unreliable asymptotic null (Sinharay 2016; Müller 2020). Output as table, data.frame, or a named list of person-fit maps;zstd = TRUEadds the Wilson-Hilferty transform (comparability only, not for inference);flag = "underfit"restricts flagging to the validity-relevant direction. -
RMitemParameters()— item difficulty (dichotomous) or Andrich-threshold (polytomous) parameters in long/wide format, with optional SEs and Wald CIs. -
RMpersonParameters()— per-respondent theta and SEM computed on each response pattern (handles partial missingness), via Warm’s WLE (default) or EAP under a normal prior (SD estimated by marginal ML unless fixed). - Both
RMitemParameters()andRMpersonParameters()supportoutput = "file"to write the result table to a CSV atfilename(the data.frame is also returned invisibly).
CFA dimensionality: loadings + three-function split
CFA now also reports per-item standardized factor loadings (observed vs a simulated expected range), restructured to match the other simulation tools:
-
RMdimCFACutoff()is now simulate-only — returns the simulation object (null distributions + cutoffs for fit indices and loadings); it no longer computes the observed fit, andoutput = "kable"errors with a pointer toRMdimCFA(). (Breaking.) -
RMdimCFA()(new) takesdata+ a required cutoff object and returns a list of two tables,$fit(CFI/RMSEA/SRMR) and$loadings(observed loading vs the two-sided expected range), as kables (default) or data.frames. -
RMdimCFAPlot(cutoff_res, data)now returns a list of two ggplots ($loadings, in theRMitemInfitCutoffPlot()style; and$fit, the faceted fit-index distributions) and requiresdata. (Breaking: previously a single ggplot.)
Bootstrap p-values and multiplicity correction
Six simulation-based diagnostics gain optional bootstrap p-values computed against their simulated null distributions (p_value = TRUE; the default FALSE leaves existing output unchanged). Shared mechanics: each statistic is studentised by its bootstrap mean/SD; marginal Monte-Carlo p-values have floor 1/(B+1); correction offers Westfall-Young studentised-max step-down FWER (default), Benjamini-Hochberg or Benjamini-Yekutieli FDR, or "none"; Flagged then reflects padj < alpha while the simulated effect-size bands stay in the tables. The full *Cutoff() object is required, and >= 1000 cutoff iterations are recommended (warning below that). (Ferreira 2024; Westfall & Young 1993.) Per function:
-
RMdifGamma(): two-sided per item. The asymptotic BH-adjusted p-value and star columns fromiarmare dropped in this mode (one p-value family per table);p_gamma/padj_gammareplace them. -
RMdimCFA(): one-sided in the unfavourable direction for CFI / RMSEA / SRMR, two-sided for the per-item loadings, corrected as two separate families. -
RMdimResidualPCA(): a single one-sided test of the first-contrast eigenvalue, so no multiplicity correction is involved. -
RMitemInfit(): two-sided per item. -
RMlocdepGamma(): one-sided per pair for excess positive LD (matchingRMlocdepQ3()), computed once per pair in the canonical direction (rest score = total − Item2, the simulated direction) and repeated in the direction-2 table; correction runs over the full pair family before anyn_pairsdisplay filter; theiarmBH columns are dropped as inRMdifGamma(). -
RMlocdepQ3(): one-sided per pair, folded into the new per-pair$pairstable returned alongside$matrix(observed Q3 vs simulated band, directional flag, sorted by departure from the per-pair median, optionaln_pairscap).
RMitemInfit(), RMlocdepQ3(), and the newly extended functions share a “Multiple comparisons” help section.
Output and argument consistency
- All table and plot captions now report the estimation sample size in a common form:
n = X of Y respondents (<policy>), whereof Yappears only when respondents were excluded and the policy note (complete cases/incomplete responses retained/missing values imputed) only when the input contained missing values — complete data reads simplyn = X respondents. Terminology is “respondents” throughout (previously a mix of “persons” / “complete cases”). Sample size is newly reported byRMitemParameters(),RMpersonParameters(),RMitemHierarchy(),RMitemCatProb(),RMscoreSE(),RMlocdepQ3(),RMdimResidualPCA(),RMpersonFit()’s kable, and the descriptive plots (RMplotBar(),RMplotStackedbar(),RMplotTile()); all other captions are reworded to the common form. The bootstrap-null plots (RMitemInfitPlot(),RMdifGammaPlot(),RMlocdepGammaPlot(),RMlocdepQ3Plot(),RMdimCFAPlot()) report the simulation sample the same way, suffixedper dataset; their*Cutoff()objects storesample_n_total/sample_has_na, with a graceful fallback for cutoff objects from older versions. Respondents with no responses (all-NA rows) are dropped with a one-time message rather than triggering a CML fitting error, andRMplotTile()likewise messages when rows withNAingroupare dropped (previously silent; item-levelNAs are retained in the descriptive plots). -
RMdifGammaCutoff()no longer prints aniarm::partgam_DIF()result table on every iteration in sequential (parallel = FALSE) runs; the silencing sink is now also restored safely on iteration failure (hardened inRMlocdepGammaCutoff()too). -
RMdifLR()captions now report the Andersen LR p-value as a plain number (exact to three decimals,p < 0.001below that) instead of theformat.pval()scientific notation (<1e-04), and the test statistic is shown as χ² instead ofchi^2. - Naming aligned across functions (no deprecation aliases):
RMdimResidualPCA()plot output is nowoutput = "ggplot"("loadings"kept as a backward-compatible alias);RMtargeting()output = "figure"→"patchwork"(matchingRMitemICCPlot());RMitemRestscore()p.adj→p_adj;RMitemInfitPlot()output→statistic. -
RMitemInfitCutoffPlot()renamed toRMitemInfitPlot(), matching the<base>Plotform of the other bootstrap-cutoff plot functions (RMdifGammaPlot(),RMlocdepGammaPlot(),RMlocdepQ3Plot(),RMdimCFAPlot()). Because the old name shipped in the 0.8.0 CRAN release, it is kept as a deprecated alias that warns and forwards (unlike the 0.8.0 renames, which dropped old names outright). Separately,RMdimCFAPlot()’s first argumentcutoff_reswas renamed tosimfitto match the other plot functions (no alias). -
RMdifLR()now defaults tooutput = "kable"(was"ggplot"), matching every other function that offers both akableand aggplotoutput (RMscoreSE(),RMdimMartinLof(),RMpersonFit(),RMpersonParameters(),RMdimResidualPCA()). Passoutput = "ggplot"for the previous default. - The
Flaggedcolumn now labels misfit direction ("overfit"/"underfit"/"") instead of logical TRUE/FALSE inRMitemInfit()/RMitemInfitMI()(column type changes from logical to character).RMitemRestscore()gains aFlaggedcolumn and drops the redundant significance-star andLocationcolumns (trimmed headers + explanatory caption). Note the value direction differs: a high infit is underfit, a high restscore correlation is overfit.
Other changes and fixes
-
RMitemInfitMI()andRMitemInfitCutoffMI()now acceptmidsobjects whose items were imputed as ordered factors (as required by mice’spolrmethod): the completed data are coerced back to numeric responses internally, rather than erroring on the factor columns. -
RMitemInfitCutoff()andRMlocdepQ3Cutoff()gain an experimentaldgpargument —"resample"(default; resample WLE locations and simulate, a marginal null) vs"conditional"(simulate each pattern from the exact Rasch conditional given the observed total score, a matched conditional null) — stored in the result. Seedev/q3_dgp_comparison.R/dev/infit_dgp_comparison.R. - Q3 plot and table outputs now share a
$matrix/$pairsstructure.RMlocdepQ3Plot()returns a list of two plots:$pairs(the per-pair simulated-vs-observed dot-interval, previously the single return value) and$matrix(a lower-triangle diverging-RdYlBu Q3 tile heatmap with above-cutoff pairs outlined, adapted fromRASCHplot::ggQ3star(); needsdata, elseNULL). -
RMitemICCPlot()is reimplemented on the CML engine, replacing theiarm::ICCplot()wrapper. The conditional item curve and its variance now come frompsychotoolsCML thresholds + the exact conditional distribution given the total score. It draws confidence intervals on the observed class-interval means (ci, default on) and an optional model band (error_band); in DIF mode it shows per-group CIs and annotates each panel with the partial-gamma DIF magnitude (iarm::partgam_DIF, as inRMdifGamma()), with the full table attached asattr(., "dif_gamma"). New argumentsci,error_band,conf_level,min_n(per-cell floor, 8),items;method/class_intervals/dif_var/outputare unchanged. The conditional-ICC approach follows Buchardt, Christensen & Jensen (2023) and theirRASCHplotpackage. -
RMlocdepGamma(): corrected the$direction2caption /@returnwording to “total - Item2” (with a note that direction 2 lists pairs in reverse order); computations unchanged (labelling fix). -
RMdifTree(): fixed a “variable lengths differ” error when a single covariate was passed by index or expression (e.g.covariates = phq9[, 10]). The derived non-syntactic column name is now matched as a literal column rather than re-evaluated as an R expression against the original (pre-NA-drop) data. -
RMdifTree(stability = TRUE)no longer silences the console in front-ends (e.g. RStudio) that redirect the message stream. The internal stderr capture used to muffle resample-fit noise reset the message sink to the default, clobbering the front-end’s sink; it now only redirects when no foreign message sink is active. -
RMitemRestscore(p_adj = "none")now returns the unadjusted p-values instead ofNAwith a “NAs introduced by coercion” warning. With no adjustmentiarm::item_restscore()omits the adjusted-p column, so the p-value is now selected by name rather than by a fixed column position (which had picked up the significance-stars column). The table header reads “p-value” in this case.
easyRasch2 0.8.0
CRAN release: 2026-06-08
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.