MCMCサンプルからのモードの信頼性


12

彼の著書Doing Bayesian Data Analysisで、John KruschkeはRのJAGSを使用する際に次のように述べています。

... MCMCサンプルからのモードの推定は、MCMCサンプルのランダムなバンプとリップルに敏感な平滑化アルゴリズムに基づいているため、かなり不安定になる可能性があります。(ベイジアンデータ分析の実行、ページ205、セクション8.2.5.1)

メトロポリスアルゴリズムとギブスサンプリングのような正確な形式を把握していますが、スムージングアルゴリズムについてもよく知らないので、MCMCサンプルからのモードの推定が不安定になることを意味します。誰もが平滑化アルゴリズムが何をしていて、なぜモードの推定が不安定になるのかについて直感的な洞察を与えることができますか?


2
カーネル密度推定に基づくモード推定アルゴリズムについて、John Kruschke氏と話しています。
アンドレイコリャーディン

2
このリンクは役に立ちます。
アンドレイコリャーディン

私がこの統計の分野に慣れていない限り、JAGSは確率密度関数ではなく事後分布からサンプルのセットを出力するので、カーネル密度の推定値が入りません。リンクをありがとうございます。
モーガンボール

これはおそらく、特定の値が複数存在しない可能性がある連続変数の大きなサンプルからモードを取得する方法と関係があるため、サンプルをグループ化(またはスムージング)する必要があると思います。
モーガンボール

1
カーネル密度推定で最大密度の値としてモードを取得できます。(少なくとも、これは私が何をすべきかである、と私は間違っていない場合はJ. Kruschkeは彼の例では、同じアプローチを使用する)
アンドレイKolyadin

回答:


8

本が手元にないので、Kruschkeがどのスムージング方法を使用するかわかりませんが、直観のために、0.1から1.0までのさまざまな帯域幅を使用したガウスカーネル密度推定とともに、標準法線からの100サンプルのこのプロットを考慮してください。(簡単に言えば、ガウスKDEは一種の平滑化されたヒストグラムです。各データポイントにガウスを追加することで密度を推定します。平均値は観測値です。)

平滑化が単峰性分布を作成した後でも、モードは一般に既知の値である0未満であることがわかります。

ここに画像の説明を入力してください

さらに、同じサンプルを使用して、密度の推定に使用されるカーネル帯域幅ごとの推定モード(y軸)のプロットがあります。これが、推定値が平滑化パラメーターによってどのように変化するかについての直観に役立つことを願っています。

ここに画像の説明を入力してください

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Wed Feb  1 09:35:51 2017

@author: seaneaster
"""

import numpy as np
from matplotlib import pylab as plt
from sklearn.neighbors import KernelDensity

REAL_MODE = 0
np.random.seed(123)

def estimate_mode(X, bandwidth = 0.75):
    kde = KernelDensity(kernel = 'gaussian', bandwidth = bandwidth).fit(X)
    u = np.linspace(-3,3,num=1000)[:, np.newaxis]
    log_density = kde.score_samples(u)
    return u[np.argmax(log_density)]

X = np.random.normal(REAL_MODE, size = 100)[:, np.newaxis] # keeping to standard normal

bandwidths = np.linspace(0.1, 1., num = 8)

plt.figure(0)
plt.hist(X, bins = 100, normed = True, alpha = 0.25)

for bandwidth in bandwidths:
    kde = KernelDensity(kernel = 'gaussian', bandwidth = bandwidth).fit(X)
    u = np.linspace(-3,3,num=1000)[:, np.newaxis]
    log_density = kde.score_samples(u)
    plt.plot(u, np.exp(log_density))

bandwidths = np.linspace(0.1, 3., num = 100)
modes = [estimate_mode(X, bandwidth) for bandwidth in bandwidths]
plt.figure(1)
plt.plot(bandwidths, np.array(modes))

5

ショーン・イースターはいい答えを提供してくれました。Kruschkeの本に付属しているRスクリプトによって実際に行われる方法を次に示します。plotPost()関数は、名前のRスクリプトで定義されていますDBDA2E-utilities.R。推定モードが表示されます。関数定義の内部には、次の2行があります。

mcmcDensity = density(paramSampleVec)
mo = mcmcDensity$x[which.max(mcmcDensity$y)]

このdensity()関数には、Rの基本統計パッケージが付属しており、Sean Easterが説明した種類のカーネル密度フィルターを実装しています。これには、平滑化カーネルの帯域幅、および使用するカーネルのタイプに関するオプションの引数があります。デフォルトはガウスカーネルで、素敵な帯域幅を見つけるための内部マジックがあります。このdensity()関数は、yさまざまな値で平滑化された密度を持つ名前のコンポーネントを持つオブジェクトを返しますx。上記のコードの2行目は、最大x値を見つけるだけyです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.