Skip to contents

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

  1. Start with plot_qc_dashboard() for one-page triage.

  2. Move to plot_unexpected(), plot_displacement(), and plot_interrater_agreement() for flagged local issues.

  3. Use plot(fit, type = "wright"), plot(fit, type = "pathway"), and plot_residual_pca() for structural interpretation.

  4. Use plot(..., draw = FALSE) when you want reusable plotting payloads instead of immediate graphics.

  5. 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

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"