Skip to content

Product manual (generated)

metaproc — Product Manual & Feature Inventory

Section titled “metaproc — Product Manual & Feature Inventory”

Last reviewed against source on 2026-05-31 (commit 82f983a). This is a factual inventory generated by reading every R module; companion document CODE_REFERENCE.md reproduces the exact R code behind every model, figure, and graphic for correctness auditing.


MetaProc runs frequentist meta-analysis from buttons, in the browser or on the desktop. It’s an R Shiny app (golem, bslib/Bootstrap 5) built around analysis templates you configure with controls instead of writing R. It’s made for researchers who run meta-analyses rather than for people who write R for a living.

The defining principle — “SAS-like” reproducible code capture

Section titled “The defining principle — “SAS-like” reproducible code capture”

Every model, table, figure, and graphic in the app is produced by building R code as text from the user’s choices, evaluating that exact text, and displaying the same text in a copyable code panel. What you see in the “R code” panel is — by construction — what actually ran. This is implemented uniformly: each template has a build_code() generator that returns a $display string (shown) and a $model string (evaluated); the two are assembled from the same pieces. See CODE_REFERENCE.md for the verbatim generators. The only outputs not governed by a user-visible code panel are the four appraisal/QC computations noted in §6.4 and the in-app diagnostic helper panels (heterogeneity panel, interpretation, caveats) which are rendered HTML summaries rather than re-runnable code.

PurposePackageWhere
Pairwise pooling, diagnostics, 3-levelmetafor (escalc, rma, rma.mh, rma.peto, rma.glmm, rma.mv)Templates, Pipeline
Network meta-analysisnetmeta (pairwise, netmeta)Network
Risk-of-bias figuresrobvisAppraise → Risk of bias
Effect-size conversionescTools → Converter
Report renderingrmarkdown (+ Quarto’s bundled pandoc)Report
Power, GRADE, SWiM, PRISMAbase R (hand-implemented formulas / base graphics)various

Note: the meta package is a locked dependency but pairwise pooling stays on metafor. Mantel-Haenszel / Peto are done via metafor’s rma.mh / rma.peto.


Motion (inter-tab transitions, plot-render shimmer loaders, value-box count-up) is gated behind prefers-reduced-motion. Icon-only controls and the ⓘ info-tips carry ARIA labels and are keyboard-operable (Enter/Space); slide-out panels are role="dialog"; focus shows a consistent :focus-visible ring. Body text meets WCAG-AA contrast on the Orbital theme. A navbar colourblind-safe switch swaps the plot palette — the static forest (study squares/CIs) and funnel contour shading, the ggiraph forest/funnel, the EDA plots (distributions / missingness / correlations / by-group / scatter), SWiM harvest, PRISMA flow, and leave-one-out — to the Okabe–Ito set. A navbar light/dark toggle recolours the entire UI (page canvas, sidebars, cards, panels, tables, chips, inputs) via a scoped [data-bs-theme="dark"] palette with a reduced-motion-safe crossfade, while plots keep a white publication “paper”; the UI font is a modern sans-serif with a robust offline fallback (never a browser serif). (A full axe/Lighthouse + screen-reader audit is still recommended.) A first-run guided tour (Import → EDA → Templates → Report; dismissible, re-openable from Help) and one-click worked examples ease new users in.

From app_ui.R (bslib::page_navbar, id main_nav). The clickable title returns to Home.

#ItemTypeModule
1Homepanelmod_home
2Datapanelmod_data_import
3Citationspanelmod_references
4Combinepanelmod_combine
5EDApanelmod_eda
6Planpanelmod_planner
7Templatespanelmod_templates
8Networkpanelmod_network
9Pipelinepanelmod_pipeline
10Plotspanelmod_plots
11Tablespanelmod_tables
12AppraisemenuRisk of bias (mod_rob), GRADE (mod_grade), SWiM narrative (mod_swim)
13ReportmenuReproducible report (mod_report), PRISMA 2020 flow (mod_prisma)
14ToolsmenuEffect-size converter (mod_esc), Power analysis (mod_power)
15Guidepanelmod_guide
16Manualpanelmod_manual (this document, in-app)
17Aboutpanelmod_landing
18Helplinkquick-help modal

Global chrome: a floating display cluster — zoom/scale (root-rem based, persists in localStorage) plus the light/dark mood and colourblind-safe palette toggles (both moved out of the navbar); a docked Workspace edge tab (grouped beside the Workflow tray) opening a slide-out that lists every loaded file/sheet with row×col counts (click to switch active dataset app-wide); slide-out glossary info-panel (102 plain-language term definitions opened by ⓘ icons — the most-used deepened with worked examples + cautions; ~76 placed across tabs); scroll-down cue; keyboard nav (Ctrl+←/→ cycle tabs, Backspace back / Shift+Backspace forward).

Theme (app_theme.R + inst/app/www/custom.css): Bootstrap 5 in the “Orbital” brand (teal → emerald; see C:\dev\metaproc-deploy\design\BRAND.md, the locked source of truth). Primary is an AA-safe deep teal #0A7A68; secondary a muted slate #5B6877; amber-deep #D97706 is the on-brand warning accent. The default warm-light mood uses a warm parchment canvas #F3F0E9 (deliberately never pure white) with soft teal/emerald radial tints and a dark blue-slate ink #19222C; the navbar light/dark toggle switches to deep dusk (canvas #060A11, dusk surfaces #141C25/#18222B) scoped under [data-bs-theme="dark"]. Two mood-paired accents (shared amber + a partner — violet in dusk, coral in light) carry active-state and informational highlights. Code/results panels stay a dark navy (#0D141B bg, teal-tinted #9FE8DC text) in both moods as a contrast anchor. Fonts Inter (UI + headings) + IBM Plex Mono (code). All decorative motion respects prefers-reduced-motion and the in-app Motion toggle. The plot palette (mp_plot_palette()) follows suit — teal #0E9F8E / deep teal #0A7A68 / amber #E08A00 — while the colourblind-safe Okabe–Ito palette is unchanged.


Exists:

  • Upload CSV / XLS / XLSX, or load a bundled example (example_pairwise.csv).
  • Multi-sheet Excel: every worksheet is read and added to the Workspace under the key "<file> — <sheet>"; switchable from the Workspace panel or the in-tab picker.
  • Automatic header detection for extraction-template workbooks (mp_detect_header): scans the first 12 rows, picks the row with the most filled cells as the header, and detects a following “instructions/type” row (Dropdown: / Integer / e.g. …) to drop. Manual override controls: “Header is on row”, “Drop rows after header”, “Auto-detect” — per sheet.
  • Junk-column drop (readxl ...N auto-names) and blank-row drop.
  • Value boxes: rows / columns / missing values.
  • DT preview rendered fresh per dataset (survives 0-row sheets and column-count changes); per-column filters when ≤40 columns; horizontal scroll for wide sheets.
  • Data-overview histogram/barplot of any column + its plot code.
  • Duplicate study-ID detection (unit-of-analysis warning).
  • Biological-range checks (see §7) and Consistency rules builder (see §7), both with reproducible code, both toggleable via qc.yml.
  • Import code panel (exact read.csv / read_excel(...) shown); Clear button; CSV download of the active dataset.
  • Edit / clean data card: an editable grid (cell edits coerce to the column type and write back to the active dataset), per-column retype (numeric/integer/character/factor)
    • rename, and row include/exclude (drops rows so EDA/Templates see fewer) — each emitting its exact R (code-capture). Degrades safely on 0-row and very wide sheets.

Does NOT exist: flip/transpose; paste-from-clipboard import; database/URL/API import; .sav/.dta/.RData import; encoding selection.

Exists: join columns across worksheets into one analysis table — base sheet + merge-in sheets; auto-detected, user-editable join keys (from a key vocabulary: study_id, intervention, arm, timepoint…); left / inner / full join; per-sheet key + column pickers; grain guard (warns when a repeated-measure column is not a key and offers “Add to key”); filter-before-join (closest / max / min / first-non-missing per group) to prevent fan-out; fan-out warning naming the inflating IDs; colliding columns prefixed by sheet name; generated merge() code; CSV download; “Use as active dataset”. A Combine mode toggle also offers stack / row-bind (concatenate studies: union of columns, missing filled NA, a .source origin column) with its generated code.

Does NOT exist: fuzzy/approximate key matching; many-to-many resolution beyond the filter rules.

Exists, six views, each with its plot R code: Summary (per-variable type/N/missing/unique/mean/SD/min/median/max DT); Distributions (histogram with bins slider + log10 toggle; numeric-looking text auto-coerced; barplot for categoricals); Missingness (per-column missing bar); Correlations (Pearson/Spearman heatmap with cell values); By group (boxplot by a categorical); Scatter (with optional lm trend line, plus an opt-in Interactive ggiraph hover view). All plots are resizable (drag a corner) and full-screen-expandable (⛶); in-plot fonts scale with the panel/zoom size and render in sans-serif.

Does NOT exist: outlier tests, normality tests, time-series/longitudinal EDA, pairs-plot matrix, interactive hover on views other than Scatter, export of EDA plots as files (EDA plots are on-screen only; only their code is copyable).

3.4 Citations tab (mod_references + fct_references)

Section titled “3.4 Citations tab (mod_references + fct_references)”

Exists: an offline reference / screening-export importer (navbar item 3, right after Data). Parses RIS, CSL-JSON, RevMan RM5 (XML), and Covidence / Rayyan CSV into one fixed bibliographic schema (ref_id, authors, year, title, journal, doi, source_format), previews them in a DataTable, and parks them in rv$references — from where an opt-in References block can be added to the Reproducible report; the parsed set also downloads as CSV. Everything is parsed in-process — nothing leaves the machine — behind size-cap, XML external-entity (XXE) and CSV formula-injection guards with a fixed-schema output. Deliberately kept separate from the analysis datasets (rv$datasets): references are bibliographic, not effect-size data, so they never pollute the Templates / Plots pickers.

Does NOT exist: PubMed / Zotero / Mendeley / EndNote-library import or any network lookup; de-duplication or screening decisions (it ingests an existing screening export — it is not itself a screening tool); CSL citation-style formatting of the references in the report.


4. Analysis templates (Templates tab, mod_templates + fct_templates)

Section titled “4. Analysis templates (Templates tab, mod_templates + fct_templates)”

Thirteen config-driven templates. Each declares column roles (auto-guessed from names, user-mappable) and options, then generates + runs metafor code. Templates 12–13 and the measures marked (Advanced) appear when Advanced mode is on (the Simple/Advanced switch in the floating toolbar — see Accessibility & UX).

#TemplateEffect measuresPooling / model specials
1Pairwise — binary (2×2)RR (default), OR, RDInverse-variance / Mantel-Haenszel / Peto; flip direction; zero-cell warning
2Pairwise — continuousSMD (default, Hedges’ g), MD, ROM; (Advanced) SMDH (unequal variances), VR & CVR (variability ratios)flip direction
3Single-group proportionGLMM random-intercept logistic (default, recommended), PLO logit+CC, Freeman-Tukey PFT (back-transform can mislead — warned), raw PRGLMM has an automatic logit fallback
4CorrelationFisher’s z (ZCOR, default); (Advanced) raw correlation (COR)
5Pre-computed (yi/SE)none / exp display transform
6Single-group incidence rateIRLN (default), IR
7Single-group meanMN (default), MNLN
8Three-level (rma.mv) (Advanced)none / expnested random effects; REML/ML only (no Knapp-Hartung); opt-in cluster-robust SEs (RVE: CR2 + Satterthwaite df, clubSandwich)
9Time-to-event — hazard ratio (HR)log-HR + SE → HR (exp, null = 1)pools per-study log-HR + SE; pair with the HR converter for reported HR + 95% CI
10Two-group incidence-rate ratio (IRR) (Advanced)IRR (exp, null = 1)event counts + person-time per group via escalc("IRR")
11Change from baseline (pre/post)MC (raw) / SMCC (standardized)change-score SD from an imputed, flagged pre-post correlation ri (+ sensitivity note)
12Reliability (Cronbach’s α) (Advanced)ARAW (raw alpha)reliability generalization via escalc("ARAW", ai, mi, ni)
13Partial correlation (Advanced)PCORadjusted association via escalc("PCOR", ri, ni, mi)

Shared model options (all templates except the three-level model): τ² estimator — REML (default), Paule-Mandel, DerSimonian-Laird, ML, Empirical Bayes, Sidik-Jonkman, Hunter-Schmidt, Hedges, or common-effect (FE); Knapp-Hartung adjustment (default ON, auto-greyed under the common-effect/FE model where it has no role) — applied as the modified (ad-hoc) HKSJ (metafor test="adhoc"), which is never narrower than the standard interval and flags when that safeguard fires; confidence level.

Defaults & methods basis (reviewed 2026-06-17 against the current literature/guidelines). metaproc’s defaults align with current best practice and Cochrane’s 2024/2025 RevMan random-effects stack: REML τ² + (modified) Knapp-Hartung CI + prediction intervals + contour-enhanced funnel + RR/SMD-as-Hedges’-g. Proportions default to GLMM (random-intercept logistic), per Schwarzer et al. 2019 / Lin & Chu 2020 (Freeman-Tukey’s back-transform can be seriously misleading and is flagged). Trim-and-fill and fail-safe N are retained but marked legacy / sensitivity-only (Cochrane Ch.13); NMA P-score rankings carry the Salanti et al. 2022 caution and a rankogram. See metaproc-validation/reports/METHODS_RECOMMENDATIONS_REVIEW.md for the full evidence + decisions.

Per-run outputs (all exist):

  • Value boxes: pooled estimate + CI (back-transformed), I², k.
  • Forest plot tab — interactive controls: prediction interval on/off (default on), sort (default / effect size / precision), custom x-axis label; the live forest() call is shown; export PNG / PDF / SVG. An Interactive toggle (default off) adds a ggiraph (SVG) forest with per-study hover tooltips (study, estimate, CI, weight); the static metafor plot + its code stay the default/export.
  • Funnel plot tab (contour-enhanced); same opt-in Interactive (ggiraph) hover view.
  • Heterogeneity panel: K, total N, Cochran’s Q (df, p), I² with 95% CI, τ² with 95% CI, τ, H², 95% prediction interval.
  • Per-study estimates table (Study, Estimate, CI, Weight %) + CSV download.
  • Plain-language interpretation (effect, significance vs null, heterogeneity band, caveat).
  • Copyable plain-text results summary.
  • Exact R code panel + verbatim summary(fit) (the binary template’s code documents metafor’s default continuity correction, add = 1/2, to = "only0").
  • Caveat banners: zero/full-cell continuity correction, k<5 prediction interval, “judge heterogeneity from Q+I²+τ²+PI together”.
  • Weight-dominance notice (any study ≥ 50% weight; threshold in diagnostics.yml).
  • Subgroup analysis (optional): pick a categorical column and re-run → the forest plot regroups by subgroup with a pooled summary diamond per group (per-group rma) plus the overall diamond, and a panel reports the rma(mods=~g) Q-between test + per-subgroup estimates (IV templates only; the forest subtotals and the panel use the same per-group rma, so they agree).
  • Multi-arm handling: detects sub-arms (suffix / repeated id / flag column) and offers pool-within-study / independent / three-level.
  • Boundary-proportion switch: 0%/100% rates → one-click switch to GLMM.
  • Clinical translation (binary RR/OR): NNT/NNH + absolute effects (“X fewer/more per 1000”) from a user-entered baseline risk, with CIs and the exact R (code-capture).
  • L’Abbé plot (binary): each study’s treatment-arm vs control-arm risk; shown code + PNG export.

Robustness & diagnostics card (all exist): leave-one-out (table + dot plot), influence diagnostics (Cook’s distance, DFFITS, std. residual, influential flag), exclude-large-studies sensitivity (n > 10× median, configurable), estimator robustness (re-fit under every τ² estimator) with a robustness battery (outliers-excluded / trim-and-fill / leave-one-out range), and meta-regression — pick a numeric study-level moderator and the card fits rma(yi, vi, mods = ~ moderator, data = es) with slope [CI] / p / R² / k and a back-transformed regplot bubble. Works on any standard random-effects fit including single-arm proportions (the binary 2×2 moderator path also lives on the Pipeline); flags k < 10 as exploratory.

Publication bias & small-study effects card (Advanced mode): a dedicated, opt-in card runs five metafor diagnostics on the fitted model, each showing its output and the exact R code: Egger’s regression test + Begg-Mazumdar rank test (regtest / ranktest), fail-safe N (fsn), PET-PEESE (small-study-effect-adjusted estimate), cumulative meta-analysis by precision (cumul + forest), and a step-function selection model (selmodel). Standard random-effects fits only; best with ~10+ studies; read as a triangulation, not a verdict. (Trim-and-fill remains on the Funnel tab.)

Simple / Advanced mode: a global switch in the floating toolbar. Simple (default) shows the everyday analyses and controls; Advanced reveals templates 12–13, the advanced effect measures, the Hunter-Schmidt/Hedges estimators, the publication-bias card, the continuity-correction control, and power-user forest controls (axis ticks/range, directional headers, weight/RoB/counts/caption columns). The toggle only un-hides options — it never changes a result, so Simple and Advanced give identical numbers.

Templates does NOT include: Hartung-Knapp SE variants beyond the default modified ad-hoc HKSJ (test="adhoc") — e.g. the fully conditional Hartung-Knapp or Sidik-Jonkman bias-corrected variants; arcsine/other proportion transforms beyond the four listed; dose-response or multivariate/multiple-outcome models (beyond 3-level + the opt-in RVE); Bayesian estimation; prediction-interval method choice (uses metafor default).


5.1 Network meta-analysis (mod_network, netmeta)

Section titled “5.1 Network meta-analysis (mod_network, netmeta)”

Exists: arm-level data → pairwise()netmeta(); outcome type binary (OR/RR) or continuous (SMD/MD); reference-treatment picker (auto-prefers placebo/control); network plot, forest vs reference, summary, league table, P-score rankings, net-split (direct vs indirect inconsistency), comparison-adjusted funnel; exports network PNG / forest PNG / league CSV; exact R code panel; bundled example_network.csv.

Does NOT exist: Bayesian NMA; node-splitting beyond netsplit; SUCRA plots (P-scores only, shown as text); network meta-regression; component NMA; ranking-probability rankograms; design-by-treatment interaction model.

5.2 Pipeline (mod_pipeline + fct_pipeline)

Section titled “5.2 Pipeline (mod_pipeline + fct_pipeline)”

Exists: a 3-step builder — set base analysis (pairwise-binary mapping + measure/model), drag components into an ordered pipeline, configure each, Run; each step emits its own modular R code + text output + plot in order. Ten step types: Primary, Subgroup, Meta-regression (+bubble/regplot), Multivariable meta-regression (≥2 moderators / interactions + seeded permutest), Publication bias (funnel + small-study tests: Peters/Harbord auto-selected for OR/RR, Egger elsewhere; Begg shown), Cumulative (cumul), Leave-one-out, Influence diagnostics, Trim-and-fill (trimfill), Baujat.

Limitations: the pipeline base is hard-wired to the pairwise-binary template (mod_pipeline.R:81) — it always uses 2×2 event/total mapping and the binary escalc, regardless of what the Templates tab is set to. Continuous / proportion / etc. pipelines are not available here. Steps run against the base es/fit; there is no branching or conditional flow.

  • Risk of bias (mod_rob, robvis): RoB 2 / ROBINS-I / QUADAS-2; editable per-domain judgement dropdowns; traffic-light + summary plots; PNG export. Domains are the named instrument domains in the entry grid + a domain key (ROBINS-I 7 / RoB 2 5 / QUADAS-2 4); the robvis traffic-light/summary plots use the standard D1..Dn columns.
  • GRADE (mod_grade): start High (RCT) / Low (observational); five downgrade factors + three upgrade factors (obs only); certainty computed by arithmetic clamp to Very low/Low/Moderate/High; value-box rating + factor table + the arithmetic shown as code. Plus a Cochrane-style Summary-of-Findings row populated from the live analysis (rv$analysis): relative + absolute effect (per 1000, from a baseline rate) + k + N + I² + the certainty rating.
  • SWiM (mod_swim): editable per-study effect-direction table (4 directions); vote counting; harvest barplot; vote-count code shown.

Appraisal does NOT include: RoB instrument-specific domain prompts/signalling questions; automatic RoB import from data; ROB-ME / ROBIS / AMSTAR; SWiM weighting beyond simple vote counts.

Exists: a real rmarkdown report built from the last Templates run (rv$analysis), output as HTML (default), PDF, or R Markdown (.Rmd) source via a format selector (the choice persists in rv$report_format). Selectable sections: Methods, PRISMA-flow bullets, included-studies table, pooled result (summary), forest plot, heterogeneity + prediction interval, reproducible R code, software/package citations. Uses Quarto’s bundled pandoc if none is on PATH; PDF renders via TinyTeX (one-time install, graceful fall-back to HTML if no LaTeX). Render errors are surfaced in the UI (notification + status alert), never a silent hang. DPI 120; error-tolerant chunks. The HTML report is fully self-contained and offline — assets are embedded and MathJax is disabled (mathjax: null; the report uses no LaTeX math), so it opens with no internet connection. The .Rmd download bundles a sibling -data.rds so it re-renders as-is. A Download reproducibility bundle button on the same tab produces a .zip — a runnable analysis.R, the dataset.csv it reads, the .Rmd, sessionInfo(), renv.lock (exact versions), and a README — that re-runs in a clean R session and reproduces the pooled estimate.

Does NOT exist / important gaps:

  • The modular report builder now exports HTML, PDF and Word (.docx); the classic single-analysis report stays HTML / PDF / .Rmd.
  • The report’s PRISMA section is text bullets from manually typed counts; it does not embed the mod_prisma diagram.
  • Report covers the pairwise Templates analysis only — it does not pull in Network, RoB, GRADE, SWiM, or pipeline results.
  • Requires a Templates run first (no report without rv$analysis).

Exists: a PRISMA-style flow diagram drawn with base R graphics; counts auto-derived from screening/inclusion columns in the loaded data (inclusion flag, exclusion-reason, screening-stage, identified-count), with editable node labels; “included” and “reports-excluded” boxes are computed live; excluded-reasons list; PNG / SVG export.

Does NOT exist: uses base-graphics boxes, not the official PRISMA2020 / DiagrammeR template; the screening-excluded box is wired to the editable text input, not the data-computed split (see CODE_REFERENCE.md §13 for the exact wiring); not embedded in the HTML report.

  • Effect-size converter (mod_esc, esc + closed-form): 12 conversions → effect + SE
    • exact code — group means/SDs/Ns, independent t, one-way F (2 groups), χ²(df=1), 2×2 table, point-biserial r, unstandardized B, standardized β, two proportions, and (Phase 8) HR + 95% CI → log-HR + SE (Tierney 2007), median/IQR/range → mean & SD (Wan 2014 / Luo 2018; three scenarios), and a cluster-RCT design-effect adjustment (SE inflated by √DEff, DEff = 1+(m−1)·ICC). Inputs are validated (clear message on a bad CI ordering / out-of-range ICC). All but the 2×2 and proportions return Hedges’ g (es.type="g").
  • Effect-size converter — also (SAP capability round): paired pre-post change (impute the change SD from a pre-post correlation r; Cochrane 6.5.2.8), Snellen → logMAR (Holladay 1997), and an indirect comparison of two pooled single-arm rates → OR (Bucher-style logit contrast with a combined CI + an indirectness caveat). Separately: the GLMM proportion template now auto-falls-back to a logit model on zero-/boundary-event data (instead of erroring), and GRADE imprecision is MID-anchored (Core GRADE Paper 2) when a Minimal Important Difference is supplied. A robustness battery (outliers excluded / trim-and-fill / leave-one-out, under the estimator-sensitivity card), a Sun-Briel-Guyatt subgroup-credibility checklist, and a base-graphics cross-modality revision-flow diagram round it out.
  • A-priori power (mod_power): power for random-effects vs common-effect models given K / N-per-group / expected SMD / heterogeneity band / α, plus a power-vs-K curve with an 80% target line. Formulas hand-implemented (no dmetar): the heterogeneity band sets τ² = v * I²/(1 - I²) (the exact I² inversion → variance inflation 1/(1 - I²), shown in-panel) — more conservative than dmetar’s fixed 1.33/1.67/2.0 multipliers at higher I².

Tools does NOT include: sample-size/MDES solving (power is forward-only, no inversion to required K); converter coverage of log-rank O−E/V → log-HR, or correlation-matrix conversions (HR + 95% CI, medians/IQR/range → mean & SD, and the cluster design-effect SE adjustment are now covered — see above).

5.7 Plan wizard (mod_planner) and Guide (mod_guide)

Section titled “5.7 Plan wizard (mod_planner) and Guide (mod_guide)”
  • Plan: PICO inputs + a questionnaire (design, data type, structure, rare events, dependence, moderators, k) → mp_recommend() returns a recommended template, effect measure, model (random-effects; Knapp-Hartung when k<10), pooling (MH/Peto for rare events), a suggested pipeline, and caveats; “Apply & go” pre-selects the template on the Templates tab.
  • Guide: a PICO analysis picker and per-analysis walkthroughs that display the real generated code for 8 analyses; a “Your first meta-analysis in 5 steps” walkthrough; and one-click worked examples (binary / continuous / proportion / network) that load a bundled dataset and run it so you land on a populated result.

These are advisory/navigational — Plan/Guide do not themselves fit models, but the worked-example buttons drive a real analysis on Templates/Network.

A slim horizontal pipeline on the Home tab — Protocol → Data → Analyses → GRADE → Report — that shows, at a glance, how far the current review has progressed. It is purely additive and read-only: the status is derived from the existing in-session stores (no new persistent state, no computation), so it changes no analysis numbers and is golden-safe. The strip persists with a project .rds exactly as much as the session state it reflects.

  • Status derivation lives in mp_stepper_status() (fct_stepper.R), a pure function (no Shiny) that reads the same state the Summary-of-Findings table does: the review protocol (Plan), the active data, the outcomes list, the workflow store, per-outcome GRADE ratings, and the report blocks. Each step resolves to one of done / now (the single active frontier) / todo, plus a short status line — e.g. “Scope set”, “28 studies · 3 outcomes”, “2 of 3 run”, “1 of 3 rated”, “Not started”. With no outcomes defined yet, Analyses degrades to “any analysis run?” and GRADE reads “Needs outcomes”.
  • Navigation: each step is a real <button> that jumps to its tab (Protocol → Plan, Analyses → Templates, etc.) via the same Home goto path every other Home button uses, so it reaches menu-nested panes (GRADE, Report) by their stable pane value.
  • Styling / a11y (.mp-stepper in custom.css, Orbital skin): brand-gradient done dots and connectors, an amber active dot with a beating glow ring; per-step aria-label carrying the status, aria-current="step" on the active step, the shared :focus-visible ring, and every animation disabled under prefers-reduced-motion.

A “pick up where you left off” list on the Home tab — saved/opened projects shown as cards (a hexagonal initial badge, the project name, a meta line, and a relative time). It is client-side only (decision B4 option (a)): the list lives in the browser’s localStorage under mp-recent-projects, never on the server, so it adds no data-at-rest, no backups, and no privacy-policy obligations. The card carries the honest limitation in its copy and an explicit privacy line — “Stored only in this browser — never uploaded to the server.” (the same wording the portal uses; the two share this localStorage key, which the portal reads read-only).

  • What gets recorded — after a successful project save or load, mod_home sends the client a small metadata record via session$sendCustomMessage("mp-recent-project", …): the project name (the review protocol’s title if set, else the active dataset, else a generic fallback), the study count k (rows of the active data), the analysis kind (the latest analysis item’s measure label, when known), and an ISO-8601 timestamp. The record is built by the pure mp_recent_project_meta() (fct_recents.R) from cheap reads of existing in-session state — no model is fitted and the save/load logic itself is not touched; the notification is appended only after success, so a rejected (foreign) .rds records nothing.
  • The list (metaproc.js) — keeps the newest 8 entries, newest first, deduped by name (case-insensitive). Because a browser cannot re-read a file path (a hard security boundary), clicking a recent card re-opens the existing Load project file dialog (a real .click() on the file input, inside the user gesture) and shows a small hint — “Re-select .rds” — so reopening is one click but the user still chooses the file. A clean empty state shows when the list is empty, and a server-rendered fallback keeps the card sensible without JS.
  • Scope — purely additive chrome; it works identically in desktop and web mode (no METAPROC_MODE gating) and changes no analysis numbers (golden-safe).
  • Styling / a11y (.mp-recent-* in custom.css, Orbital skin): each card is a real <button> (so it carries the shared ripple and :focus-visible ring) with a descriptive aria-label; the hint toast is an aria-live status; the hexagonal badge is the brand mark’s shape (decorative, aria-hidden); colours ride on --mp-* tokens so the card reads in both warm-light and deep-dusk, and all motion is disabled under prefers-reduced-motion.

Exists: a dedicated Plots tab that re-draws forest and funnel plots from a saved analysis (verified against its snapshot), with two drawing engines selectable per plot — native metafor base graphics and a themed ggplot2 path. The ggplot “studio” exposes fine-grained, opt-in customization that leaves the default output byte-for-byte unchanged: per-plot appearance (diamond, reference line, axis limits/ticks, point shape/size, subtitle), per-study row styling (point / CI / label colour + shape), per-element text controls (family, size, weight, colour), and cosmetic presets. Plots follow the runtime theme and the colourblind-safe Okabe–Ito palette, and export to PNG / vector (SVG/PDF) with explicit size controls. As everywhere, the exact reproducible R code that drew the preview sits beneath it, and an opt-in standalone (literal) ggplot2 emitter produces self-contained plotting code that runs without metaproc. Freeman–Tukey double-arcsine proportion forests draw on the correct back-transformed [0, 1] scale.

Does NOT exist: journal house-style layouts (JAMA / RevMan via {meta}); drag-to-position annotations; plotting of surfaces other than the saved forest / funnel analyses.

5.11 Tables tab — formatted tables & Table 1 (mod_tables, fct_tables, fct_table1)

Section titled “5.11 Tables tab — formatted tables & Table 1 (mod_tables, fct_tables, fct_table1)”

Exists: a Tables tab that turns any loaded data frame into a publication-ready table, exported to HTML, LaTeX, or Word through knitr::kable (no new dependencies). Two modes share one preview / export / reproducible-code / save-to-report path:

  • Format a table — title, caption, column selection + renaming, alignment, rounding, footnotes over any source frame.
  • Summary / Table 1 — a hand-rolled (base R) descriptive-table builder for medical Table 1s. Per-column operations: continuous (mean (SD) / median [IQR] / median [range] / range / both), categorical (n (%) per level), binary (the “yes” level), count (n, or pooled n = column sum), and binned (cut a continuous column at custom thresholds or k equal bins → n (%)). Optional stratification by a grouping column (an Overall column + per-group columns with group Ns, Overall toggleable), opt-in comparison p-values (t / ANOVA for continuous, χ² / Fisher for categorical), missing counts, and an auto methods footnote that self-documents the statistics used. Both modes draw from the active dataset, any loaded dataset, imported references, a saved workflow item’s data (analysis + EDA “Data summary” snapshots), or a generic snapshot store (mp_table_store_add). The exact R that built the table is shown and can be saved to the report as a table block.

Does NOT exist: automatic test selection beyond the t/ANOVA · χ²/Fisher defaults (no non-parametric / Welch switching); multi-level column spanners or weighted / survey summaries. (Word output is available on the Tables tab and, since v0.6.0, from the modular report builder — see §5.4.)


6. Real-world data robustness (the Phase 4 batch)

Section titled “6. Real-world data robustness (the Phase 4 batch)”

All fixture-validated against a real-world extraction workbook (tests/fixtures/realworld_extraction.xlsx).

  1. Combine grain guard + refinement-key suggestion + filter-before-join (§3.2).
  2. Multi-arm / sub-arm detection and three pooling modes (§4).
  3. Weight-dominance notice + leave-one-out / influence / exclude-large (§4).
  4. Boundary proportions — 0%/100% → logit-CC / GLMM / Freeman-Tukey switch (§4).
  5. Biological-range checks — a 30-variable clinical registry (biological_ranges.R): per-cell value-vs-typical-range (warning) and value-vs-possible-range (error) flags, to catch unit mismatches / data-entry errors (e.g. cmH₂O vs mmHg). Toggle in qc.yml.
  6. Configurable consistency rules (fct_consistency.R): a rule engine with four rule types — sum_eq_total, sum_le_total, le, range — a starter library, in-app authoring, a violations panel, YAML export, and rules saved with the project. Reproducible per-rule code shown. Toggle in qc.yml.
  7. PRISMA 2020 flow generated from screening/inclusion data (§5.5).
  8. Regression test (14 assertions across items 1–7) + glossary terms.

7. Configuration (user-extensible without editing source)

Section titled “7. Configuration (user-extensible without editing source)”

inst/config/:

  • diagnostics.ymlweight_dominance_threshold (0.5), large_study_multiplier (10).
  • grain_keys.yml — glob patterns identifying repeated-measure columns for the Combine grain guard (timepoint*, _months, visit, followup*, …).
  • qc.ymlenable_biological_ranges, enable_consistency_rules.

The biological-range registry (biological_ranges.R) and consistency starter templates (fct_consistency.R) are R data structures intended to be extended. Multi-arm flag columns are read from a multiarm config with a code default.


  • Save project.rds containing all datasets, the active dataset, and the consistency rules.
  • Load project / New project.
  • Every loaded file/sheet is remembered in the Workspace and switchable app-wide.

Does NOT persist: per-template analysis configuration (mappings/options), pipeline definitions, RoB/GRADE/SWiM/PRISMA entries, or generated reports — saving stores the data + rules, not the analysis state.


9. What metaproc is currently missing (consolidated gap list)

Section titled “9. What metaproc is currently missing (consolidated gap list)”

Packaging / distribution

  • Not yet an installable desktop binary — runs from R via shiny::runApp(run_app()). Electron shell + bundled R/packages is the planned-but-unbuilt Phase 5.
  • Dev workflow (golem::run_dev) needs devtools/pkgload/roxygen2 not in the renv lock.

Statistical scope

  • Frequentist only — no Bayesian pairwise or network MA.
  • No diagnostic test-accuracy meta-analysis (bivariate/HSROC).
  • No dose-response, multivariate/multiple-outcome (beyond 3-level), or IPD meta-analysis.
  • No robust/cluster-variance (RVE) one-click option.
  • Pipeline is locked to the binary base template (no continuous/proportion pipelines).
  • No Trial Sequential Analysis / required information size (sequential monitoring of whether the evidence base is yet conclusive).

Reporting

  • The modular report builder outputs HTML / PDF / Word (.docx); the classic single-analysis report outputs HTML / PDF / .Rmd. (Standalone publication tables in Word/LaTeX are also on the Tables tab; see §5.11.)
  • Each modular analysis block now carries a plain-language interpretation, a heterogeneity table, a funnel + Egger section, leave-one-out sensitivity, optional NNT (baseline risk) and meta-regression (moderator); the builder can also add a Summary-of-Findings table and a risk-of-bias figure. Still excluded: Network/SWiM/pipeline results and the PRISMA diagram (the report carries typed PRISMA counts).
  • No journal house-style forest layouts (JAMA / RevMan) — would require driving pooling off the {meta} package. (The Plots tab does add themed ggplot2 forest/funnel customization, per-study styling, and a standalone-code emitter; see §5.10.)

Appraisal

  • RoB domains are generic D1..Dn, not instrument-named with signalling questions.
  • GRADE/SWiM are standalone calculators (no auto-import from the analysis).

Data handling

  • Analysis-data imports limited to CSV/Excel (no SPSS/Stata/RData/database/URL). (In-app cell editing, column retype/rename, row include/exclude, and Combine row-bind/stacking are now available; bibliographic reference / screening exports — RIS, CSL-JSON, RevMan, Covidence/Rayyan — import via the Citations tab, see §3.4.)
  • Drag-to-resize DT column widths not available (DT lacks it natively).

Persistence

  • Saved projects store data + rules only — not analysis/pipeline/report state.

Licensing

  • The GPL-derivative concern (R + meta/metafor/netmeta/robvis/esc are GPL copyleft) was resolved 2026-06-11: metaproc itself is now GPL-3.0-or-later. Desktop installers are conveyance, so each shipped installer ships with a matching public source tag (GPLv3 section 6 Corresponding Source); hosted SaaS use is not conveyance (network use is not distribution under GPLv3). See LICENSING.md + NOTICE.

R 4.5.3 at C:\Program Files\R\R-4.5.3\bin\Rscript.exe (not on PATH). From metaproc/:

source("renv/activate.R"); library(metaproc); shiny::runApp(run_app(), launch.browser = TRUE)

Regression suite: testthat::test_dir("tests/testthat") (green; golden snapshots 96/96).


11. Guide: meta-analysis types & when to use them

Section titled “11. Guide: meta-analysis types & when to use them”

A standalone, plain-language guide to every analysis MetaProc can run — what each one is for, when to use it, the effect measure, and the key caution — lives at META_ANALYSIS_GUIDE.md. It pairs the everyday explanation with the statistical term, and covers two-group (binary/continuous), single-group (proportion/rate/mean), correlation, partial correlation, reliability, time-to-event, incidence-rate ratio, pre-computed, three-level/dependent, and network meta-analysis, plus model choices (random vs fixed, τ² estimators, Knapp-Hartung), reading heterogeneity (I²/τ²/PI), subgroups & meta-regression, publication-bias tools, and good-practice reminders. The same “how to choose” logic is in the in-app manual’s How to choose your analysis section and the Plan tab.