Correct value learned with messed up convergence and statistics

My model predicts correctly the p value for a geometric distribution i use for convolution.
BUT, the convergence statistics are bad / wrong and sampling takes forever unless i set tune/draws to 100.

I feel i miss something very basic here, maybe someone can point me into the correct direction:

The model

model = pm.Model()

base_vector = pt.as_tensor_variable(([1.0]+[0.0]*9))

# corresponds to a convolution of base_vector with pm.Geometric.dist(0.25)
geometric_convolution = pt.as_tensor_variable(
      [0.26491849, 0.19868887, 0.14901665, 0.11176249, 0.08382187,
       0.0628664 , 0.0471498, 0.03536235, 0.02652176, 0.01989132])

with model:

    p= pm.Beta('p', alpha=1, beta=1)
    distribution = pm.Geometric.dist(p)

    convoluted_series = convolve1d(base_vector, distribution, 10)
    sigma = pm.HalfNormal('sigma',0.1)
    observed_convolution = pm.Normal('observed_convolution', mu=convoluted_series, sigma=sigma, observed=geometric_convolution)

    trace = pm.sample(tune=100, draws=100) 

The trace statistics:
p: mean=0.25 , sd=0 , r_hat = 1.43
sigma: mean=0, sd=0 , r_hat = 2.36

The convolution function:

import pytensor.tensor as pt
import pytensor.tensor.conv as conv

def convolve1d(x, distribution, length):

    dist_pdf = pt.exp(pm.logp(distribution, pt.arange(1, length+1, 1)))
    dist_pdf_normalized = dist_pdf / pt.sum(dist_pdf)
  
    convolved = conv.conv2d(input=x[np.newaxis, np.newaxis,: ,np.newaxis],
                    filters=dist_pdf_normalized[np.newaxis, np.newaxis,  :, np.newaxis],
                    border_mode='full')

    return convolved[0, 0, :-length+1 ].T[0]

Ok, i never had the problem that a model fits just to well. My test data is just not dirty enough to allow some space for the sampler to wiggle in uncertainity.

When I dirty up my test data, it works fine. e.g.:

geometric_convolution = pt.as_tensor_variable(
[0.26, 0.19, 0.14, 0.11, 0.08,
0.06 , 0.04, 0.03, 0.02, 0.019])

1 Like

If you want to fit data with really little noise it’s better to use the precision parameterization of the normal (use the tau kwarg instead of sigma). But I’ve been surprised by this “problem” myself in the past!

Thank you @jessegrabowski . Its good to know that others also had such ‘aha’ moments too. It makes me feel less stupid ,)