Python——带收缩的PYMCβ二项式

Python——带收缩的PYMCβ二项式,python,bayesian,hierarchical,pymc,hierarchical-bayesian,Python,Bayesian,Hierarchical,Pymc,Hierarchical Bayesian,我正在努力实现一个贝叶斯层次模型 基本上,我正试图用这种结构建立一个模型 我有数据显示当一个球被抛向他们时,每个人能击中多少次(建模为二项式)。每个球的命中概率(θ)来自所有可能θ的β分布。此个人级别贝塔分布的模式本身来自更高级别的“玩家位置”贝塔分布,该贝塔分布表示所有在该位置上玩的个人的可能模式。我们的想法是将所有这些放在一个层次模型中,以允许在单个层次分布上进行收缩 我曾经尝试过像这样使用pymc实现它,但它似乎没有正确地进行采样(也就是说,所有东西都保持在起始值)。感谢您的帮助 imp

我正在努力实现一个贝叶斯层次模型

基本上,我正试图用这种结构建立一个模型

我有数据显示当一个球被抛向他们时,每个人能击中多少次(建模为二项式)。每个球的命中概率(θ)来自所有可能θ的β分布。此个人级别贝塔分布的模式本身来自更高级别的“玩家位置”贝塔分布,该贝塔分布表示所有在该位置上玩的个人的可能模式。我们的想法是将所有这些放在一个层次模型中,以允许在单个层次分布上进行收缩

我曾经尝试过像这样使用pymc实现它,但它似乎没有正确地进行采样(也就是说,所有东西都保持在起始值)。感谢您的帮助

import pandas as pd
import pymc as pm

### EXAMPLE DATA

initial_data=pd.DataFrame({'player_position':pd.Categorical([1,1,1,2,2,2]),
                       'player_ids':pd.Categorical([1, 2, 3, 4, 5, 6]),
                       'total_chances':pd.array([8, 7, 4, 4, 6, 13]), 
                       'hits':np.array([7, 7, 3, 3, 5, 11])})

### declarations
total_chances = initial_data.total_chances.values
hits = initial_data.hits.values
player_ids= initial_data.player_ids.values
position_ids = initial_data.player_position.values
num_players = len(initial_data.player_ids.unique())
num_positions = len(initial_data.player_position.unique())

### SPECIFYING THE MODEL
### overall-level distributions
overall_mode = pm.Beta('overall_mode', 1, 1)
overall_conc = pm.Gamma('overall_conc', 0.1, 0.1)

### position-level distributions
position_mode = pm.Beta('position_mode', (overall_mode*overall_conc)+1, 
                           ((1-overall_mode)*overall_conc)+1, 
                            size=num_positions)
position_conc = pm.Gamma('position_conc', 0.1, 0.1, 
                            size=num_positions)

### individual-level distribution 
individual_theta = pm.Beta('individual_theta',
     (position_mode[position_ids]*position_conc[position_ids])+1, 
                            ((1-
     position_mode[position_ids])*position_conc[position_ids])+1, size=num_players)

### likelihood scoring
hits_likelihood = pm.Binomial('hits_likelihood', n=total_chances, 
p=individual_theta, value=hits, observed=True)

### model construction
model = pm.Model([overall_mode, overall_conc, position_mode, 
position_conc, individual_theta, hits_likelihood])

### RUNNING THE MODEL
map_ = pm.MAP(model)
map_.fit()
mcmc = pm.MCMC(model)
mcmc.sample(2000, 400, 1)

pm.Matplot.plot(mcmc)