Distribuição da proposta para uma distribuição normal generalizada

10

Estou modelando a dispersão da planta usando uma distribuição normal generalizada ( entrada da Wikipedia ), que tem a função de densidade de probabilidade:

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

onde é a distância percorrida, é um parâmetro de escala é o parâmetro de forma. A distância média percorrida é dada pelo desvio padrão desta distribuição:dab

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

Isso é conveniente porque permite uma forma exponencial quando , uma forma gaussiana quando e uma distribuição leptocúrtica quando . Essa distribuição surge regularmente na literatura de dispersão de plantas, embora seja bastante rara em geral e, portanto, difícil de encontrar informações.b=1b=2b<1

Os parâmetros mais interessantes são distância média da dispersão.b

Eu estou tentando estimar e usando MCMC, mas eu estou lutando para chegar a uma forma eficiente de valores proposta de amostra. Até agora, usei Metropolis-Hastings, e extraí de distribuições uniformes e , e obtenho distâncias médias de dispersão posteriores de cerca de 200 a 400 metros, o que faz sentido biológico. No entanto, a convergência é realmente lenta e não estou convencido de que esteja explorando todo o espaço de parâmetros.ab0<a<4000<b<3

Sua complicado para chegar a uma melhor distribuição proposta de e , porque eles dependem um do outro, sem ter muito significado por conta própria. A distância média de dispersão tem um significado biológico claro, mas uma determinada distância média de dispersão pode ser explicada por infinitas combinações de e . Como tal e são correlacionados no posterior.ababab

Até agora, usei o Metropolis Hastings, mas estou aberto a qualquer outro algoritmo que funcione aqui.

Pergunta: Alguém pode sugerir uma maneira mais eficiente de desenhar valores da proposta para e ?ab

Edit: Informações adicionais sobre o sistema: Estou estudando uma população de plantas ao longo de um vale. O objetivo é determinar a distribuição das distâncias percorridas pelo pólen entre as plantas doadoras e as plantas que polinizam. Os dados que tenho são:

  1. A localização e o DNA de todos os possíveis doadores de pólen
  2. Sementes coletadas de uma amostra de 60 plantas maternas (ou seja, receptores de pólen) que foram cultivadas e genotipadas.
  3. A localização e o DNA de cada planta materna.

Não conheço a identidade das plantas doadoras, mas isso pode ser inferido a partir dos dados genéticos, determinando quais doadores são os pais de cada muda. Digamos que essa informação esteja contida em uma matriz de probabilidades G com uma linha para cada descendência e uma coluna para cada candidato a doador, que fornece a probabilidade de cada candidato ser o pai de cada descendente com base apenas em dados genéticos. G leva cerca de 3 segundos para calcular e precisa ser recalculado a cada iteração, o que torna as coisas consideravelmente mais lentas.

Como geralmente esperamos que os doadores candidatos mais próximos tenham maior probabilidade de serem pais, a inferência de paternidade é mais precisa se você deduzir em conjunto paternidade e dispersão. A matriz D tem as mesmas dimensões que G e contém probabilidades de paternidade baseadas apenas em função das distâncias entre mãe e candidato e algum vetor de parâmetros. A multiplicação de elementos em D e G fornece a probabilidade conjunta de paternidade, dados genéticos e espaciais. O produto de valores multiplicados fornece a probabilidade de modelo de dispersão.

Como descrito acima, tenho usado o GND para modelar a dispersão. Na verdade, usei uma mistura de um GND e uma distribuição uniforme para permitir a possibilidade de candidatos muito distantes terem uma maior probabilidade de paternidade devido apenas ao acaso (a genética é uma bagunça) que inflaria a cauda aparente do GND se ignorado. Portanto, a probabilidade da distância de dispersão é:d

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

onde é a probabilidade de distância de dispersão do GND, N é o número de candidatos e ( ) determina quanta contribuição o GND faz para a dispersão.Pr(d|a,b)c0<c<1

Há, portanto, duas considerações adicionais que aumentam a carga computacional:

  1. A distância de dispersão não é conhecida, mas deve ser inferida a cada iteração, e criar G para fazer isso é caro.
  2. Há um terceiro parâmetro, , para integrar novamente.c

Por esses motivos, pareceu-me ser um pouco complexo demais para executar a interpolação da grade, mas estou feliz por estar convencido do contrário.

Exemplo

Aqui está um exemplo simplificado do código python que eu usei. Simplifiquei a estimativa de paternidade a partir de dados genéticos, pois isso envolveria muito código extra e o substituí por uma matriz de valores entre 0 e 1.

Primeiro, defina funções para calcular o 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

Em seguida, simule 2000 candidatos e 800 filhos. Simule também uma lista de distâncias entre as mães dos filhos e os pais candidatos e uma matriz G fictícia .

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]

Defina os valores iniciais dos parâmetros:

# 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

Atualize a, bec, por sua vez, e calcule a proporção 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
tellis
fonte
2
Você está procurando a prior em aeb, ou uma distribuição de proposta em um algoritmo Metropolis-Hastings? Você parece ter usado os dois termos de forma intercambiável.
Robin Ryder
Você está certo - desculpe por não ser claro. Estou mais interessado em uma distribuição de proposta para MH. Mudei o título em que mencionei os anteriores.
tellis 27/09/18
Sob um plano ou Jeffreys anterior em , ie, ou Acredito que uma mudança da variável para produza um fechamento -forma condicional . π ( a ) 1 π ( a ) 1 / a α = a - b π ( a | b , dados )aπ(a)1π(a)1/aα=abπ(a|b,data)
Xian
Ainda não está claro se você está interessado ou não em definir um prior que ajude ou em executar Metropolis-Hastings com mais eficiência.
Xian

Respostas:

2

Você não precisa usar o método Markov Chain Monte Carlo (MCMC).

Se você estiver usando distribuições anteriores uniformes , estará fazendo algo muito semelhante à estimativa de probabilidade máxima em um espaço restrito para os parâmetros e .ab

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

onde é uma constante (independente a partir de e ) e que pode ser encontrada por escamação da função de probabilidade de tal modo que integra a 1.P(a,b)P(d)ab

A função de log de probabilidade, para variáveis iid é:ndiGN(0,a,b)

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

Para esta função, não deve ser muito difícil plotá-la e encontrar um máximo.

Sextus Empiricus
fonte
Essa interpolação de giro funcionaria para dois parâmetros e distâncias observadas, e pode ser o que eu acabo fazendo. Na verdade, estou fazendo uma estimativa conjunta da distância de dispersão e inferência de paternidade, que envolve pelo menos um outro parâmetro para integrar, e um termo de probabilidade extra que é realmente lento (~ 3 segundos por iteração) que realmente diminui a cadeia. Eu acho que precisaria de cerca de 10 vezes mais iterações do que atualmente usei para a cadeia markov.
tellis 28/09/18
@tellis esses termos 'distância de dispersão' e 'inferência de paternidade' que eu realmente não entendo. Talvez você possa fornecer informações mais concretas adicionando um conjunto de dados ou parte dele. Enquanto isso, você também pode falar mais sobre o 'outro parâmetro'. Então, o que os dados é que você não tem?
Sextus Empiricus 28/09
11
Eu adicionei um exemplo usando dados simulados.
Tellis
0

Não entendo bem como você está configurando o modelo: em particular, parece-me que, para uma dada semente, as possíveis distâncias de dispersão do pólen são um conjunto finito e, portanto, sua "probabilidade de dispersão" pode ser melhor denominada " taxa de dispersão "(como seria necessário normalizar somando pais putativos para ser uma probabilidade). Portanto, os parâmetros podem não ter exatamente o significado (como em valores plausíveis) que você espera.

Eu trabalhei em alguns problemas semelhantes no passado e, portanto, tentarei preencher as lacunas no meu entendimento, como uma maneira de sugerir uma possível abordagem / aparência crítica. Desculpas se eu não entender completamente a questão original. O tratamento abaixo segue basicamente Hadfield et al (2006) , um dos melhores trabalhos sobre esse tipo de modelo.

Seja denotado o genótipo no locus para algum individual . Para descendentes com mãe conhecida e pai putativo , seja - no caso mais simples, isso é simplesmente um produto das probabilidades de herança mendeliana, mas em casos mais complicados pode incluir algum modelo de erro de genotipagem ou falta de genótipos parentais, portanto, incluo parâmetro (s) ) .Xl,klkimif

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

Seja a distância de dispersão de pólen para a prole , e seja a distância entre mãe conhecida e pai putativo , e seja seja a taxa de dispersão (por exemplo, uma combinação ponderada de pdf normais e uniformes generalizados, como na sua pergunta). Para expressar a taxa de dispersão como uma probabilidade, normalize wrt para o espaço de estados finito: o conjunto (finito) de possíveis distâncias de dispersão induzidas pelo número (finito) de pais putativos em sua área de estudo, para que δiidmi,fmifDi,f=q(dmi,f|a,b,c)

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

Seja a atribuição paterna da semente , ou seja, se a planta for o pai da prole . Assumindo um uniforme uniforme nas atribuições de paternidade, Em outras palavras, condicional a outros parâmetros e genótipos, a atribuição paterna é um RV discreto com suporte finito, que é normalizado pela integração em todo o suporte (pais possíveis).PiiPi=ffi

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

Portanto, uma maneira razoável de escrever um amostrador simples para esse problema é Metropolis-within-Gibbs:

  1. Condicional em , atualize as atribuições de paternidade para todos os . Este é um rv discreto com suporte finito para que você possa desenhar facilmente uma amostra exata{a,b,c,θ}Pii
  2. Condicional em , atualize com uma atualização do Metropolis-Hastings. Para formar a meta, apenas os valores nas equações acima precisam ser atualizados, portanto, isso não é caro{Pi,θ}a,b,cD
  3. Condicional em , atualize com uma atualização MH. Para formar a meta, os valores precisam ser atualizados, o que é caro, mas os não.{Pi,a,b,c}θGD

Para diminuir o custo de desenhar amostras de , você pode executar as etapas 1-2 várias vezes antes de 3. Para ajustar as distribuições da proposta nas etapas 2-3, você pode usar amostras de uma execução preliminar para estimar a covariância da distribuição posterior da articulação para . Em seguida, use essa estimativa de covariância em uma proposta gaussiana multivariada. Tenho certeza de que essa não é a abordagem mais eficiente, mas é fácil de implementar.{a,b,c}{a,b,c,θ}

Agora, esse esquema pode estar próximo do que você já está fazendo (não sei como você está modelando a paternidade a partir da sua pergunta). Mas, além das preocupações computacionais, meu argumento mais amplo é que os parâmetros podem não ter o significado que você pensa que eles têm, com relação à distância média de dispersão. Isso ocorre porque, no contexto do modelo de paternidade que descrevi acima, entram no numerador e no denominador (constante de normalização): assim, o arranjo espacial das plantas será ter um efeito potencialmente forte sobre o qual os valores de têm uma alta probabilidade ou probabilidade posterior. Isto é especialmente verdade quando a distribuição espacial das plantas é desigual.a,b,cPr(Pi|)a,b,ca , b , ca,b,c

Por fim, sugiro que você dê uma olhada no artigo de Hadfield vinculado acima e no pacote R que acompanha ("MasterBayes"), se você ainda não o fez. No mínimo, pode fornecer idéias.

Nate Pope
fonte
Minha abordagem é de fato modelada na de Hadfield, com duas grandes mudanças: (1) sementes de uma mãe podem ser irmãos completos e, portanto, não independentes. O problema é, portanto, inferir conjuntamente a dispersão, a paternidade e a estrutura de irmãos também. (2) Estou usando uma abordagem de paternidade fracionária para considerar todos os candidatos simultaneamente, proporcionalmente à sua probabilidade de paternidade, em vez de atualizar as atribuições de paternidade sequencialmente, porque existe um grande espaço de pais possíveis para explorar.
Tellis
Estou usando o pacote FAPS para fazer essas coisas.
Tellis
Minha pergunta é essencialmente sobre uma distribuição eficiente da proposta para o seu ponto 2. O restante da sua resposta descreve algo muito próximo do que eu já fiz, incluindo a formulação do produto de G e D (mas obrigado por isso - eu não estava tenho certeza que eu fiz corretamente, então é útil saber que um segundo par de olhos concorda!).
Tellis
Não tenho uma solução enlatada para distribuição de propostas, desculpe. Mas tenho algumas observações: (1) As etapas 1 a 2 são muito baratas e podem ser repetidas várias vezes com pouco custo antes de passar para a etapa 3. Mesmo com uma proposta de má qualidade na etapa 2, muitas iterações devem ser suficientes para " faça movimentos grandes "no espaço de estado de . a,b,c
Nate Pope
(2) A distribuição condicional na etapa 2 é tridimensional. Como em: fácil de visualizar. Como é o destino não normalizado de em uma estimativa MAP das atribuições de paternidade para um fixo ? Visualizar o alvo não normalizado em diferentes paternidades deve lhe dar uma idéia de se é multimodal, plano em áreas etc.Ga,b,cG
Nate Pope