如何根据 PyMC3 中的另一个值测量一个值的贝叶斯不确定性

How to measure Bayesian uncertainty of a value based on another value in PyMC3

我的数据看起来像这样:

Player | Avg_goals  | Minutes played

A      | 10         | 100
B      | 12.1       | 900
C      | 15         | 1600
D      | 8.3        | 3200
E      | 3          | 750
...
Z      | 2.4        | 420

我想做什么

是为不确定性来源为 Minutes 值的任何玩家建模并获得 true avg_goals

因为,我更确定 true 率更接近记录的 Avg_goals,其中 Minutes high 而对于 less 分钟的球员来说,他们的 true 率越接近该值,方差越大,不确定性也越大在 Avg_goals 列中。所以我更确定玩家 D 的比率比玩家 Z 的(记录值 = 2.4)更接近 8.3,因为分钟数。

问题

我不确定如何在 PyMC3 模型中描述 Avg_goalsMinutes 之间的这种关系。 我决定在目标列中使用泊松先验,但在那之后我不知道如何进行。到目前为止我的(不完整的)代码是

import pymc3 as pm
import numpy as np

minutes = np.array([100, 900, 1600, 3200, 750])
goals_ = np.array([10, 12.1, 15, 8.3, 3])

with pm.Model() as model:
    lambda = pm.Normal('lambda', goals_.mean())
    goals_ = pm.Poisson('goals_', lambda) 
    
    ###NO IDEA WHAT COMES NEXT??!!



如有任何帮助,我们将不胜感激。如果我能在 PyMC3 中实现类似的示例,那就太好了。

如果没有实际的重复,不确定性如何随时间变化将是任意的。但是,您是正确的,至少可以观察到不确定性的相对关系。只是不确定性的绝对单位将取决于先验中所做的选择。

为了简化模型,我建议使用 minutes_playedtotal_goals,而不是 OP 中的变量。我们仍然可以指定 goal_rate 输出,但它将是模型参数的确定性函数。应该注意的是,OP 数据中给出的一些条目没有任何意义。例如,没有一个球员在 1600 分钟的比赛中可以取得的进球总数会导致 15 goals/90 分钟的进球率。因此,我更改了数据以使其有效。

二项式回归模型

作为第一步,我将提出一个二项式回归模型,我们将 total_goals 玩家制作的模型建模为二项式随机变量,其中 N 对应于 minutes_played 和比率每分钟 player-specific 个目标。回归部分是我们假设所有球员都有一个共同的平均进球率,我们将推断一个 player-specific 系数来定义他们与平均值的偏差。

这不是一个精确的模型。例如,它假设所有球员的得分率都在每分钟 0 到 1 个进球 (GPM) 之间。虽然GPM超过1在逻辑上没有什么不可能,但实际上是不可信的,所以我认为这个模型不无道理。

数据

minutes_played = np.array([10, 90, 750, 900, 1800, 3600])
goals_per_game = np.array([18, 10, 3, 12.1, 15, 8.3])
total_goals = goals_per_game * minutes_played / 90

n_players = len(total_goals)

型号

with pm.Model() as model:
    # regression model coefficients
    c_player = pm.Normal('c_player', 0, tau=1, shape=n_players)
    c_mu = pm.Normal('c_mu', 0, 10)

    # goals per minute (by player)
    gpm = pm.math.invlogit(c_mu + c_player)

    # intuitive variables
    pm.Deterministic('avg_goal_rate', pm.math.invlogit(c_mu)*90)
    pm.Deterministic('goal_rate', gpm*90)

    # log-likelihood
    pm.Binomial('llik', n=minutes_played, p=gpm, observed=total_goals)

    trace = pm.sample()

结果

这似乎没有太大问题:

“直观”变量的后验分布通常反映了人们的预期,即上场时间更少的球员的不确定性更高:

pm.plot_forest(trace, var_names=['avg_goal_rate', 'goal_rate'])

缩放不确定性

在这个模型中,调节不确定性尺度的参数是c_player = pm.Normal('c_player', 0, tau=1, shape=n_players)中的tau参数。就模型而言,这种精确度调节了球员真正偏离平均进球率的可能性;更高的精度意味着更低的合理性。我建议尝试使用这个值(例如 0.1、10),看看它如何改变每个球员进球率的不确定性。