我有一个来自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()。
发布于 2022-01-15 18:32:17
我建议您的原始方法,评估条件和平均(基本上是使用经验民防),而不是使用KDE。
据我所知,没有类似之处,这可能也是因为在numpy中也没有对等物(numpy有quantile和percentile)。其中有一个是scipy.stats.percentileofscore:但我也不推荐它,除非您正在处理离散数据,并且需要使用kind参数来评估关系(也就是说,您会关心或注意到使用<或<=之间的区别吗?)这个the函数也只使用一个标量作为计算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-12 11:32:28
您可以使用内核密度估计来近似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]https://stackoverflow.com/questions/70680443
复制相似问题