Quick guide to choosing the right base-R diagnostic plot in mfrmr.
Use this page when you know the analysis question but do not yet know
which plotting helper or plot() method to call.
Start with the question
"Do persons and facet levels overlap on the same logit scale?" Use
plot(fit, type = "wright")orplot_wright_unified()."Where do score categories transition across theta?" Use
plot(fit, type = "pathway")andplot(fit, type = "ccc")."Is the design linked well enough across subsets or administrations?" Use
plot(subset_connectivity_report(...), type = "design_matrix")andplot_anchor_drift()."Which responses or levels look locally problematic?" Use
plot_unexpected()andplot_displacement()."Do raters agree and do facets separate meaningfully?" Use
plot_interrater_agreement()andplot_facets_chisq()."Is there notable residual structure after the main Rasch dimension?" Use
plot_residual_pca()."Which interaction cells or facet levels drive bias screening results?" Use
plot_bias_interaction()."I need one compact triage screen first." Use
plot_qc_dashboard().
Recommended visual route
Start with
plot_qc_dashboard()for one-page triage.Move to
plot_unexpected(),plot_displacement(), andplot_interrater_agreement()for flagged local issues.Use
plot(fit, type = "wright"),plot(fit, type = "pathway"), andplot_residual_pca()for structural interpretation.Use
plot(..., draw = FALSE)when you want reusable plotting payloads instead of immediate graphics.Use
preset = "publication"when you want the package's cleaner manuscript-oriented styling.
Which plot answers which question
plot(fit, type = "wright")Shared logit map of persons, facet levels, and step thresholds. Best for targeting and spread.
plot(fit, type = "pathway")Expected score by theta, with dominant-category strips. Best for scale progression.
plot(fit, type = "ccc")Category probability curves. Best for checking whether categories peak in sequence.
plot_unexpected()Observation-level surprises. Best for case review and local misfit triage.
plot_displacement()Level-wise anchor movement. Best for anchor robustness and residual calibration tension.
plot_interrater_agreement()Exact agreement, expected agreement, pairwise correlation, and agreement gaps. Best for rater consistency.
plot_facets_chisq()Facet variability and chi-square summaries. Best for checking whether a facet contributes meaningful spread.
plot_residual_pca()Residual structure after the Rasch dimension is removed. Best for exploratory residual-structure review, not as a standalone unidimensionality test.
plot_bias_interaction()Interaction-bias screening views for cells and facet profiles. Best for systematic departure from the additive main-effects model.
plot_anchor_drift()Anchor drift and screened linking-chain visuals. Best for multi-form or multi-wave linking review after checking retained common-element support.
Practical interpretation rules
Wright map: look for gaps between person density and facet/step locations; large gaps indicate weaker targeting.
Pathway / CCC: look for monotone progression and clear category dominance bands; flat or overlapping curves suggest weak category separation.
Unexpected / displacement: use as screening tools, not final evidence by themselves.
Inter-rater agreement and facet variability address different questions: agreement concerns scoring consistency, whereas variability concerns whether facet elements are statistically distinguishable.
Residual PCA and bias plots should be interpreted as follow-up layers after the main fit screen, not as first-pass diagnostics.
Typical workflow
Quick screening:
fit_mfrm()->diagnose_mfrm()->plot_qc_dashboard().Scale and targeting review:
plot(fit, type = "wright")->plot(fit, type = "pathway")->plot(fit, type = "ccc").Linking review:
subset_connectivity_report()->plot(..., type = "design_matrix")->plot_anchor_drift().Interaction review:
estimate_bias()->plot_bias_interaction()->reporting_checklist().
Companion vignette
For a longer, plot-first walkthrough, run
vignette("mfrmr-visual-diagnostics", package = "mfrmr").
Examples
toy <- load_mfrmr_data("example_core")
fit <- fit_mfrm(
toy,
person = "Person",
facets = c("Rater", "Criterion"),
score = "Score",
method = "JML",
maxit = 25
)
diag <- diagnose_mfrm(fit, residual_pca = "none")
qc <- plot_qc_dashboard(fit, diagnostics = diag, draw = FALSE, preset = "publication")
names(qc$data)
#> [1] "title" "subtitle" "legend"
#> [4] "reference_lines" "preset" "threshold_profile"
#> [7] "thresholds" "category_stats" "fit"
#> [10] "zstd" "unexpected" "fair_average"
#> [13] "displacement" "interrater" "facets_chisq"
#> [16] "reliability" "plot_name"
wright <- plot(fit, type = "wright", draw = FALSE, preset = "publication")
wright$data$preset
#> [1] "publication"
pca <- analyze_residual_pca(diag, mode = "overall")
scree <- plot_residual_pca(pca, plot_type = "scree", draw = FALSE, preset = "publication")
scree$data$preset
#> [1] "publication"