2

我有一个来自 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().

4

2 回答 2

2

您可以使用内核密度估计来近似 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]
于 2022-01-12T11:32:28.093 回答
2

我建议您使用原始方法评估条件和平均(基本上是使用经验 cdf)而不是使用 KDE。

我知道没有等价物,可能也是因为 numpy 中也没有等价物(它同时具有quantileand percentile)。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"))

它返回我们在所有 6 个团队中评估的 3 个值中的每一个的概率。

<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
于 2022-01-15T18:32:17.843 回答