Я вижу, что в Pystan функция HDI может использоваться для обеспечения 95% доверительного интервала, охватывающего последующее распределение. Однако они говорят, что это будет работать только для унимодальных распределений. Если моя модель может иметь мультимодальное распределение (до 4 пиков), есть ли способ найти ИРЧП в Пистане? Спасибо!
Я бы не стал рассматривать это как специфическую для Stan/PyStan проблему. Интервал с наивысшей плотностью по определению является единственным интервалом и поэтому не подходит для характеристики мультимодальных распределений. Роб Хиндман (Rob Hyndman), " Вычислительные и графические регионы с наивысшей плотностью", проделал замечательную работу, которая расширяет концепцию до мультимодальных дистрибутивов, и это было реализовано в R в пакете hdrcde.
Что касается Python, то это обсуждается на сайте Дискурса PyMC, где рекомендуется использовать функцию (hpd_grid
), которую Освальдо Мартин написал для своей книги "Байесовский анализ с Python". Источник для этой функции находится в файле hpd.py, а для области 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()
Следует отметить, что мультимодальные апостериорные распределения по должным образом смоделированным параметрам, как правило, встречаются редко, но очень часто встречаются при неконвергентной выборке MCMC, особенно при использовании нескольких цепочек (что является наилучшей практикой). Если кто-то ожидает мультимодальность априори, то обычно это приводит к некоторой форме модели смеси, которая устранит мультимодальность. Если не ожидать мультимодальности, но авторы покажут это в любом случае, тогда красный флаг будет скептически относиться к результатам.
pystan.StanModel.optimizing()
генерирует только точечную оценку параметров MAP, поэтому нет. Используйтеpystan.StanModel.sampling()
чтобы получить образцы из вашего апостериорного.