后分布P斯坦的最高密度间隔(HDI)

时间:2018-12-07 14:54:22

标签: python bayesian stan pystan credible-interval

我看到在Pystan中,可以使用HDI函数在后分布周围提供95%的可信区间。但是,他们说这仅适用于单峰分布。如果我的模型可能具有多峰分布(最多4个峰),是否可以在Pystan中找到HDI?谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这不是Stan / PyStan的特定问题。根据定义,最高密度间隔是单个间隔,因此不适用于表征多峰分布。 Rob Hyndman( Computing and Graphing Highest Density Regions )的出色工作将概念扩展到多峰分布,并且已在the hdrcde package下的R中实现。

对于Python,有a discussion of this on the PyMC Discourse site,建议使用Osvaldo Martin在他的《用Python进行贝叶斯分析》一书中编写的函数(hpd_grid)。该函数的源位于the hpd.py file中,并且95%的区域将使用

from hpd import hpd_grid

intervals, x, y, modes = hpd_grid(samples, alpha=0.05)

其中samples是其中一个参数的后验样本,intervals是表示最高密度区域的元组列表。

示例与情节

这是一个使用一些假多模态数据的示例图。

import numpy as np
from matplotlib import pyplot as plt
from hpd import hpd_grid

# include two modes
samples = np.random.normal(loc=[-4,4], size=(1000, 2)).flatten()

# compute high density regions
hpd_mu, x_mu, y_mu, modes_mu = hpd_grid(samples)

plt.figure(figsize=(8,6))

# raw data
plt.hist(samples), density=True, bins=29, alpha=0.5)

# estimated distribution
plt.plot(x_mu, y_mu)

# high density intervals
for (x0, x1) in hpd_mu:
    plt.hlines(y=0, xmin=x0, xmax=x1, linewidth=5)
    plt.axvline(x=x0, color='grey', linestyle='--', linewidth=1)
    plt.axvline(x=x1, color='grey', linestyle='--', linewidth=1)

# modes
for xm in modes_mu:
    plt.axvline(x=xm, color='r')

plt.show()

enter image description here


警告提示

应注意,在正确建模的参数上,多峰后验分布通常很少见,但在非聚合MCMC采样中确实非常频繁地出现,特别是在使用多链时(这是最佳做法)。如果人们期望多模态先验,那么通常会导致某种形式的混合模型,从而消除多模态。如果不希望采用多模式,但后继者仍会展示它,那是对结果表示怀疑的危险信号。