我在这里发布了一个python笔记本:http://nbviewer.ipython.org/gist/awellis/9067358
我正在尝试使用PyMC 3创建一个probit回归模型,使用生成的数据来恢复已知参数(参见笔记本)。对拦截的估计几乎没有问题,但是斜率估计是偏离标记的。
我的模型看起来像这样:
with pm.Model() as model:
# priors
alpha = pm.Normal('alpha', mu=0, tau=0.001)
beta = pm.Normal('beta', mu=0, tau=0.001)
# linear predictor
theta_p = (alpha + beta * x)
# logic transform (just for comparison - this seems to work ok)
# def invlogit(x):
# import theano.tensor as t
# return t.exp(x) / (1 + t.exp(x))
# theta = invlogit(theta_p)
# Probit transform: this doesn't work
def phi(x):
import theano.tensor as t
return 0.5 * (1 + t.erf(x / t.sqr(2)))
theta = phi(theta_p)
# likelihood
y = pm.Bernoulli('y', p=theta, observed=y)
with model:
# Inference
start = pm.find_MAP() # Find starting value by optimization
print("MAP found:")
print("alpha:", start['alpha'])
print("beta:", start['beta'])
print("Compare with true values:")
print("true_alpha", true_alpha)
print("true_beta", true_beta)
with model:
step = pm.NUTS()
trace = pm.sample(2000,
step,
start=start,
progressbar=True) # draw posterior samples
它似乎工作的唯一方法是使用Theano来定义phi(x),使用错误函数,类似于PyMC存储库中的逻辑回归示例。
有人能指出我正确的方向吗?有更好/更简单的方法吗?
答案 0 :(得分:2)
这可能是在马拴了一下之后很久,但我自己刚试过一个简单的分层二项模型并发现了与logit函数相当的结果。
我唯一的区别是我使用了张量sqrt()函数。可能只是你的错字?
import theano.tensor as tsr
def probit_phi(x):
""" Probit transform assuming 0 mean and 1 sd """
mu = 0
sd = 1
return 0.5 * (1 + tsr.erf((x - mu) / (sd * tsr.sqrt(2))))