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.
1. What metaproc is
Section titled “1. What metaproc is”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.
Engines (all frequentist)
Section titled “Engines (all frequentist)”| Purpose | Package | Where |
|---|---|---|
| Pairwise pooling, diagnostics, 3-level | metafor (escalc, rma, rma.mh, rma.peto, rma.glmm, rma.mv) | Templates, Pipeline |
| Network meta-analysis | netmeta (pairwise, netmeta) | Network |
| Risk-of-bias figures | robvis | Appraise → Risk of bias |
| Effect-size conversion | esc | Tools → Converter |
| Report rendering | rmarkdown (+ Quarto’s bundled pandoc) | Report |
| Power, GRADE, SWiM, PRISMA | base 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.
Accessibility & UX
Section titled “Accessibility & UX”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.
2. Navigation map (exact, in order)
Section titled “2. Navigation map (exact, in order)”From app_ui.R (bslib::page_navbar, id main_nav). The clickable title returns
to Home.
| # | Item | Type | Module |
|---|---|---|---|
| 1 | Home | panel | mod_home |
| 2 | Data | panel | mod_data_import |
| 3 | Citations | panel | mod_references |
| 4 | Combine | panel | mod_combine |
| 5 | EDA | panel | mod_eda |
| 6 | Plan | panel | mod_planner |
| 7 | Templates | panel | mod_templates |
| 8 | Network | panel | mod_network |
| 9 | Pipeline | panel | mod_pipeline |
| 10 | Plots | panel | mod_plots |
| 11 | Tables | panel | mod_tables |
| 12 | Appraise ▾ | menu | Risk of bias (mod_rob), GRADE (mod_grade), SWiM narrative (mod_swim) |
| 13 | Report ▾ | menu | Reproducible report (mod_report), PRISMA 2020 flow (mod_prisma) |
| 14 | Tools ▾ | menu | Effect-size converter (mod_esc), Power analysis (mod_power) |
| 15 | Guide | panel | mod_guide |
| 16 | Manual | panel | mod_manual (this document, in-app) |
| 17 | About | panel | mod_landing |
| 18 | Help | link | quick-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.
3. Data lifecycle features
Section titled “3. Data lifecycle features”3.1 Data tab (mod_data_import)
Section titled “3.1 Data tab (mod_data_import)”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
...Nauto-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.
3.2 Combine tab (mod_combine)
Section titled “3.2 Combine tab (mod_combine)”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.
3.3 EDA tab (mod_eda)
Section titled “3.3 EDA tab (mod_eda)”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).
| # | Template | Effect measures | Pooling / model specials |
|---|---|---|---|
| 1 | Pairwise — binary (2×2) | RR (default), OR, RD | Inverse-variance / Mantel-Haenszel / Peto; flip direction; zero-cell warning |
| 2 | Pairwise — continuous | SMD (default, Hedges’ g), MD, ROM; (Advanced) SMDH (unequal variances), VR & CVR (variability ratios) | flip direction |
| 3 | Single-group proportion | GLMM random-intercept logistic (default, recommended), PLO logit+CC, Freeman-Tukey PFT (back-transform can mislead — warned), raw PR | GLMM has an automatic logit fallback |
| 4 | Correlation | Fisher’s z (ZCOR, default); (Advanced) raw correlation (COR) | — |
| 5 | Pre-computed (yi/SE) | none / exp display transform | — |
| 6 | Single-group incidence rate | IRLN (default), IR | — |
| 7 | Single-group mean | MN (default), MNLN | — |
| 8 | Three-level (rma.mv) (Advanced) | none / exp | nested random effects; REML/ML only (no Knapp-Hartung); opt-in cluster-robust SEs (RVE: CR2 + Satterthwaite df, clubSandwich) |
| 9 | Time-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 |
| 10 | Two-group incidence-rate ratio (IRR) (Advanced) | IRR (exp, null = 1) | event counts + person-time per group via escalc("IRR") |
| 11 | Change from baseline (pre/post) | MC (raw) / SMCC (standardized) | change-score SD from an imputed, flagged pre-post correlation ri (+ sensitivity note) |
| 12 | Reliability (Cronbach’s α) (Advanced) | ARAW (raw alpha) | reliability generalization via escalc("ARAW", ai, mi, ni) |
| 13 | Partial correlation (Advanced) | PCOR | adjusted 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 therma(mods=~g)Q-between test + per-subgroup estimates (IV templates only; the forest subtotals and the panel use the same per-grouprma, 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. Other analysis surfaces
Section titled “5. Other analysis surfaces”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.
5.3 Appraise menu
Section titled “5.3 Appraise menu”- 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.
5.4 Report (mod_report)
Section titled “5.4 Report (mod_report)”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_prismadiagram. - 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).
5.5 PRISMA 2020 flow (mod_prisma)
Section titled “5.5 PRISMA 2020 flow (mod_prisma)”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.
5.6 Tools menu
Section titled “5.6 Tools menu”- 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").
- 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 (
- 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.
5.8 Review progress stepper (Home)
Section titled “5.8 Review progress stepper (Home)”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 Homegotopath every other Home button uses, so it reaches menu-nested panes (GRADE, Report) by their stable pane value. - Styling / a11y (
.mp-stepperincustom.css, Orbital skin): brand-gradient done dots and connectors, an amber active dot with a beating glow ring; per-steparia-labelcarrying the status,aria-current="step"on the active step, the shared:focus-visiblering, and every animation disabled underprefers-reduced-motion.
5.9 Recent projects (Home, on-device)
Section titled “5.9 Recent projects (Home, on-device)”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_homesends the client a small metadata record viasession$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 puremp_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).rdsrecords 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_MODEgating) and changes no analysis numbers (golden-safe). - Styling / a11y (
.mp-recent-*incustom.css, Orbital skin): each card is a real<button>(so it carries the shared ripple and:focus-visiblering) with a descriptivearia-label; the hint toast is anaria-livestatus; 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 underprefers-reduced-motion.
5.10 Plots studio (mod_plots + fct_plots)
Section titled “5.10 Plots studio (mod_plots + fct_plots)”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 atableblock.
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).
- Combine grain guard + refinement-key suggestion + filter-before-join (§3.2).
- Multi-arm / sub-arm detection and three pooling modes (§4).
- Weight-dominance notice + leave-one-out / influence / exclude-large (§4).
- Boundary proportions — 0%/100% → logit-CC / GLMM / Freeman-Tukey switch (§4).
- 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 inqc.yml. - 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 inqc.yml. - PRISMA 2020 flow generated from screening/inclusion data (§5.5).
- 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.yml—weight_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.yml—enable_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.
8. Project / workspace persistence
Section titled “8. Project / workspace persistence”- Save project →
.rdscontaining 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.
10. Run / verify
Section titled “10. Run / verify”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.