This vignette covers the package-native route for:
For a broader workflow guide, see
vignette("mfrmr-workflow", package = "mfrmr"). For the
shorter help-page map, see
help("mfrmr_linking_and_dff", package = "mfrmr").
library(mfrmr)
bias_df <- load_mfrmr_data("example_bias")
# The vignette uses compact quadrature so optional local execution stays fast.
# For final DFF or linking evidence, refit with the package default or a higher
# quadrature setting and record that setting in the analysis log.
fit <- fit_mfrm(
bias_df,
person = "Person",
facets = c("Rater", "Criterion"),
score = "Score",
method = "MML",
model = "RSM",
quad_points = 7
)
diag <- diagnose_mfrm(fit, residual_pca = "none")Use subset_connectivity_report() before interpreting
subgroup or cross-form contrasts.
sc <- subset_connectivity_report(fit, diagnostics = diag)
sc$summary[, c("Subset", "Observations", "ObservationPercent")]
plot(sc, type = "design_matrix", preset = "publication")Interpretation:
make_anchor_table() is the shortest route when you need
reusable anchor elements from an existing calibration.
Use review_mfrm_anchors() when you want a stricter
review of anchor quality.
Residual DFF is the fast screening route. It is useful for triage, but it is not automatically a logit-scale inferential contrast.
dff_resid <- analyze_dff(
fit,
diag,
facet = "Criterion",
group = "Group",
data = bias_df,
method = "residual"
)
dff_resid$summary
head(
dff_resid$dif_table[, c("Level", "Group1", "Group2", "Classification", "ClassificationSystem")],
8
)
plot_dif_heatmap(dff_resid)Interpretation:
residual output as screening evidence.ClassificationSystem to see how the current
residual screen was labeled.ScaleLinkStatus and
ContrastComparable for refit-based contrasts.The refit route can support logit-scale contrasts only when subgroup linking is adequate and the precision layer supports it.
If the level-wise screen points to a specific facet, follow up with the interaction table and narrative report.
Residual bias and DFF tools screen for unusual cells after fitting
the additive model. When the interaction hypothesis is specified in
advance, use facet_interactions to estimate the named
two-way non-person facet interaction in the model likelihood.
fit_add <- fit_mfrm(
bias_df,
person = "Person",
facets = c("Rater", "Criterion"),
score = "Score",
method = "MML",
model = "RSM",
quad_points = 7
)
fit_interaction <- fit_mfrm(
bias_df,
person = "Person",
facets = c("Rater", "Criterion"),
score = "Score",
method = "MML",
model = "RSM",
facet_interactions = "Rater:Criterion",
quad_points = 7
)
interaction_effect_table(fit_interaction)
compare_mfrm(Additive = fit_add, Interaction = fit_interaction, nested = TRUE)Interpretation:
estimate_bias().When you work across administrations, the route usually moves from anchor export to anchored fitting and then to drift review.
d1 <- load_mfrmr_data("study1")
d2 <- load_mfrmr_data("study2")
fit1 <- fit_mfrm(d1, "Person", c("Rater", "Criterion"), "Score",
method = "JML", maxit = 25)
fit2 <- fit_mfrm(d2, "Person", c("Rater", "Criterion"), "Score",
method = "JML", maxit = 25)
anchored <- anchor_to_baseline(
d2,
fit1,
person = "Person",
facets = c("Rater", "Criterion"),
score = "Score"
)
drift <- detect_anchor_drift(list(Wave1 = fit1, Wave2 = fit2))
plot_anchor_drift(drift, type = "drift", preset = "publication")For a compact linking route:
fit_mfrm()diagnose_mfrm()subset_connectivity_report()make_anchor_table() or
review_mfrm_anchors()analyze_dff()dif_report() and plot_dif_heatmap()interaction_effect_table() after a confirmatory
facet_interactions fitanchor_to_baseline() /
detect_anchor_drift() when working across waves