efecto_aditivo#

Efectos aditivos para el modelo de mezcla de marketing multidimensional.

Ejemplo de un efecto aditivo personalizado#

  1. Componente de efecto negativo personalizado (agregado como un MuEffect)

import numpy as np
import pandas as pd
import pymc as pm
import pymc.dims as pmd
from pymc_extras.prior import create_dim_handler

# A simple custom effect that penalizes certain dates/segments with a
# negative-only coefficient. This is not a "control" in the MMM sense, so
# give it a different name/prefix to avoid clashing with built-in controls.
class PenaltyEffect:
    '''Example MuEffect that applies a negative coefficient to a user-specified pattern.
    '''

    def __init__(self, name: str, penalty_provider):
        self.name = name
        self.penalty_provider = penalty_provider

    def create_data(self, mmm):
        # Produce penalty values aligned with model dates (and optional extra dims)
        dates = safe_to_datetime(mmm.model.coords["date"], "date")
        penalty = self.penalty_provider(dates)
        pmd.Data(f"{self.name}_penalty", penalty, dims=("date", *mmm.dims))

    def create_effect(self, mmm):
        model = mmm.model
        penalty = model[f"{self.name}_penalty"]  # dims: (date, *mmm.dims)

        # Negative-only coefficient per extra dims, broadcast over date
        coef = pmd.TruncatedNormal(f"{self.name}_coef", mu=-0.5, sigma=-0.05, lower=-1.0, upper=0.0, dims=mmm.dims)

        dim_handler = create_dim_handler(("date", *mmm.dims))
        effect = pmd.Deterministic(
            f"{self.name}_effect_contribution",
            dim_handler(coef, mmm.dims) * penalty,
            dims=("date", *mmm.dims),
        )
        return effect  # Must have dims ("date", *mmm.dims)

    def set_data(self, mmm, model, X):
        # Update to future dates during posterior predictive
        dates = safe_to_datetime(model.coords["date"], "date")
        penalty = self.penalty_provider(dates)
        pm.set_data({f"{self.name}_penalty": penalty}, model=model)

Usage
-----
# Example weekend penalty (Sat/Sun = 1, else 0), applied per geo if present
weekend_penalty = PenaltyEffect(
    name="brand_penalty",
    penalty_provider=lambda dates: pd.Series(dates)
    .dt.dayofweek.isin([5, 6])
    .astype(float)
    .to_numpy()[:, None]  # if mmm.dims == ("geo",), broadcast over geo
)

# Build your MMM as usual (with channels, etc.), then add the effect before build/fit:
# mmm = MMM(...)
# mmm.mu_effects.append(weekend_penalty)
# mmm.build_model(X, y)
# mmm.fit(X, y, ...)
# At prediction time, the effect updates itself via set_data.

Cómo funciona#

  • Los efectos Mu siguen un protocolo simple: create_data(mmm), create_effect(mmm), y set_data(mmm, model, X).

  • During MMM.build_model(...), each effect’s create_data is called first to introduce any needed pmd.Data. Then create_effect must return a tensor with dims («date», *mmm.dims) that is added additively to the model mean.

  • During posterior predictive, set_data is called with the cloned PyMC model and the new coordinates; update any pmd.Data you created using pm.set_data.

Consejos para componentes personalizados#

  • Utilice prefijos de variable únicos para evitar conflictos de nombres con elementos integrados como los controles. No llame a su componente «control»; elija un nombre/prefijo distinto.

  • Siga los patrones utilizados por los efectos proporcionados en este módulo (por ejemplo, FourierEffect, LinearTrendEffect, EventAdditiveEffect): - En create_data, derive y registre cualquier entrada requerida en el modelo. - En create_effect, construya expresiones de PyTensor y devuelva una contribución.

    con dims («date», *mmm.dims). Si necesita broadcasting, utilice pymc_extras.prior.create_dim_handler como se mostró arriba.

    • En set_data, actualice las variables de datos cuando cambien las fechas/dimensiones.

Functions

safe_to_datetime(coords_values[, ...])

Safely convert coordinates to datetime, with validation.

Clases

EventAdditiveEffect(**data)

Clase de efecto de evento para el MMM.

FourierEffect(**data)

Efecto aditivo de estacionalidad de Fourier para MMM.

LinearTrendEffect(*, trend, prefix[, ...])

Envoltura para LinearTrend para usar con el protocolo MuEffect de MMM.

Modelo(*args, **kwargs)

Protocolo MMM.

MuEffect(**data)

Abstract base class for arbitrary additive mu effects.