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 中也没有等效项(它同时具有 quantile
和 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"))
我们正在评估的 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
我有一个来自 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 中也没有等效项(它同时具有 quantile
和 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"))
我们正在评估的 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