Initial CRAN release.
ML-UMR models: Bayesian multilevel unanchored meta-regression with two model variants:
Three outcome families: binary (binomial), continuous (normal), and count (Poisson) outcomes, each with appropriate link functions:
Dual Stan backend: rstan (default, CRAN-compatible) with optional
cmdstanr support. Switch engines with mlumr_engine("cmdstanr"), which
guides installation of cmdstanr and CmdStan if needed. Per-call override
via the engine argument in mlumr().
Simulated Treatment Comparison (STC): Frequentist outcome regression via parametric G-computation with delta-method standard errors. Supports prediction at covariate means or marginalization over full covariate distributions using integration points.
Naive unadjusted estimate: Benchmark comparison of crude outcome summaries with delta-method confidence intervals.
set_ipd(), set_agd(), and combine_data() provide a
unified interface for preparing IPD and AgD for all three methods.set_ipd() rejects covariate names that collide with reserved
internal columns (.outcome, .study, .trt, .exposure) so user
values cannot be silently overwritten by the standardized frame.set_agd() applies the same check to its covariate mean/SD columns
(.n, .r, .y, .se, .study, .trt, .E) and additionally
rejects cov_means entries that collapse to duplicate names after
stripping the _mean / _prop suffix (e.g. c("age_mean", "age")).add_integration() generates Sobol-sequence quasi-Monte Carlo
integration points with a Gaussian copula to account for covariate
correlations, enabling accurate marginalization over the AgD covariate
distribution.mlumr(), add_integration(), check_integration(), and
prior_sensitivity() include verbose controls so scripts and
tests can suppress package-level progress output while retaining warnings.multinma package for the data-setup, integration, and
effect-summary workflow (set_ipd(), set_agd(),
add_integration(), unnest_integration(), distr(),
marginal_effects(), qbern()/pbern()/dbern()). Users
familiar with ML-NMR can transfer their muscle memory directly to
ML-UMR. When both packages are attached in the same R session R
issues masking warnings on the shared names; disambiguate with
mlumr::function() / multinma::function().prior_normal(mean, sd), prior_student_t(df, mean, sd),
prior_cauchy(mean, sd) (alias for prior_student_t(df = 1, ...)), and
prior_exponential(rate). All six Stan models branch on the prior
family at runtime, so any of these can be supplied to prior_intercept,
prior_beta, or (normal family only) prior_sigma.prior_beta accepts either a single prior (broadcast to all covariates)
or a list of per-coefficient priors. Per-coefficient priors must share
the same family and df (Stan branches on a single dist code).prior_normal(), prior_student_t(), and prior_cauchy() carry an
autoscale argument. When passed as prior_beta with
autoscale = TRUE, each coefficient's prior scale is divided by the
empirical SD of its covariate (Gelman et al., 2008).
autoscale = FALSE by default.prior_intercept: prior_normal(0, 10)prior_beta: prior_normal(0, 2.5) (weakly informative; Gelman et al.,
2008)prior_sigma: prior_normal(0, 2.5) (half-normal via the <lower=0>
constraint in Stan) for the normal family.default_prior_intercept(), default_prior_beta(), and
default_prior_sigma() accessors expose the package defaults. Values
are tagged with $default = TRUE and the package $version so
prior_summary() can report whether each prior is a default and which
mlumr version produced it.prior_summary() S3 generic + prior_summary.mlumr_fit() method for
human-readable introspection of every prior used in a fit, including
post-autoscale per-coefficient scales.prior_sensitivity() refits a model across a grid of prior_beta
scales and returns a posterior-summary table — the workflow recommended
by Vehtari et al.'s prior-choice wiki for judging data- vs prior-driven
inference.predict.mlumr_fit() returns population-specific predicted outcomes.marginal_effects() returns posterior treatment-effect summaries.conditional_effects() returns covariate-conditional treatment
effects.conditional_predict() returns predictions at specific covariate
values.predict.mlumr_fit() and conditional_effects() document the
Jensen's-inequality gap on non-identity links: response-scale summaries
are E[g^{-1}(eta)], not g^{-1}(E[eta]).calculate_dic() for DIC-based comparison (no extra dependencies).calculate_loo() and calculate_waic() using the optional loo
package for PSIS-LOO and WAIC (Vehtari, Gelman, Gabry, 2017). loo
is in Suggests, not Imports.compare_models() accepts criterion = c("dic", "loo", "waic"),
defaulting to "dic".log_lik_ipd, log_lik_agd) — the standard contract for
loo::loo() / loo::waic().beta (and beta_comparator in relaxed
models) are sampled via an affine (non-centered) reparameterization:
z_beta ~ std_* (0, 1), beta = prior_beta_mean + prior_beta_sd .* z_beta.
This decouples HMC adaptation from the prior scale and typically
improves mixing when the prior scale is mis-matched with the
posterior scale.check_diagnostics().check_integration() provides a check_joint argument that
compares pairwise correlation matrices at the current vs doubled n_int
(and against the user-supplied correlation target when available).#include include/priors_hyperparameters.stan and
include/priors_sigma_hyperparameters.stan. Prior log-density
dispatchers live in include/priors_functions.stan.include/binary_functions.stan.E_ipd in the two Poisson Stan models carries <lower=0> so
off-API consumers who assemble stan_data manually get a Stan
validation error rather than log(0) = -Inf on a non-positive
exposure.?mlumr-numerical-guards documents
safe_logit, safe_divide, and the <lower=0> Stan guards.?mlumr-package provides a full overview of the typical workflow
(data preparation -> integration -> fit -> diagnostics -> inference) and
points at the alternative methods (stc(), naive()).@seealso cross-links across predict.mlumr_fit(),
marginal_effects(), conditional_effects(),
conditional_predict(), prior_summary(), and
prior_sensitivity().