Distribuzione della proposta per una distribuzione normale generalizzata


10

Sto modellando la dispersione delle piante usando una distribuzione normale generalizzata ( voce di Wikipedia ), che ha la funzione di densità di probabilità:

b2aΓ(1/b)e(da)b

dove è la distanza percorsa, è un parametro di scala e è il parametro di forma. La distanza media percorsa è data dalla deviazione standard di questa distribuzione:dab

a2Γ(3/b)Γ(1/b)

Ciò è utile perché consente una forma esponenziale quando b=1 , una forma gaussiana quando b=2 e una distribuzione leptokurtic quando b<1 . Questa distribuzione cresce regolarmente nella letteratura sulla dispersione delle piante, anche se è piuttosto rara in generale, e quindi è difficile trovare informazioni su.

La maggior parte dei parametri interessanti sono b e la distanza media di dispersione.

Sto cercando di stimare a e b utilizzando MCMC, ma sto lottando per trovare un modo efficace per valori proposta dei campioni. Finora ho usato Metropolis-Hastings e tratto da distribuzioni uniformi 0<a<400 e 0<b<3 , e ottengo distanze di dispersione medie posteriori di circa 200-400 metri, il che ha un senso biologico. Tuttavia, la convergenza è molto lenta e non sono convinto che stia esplorando l'intero spazio dei parametri.

La sua difficile da venire con una migliore distribuzione proposta di e , perché dipendono l'uno dall'altro, senza avere molto senso per conto proprio. La distanza di dispersione media ha un chiaro significato biologico, ma una data distanza di dispersione media potrebbe essere spiegata da infinite combinazioni di e . Come tale e sono correlati in quella posteriore.ababab

Finora ho usato Metropolis Hastings, ma sono aperto a qualsiasi altro algoritmo che funzionerebbe qui.

Domanda: qualcuno può suggerire un modo più efficiente per disegnare i valori della proposta per e ?ab

Modifica: Ulteriori informazioni sul sistema: sto studiando una popolazione di piante lungo una valle. L'obiettivo è determinare la distribuzione delle distanze percorse dal polline tra le piante donatrici e le piante che impollinano. I dati che ho sono:

  1. La posizione e il DNA di ogni possibile donatore di polline
  2. Semi raccolti da un campione di 60 piante materne (cioè ricevitori di polline) che sono state coltivate e genotipizzate.
  3. La posizione e il DNA di ogni pianta materna.

Non conosco l'identità delle piante donatrici, ma ciò può essere desunto dai dati genetici determinando quali donatori sono i padri di ogni piantina. Supponiamo che queste informazioni siano contenute in una matrice di probabilità G con una riga per ogni prole e una colonna per ciascun donatore candidato, che dà la probabilità che ciascun candidato sia il padre di ogni prole in base esclusivamente a dati genetici. G richiede circa 3 secondi per il calcolo e deve essere ricalcolato ad ogni iterazione, il che rallenta notevolmente le cose.

Dal momento che generalmente ci aspettiamo che i donatori candidati più vicini abbiano più probabilità di essere padri, l'inferenza della paternità è più accurata se si deducono congiuntamente paternità e dispersione. La matrice D ha le stesse dimensioni di G e contiene probabilità di paternità basate solo su una funzione delle distanze tra madre e candidato e alcuni vettori di parametri. Moltiplicare gli elementi in D e G fornisce la probabilità congiunta di paternità dati genetici e spaziali dati. Il prodotto di valori moltiplicati dà la probabilità del modello di dispersione.

Come descritto sopra, ho usato GND per modellare la dispersione. In realtà ho usato una miscela di un GND e una distribuzione uniforme per consentire la possibilità che candidati molto distanti avessero una maggiore probabilità di paternità a causa del solo caso (la genetica è disordinata) che gonfierebbe la coda apparente del GND se ignorata. Quindi la probabilità della distanza di dispersione è:d

cPr(d|a,b)+(1c)N

dove è la probabilità di distanza di dispersione dal GND, N è il numero di candidati e ( ) determina la quantità di contributo che il GND fornisce alla dispersione.Pr(d|a,b)c0<c<1

Vi sono quindi due ulteriori considerazioni che aumentano l'onere computazionale:

  1. La distanza di dispersione non è nota ma deve essere dedotta ad ogni iterazione e creare G per fare ciò è costoso.
  2. C'è un terzo parametro, , da integrare.c

Per questi motivi mi è sembrato un po 'troppo complesso per eseguire l'interpolazione della griglia, ma sono felice di essere convinto altrimenti.

Esempio

Ecco un esempio semplificato del codice Python che ho usato. Ho semplificato la stima della paternità dai dati genetici, poiché ciò implicherebbe un sacco di codice extra e lo ha sostituito con una matrice di valori tra 0 e 1.

Innanzitutto, definire le funzioni per calcolare il GND:

import numpy as np
from scipy.special import gamma

def generalised_normal_PDF(x, a, b, gamma_b=None):
    """
    Calculate the PDF of the generalised normal distribution.

    Parameters
    ----------
    x: vector
        Vector of deviates from the mean.
    a: float
        Scale parameter.
    b: float
        Shape parameter
    gamma_b: float, optional
        To speed up calculations, values for Euler's gamma for 1/b
        can be calculated ahead of time and included as a vector.
    """
    xv = np.copy(x)
    if gamma_b:
        return (b/(2 * a * gamma_b ))      * np.exp(-(xv/a)**b)
    else:
        return (b/(2 * a * gamma(1.0/b) )) * np.exp(-(xv/a)**b)

def dispersal_GND(x, a, b, c):
    """
    Calculate a probability that each candidate is a sire
    assuming assuming he is either drawn at random form the
    population, or from a generalised normal function of his
    distance from each mother. The relative contribution of the
    two distributions is controlled by mixture parameter c.

    Parameters
    ----------
    x: vector
        Vector of deviates from the mean.
    a: float
        Scale parameter.
    b: float
        Shape parameter
    c: float between 0 and 1.
        The proportion of probability mass assigned to the
        generalised normal function.
    """    
    prob_GND = generalised_normal_PDF(x, a, b)
    prob_GND = prob_GND / prob_GND.sum(axis=1)[:, np.newaxis]

    prob_drawn = (prob_GND * c) + ((1-c) / x.shape[1])
    prob_drawn = np.log(prob_drawn)

    return prob_drawn

Successivamente simula 2000 candidati e 800 prole. Simula anche un elenco di distanze tra le madri della prole e i padri candidati e una matrice G fittizia .

n_candidates = 2000 # Number of candidates in the population
n_offspring  = 800 # Number of offspring sampled.
# Create (log) matrix G.
# These are just random values between 0 and 1 as an example, but must be inferred in reality.
g_matrix  = np.random.uniform(0,1, size=n_candidates*n_offspring)
g_matrix  = g_matrix.reshape([n_offspring, n_candidates])
g_matrix  = np.log(g_matrix)
# simulate distances to ecah candidate father
distances = np.random.uniform(0,1000, 2000)[np.newaxis]

Imposta i valori dei parametri iniziali:

# number of iterations to run
niter= 100
# set intitial values for a, b, and c.
a_current = np.random.uniform(0.001,500, 1)
b_current = np.random.uniform(0.01,  3, 1)
c_current = np.random.uniform(0.001,  1, 1)
# set initial likelihood to a very small number
lik_current = -10e12

Aggiorna a, b e c a sua volta e calcola il rapporto Metropolis.

# number of iterations to run
niter= 100
# set intitial values for a, b, and c.
# When values are very small, this can cause the Gamma function to break, so the limit is set to >0.
a_current = np.random.uniform(0.001,500, 1)
b_current = np.random.uniform(0.01,  3, 1)
c_current = np.random.uniform(0.001,  1, 1)
# set initial likelihood to a very small number
lik_current = -10e12 
# empty array to store parameters
store_params = np.zeros([niter, 3])

for i in range(niter):
    a_proposed = np.random.uniform(0.001,500, 1)
    b_proposed = np.random.uniform(0.01,3, 1)
    c_proposed = np.random.uniform(0.001,1, 1)

    # Update likelihood with new value for a
    prob_dispersal = dispersal_GND(distances, a=a_proposed, b=b_current, c=c_current)
    lik_proposed = (g_matrix + prob_dispersal).sum() # lg likelihood of the proposed value
    # Metropolis acceptance ration for a
    accept = bool(np.random.binomial(1, np.min([1, np.exp(lik_proposed - lik_current)])))
    if accept:
        a_current = a_proposed
        lik_current = lik_proposed
    store_params[i,0] = a_current

    # Update likelihood with new value for b
    prob_dispersal = dispersal_GND(distances, a=a_current, b=b_proposed, c=c_current)
    lik_proposed = (g_matrix + prob_dispersal).sum() # log likelihood of the proposed value
    # Metropolis acceptance ratio for b
    accept = bool(np.random.binomial(1, np.min([1, np.exp(lik_proposed - lik_current)])))
    if accept:
        b_current = b_proposed
        lik_current = lik_proposed
    store_params[i,1] = b_current

    # Update likelihood with new value for c
    prob_dispersal = dispersal_GND(distances, a=a_current, b=b_current, c=c_proposed)
    lik_proposed = (g_matrix + prob_dispersal).sum() # lg likelihood of the proposed value
    # Metropolis acceptance ratio for c
    accept = bool(np.random.binomial(1, np.min([1, np.exp(lik_proposed - lik_current)])))
    if accept:
        c_current = c_proposed
        lik_current = lik_proposed
    store_params[i,2] = c_current

2
Stai cercando un precedente su aeb, o una distribuzione di proposta in un algoritmo Metropolis-Hastings? Sembra che tu abbia usato entrambi i termini in modo intercambiabile.
Robin Ryder,

Hai ragione - scusa per non essere stato chiaro. Sono più interessato a una distribuzione di proposte per MH. Ho cambiato il titolo in cui ho menzionato i priori di conseguenza.
tellis,

Sotto un piatto o Jeffreys prima su , cioè, o Credo che un cambiamento di variabile da produce un chiuso -form condizionale . aπ(a)1π(a)1/aα=abπ(a|b,data)
Xi'an,


Non è ancora chiaro se sei interessato a stabilire un precedente che aiuti o a gestire Metropolis-Hastings in modo più efficiente.
Xi'an,

Risposte:


2

Non è necessario utilizzare il metodo Markov Chain Monte Carlo (MCMC).

Se si utilizza uniformi distribuzioni a priori allora si sta facendo qualcosa di molto simile come stima di massima verosimiglianza su uno spazio limitato per i parametri a e b .

P(a,b;d)=P(d;a,b)P(a,b)P(d)=L(a,b;d)×const

dove P(a,b)P(d) è una costante (indipendente daaeb) e può essere trovato scalando la funzione di verosimiglianza tale che integra a 1.

La funzione di verosimiglianza logaritmica, per n variabili diGN(0,a,b) è:

logL(a,b;d)=nlog(2a)nlog(Γ(1/b)b)1abi=1n(di)b

Per questa funzione non dovrebbe essere troppo difficile tracciarlo e trovare il massimo.


Questa interpolazione gird funzionerebbe per due parametri e distanze osservate, e potrebbe essere quello che finisco per fare. Sto effettivamente facendo una stima congiunta della distanza di dispersione e dell'inferenza di paternità, che coinvolge almeno un altro parametro su cui integrarsi, e un termine di probabilità extra che è veramente lento (~ 3 secondi per iterazione) che rallenta davvero la catena. Penso che avrei bisogno di circa 10 volte più iterazioni di quelle attualmente utilizzate per la catena markov.
tellis,

@tellis quei termini "distanza di dispersione" e "inferenza di paternità" non capisco davvero. Forse potresti fornire alcune informazioni più concrete aggiungendo un set di dati o una parte di esso. Nel fare ciò potresti anche parlare di più di un "altro parametro". Allora, che cosa i dati è che si fa hai?
Sesto Empirico

1
Ho aggiunto un esempio usando i dati simulati.
tellis,

0

Non capisco bene come stai impostando il modello: in particolare, mi sembra che per un dato seme, le possibili distanze di dispersione del polline siano un insieme finito, e quindi la tua "probabilità di dispersione" potrebbe essere meglio definita un " tasso di dispersione "(poiché dovrebbe essere normalizzato sommando i padri putativi per essere una probabilità). Pertanto, i parametri potrebbero non avere esattamente il significato (come in, valori plausibili) che ci si aspetta.

Ho lavorato su un paio di problemi simili in passato e quindi cercherò di colmare le lacune nella mia comprensione, come un modo per suggerire un possibile approccio / aspetto critico. Mi scuso se mi manca completamente il punto della tua domanda originale. Il trattamento di seguito segue fondamentalmente Hadfield et al (2006) , uno dei migliori articoli su questo tipo di modello.

Xl,klkimif

Gi,f=lPr(Xl,i|Xl,mi,Xl,f,θ)
θ

δiidmi,fmifDi,f=q(dmi,f|a,b,c)

D~i,f=Pr(δi=dmi,f|a,b,c)=Di,fkDi,k

PiiPi=ffi

Pr(Pi=f|a,b,c,θ,X)=Gi,fD~i,fkGi,kD~i,k=Gi,fDi,fkGi,kDi,k

Quindi un modo ragionevole di scrivere un semplice campionatore per questo problema è Metropolis-Within-Gibbs:

  1. {a,b,c,θ}Pii
  2. {Pi,θ}a,b,cD
  3. {Pi,a,b,c}θGD

{a,b,c}{a,b,c,θ}

a,b,cPr(Pi|)a,b,ca,b,c

Infine, ti suggerisco di dare un'occhiata a quel documento di Hadfield collegato sopra e al pacchetto R di accompagnamento ("MasterBayes"), se non l'hai già fatto. Almeno può fornire idee.


Il mio approccio è in effetti modellato su quello di Hadfield, con due importanti cambiamenti: (1) i semi di una madre possono essere fratelli e sorelle, quindi non indipendenti. Il problema riguarda quindi anche la dispersione, la paternità e la struttura dei fratelli. (2) Sto usando un approccio di paternità frazionata per considerare tutti i candidati contemporaneamente in proporzione alla loro probabilità di paternità, piuttosto che aggiornare le assegnazioni di paternità in sequenza, perché c'è un ampio spazio di possibili padri da esplorare.
tellis,

Sto usando il pacchetto FAPS per fare quelle cose.
tellis,

La mia domanda è essenzialmente quella di chiedere una distribuzione efficiente della proposta per fare il tuo punto 2. Il resto della tua risposta descrive qualcosa di molto vicino a quello che ho già fatto, inclusa la formulazione del prodotto di G e D (ma grazie per questo - non ero sono sicuro di averlo fatto correttamente, quindi è utile sapere un secondo paio di occhi d'accordo!).
tellis,

a,b,c

a,b,cG
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.