Интервал с наивысшей плотностью (HDI) для заднего распределения Pystan

1

Я вижу, что в Pystan функция HDI может использоваться для обеспечения 95% доверительного интервала, охватывающего последующее распределение. Однако они говорят, что это будет работать только для унимодальных распределений. Если моя модель может иметь мультимодальное распределение (до 4 пиков), есть ли способ найти ИРЧП в Пистане? Спасибо!

Теги:
bayesian
stan
pystan

1 ответ

1
Лучший ответ

Я бы не стал рассматривать это как специфическую для 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()

Изображение 174551


Предупреждение

Следует отметить, что мультимодальные апостериорные распределения по должным образом смоделированным параметрам, как правило, встречаются редко, но очень часто встречаются при неконвергентной выборке MCMC, особенно при использовании нескольких цепочек (что является наилучшей практикой). Если кто-то ожидает мультимодальность априори, то обычно это приводит к некоторой форме модели смеси, которая устранит мультимодальность. Если не ожидать мультимодальности, но авторы покажут это в любом случае, тогда красный флаг будет скептически относиться к результатам.

  • 0
    Здравствуй. Будет ли это работать, если я использую функцию fit.optimizing () в Pystan для получения моего апостериорного значения?
  • 0
    @nikjacks pystan.StanModel.optimizing() генерирует только точечную оценку параметров MAP, поэтому нет. Используйте pystan.StanModel.sampling() чтобы получить образцы из вашего апостериорного.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню