PyMC3 - 索引二维数据,同时拟合分层自回归模型

时间:2016-07-13 09:29:20

标签: pymc pymc3

我(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类中的多个维度。

我的问题是,如果模型定义实际上按预期用于二维时间序列数据。如果我正确地为attsdefs变量编制索引,我不确定。

编辑2:我最终手动构建了时间序列,类似于Javier's solution,这似乎工作正常!

0 个答案:

没有答案