我(PyMC3的新手)希望通过使攻击和防御强度的潜在变量自动回归来扩展PyMC3示例中提出的模型用于橄榄球预测的分层模型。我不确定如何使用二维数据和GaussianRandomWalk
类的形状参数(如下所述)。
编辑1:我没有找到多维使用的明确文档,但我在pyMC3 github问题中找到了fonnesbeck的comment:
[...]我认为大多数人都会期待一个变量向量,这意味着第一个维度是可变元素的数量,剩下的维度是每个变量的大小。
如下所述,我使用时间索引作为第一维度。我试图切换轴,产生相同的结果。所以,我现在的模型是:
with pm.Model() as model:
home = pm.Normal('home', 0, .0001)
intercept = pm.Normal('intercept', 0, .0001)
tau_att = pm.Exponential('tau_att', 1./.02)
tau_def = pm.Exponential('tau_def', 1./.02)
atts = pm.GaussianRandomWalk('atts', tau_att**-2, shape=[T, num_teams])
defs = pm.GaussianRandomWalk('defs', tau_def**-2, shape=[T, num_teams])
home_theta = tt.exp(intercept + home + atts[:, home_team] + defs[:, away_team])
away_theta = tt.exp(intercept + atts[:, away_team] + defs[:, home_team])
home_points = pm.Poisson('home_points', mu=home_theta, observed=observed_home_goals)
away_points = pm.Poisson('away_points', mu=away_theta, observed=observed_away_goals)
输入是一个二维数组,其中行是时间步数,列包含在该时间步中播放的所有团队的主页或客场目标。假设以下模拟数据
home_score away_score home_team away_team i_home i_away t
0 1 0 Arsenal Liverpool 0 1 1
1 1 1 Liverpool Burnley 1 2 1
2 2 4 Burnley Arsenal 2 0 1
3 0 3 Liverpool Arsenal 1 0 2
4 1 1 Burnley Liverpool 2 1 2
5 5 0 Arsenal Burnley 0 2 2
observed_home_goals
(类似于observed_away_goals
)看起来像这样:
[[1 1 2]
[0 1 5]]
并且相应的团队索引如下所示:
[[0 1 2]
[1 2 0]]
意味着在时间步骤1中,团队[0 1 2]
分别拍摄[1 1 2]
个目标。
拟合模型不会产生错误,但是采样会产生所有参数的零估计值。我尝试浏览 distributions / timeseries.py 源代码,了解shape参数如何用于GaussianRandomWalk
类中的多个维度。
我的问题是,如果模型定义实际上按预期用于二维时间序列数据。如果我正确地为atts
和defs
变量编制索引,我不确定。
编辑2:我最终手动构建了时间序列,类似于Javier's solution,这似乎工作正常!