Post-Fit Facades

After fitting, PanelMMM exposes most read and reporting operations through bound properties:

  • mmm.data
  • mmm.summary
  • mmm.diagnostics
  • mmm.plot

These are the preferred entry points when you already have a fitted model.

mmm.data

mmm.data returns MMMIDataWrapper.

Direct import path:

from abacus.data.idata import MMMIDataWrapper

You can also create it explicitly with:

wrapper = MMMIDataWrapper.from_mmm(mmm)

Main methods:

MethodPurpose
get_target(original_scale=True)Return observed target data
get_channel_spend()Return observed channel spend
get_posterior_predictive(original_scale=True)Return posterior predictive samples
get_errors(original_scale=True)Return residual samples
get_channel_contributions(original_scale=True)Return media contribution samples
get_contributions(...)Return channels, baseline, controls, seasonality, and events
get_elementwise_roas(original_scale=True)Contribution-over-spend ratios
get_elementwise_cost_per_target(original_scale=True)Spend-over-contribution ratios
get_channel_scale()Return stored channel scaling factors
get_target_scale()Return stored target scaling factors
to_original_scale(...)Convert a posterior variable or array to original scale
to_scaled(...)Convert an original-scale array back to model scale

mmm.summary

mmm.summary returns MMMSummaryFactory.

Direct import path:

from abacus.mmm.summary import MMMSummaryFactory

If you instantiate it manually, pass model=mmm when you need transform-backed curve summaries:

summary = MMMSummaryFactory(mmm.data, model=mmm)

Main methods:

MethodPurpose
posterior_predictive(...)Predictive summary table with observed target
contributions(...)Tidy contribution summaries
mean_contributions_over_time(...)Wide decomposition table
roas(...)ROAS summary
cost_per_target(...)Cost-per-target summary
efficiency(...)Target-type-aware efficiency summary
channel_spend(...)Raw spend table
saturation_curves(...)Saturation curve summary table
adstock_curves(...)Adstock curve summary table
total_contribution(...)Totals by component type
change_over_time(...)Percentage change in channel contributions

MMMSummaryFactory also exposes:

  • hdi_probs
  • output_format
  • efficiency_metric
  • efficiency_metric_label

mmm.diagnostics

mmm.diagnostics returns MMMDiagnosticsFactory.

Direct import path:

from abacus.mmm.diagnostics.factory import MMMDiagnosticsFactory

Main methods:

MethodPurpose
design_summary(X, ...)Per-variable design checks
design_report(X, ...)Machine-readable design report
mcmc_summary(...)Parameter-level MCMC diagnostics
mcmc_report(...)Machine-readable MCMC report
predictive_summary(...)Aggregate predictive metrics
predictive_report(...)Machine-readable predictive report
bayesian_criteria_summary()LOO, WAIC and Pareto-k summary table
bayesian_criteria_report()Typed BayesianCriteriaReport with to_dict()

The report methods return typed dataclass objects with to_dict().

Bayesian criteria

Both criteria methods require an InferenceData.log_likelihood group. The standalone functions accept idata directly and are exported from abacus.mmm.diagnostics.

from abacus.mmm.diagnostics import (
    bayesian_criteria_report,
    bayesian_criteria_summary,
)

bayesian_criteria_summary(idata) returns a pandas DataFrame with metric, estimate, se, warning and likelihood_basis columns. Rows cover LOO ELPD, WAIC ELPD, maximum Pareto-k and counts above 0.7 and 1.0. bayesian_criteria_report(idata) returns a BayesianCriteriaReport with ELPD estimates and standard errors, effective parameter counts, LOO/WAIC warnings, Pareto-k summaries, observation counts and the likelihood basis.

FE reports contrast_space; other models report level_space. CRE scores marginal unit blocks, so that label alone does not establish comparability with an ordinary level-observation likelihood. Require matching observation units, scale and prediction task before comparing scores. See Model comparison.

Stage 50 retains bayesian_criteria_summary.csv, bayesian_criteria_report.json and the equivalent elpd_summary.csv table. These are predictive diagnostics. Warnings require interpretation and do not establish a causal conclusion or automatically choose a model.

mmm.plot

mmm.plot returns MMMPlotSuite.

Direct import path:

from abacus.mmm.plot import MMMPlotSuite

PanelMMM binds this automatically to the model’s idata, but the class also supports compatible custom InferenceData objects.

Main methods:

MethodPurpose
posterior_predictive(...)Plot fitted or sampled predictive series
prior_predictive(...)Plot prior predictive series
residuals_over_time(...)Plot residual trajectories
residuals_posterior_distribution(...)Plot residual posterior distributions
contributions_over_time(...)Plot time-series contributions
posterior_distribution(...)Plot posterior violin distributions
channel_parameter(...)Plot channel-level parameter posteriors
prior_vs_posterior(...)Compare prior and posterior distributions
saturation_scatterplot(...)Plot spend-versus-contribution scatter views
saturation_curves(...)Plot sampled saturation curves
waterfall_components_decomposition(...)Plot waterfall decompositions
media_contribution_over_time(...)Plot stacked media contributions
channel_contribution_share_hdi(...)Plot contribution share intervals
budget_allocation(...)Plot optimisation allocation outputs
allocated_contribution_by_channel_over_time(...)Plot simulated allocation contributions

Direct idata utilities

The abacus.data.idata package also exports schema and utility helpers:

ImportPurpose
MMMIdataSchemaExpected structure for retained MMM InferenceData
VariableSchemaVariable-level schema helper
InferenceDataGroupSchemaGroup-level schema helper
filter_idata_by_dates(...)Filter idata on a date window
filter_idata_by_dims(...)Filter idata on non-date dimensions
aggregate_idata_time(...)Aggregate idata over time
aggregate_idata_dims(...)Aggregate idata over non-time dims
subsample_draws(...)Subsample posterior draws