Description
In this reproducible example, sampling from the model gives the correct
parameter estimates while pymc.find_MAP()
does not.
(I just installed the latest pymc version using conda in a new environment on Ubuntu)
I am modeling weight as a function of height, here is some simulated data:
import numpy as np
from scipy import stats
import pymc
n_individuals = 1000
alpha = 50
beta = 0.3
sigma = 5
height = np.random.uniform(130, 170, n_individuals)
mu = alpha + beta * (height-height.mean())
weight = stats.norm.rvs(loc=mu, scale=sigma, size=n_individuals)
When the prior for alpha is centered on the true value of alpha,
find_MAP() correctly estimates the values for alpha, beta and sigma:
with pymc.Model() as model:
alpha = pymc.Normal('alpha', mu=50, sigma=10)
beta = pymc.Lognormal('beta', mu=0, sigma=1)
sigma = pymc.Uniform('sigma', lower=0, upper=10)
mu = alpha + beta * (height-height.mean())
weight = pymc.Normal('height', mu=mu, sigma=sigma, observed=weight)
mean_q = pymc.find_MAP()
print(mean_q)
However, when the true value of alpha differs from the prior mean,
beta and sigma are estimated to be 0:
import numpy as np
from scipy import stats
import pymc
n_individuals = 1000
alpha = 30
beta = 0.3
sigma = 5
height = np.random.uniform(130, 170, n_individuals)
mu = alpha + beta * (height-height.mean())
weight = stats.norm.rvs(loc=mu, scale=sigma, size=n_individuals)
with pymc.Model() as model:
alpha = pymc.Normal('alpha', mu=50, sigma=10)
beta = pymc.Lognormal('beta', mu=0, sigma=1)
sigma = pymc.Uniform('sigma', lower=0, upper=10)
mu = alpha + beta * (height-height.mean())
weight = pymc.Normal('height', mu=mu, sigma=sigma, observed=weight)
mean_q = pymc.find_MAP()
print(mean_q)
Sampling from the model still returns the correct values for all three parameters:
with model:
trace = pymc.sample(1000, tune=1000)
pymc.summary(trace)
So I am wondering if this is a bug or if find_MAP() is supposed to fail in the second case.
If latter, I would have expected some error or warning being put out by the function.