Distribution de proposition pour une distribution normale généralisée


10

Je modélise la dispersion des plantes en utilisant une distribution normale généralisée ( entrée wikipedia ), qui a la fonction de densité de probabilité:

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

où est la distance parcourue, est un paramètre d'échelle et est le paramètre de forme. La distance moyenne parcourue est donnée par l'écart type de cette distribution:dab

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

Ceci est pratique car il permet une forme exponentielle lorsque , une forme gaussienne lorsque et une distribution leptokurtique lorsque . Cette distribution revient régulièrement dans la littérature sur la dispersion des plantes, même si elle est assez rare en général, et donc difficile à trouver.b=1b=2b<1

Les paramètres les plus intéressants sont et la distance de dispersion moyenne.b

J'essaie d'estimer et aide de MCMC, mais j'ai du mal à trouver un moyen efficace d'échantillonner les valeurs de proposition. Jusqu'à présent, j'ai utilisé Metropolis-Hastings et tiré de distributions uniformes et , et j'obtiens des distances de dispersion moyennes postérieures d'environ 200 à 400 mètres, ce qui a un sens biologique. Cependant, la convergence est vraiment lente, et je ne suis pas convaincu qu'elle explore tout l'espace des paramètres.ab0<a<4000<b<3

Il est difficile de trouver une meilleure distribution de proposition pour et , car ils dépendent les uns des autres, sans avoir beaucoup de sens par eux-mêmes. La distance de dispersion moyenne a une signification biologique claire, mais une distance de dispersion moyenne donnée pourrait s'expliquer par une infinité de combinaisons de et . Ainsi, et sont corrélés dans la partie postérieure.ababab

Jusqu'à présent, j'ai utilisé Metropolis Hastings, mais je suis ouvert à tout autre algorithme qui fonctionnerait ici.

Question: Quelqu'un peut-il suggérer un moyen plus efficace de dessiner des valeurs de proposition pour et ?ab

Edit: Informations supplémentaires sur le système: J'étudie une population de plantes le long d'une vallée. L'objectif est de déterminer la répartition des distances parcourues par le pollen entre les plantes donneuses et les plantes qu'elles pollinisent. Les données dont je dispose sont:

  1. L'emplacement et l'ADN de chaque donneur de pollen possible
  2. Graines recueillies auprès d'un échantillon de 60 plantes maternelles (c.-à-d. Récepteurs de pollen) qui ont été cultivées et génotypées.
  3. L'emplacement et l'ADN de chaque plante maternelle.

Je ne connais pas l'identité des plantes donneuses, mais cela peut être déduit des données génétiques en déterminant quels donneurs sont les pères de chaque semis. Disons que cette information est contenue dans une matrice de probabilités G avec une ligne pour chaque progéniture et une colonne pour chaque candidat donneur, qui donne la probabilité que chaque candidat soit le père de chaque progéniture sur la base de données génétiques uniquement. G prend environ 3 secondes à calculer et doit être recalculé à chaque itération, ce qui ralentit considérablement les choses.

Étant donné que nous nous attendons généralement à ce que les candidats donateurs plus proches soient plus susceptibles d'être des pères, l'inférence de paternité est plus précise si vous inférez conjointement la paternité et la dispersion. La matrice D a les mêmes dimensions que G et contient des probabilités de paternité basées uniquement sur une fonction des distances entre la mère et la candidate et un vecteur de paramètres. La multiplication des éléments en D et G donne la probabilité conjointe de paternité compte tenu des données génétiques et spatiales. Le produit de valeurs multipliées donne la probabilité d'un modèle de dispersion.

Comme décrit ci-dessus, j'ai utilisé le GND pour modéliser la dispersion. En fait, j'ai utilisé un mélange de GND et d'une distribution uniforme pour permettre à des candidats très éloignés d'avoir une probabilité de paternité plus élevée en raison du hasard seul (la génétique est en désordre), ce qui gonflerait la queue apparente du GND s'il était ignoré. La probabilité de distance de dispersion est donc:d

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

où est la probabilité de distance de dispersion par rapport au GND, N est le nombre de candidats et ( ) détermine la contribution du GND à la dispersion.Pr(d|a,b)c0<c<1

Il y a donc deux considérations supplémentaires qui alourdissent la charge de calcul:

  1. La distance de dispersion n'est pas connue mais doit être déduite à chaque itération, et la création de G pour ce faire est coûteuse.
  2. Il y a un troisième paramètre, , à intégrer.c

Pour ces raisons, il m'a semblé être un peu trop complexe pour effectuer une interpolation de grille, mais je suis heureux d'être convaincu du contraire.

Exemple

Voici un exemple simplifié du code python que j'ai utilisé. J'ai simplifié l'estimation de la paternité à partir des données génétiques, car cela impliquerait beaucoup de code supplémentaire, et je l'ai remplacé par une matrice de valeurs entre 0 et 1.

Tout d'abord, définissez les fonctions pour calculer le 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

Ensuite, simulez 2000 candidats et 800 descendants. Simulez également une liste de distances entre les mères de la progéniture et les pères candidats, ainsi qu'une matrice G factice .

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]

Définissez les valeurs initiales des paramètres:

# 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

Mettez à jour a, b et c tour à tour et calculez le ratio 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
Vous recherchez un a priori sur a et b, ou une distribution de proposition dans un algorithme de Metropolis-Hastings? Vous semblez avoir utilisé les deux termes de façon interchangeable.
Robin Ryder

Vous avez raison - désolé de ne pas avoir été clair. Je suis le plus intéressé par une distribution de propositions pour MH. J'ai changé le titre où j'ai mentionné les prieurs en conséquence.
tellis

Sous un aplat ou un Jeffreys a priori sur , c'est-à-dire ou je crois qu'un changement de variable en produit un fermé -form conditionnel . aπ(a)1π(a)1/aα=abπ(a|b,data)
Xi'an


On ne sait pas vraiment si vous êtes intéressé ou non à définir un prior qui aide ou à exécuter Metropolis-Hastings plus efficacement.
Xi'an

Réponses:


2

Vous n'avez pas besoin d'utiliser la méthode Markov Chain Monte Carlo (MCMC).

Si vous utilisez des distributions antérieures uniformes, vous faites quelque chose de très similaire comme estimation du maximum de vraisemblance sur un espace restreint pour les paramètres et .ab

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

où est une constante (indépendante de et ) et elle peut être trouvée en mettant à l'échelle la fonction de vraisemblance de telle sorte qu'elle s'intègre à 1.P(a,b)P(d)ab

La fonction log de vraisemblance, pour iid variables est:ndiGN(0,a,b)

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

Pour cette fonction, il ne devrait pas être trop difficile de la tracer et de trouver un maximum.


Cette interpolation de ceinture fonctionnerait pour deux paramètres et distances observées, et pourrait être ce que je finirais par faire. En fait, je fais une estimation conjointe de la distance de dispersion et de l'inférence de paternité, qui implique au moins un autre paramètre à intégrer, et un terme de probabilité supplémentaire qui est vraiment lent (~ 3 secondes par itération) qui ralentit vraiment la chaîne. Je pense que j'aurais besoin d'environ 10 fois plus d'itérations que ce que j'utilise actuellement pour la chaîne markov.
tellis

@tellis ces termes «distance de dispersion» et «inférence de paternité» que je ne comprends pas vraiment. Peut-être pourriez-vous fournir des informations plus concrètes en ajoutant un ensemble de données ou une partie de celui-ci. En faisant cela, vous pourriez tout aussi bien parler d'un «autre paramètre». Alors, quelles données avez - vous ?
Sextus Empiricus

1
J'ai ajouté un exemple utilisant des données simulées.
tellis

0

Je ne comprends pas très bien comment vous configurez le modèle: en particulier, il me semble que pour une graine donnée, les distances possibles de dispersion du pollen sont un ensemble fini, et donc votre "probabilité de dispersion" pourrait être mieux appelée " taux de dispersion "(car il devrait être normalisé en additionnant les pères putatifs pour être une probabilité). Ainsi, les paramètres peuvent ne pas avoir la signification (comme dans les valeurs plausibles) que vous attendez.

J'ai travaillé sur quelques problèmes similaires dans le passé et je vais donc essayer de combler les lacunes dans ma compréhension, afin de suggérer une approche / un regard critique possible. Toutes mes excuses si je rate complètement le point de votre question initiale. Le traitement ci-dessous suit essentiellement Hadfield et al (2006) , l'un des meilleurs articles sur ce type de modèle.

Soit le génotype au locus pour un individuel . Pour la progéniture avec une mère connue et un père putatif , la probabilité des génotypes de progéniture observés soit - dans le cas le plus simple, il s'agit simplement d'un produit de probabilités d'hérédité mendélienne, mais dans des cas plus compliqués peut inclure un modèle d'erreur de génotypage ou des génotypes parentaux manquants, j'inclus donc des paramètres de nuisance ) .Xl,klkimif

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

Soit la distance de dispersion du pollen pour la progéniture , et soit la distance entre la mère connue et le père putatif , et soit est le taux de dispersion (par exemple une combinaison pondérée de pdfs normaux et uniformes généralisés comme dans votre question). Pour exprimer le taux de dispersion sous forme de probabilité, normalisez wrt à l'espace d'états fini: l'ensemble (fini) des distances de dispersion possibles induites par le nombre (fini) de pères putatifs dans votre zone d'étude, de sorte que δiidmi,fmifDi,f=q(dmi,f|a,b,c)

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

Soit l'affectation paternelle de la graine , c'est-à-dire si la plante est le père de la progéniture . En supposant un prior uniforme sur les affectations de paternité, En d'autres termes, conditionnel à d'autres paramètres et génotypes, l'affectation paternelle est une RV discrète à support fini, qui est normalisée en intégrant à travers ledit support (pères possibles).PiiPi=ffi

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

Donc, une façon raisonnable d'écrire un échantillonneur simple pour ce problème est Metropolis-within-Gibbs:

  1. Conditionnellement à , mettre à jour les affectations de paternité pour tout . Ceci est un RV discret avec un support fini afin que vous puissiez facilement dessiner un échantillon exact{a,b,c,θ}Pii
  2. Sous condition sur , mettez à jour avec une mise à jour Metropolis-Hastings. Pour former la cible, seules les valeurs dans les équations ci-dessus doivent être mises à jour, donc ce n'est pas coûteux{Pi,θ}a,b,cD
  3. Conditionnel à , mettre à jour avec une mise à jour MH. Pour former la cible, les valeurs doivent être mises à jour, ce qui est coûteux, mais le ne le font pas.{Pi,a,b,c}θGD

Pour réduire le coût du dessin d'échantillons de , vous pouvez effectuer les étapes 1 à 2 plusieurs fois avant 3. Pour régler les distributions de proposition aux étapes 2 à 3, vous pouvez utiliser des échantillons d'une exécution préliminaire pour estimer la covariance de la distribution postérieure conjointe pour . Utilisez ensuite cette estimation de covariance dans une proposition gaussienne multivariée. Je suis sûr que ce n'est pas l'approche la plus efficace, mais elle est facile à mettre en œuvre.{a,b,c}{a,b,c,θ}

Maintenant, ce schéma peut être proche de ce que vous faites déjà (je ne peux pas dire comment vous modélisez la paternité à partir de votre question). Mais au-delà des préoccupations de calcul, mon point le plus important est que les paramètres peuvent ne pas avoir le sens que vous pensez qu'ils ont, en ce qui concerne la distance de dispersion moyenne. En effet, dans le contexte du modèle de paternité j'ai décrit ci-dessus, entrent à la fois dans le numérateur et le dénominateur (constante de normalisation): ainsi, l'agencement spatial des plantes sera ont un effet potentiellement fort sur les valeurs de ont une forte probabilité ou une probabilité postérieure. Cela est particulièrement vrai lorsque la distribution spatiale des plantes est inégale.a,b,cPr(Pi|)a,b,ca , b , ca,b,c

Enfin, je vous suggère de jeter un œil à ce document Hadfield lié à ce qui précède et au package R qui l'accompagne ("MasterBayes"), si vous ne l'avez pas déjà fait. Au moins, cela peut fournir des idées.


Mon approche est en effet calquée sur celle d'Hadfield, avec deux changements majeurs: (1) les graines d'une mère peuvent être des frères et sœurs à part entière, et donc pas indépendantes. Le problème est donc de déduire conjointement la structure de dispersion, de paternité et de fratrie. (2) J'utilise une approche de paternité fractionnée pour considérer tous les candidats simultanément en proportion de leur probabilité de paternité, plutôt que de mettre à jour les affectations de paternité séquentiellement, car il y a un grand espace de pères possibles à explorer.
tellis

J'utilise le package FAPS pour faire ces choses.
tellis

Ma question porte essentiellement sur une distribution de proposition efficace pour faire votre point 2. Le reste de votre réponse décrit quelque chose de très proche de ce que j'ai déjà fait, y compris la formulation du produit de G et D (mais merci pour cela - je n'étais pas Je ne suis pas sûr de l'avoir fait correctement, il est donc utile de savoir qu'une deuxième paire d'yeux est d'accord!).
tellis

Je n'ai pas de solution en conserve pour la distribution des propositions, désolé. Mais j'ai quelques observations: (1) Les étapes 1 à 2 sont très bon marché et peuvent être répétées plusieurs fois à moindre coût avant de passer à l'étape 3. Même avec une proposition de mauvaise qualité à l'étape 2, de nombreuses itérations devraient suffire à " faire de grands mouvements "dans l'espace d'état de . a,b,c
Nate Pope

(2) La distribution conditionnelle à l'étape 2 est tridimensionnelle. Comme dans: facile à visualiser. À quoi ressemble la cible non normalisée de à une estimation MAP des affectations de paternité pour un fixe ? Visualiser la cible non normalisée à travers différentes paternités devrait vous donner une idée si elle est multimodale, plate dans les zones, etc.Ga,b,cG
Nate Pope
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.