在这里是新的,并通过各种参考资料中的示例进行工作。我已经看到了在 PyMC3 中使用分类变量构建分层模型的多种方法。作为一个玩具示例,假设我有一个收集过度分散的计数数据(例如消耗的单位)的系统,这些数据可以分解为多个阶段,与某个可用的地理层次结构(例如本地、区域等)相关联,以及在哪里是为影响计数结果而实施的多个过程。
我将以下模型结构放在一起,认为我可以分别对每个流程进行建模——尽管添加“流程”也会更有效。我已经在网上和参考资料中看到过这种结构的例子。
count = data['count'].values
phase_idx, phase = data['phase'].factorize(sort=True)
region_idx, region = data['region'].factorize(sort=True)
process_idx, process = process['process'].factorize(sort=True)
COORDS = {
'obs_id': np.arange(len(phase_idx)),
'phase': phase,
'region': region,
'process': process
}
with pm.Model(coords = COORDS) as count_model:
data = pm.Data('counts', count, dims=('obs_id'))
## Hyperpriors
mu_lam = pm.Exponential('mu_lam', lam=0.3)
a_lam = pm.Exponential('a_lam', lam=2)
## Priors
μ = pm.Exponential('μ', lam= mu_lam, dims= ('phase', 'region'))
α = pm.Exponential('α', lam= a_lam, dims = ('phase', 'region'))
# Likelihood
obs = pm.NegativeBinomial('obs', mu= μ[phase_idx, region_idx], \
alpha= α[phase_idx, region_idx], observed= data, dims= ('obs_id'))
idata_trace = pm.sample(draws= 10_000, tune=5_000, chains=2, target_accept= 0.95)
这是构建模型的有效方法吗?它使用组成的数据进行精细采样并提供感兴趣的输出 - 描述每个分类变量的 μ 周围的不确定性。
那么这三个变量呢?不幸的是,这三个变量一直在杀死我的内核。
# Likelihood
obs = pm.NegativeBinomial('obs', mu= μ[phase_idx, region_idx, process_idx], \
alpha= α[phase_idx, region_idx, process_idx], observed= data, dims= ('obs_id'))