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

2
nik jacks 7 Дек 2018 в 17:54

1 ответ

Лучший ответ

Я бы не стал считать это проблемой, специфичной для Stan / PyStan. Интервал наивысшей плотности по определению является единственным интервалом и поэтому не подходит для характеристики мультимодальных распределений. Есть прекрасная работа Роба Хайндмана, Вычисление и построение графиков для областей с наибольшей плотностью , который расширяет концепцию до мультимодальных распределений, и это было реализовано в R в разделе пакет hdrcde.

Что касается Python, здесь обсуждается это на сайте PyMC Discourse., где рекомендуется использовать функцию (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()

enter image description here


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

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

1
merv 11 Дек 2018 в 18:33