我有一些观测数据需要估计参数,想着试试PYMC3。我的数据结构是一系列记录。每个记录包含一对与固定一小时期间相关的观测值。一个观测值是在给定小时内发生的事件总数,另一个观测值是该时间段内成功的数量。例如,一个数据点可能指定在给定的一个1小时周期内,总共有1000个事件,其中100个是成功的。在另一个时间段,总共可能有1000000个事件,其中120000个是成功的。观测值的方差不是恒定的,并且取决于总事件数,部分原因是我想要控制和建模的效应。
我的第一步是估计潜在成功率。我准备了下面的代码,旨在通过使用scipy生成两组'观察到'数据来模拟情况。但它不能正常工作。我希望它能找到:
- loss_lambda_factor大致为0.1
- total_lambda(和total_lambda_mu)大致为120。
相反,模型非常快地收敛,但却得到了意外的答案:
- total_lambda和total_lambda_mu分别是5e5左右的尖峰。
- loss_lambda_factor大约为0。
跟踪图(由于声望低于10,无法发布)相当无聊-快速收敛,并且尖峰位于不对应输入数据的数字。 我很想知道我采取的方法是否基本上是错误的。如何修改以下代码以给出正确/预期结果?
from pymc import Model, Uniform, Normal, Poisson, Metropolis, traceplot
from pymc import sample
import scipy.stats
totalRates = scipy.stats.norm(loc=120, scale=20).rvs(size=10000)
totalCounts = scipy.stats.poisson.rvs(mu=totalRates)
successRate = 0.1*totalRates
successCounts = scipy.stats.poisson.rvs(mu=successRate)
with Model() as success_model:
total_lambda_tau= Uniform('total_lambda_tau', lower=0, upper=100000)
total_lambda_mu = Uniform('total_lambda_mu', lower=0, upper=1000000)
total_lambda = Normal('total_lambda', mu=total_lambda_mu, tau=total_lambda_tau)
total = Poisson('total', mu=total_lambda, observed=totalCounts)
loss_lambda_factor = Uniform('loss_lambda_factor', lower=0, upper=1)
success_rate = Poisson('success_rate', mu=total_lambda*loss_lambda_factor, observed=successCounts)
with success_model:
step = Metropolis()
success_samples = sample(20000, step) #, start)
plt.figure(figsize=(10, 10))
_ = traceplot(success_samples)