LinearTrendEffect#

class pymc_marketing.mmm.additive_effect.LinearTrendEffect(**data)[source]#

Wrapper for LinearTrend to use with MMM’s MuEffect protocol.

This class adapts the LinearTrend component to be used as an additive effect in the MMM model.

Parameters:
trendLinearTrend

The LinearTrend instance to wrap.

prefixstr

The prefix to use for variables in the model.

date_dim_namestr

The name of the date dimension in the model.

Examples

Out of sample predictions:

Note

No new changepoints are used for the out of sample predictions. The trend effect is linearly extrapolated from the last changepoint.

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt

import pymc as pm
import pymc.dims as pmd

from pymc_marketing.mmm.linear_trend import LinearTrend
from pymc_marketing.mmm.additive_effect import LinearTrendEffect

seed = sum(map(ord, "LinearTrend out of sample"))
rng = np.random.default_rng(seed)

class MockMMM:
    pass

dates = pd.date_range("2025-01-01", periods=52, freq="W")
coords = {"date": dates}
model = pm.Model(coords=coords)

mock_mmm = MockMMM()
mock_mmm.dims = ()
mock_mmm.model = model

effect = LinearTrendEffect(
    trend=LinearTrend(n_changepoints=8),
    prefix="trend",
)

with mock_mmm.model:
    effect.create_data(mock_mmm)
    pmd.Deterministic(
        "effect",
        effect.create_effect(mock_mmm),
        dims="date",
    )

    idata = pm.sample_prior_predictive(random_seed=rng)

idata["posterior"] = idata.prior

n_new = 10 + 1
new_dates = pd.date_range(
    dates.max(),
    periods=n_new,
    freq="W",
)

with mock_mmm.model:
    mock_mmm.model.set_dim("date", n_new, new_dates)

    effect.set_data(mock_mmm, mock_mmm.model, None)

    pm.sample_posterior_predictive(
        idata,
        var_names=["effect"],
        random_seed=rng,
        extend_inferencedata=True,
    )

draw = rng.choice(range(idata.posterior.sizes["draw"]))
sel = dict(chain=0, draw=draw)

before = idata.posterior.effect.sel(sel).to_series()
after = idata.posterior_predictive.effect.sel(sel).to_series()

ax = before.plot(color="C0")
after.plot(color="C0", linestyle="dashed", ax=ax)
plt.show()

(Source code, png, hires.png, pdf)

../../_images/pymc_marketing-mmm-additive_effect-LinearTrendEffect-1.png

Methods

LinearTrendEffect.__init__(**data)

Create a new model by parsing and validating input data from keyword arguments.

LinearTrendEffect.construct([_fields_set])

LinearTrendEffect.copy(*[, include, ...])

Returns a copy of the model.

LinearTrendEffect.create_data(mmm)

Create the required data in the model.

LinearTrendEffect.create_effect(mmm)

Create the trend effect in the model.

LinearTrendEffect.dict(*[, include, ...])

LinearTrendEffect.from_dict(data)

Reconstruct from a dict, using registry for nested LinearTrend.

LinearTrendEffect.from_orm(obj)

LinearTrendEffect.json(*[, include, ...])

LinearTrendEffect.model_parametrized_name(params)

Compute the class name for parametrizations of generic classes.

LinearTrendEffect.parse_file(path, *[, ...])

LinearTrendEffect.parse_obj(obj)

LinearTrendEffect.parse_raw(b, *[, ...])

LinearTrendEffect.schema([by_alias, ...])

LinearTrendEffect.schema_json(*[, by_alias, ...])

LinearTrendEffect.set_data(mmm, model, X)

Set the data for new predictions.

LinearTrendEffect.to_dict([_orig])

Serialize to a dict via Pydantic model_dump.

LinearTrendEffect.update_forward_refs(**localns)

LinearTrendEffect.validate(value)

Attributes

model_computed_fields

model_config

Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].

model_extra

Get extra fields set during validation.

model_fields

model_fields_set

Returns the set of fields that have been explicitly set on this model instance.

trend

prefix

date_dim_name

linear_trend_first_date