PyMC Distributions Skill
You are an expert in PyMC probability distributions, helping migrate notebook code to work with the current stable PyMC version.
Distribution Categories
Continuous Distributions
Common distributions include:
pm.Normal(mu, sigma) - Gaussian/normal distribution
pm.Beta(alpha, beta) - Beta distribution (0, 1)
pm.Gamma(alpha, beta) - Gamma distribution
pm.Exponential(lam) - Exponential distribution
pm.StudentT(nu, mu, sigma) - Student's t-distribution
pm.Uniform(lower, upper) - Uniform distribution
pm.HalfNormal(sigma) - Half-normal (positive only)
pm.LogNormal(mu, sigma) - Log-normal distribution
pm.Cauchy(alpha, beta) - Cauchy distribution
pm.Laplace(mu, b) - Laplace distribution
pm.SkewNormal(mu, sigma, alpha) - Skewed normal
Discrete Distributions
pm.Bernoulli(p) - Binary outcomes
pm.Binomial(n, p) - Count of successes
pm.Poisson(mu) - Count data
pm.Categorical(p) - Categorical outcomes
pm.NegativeBinomial(mu, alpha) - Overdispersed count data
pm.DiscreteUniform(lower, upper) - Discrete uniform
Multivariate Distributions
pm.MvNormal(mu, cov) - Multivariate normal
pm.Dirichlet(a) - Dirichlet distribution
pm.Wishart(nu, V) - Wishart distribution
pm.LKJCorr(n, eta) - LKJ correlation prior
pm.LKJCholeskyCov(n, eta, sd_dist) - Cholesky parameterization
Mixture Distributions
pm.Mixture(w, comp_dists) - General mixture
pm.NormalMixture(w, mu, sigma) - Gaussian mixture
pm.ZeroInflatedPoisson(psi, mu) - Zero-inflated count
pm.ZeroInflatedBinomial(psi, n, p) - Zero-inflated binomial
pm.HurdleGamma(psi, alpha, beta) - Hurdle model
Timeseries Distributions
pm.AR(rho, sigma) - Autoregressive
pm.GaussianRandomWalk(mu, sigma) - Random walk
pm.GARCH11(omega, alpha_1, beta_1) - GARCH model
pm.EulerMaruyama(dt, sde_fn, sde_pars) - SDE approximation
Special Features
Truncated/Censored Distributions
# Truncated distribution
pm.Truncated("x", pm.Normal.dist(mu=0, sigma=1), lower=0, upper=10)
# Censored distribution
pm.Censored("y", pm.Normal.dist(mu=0, sigma=1), lower=None, upper=5)
Custom Distributions
# Define custom distribution
def custom_logp(value, mu):
return -0.5 * ((value - mu) ** 2)
pm.CustomDist("custom", mu, logp=custom_logp, observed=data)
Simulator Integration
pm.Simulator("sim", fn=simulator_function, params=[param1, param2], observed=data)
Common Parameters
Most distributions accept:
name - Variable name (required for RVs in model)
- Distribution-specific parameters (mu, sigma, alpha, etc.)
shape - Shape of the random variable
dims - Named dimensions for the variable
observed - Observed data (makes it a likelihood)
transform - Transformation for parameter constraints
Key Methods
# Log-probability
dist.logp(value)
# Log cumulative distribution
dist.logcdf(value)
# Inverse CDF (quantile function)
dist.icdf(q)
# Random sampling (outside of pm.sample)
dist.random(size=100, rng=rng)
Common Migration Issues
PyMC3 → latest PyMC version
- Import changes
# Old (PyMC3)
import pymc3 as pm
# New (latest PyMC version)
import pymc as pm
- Distribution parameters
# Some distributions have parameter renames
# Check documentation for specific changes
# Old: sd parameter
pm.Normal('x', mu=0, sd=1) # PyMC3
# New: sigma parameter
pm.Normal('x', mu=0, sigma=1) # latest PyMC version
- Shape specification
# Shape handling is more explicit in latest PyMC version
# Use dims and coords for cleaner shape management
with pm.Model(coords={"subject": subjects, "time": times}) as model:
x = pm.Normal("x", mu=0, sigma=1, dims=("subject", "time"))
- Distribution creation
# Creating distributions without adding to model
# Old
dist = pm.Normal.dist(mu=0, sd=1)
# New
dist = pm.Normal.dist(mu=0, sigma=1)
Best Practices
- Use informative priors - Weakly informative priors often work better than flat priors
- Named dimensions - Use
dims and coords for better shape management
- Vectorization - Leverage broadcasting for efficient computation
- Prior predictive checks - Always check priors make sense before sampling
- Transformations - Let PyMC handle constraints automatically when possible
Troubleshooting
Shape mismatches
- Check that observed data shape matches distribution shape
- Verify broadcasting rules are applied correctly
- Use
pm.model_to_graphviz(model) to visualize shapes
Invalid parameter values
- Ensure positive constraints (use HalfNormal, Exponential, etc.)
- Check bounds for bounded distributions
- Verify probability parameters are in (0, 1)
Sampling issues
- Some distributions may need specific step samplers
- Consider reparameterization for better geometry
- Use
pm.find_MAP() to check if model is well-specified
Example Usage
import pymc as pm
import numpy as np
# Generate data
true_mu = 5
true_sigma = 2
data = np.random.normal(true_mu, true_sigma, size=100)
# Build model
with pm.Model() as model:
# Priors
mu = pm.Normal("mu", mu=0, sigma=10)
sigma = pm.HalfNormal("sigma", sigma=5)
# Likelihood
y = pm.Normal("y", mu=mu, sigma=sigma, observed=data)
# Sample
trace = pm.sample(1000, tune=1000)
When to Use This Skill
- Converting distribution specifications from old notebooks
- Fixing distribution parameter errors
- Implementing custom distributions
- Troubleshooting likelihood specifications
- Choosing appropriate priors
- Handling mixture models or zero-inflation
1---2name: pymc-distributions3description: Expert on PyMC probability distributions including continuous (Normal, Beta, Gamma), discrete (Poisson, Binomial), multivariate (MvNormal, Dirichlet), mixture, and timeseries distributions. Use when encountering distribution errors, parameter issues, or migrating PyMC3 distribution code.4---56# PyMC Distributions Skill78You are an expert in PyMC probability distributions, helping migrate notebook code to work with the current stable PyMC version.910## Distribution Categories1112### Continuous Distributions13Common distributions include:14- `pm.Normal(mu, sigma)` - Gaussian/normal distribution15- `pm.Beta(alpha, beta)` - Beta distribution (0, 1)16- `pm.Gamma(alpha, beta)` - Gamma distribution17- `pm.Exponential(lam)` - Exponential distribution18- `pm.StudentT(nu, mu, sigma)` - Student's t-distribution19- `pm.Uniform(lower, upper)` - Uniform distribution20- `pm.HalfNormal(sigma)` - Half-normal (positive only)21- `pm.LogNormal(mu, sigma)` - Log-normal distribution22- `pm.Cauchy(alpha, beta)` - Cauchy distribution23- `pm.Laplace(mu, b)` - Laplace distribution24- `pm.SkewNormal(mu, sigma, alpha)` - Skewed normal2526### Discrete Distributions27- `pm.Bernoulli(p)` - Binary outcomes28- `pm.Binomial(n, p)` - Count of successes29- `pm.Poisson(mu)` - Count data30- `pm.Categorical(p)` - Categorical outcomes31- `pm.NegativeBinomial(mu, alpha)` - Overdispersed count data32- `pm.DiscreteUniform(lower, upper)` - Discrete uniform3334### Multivariate Distributions35- `pm.MvNormal(mu, cov)` - Multivariate normal36- `pm.Dirichlet(a)` - Dirichlet distribution37- `pm.Wishart(nu, V)` - Wishart distribution38- `pm.LKJCorr(n, eta)` - LKJ correlation prior39- `pm.LKJCholeskyCov(n, eta, sd_dist)` - Cholesky parameterization4041### Mixture Distributions42- `pm.Mixture(w, comp_dists)` - General mixture43- `pm.NormalMixture(w, mu, sigma)` - Gaussian mixture44- `pm.ZeroInflatedPoisson(psi, mu)` - Zero-inflated count45- `pm.ZeroInflatedBinomial(psi, n, p)` - Zero-inflated binomial46- `pm.HurdleGamma(psi, alpha, beta)` - Hurdle model4748### Timeseries Distributions49- `pm.AR(rho, sigma)` - Autoregressive50- `pm.GaussianRandomWalk(mu, sigma)` - Random walk51- `pm.GARCH11(omega, alpha_1, beta_1)` - GARCH model52- `pm.EulerMaruyama(dt, sde_fn, sde_pars)` - SDE approximation5354## Special Features5556### Truncated/Censored Distributions57```python58# Truncated distribution59pm.Truncated("x", pm.Normal.dist(mu=0, sigma=1), lower=0, upper=10)6061# Censored distribution62pm.Censored("y", pm.Normal.dist(mu=0, sigma=1), lower=None, upper=5)63```6465### Custom Distributions66```python67# Define custom distribution68def custom_logp(value, mu):69 return -0.5 * ((value - mu) ** 2)7071pm.CustomDist("custom", mu, logp=custom_logp, observed=data)72```7374### Simulator Integration75```python76pm.Simulator("sim", fn=simulator_function, params=[param1, param2], observed=data)77```7879## Common Parameters8081Most distributions accept:82- `name` - Variable name (required for RVs in model)83- Distribution-specific parameters (mu, sigma, alpha, etc.)84- `shape` - Shape of the random variable85- `dims` - Named dimensions for the variable86- `observed` - Observed data (makes it a likelihood)87- `transform` - Transformation for parameter constraints8889## Key Methods9091```python92# Log-probability93dist.logp(value)9495# Log cumulative distribution96dist.logcdf(value)9798# Inverse CDF (quantile function)99dist.icdf(q)100101# Random sampling (outside of pm.sample)102dist.random(size=100, rng=rng)103```104105## Common Migration Issues106107### PyMC3 → latest PyMC version1081091. **Import changes**110```python111# Old (PyMC3)112import pymc3 as pm113114# New (latest PyMC version)115import pymc as pm116```1171182. **Distribution parameters**119```python120# Some distributions have parameter renames121# Check documentation for specific changes122123# Old: sd parameter124pm.Normal('x', mu=0, sd=1) # PyMC3125126# New: sigma parameter127pm.Normal('x', mu=0, sigma=1) # latest PyMC version128```1291303. **Shape specification**131```python132# Shape handling is more explicit in latest PyMC version133# Use dims and coords for cleaner shape management134135with pm.Model(coords={"subject": subjects, "time": times}) as model:136 x = pm.Normal("x", mu=0, sigma=1, dims=("subject", "time"))137```1381394. **Distribution creation**140```python141# Creating distributions without adding to model142# Old143dist = pm.Normal.dist(mu=0, sd=1)144145# New146dist = pm.Normal.dist(mu=0, sigma=1)147```148149## Best Practices1501511. **Use informative priors** - Weakly informative priors often work better than flat priors1522. **Named dimensions** - Use `dims` and `coords` for better shape management1533. **Vectorization** - Leverage broadcasting for efficient computation1544. **Prior predictive checks** - Always check priors make sense before sampling1555. **Transformations** - Let PyMC handle constraints automatically when possible156157## Troubleshooting158159### Shape mismatches160- Check that observed data shape matches distribution shape161- Verify broadcasting rules are applied correctly162- Use `pm.model_to_graphviz(model)` to visualize shapes163164### Invalid parameter values165- Ensure positive constraints (use HalfNormal, Exponential, etc.)166- Check bounds for bounded distributions167- Verify probability parameters are in (0, 1)168169### Sampling issues170- Some distributions may need specific step samplers171- Consider reparameterization for better geometry172- Use `pm.find_MAP()` to check if model is well-specified173174## Example Usage175176```python177import pymc as pm178import numpy as np179180# Generate data181true_mu = 5182true_sigma = 2183data = np.random.normal(true_mu, true_sigma, size=100)184185# Build model186with pm.Model() as model:187 # Priors188 mu = pm.Normal("mu", mu=0, sigma=10)189 sigma = pm.HalfNormal("sigma", sigma=5)190191 # Likelihood192 y = pm.Normal("y", mu=mu, sigma=sigma, observed=data)193194 # Sample195 trace = pm.sample(1000, tune=1000)196```197198## When to Use This Skill199200- Converting distribution specifications from old notebooks201- Fixing distribution parameter errors202- Implementing custom distributions203- Troubleshooting likelihood specifications204- Choosing appropriate priors205- Handling mixture models or zero-inflation