我正在尝试使用pymc3来适应层次模型并遇到麻烦,看起来我的先验正在被采样但我的可能性不是。我尝试复制用于多次观察的here描述的方法。
我正在使用R中未标记的包中找到的野鸭数据集,作为pandas数据帧加载。您可以从我的GitHub页面here中获取我正在使用的CSV。简而言之,每行代表沿单个样带收集的最多三个观察结果(y1,y2和y3列)。我尝试删除任何y列或协变量(高程,森林覆盖率,调查长度)中缺少数据(NaN)的行,这似乎不会改变我遇到的问题。
mallard = pd.read_csv('mallard.csv')
elev, length, forest = mallard.elev, mallard.length, mallard.forest
# transpose ys to have same shape as series of each covariate (elev, length...)
observations = mallard[['y1','y2','y3']].T
num_transects = len(mallard)
with pm.Model() as mallard_model:
# priors
# detection probability considered constant across all transects and plots
prob = pm.Beta('prob', alpha=1, beta=1)
# priors for deterministic linear model of local abundance at a transect
# that applies to all plots within a transect
b0 = pm.Normal('b0', mu=0, sd=10) # intercept
b1 = pm.Normal('b1', mu=0, sd=10) # elevation
b2 = pm.Normal('b2', mu=0, sd=10) # forest cover
b3 = pm.Normal('b3', mu=0, sd=10) # survey length
# linear model of local abundance using log link
lam = pm.Deterministic('lam', pm.math.exp(b0 + b1*elev + b2*forest + b3*length))
# likelihood of observations
# Ni is abundance at a transect, with binomial distribution across
# plots within a transect
Ni = pm.Poisson('Ni', mu=lam, shape=num_transects)
Y_obs = pm.Binomial('Y_obs', n=Ni, p=prob, observed=observations)
# inference, use default step functions for each parameter
trace = pm.sample(draws=5000, init='ADVI', n_init=10000)#, step=pm.Metropolis())
plt.figure(figsize=(7, 7))
pm.traceplot(trace[100:]) # leave out first 100 draws as burn-in
plt.tight_layout()
这是出来的:
将NUTS分配给prob_logodds_
将NUTS分配给b0
将NUTS分配给b1
将NUTS分配给b2
将NUTS分配给b3
将大都会分配给Ni
指定大都会到Y_obs_missing
100%|████████████████████████████████| 5000/5000 [00:07< 00:00,675.88it / s]
我注意到没有使用ADVI报告初始化输出,这似乎令人不安。
我还发现,如果我强制模型使用特定的步骤函数(例如,我在上面的pm.Metropolis()
调用中注释掉的pm.sample
),我会对某些函数进行采样 - 但不是全部 - 参数。仍然没有初始化报告。
任何想法如何让这个工作?
答案 0 :(得分:0)
我遇到了类似的问题,只是我的观察数据不是number of observations
x number of variables
格式。结果只使用了第一次观察。
尝试observations = mallard[['y1','y2','y3']]
如果您想对后验使用进行抽样sample_ppc
答案 1 :(得分:0)
我认为你的模型中有几个问题:
离散参数不适用于advi和nut,我怀疑大都市采样器可以处理所有这些离散参数。在许多情况下,您可以将它们边缘化,但在这里您可能希望使用连续变量来代替种群大小。也许是这样的事情(这也考虑到人口规模低于观察到的数量是不可能的事实)
sd = pm.HalfCauchy('Ni_sd', beta=2.5)
trafo = pm.distributions.transforms.lowerbound(observations.max(axis=0))
Ni = pm.Gamma('Ni', mu=lam, sd=sd, shape=num_transects,
transform=trafo, testval=observations.max(axis=0) + 1)
我认为你的模型无法辨认:你是不是总是只增加所有人口规模并减少道具?我无法看到这个模型如何学习有关道具的任何有用信息。这些信息来自哪里?
为什么人口规模取决于调查长度?这种影响不应该支撑吗?或者它是一个区域?