PyMC3/Arviz:来自迹线的 CDF 值

PyMC3/Arviz: CDF value from trace

我有一个来自 PyMC3 的样本,我正试图从中获得一个累积概率,例如P(X < 0)。我目前使用这个:

trace = pymc3.sample(return_inferencedata=True)
prob_x_lt_zero = (trace.posterior.X < 0).sum() / trace.posterior.X.size

有没有更好的方法来做到这一点,或者使用 Arviz 或 XArray 的一些辅助函数?

我还没有找到任何 .cdf() 方法或类似的东西。 很奇怪,缺少这样的基本功能,但是更高级的功能却有,例如trace.posterior.X.quantile()

您可以使用核密度估计来近似 CDF,但我不认为这比您当前的方法更好:

import arviz
grid, pdf = arviz.kde(trace.posterior.X.values, cumulative=True)
idx = np.sum(grid < 0) - 1
prob_x_lt_zero = pdf[idx]

我会推荐你​​原来的评估条件和平均的方法(基本上是使用经验 cdf)而不是使用 KDE。

据我所知没有等效项,可能也是因为 numpy 中也没有等效项(它同时具有 quantilepercentile)。 scipy: scipy.stats.percentileofscore 中有一个,但我也不推荐它,除非您正在处理离散数据并且需要 kind 参数来评估联系(即您会关心或注意到任何使用 <<= 的区别?)。此 scipy 函数也仅采用标量作为值来评估 ecdf。

因此,我的建议是坚持使用您的方法,但稍微修改一下实现方式,这样它在同时评估多个值并且不减少所有维度时也有效:

import arviz; import xarray
x = xarray.DataArray([-.1, 0, .1])  # skip that if working with scalars
post = arviz.load_arviz_data("rugby").posterior
prob_x_lt_zero = (post.atts < x).mean(("chain", "draw"))

我们正在评估的 3 个值中每个值的概率 returns 在所有 6 个团队中。

<xarray.DataArray (team: 6, dim_0: 3)>
array([[0.    , 0.    , 0.0485],
       [0.347 , 0.975 , 1.    ],
       [0.    , 0.004 , 0.4245],
       [0.64  , 0.994 , 1.    ],
       [1.    , 1.    , 1.    ],
       [0.    , 0.    , 0.    ]])
Coordinates:
  * team     (team) object 'Wales' 'France' 'Ireland' ... 'Italy' 'England'
Dimensions without coordinates: dim_0