--- title: "mfrmr Reporting and APA" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{mfrmr Reporting and APA} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} is_cran_check <- !isTRUE(as.logical(Sys.getenv("NOT_CRAN", "false"))) knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 5, eval = !is_cran_check ) ``` This vignette shows the package-native route from a fitted many-facet Rasch model to manuscript-oriented prose, tables, figure notes, and revision checks. The reporting stack in `mfrmr` is organized around four objects: - `fit`: the fitted model from `fit_mfrm()` - `diag`: diagnostics from `diagnose_mfrm()` - `chk`: the revision guide from `reporting_checklist()` - `apa`: structured manuscript outputs from `build_apa_outputs()` For a broader workflow view, see `vignette("mfrmr-workflow", package = "mfrmr")`. For a plot-first route, see `vignette("mfrmr-visual-diagnostics", package = "mfrmr")`. ## Minimal setup ```{r setup} library(mfrmr) toy <- load_mfrmr_data("example_operational") # The vignette uses compact quadrature so optional local execution stays fast. # For final manuscript reporting, refit with the package default or a higher # quadrature setting and record that setting in the analysis log. fit <- fit_mfrm( toy, person = "Person", facets = c("Rater", "Criterion"), score = "Score", method = "MML", model = "RSM", quad_points = 7 ) diag <- diagnose_mfrm(fit, residual_pca = "none") ``` ## 1. Start with the revision guide Use `reporting_checklist()` first when the question is "what is still missing?" rather than "how do I phrase the results?" ```{r checklist} chk <- reporting_checklist(fit, diagnostics = diag) head( chk$checklist[, c("Section", "Item", "DraftReady", "Priority", "NextAction")], 10 ) ``` Interpretation: - `DraftReady` flags whether the current objects already support a section for drafting with the package's documented caveats. - `Priority` shows what to resolve first. - `NextAction` is the shortest package-native instruction for closing the gap. ## 2. Check the precision layer before strong claims `mfrmr` intentionally distinguishes `model_based`, `hybrid`, and `exploratory` precision tiers. ```{r precision} prec <- precision_review_report(fit, diagnostics = diag) prec$profile prec$checks prec$fit_separation_basis ``` Interpretation: - Use stronger inferential phrasing only when the reported tier is `model_based`. - Treat `hybrid` and `exploratory` outputs more conservatively, especially for SE-, CI-, and reliability-heavy prose. - Read `fit_separation_basis` as a boundary table: MnSq fit, ZSTD standardization, Rasch/FACETS-style separation, and package QC thresholds have different source bases and should not be collapsed into a single validation pass/fail claim. ## 3. Build structured manuscript outputs `build_apa_outputs()` is the writing engine. It returns report text plus a section map, note map, and caption map that all share the same output contract. ```{r apa} apa <- build_apa_outputs( fit, diagnostics = diag, context = list( assessment = "Writing assessment", setting = "Local scoring study", scale_desc = "0-4 rubric scale", rater_facet = "Rater" ) ) cat(apa$report_text) ``` ```{r section-map} apa$section_map[, c("SectionId", "Heading", "Available")] ``` Interpretation: - `report_text` is the compact narrative output. - `section_map` is the machine-readable map of what text blocks are available. - The same contract also feeds captions and notes, which reduces wording drift. ## Publication-readiness boundary The APA route is strongest when it is used as a structured drafting and review workflow. It is not a one-click manuscript generator. Before moving text into a journal article, inspect the following objects together: ```{r publication-boundary} res <- mfrm_results(fit, include = "publication") report <- mfrm_report(res, style = "apa") report$first_screen report$claim_readiness report$report_gaps head(report$template_index[, c( "Area", "Topic", "BoundaryType", "ClaimStrength", "RecommendedUse" )]) ``` For a high-stakes manuscript, treat `build_apa_outputs()` and `mfrm_report(style = "apa")` as a conservative drafting template. Stronger journal claims still require a defensible study design, cited measurement rationale, adequate precision evidence, linked or balanced design evidence where relevant, and substantive interpretation written in the language of the target journal. Do not report `DraftReady`, `ReadyForAPA`, or `ClaimStrength` as if they were formal acceptance decisions; use them to decide what wording is currently safe and which caveats must remain visible. When the target is a local HTML/CSV/replay bundle rather than an interactive review object, use `export_mfrm_bundle()` directly from the fitted object. The result is a potentially identifying analysis archive, not a deidentified sharing package: ```{r fit-to-html-bundle, eval=FALSE} bundle <- export_mfrm_bundle( fit, diagnostics = diag, output_dir = "mfrmr-report-bundle", prefix = "analysis01", include = c( "core_tables", "checklist", "dashboard", "apa", "summary_tables", "manifest", "script", "html" ), overwrite = TRUE, acknowledge_sensitive = TRUE ) bundle$written_files[bundle$written_files$Format == "html", ] ``` ## 4. Build tables from the same contract Use `apa_table()` when you want reproducible handoff tables without rebuilding captions or notes by hand. ```{r apa-tables} tbl_summary <- apa_table(fit, which = "summary") tbl_reliability <- apa_table(fit, which = "reliability", diagnostics = diag) tbl_summary$caption tbl_reliability$note ``` The actual table data are stored in `tbl_summary$table` and `tbl_reliability$table`. ## 5. Add figure-ready visual data For reporting workflows, `build_visual_summaries()` is the bridge between statistical results and figure-ready plot data. ```{r visuals} vis <- build_visual_summaries( fit, diagnostics = diag, threshold_profile = "standard" ) names(vis) names(vis$warning_map) ``` ## 6. Reporting route when interaction screening matters When bias or local interaction screens matter, keep the wording conservative. The package treats these outputs as screening-oriented unless the current precision and design evidence justify stronger claims. ```{r bias-screen} bias_df <- load_mfrmr_data("example_bias") fit_bias <- fit_mfrm( bias_df, person = "Person", facets = c("Rater", "Criterion"), score = "Score", method = "MML", model = "RSM", quad_points = 7 ) diag_bias <- diagnose_mfrm(fit_bias, residual_pca = "none") bias <- estimate_bias(fit_bias, diag_bias, facet_a = "Rater", facet_b = "Criterion") apa_bias <- build_apa_outputs(fit_bias, diagnostics = diag_bias, bias_results = bias) apa_bias$section_map[, c("SectionId", "Available", "Heading")] ``` ## 7. Keep model comparison as a reporting review When candidate models are fitted, separate same-data comparison from the scoring interpretation. `compare_mfrm()` provides the fit-statistic table; `build_model_choice_review()` attaches model roles, downstream route boundaries, and cautious wording. Convert the review to a summary-table bundle when the comparison needs to appear in an appendix or exported report. ```{r model-choice-route, eval=FALSE} cmp <- compare_mfrm(RSM = fit_rsm, PCM = fit_pcm, GPCM = fit_gpcm) review <- build_model_choice_review( RSM = fit_rsm, PCM = fit_pcm, GPCM = fit_gpcm, run_weighting_review = TRUE ) model_choice_tables <- build_summary_table_bundle( review, appendix_preset = "recommended" ) cmp[, c("Model", "LogLik", "AIC", "BIC", "ICComparable")] model_choice_tables$table_index ``` For bounded `GPCM`, report the fit as a slope-aware sensitivity model unless the score interpretation explicitly justifies discrimination-based reweighting. Do not use AIC/BIC alone as an operational-scoring decision. ## 8. Report the latent-regression population model Latent-regression fits provide reportable results through the fit summary: `population_overview`, `population_coefficients`, `population_coding`, and `caveats`. Coefficients are conditional-normal population-model parameters, not post-hoc regressions on EAP or MLE scores. ```{r latent-regression-reporting, eval=FALSE} s_pop <- summary(fit_pop) s_pop$population_overview s_pop$population_coefficients s_pop$population_coding s_pop$caveats ``` Keep latent-regression claims within the documented one-dimensional `MML` `RSM` / `PCM` route. Report the population formula, coding/contrast handling, population policy, and any omitted-person or omitted-row counts; do not imply multidimensional latent regression, Wald-test inference, or posterior predictive checking from these tables alone. ## Recommended sequence For a compact manuscript-oriented route: 1. `fit_mfrm()` 2. `diagnose_mfrm()` 3. `precision_review_report()` 4. `reporting_checklist()` 5. `build_apa_outputs()` 6. `apa_table()` 7. `build_visual_summaries()` 8. `compare_mfrm()` -> `build_model_choice_review()` when candidate-model comparisons are part of the manuscript ## Related help - `help("mfrmr_reporting_and_apa", package = "mfrmr")` - `help("mfrmr_reports_and_tables", package = "mfrmr")` - `help("reporting_checklist", package = "mfrmr")` - `help("build_apa_outputs", package = "mfrmr")`