Continuo no contractual#

from pymc_marketing.clv.distributions import ContNonContract

import numpy as np
import pandas as pd

import pymc as pm

import matplotlib.pyplot as plt
import arviz as az

Valores de Parámetros de Verdad Fundamental#

rng = np.random.RandomState(seed=34)
T = 10
T0 = 0

# individual-level model
lam = 0.5; p = 0.3

Muestreo del Prior#

Realizaremos inferencias sobre los datos anteriores para estimar los valores de lam y p, que se han establecido en 0.5 y 0.3 respectivamente.

cnc = ContNonContract.dist(
    lam=lam,
    p=p,
    T=T,
)

prior_data = pm.draw(cnc, draws=10000)

Inferencia Posterior#

with pm.Model() as model:

    λ = pm.Gamma(name="λ", alpha=0.1, beta=0.1)
    π = pm.Beta(name="π", alpha=0.1, beta=0.1)
    
    cnc = ContNonContract(
        name="cnc",
        lam=λ,
        p=π,
        T=T,
        observed=prior_data
    )
    
    trace = pm.sample(draws=1000, chains=1, tune=500)
Auto-assigning NUTS sampler...
Initializing NUTS using jitter+adapt_diag...
---------------------------------------------------------------------------
SamplingError                             Traceback (most recent call last)
Cell In[5], line 14
      4 π = pm.Beta(name="π", alpha=0.1, beta=0.1)
      6 cnc = ContNonContract(
      7     name="cnc",
      8     lam=λ,
   (...)
     11     observed=prior_data
     12 )
---> 14 trace = pm.sample(draws=1000, chains=1, tune=500)

File ~/miniforge3/envs/pymmmc_env/lib/python3.8/site-packages/pymc/sampling/mcmc.py:619, in sample(draws, tune, chains, cores, random_seed, progressbar, step, nuts_sampler, initvals, init, jitter_max_retries, n_init, trace, discard_tuned_samples, compute_convergence_checks, keep_warning_stat, return_inferencedata, idata_kwargs, nuts_sampler_kwargs, callback, mp_ctx, model, **kwargs)
    617 ip: Dict[str, np.ndarray]
    618 for ip in initial_points:
--> 619     model.check_start_vals(ip)
    620     _check_start_shape(model, ip)
    622 # Create trace backends for each chain

File ~/miniforge3/envs/pymmmc_env/lib/python3.8/site-packages/pymc/model.py:1779, in Model.check_start_vals(self, start)
   1776 initial_eval = self.point_logps(point=elem)
   1778 if not all(np.isfinite(v) for v in initial_eval.values()):
-> 1779     raise SamplingError(
   1780         "Initial evaluation of model at starting point failed!\n"
   1781         f"Starting values:\n{elem}\n\n"
   1782         f"Initial evaluation results:\n{initial_eval}"
   1783     )

SamplingError: Initial evaluation of model at starting point failed!
Starting values:
{'λ_log__': array(0.16243669), 'π_logodds__': array(0.251218)}

Initial evaluation results:
{'λ': -2.58, 'π': -3.12, 'cnc': -inf}
_ = az.plot_posterior(trace, ref_val=[lam, p])
plt.tight_layout()
prior_data
array([[7.47907972, 5.        ],
       [9.73741477, 6.        ],
       [3.98171609, 3.        ],
       ...,
       [3.86405931, 3.        ],
       [3.55657266, 4.        ],
       [9.70014652, 3.        ]])