#8190·pymc

ENH: Add ZeroOneInflatedBeta (Port from brms)

Author: nshin0911Created Mar 14, 2026Updated Aug 24, 2026
Labelsfeature request

Before

python
#Observed array of values in [0,1] is 'data' with excess zeros, ones
#Users have to fall back to a pm.Mixture approximation

import pymc as pm

with pm.Model() as model:
    zoi = pm.Beta('zoi', alpha = 1, beta = 1) #probability of zero or one (boundaries)
    coi = pm.Beta('coi', alpha = 1, beta = 1) #conditional given zoi, probability of one
    mu = pm.Beta('mu', alpha=1, beta=1)       # Mean of beta component
    kappa = pm.Gamma('kappa', alpha=2, beta=0.1)  # Precision of beta component, also phi

    #Approximate point masses with epsilon
    epsilon = 1e-6
    #Components for mixture
    zero_component = pm.Uniform.dist(lower=0, upper=epsilon)
    one_component = pm.Uniform.dist(lower=1-epsilon, upper=1)
    beta_component = pm.Beta.dist(mu=mu, kappa=kappa)
    
    #Mixture weights
    w = [zoi * (1 - coi), zoi * coi, 1 - zoi]
    
    y = pm.Mixture(
        'y',
        w=w,
        comp_dists=[zero_component, one_component, beta_component],
        observed=data
    )

After

python
#Observed array of values in [0,1] is 'data' with excess zeros, ones

import pymc as pm

with pm.Model() as model:
    zoi = pm.Beta('zoi', alpha = 1, beta = 1) #probability of zero or one (boundaries)
    coi = pm.Beta('coi', alpha = 1, beta = 1) #conditional given zoi, probability of one
    mu = pm.Beta('mu', alpha=1, beta=1)       # Mean of beta component
    kappa = pm.Gamma('kappa', alpha=2, beta=0.1)  # Precision of beta component, also phi

    y = pm.ZeroOneInflatedBeta(
        'y',
        zoi = zoi,
        coi = coi,
        mu = mu,
        kappa = kappa,
        observed = data
    )

Context for the issue:

Motivation: The zero-one-inflated beta distribution is useful for modeling proportion/rate data on [0,1] with excess zeros and ones. Common in:

  • Healthcare: proportion of wound area healed
  • Ecology: proportion of area covered by vegetation
  • Economics: proportion of the budget allocated

Existing Implementation: brms (R/Stan): HERE

The plan for implementation includes following the pattern of ZeroInflatedPoisson and HurdleGamma, but with an additional boundary.

I am willing to implement this and have posted on Discourse for design feedback: HERE

References:

  • Ospina & Ferrari (2010). Inflated beta distributions.
  • Ospina & Ferrari (2012). Zero-or-one inflated beta regression models.