Affidabilità della modalità da un campione MCMC


12

Nel suo libro Doing Bayesian Data Analysis, John Kruschke afferma che usando JAGS di R

... la stima della modalità da un campione MCMC può essere piuttosto instabile perché la stima si basa su un algoritmo di livellamento che può essere sensibile a urti e increspature casuali nel campione MCMC. ( Esecuzione dell'analisi dei dati bayesiani , pagina 205, sezione 8.2.5.1)

Mentre ho una comprensione dell'algoritmo Metropolis e forme esatte come il campionamento di Gibbs, non ho familiarità con l'algoritmo di smoothing che è anche accennato e perché significherebbe che la stima della modalità dal campione MCMC è instabile. Qualcuno è in grado di fornire una visione intuitiva di ciò che sta facendo l'algoritmo di smoothing e perché rende instabile la stima della modalità?


2
Ho parlato con John Kruschke dell'algoritmo per la stima della modalità che si basa sulla stima della densità del kernel.
Andrey Kolyadin,

2
Questo link può essere utile.
Andrey Kolyadin,

A meno che non mi sbagli di essere nuovo in questa area di statistiche, JAGS emette una serie di campioni dalla distribuzione posteriore piuttosto che una funzione di densità di probabilità, quindi non sono sicuro che la stima della densità kernale vi entri. Grazie comunque per il link.
Morgan Ball

Penso che questo abbia probabilmente più a che fare con il modo in cui si ottiene una modalità da un ampio campione di una variabile continua in cui potrebbe non esserci più di uno di un valore particolare e quindi è necessario raggruppare (o attenuare) il campione.
Morgan Ball,

1
È possibile ottenere la modalità come valore con la massima densità sulla stima della densità del kernel. (Almeno questo è quello che faccio, e se non sbaglio J. Kruschke usa lo stesso approccio nei suoi esempi)
Andrey Kolyadin,

Risposte:


8

Non ho il libro a portata di mano, quindi non sono sicuro del metodo di smoothing utilizzato da Kruschke, ma per intuizione considerare questa trama di 100 campioni da uno standard normale, insieme alle stime della densità del kernel gaussiano usando varie larghezze di banda da 0,1 a 1,0. (In breve, i KDE gaussiani sono una sorta di istogramma levigato: stimano la densità aggiungendo un gaussiano per ciascun punto di dati, con media al valore osservato.)

Puoi vedere che anche una volta che il livellamento crea una distribuzione unimodale, la modalità è generalmente inferiore al valore noto di 0.

inserisci qui la descrizione dell'immagine

Inoltre, ecco un grafico della modalità stimata (asse y) della larghezza di banda del kernel utilizzata per stimare la densità, usando lo stesso campione. Speriamo che questo dia qualche intuizione su come varia la stima con i parametri di smoothing.

inserisci qui la descrizione dell'immagine

#!/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

Sean Easter ha fornito una bella risposta; ecco come viene effettivamente realizzato dagli script R forniti con il libro di Kruschke. La plotPost()funzione è definita nello script R denominato DBDA2E-utilities.R. Visualizza la modalità stimata. All'interno della definizione della funzione, ci sono queste due righe:

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

La density()funzione viene fornita con il pacchetto di statistiche di base di R e implementa un filtro di densità del kernel del tipo descritto da Sean Easter. Ha argomenti opzionali per la larghezza di banda del kernel smoothing e per il tipo di kernel da usare. Il valore predefinito è un kernel gaussiano e ha un po 'di magia interna per trovare una buona larghezza di banda. La density()funzione restituisce un oggetto con un componente denominato yche ha le densità levigate a vari valori x. La seconda riga di codice, sopra, trova solo il xvalore dove yè massimo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.