首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyMC3 3/Arviz:痕量的CDF值

PyMC3 3/Arviz:痕量的CDF值
EN

Stack Overflow用户
提问于 2022-01-12 11:03:28
回答 2查看 92关注 0票数 2

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

代码语言:javascript
复制
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()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-15 18:32:17

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

据我所知,没有类似之处,这可能也是因为在numpy中也没有对等物(numpy有quantilepercentile)。其中有一个是scipy.stats.percentileofscore:但我也不推荐它,除非您正在处理离散数据,并且需要使用kind参数来评估关系(也就是说,您会关心或注意到使用<<=之间的区别吗?)这个the函数也只使用一个标量作为计算ecdf的值。

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

代码语言:javascript
复制
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个值中的每个值的概率。

代码语言:javascript
复制
<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
票数 2
EN

Stack Overflow用户

发布于 2022-01-12 11:32:28

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

代码语言:javascript
复制
import arviz
grid, pdf = arviz.kde(trace.posterior.X.values, cumulative=True)
idx = np.sum(grid < 0) - 1
prob_x_lt_zero = pdf[idx]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70680443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档