Genelleştirilmiş normal dağılım için teklif dağılımı


10

Olasılık yoğunluğu fonksiyonuna sahip genelleştirilmiş bir normal dağılım ( wikipedia girişi ) kullanarak bitki dağılımını modelleniyorum :

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

burada d kat edilen mesafedir, a bir ölçek parametresidir ve b şekil parametresidir. Ortalama kat edilen mesafe bu dağılımın standart sapması ile verilir:

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

Bu uygundur, çünkü b=1 olduğunda üstel bir şekle, b=2 olduğunda bir Gauss şekline ve b<1 olduğunda leptokurtik bir dağılım sağlar . Bu dağılım, genel olarak oldukça nadir olmasına ve dolayısıyla hakkında bilgi bulmak zor olmasına rağmen, bitki dağılım literatüründe düzenli olarak ekilir.

En ilginç parametreler b ve ortalama dağılım mesafesidir.

MCMC kullanarak a ve b tahmin etmeye çalışıyorum , ancak teklif değerlerini örneklemek için etkili bir yol bulmakta zorlanıyorum. Şimdiye kadar Metropolis-Hastings'i kullandım ve 0<a<400 ve 0<b<3 eşit dağılımlardan çekildim ve biyolojik anlamda mantıklı olan yaklaşık 200-400 metrelik posterior ortalama dağılım mesafeleri elde ediyorum. Ancak, yakınsama gerçekten yavaş ve tam parametre alanı keşfetmek ikna değilim.

a ve b için daha iyi bir teklif dağıtımı yapmak zor , çünkü kendi başlarına fazla bir anlamı olmadan birbirlerine bağımlılar. Ortalama dağılım mesafesi net bir biyolojik anlama sahiptir, ancak belirli bir ortalama dağılım mesafesi, a ve b sonsuz sayıda kombinasyonu ile açıklanabilir . Bu şekilde a ve b posteriorda korelasyon gösterir.

Şimdiye kadar Metropolis Hastings'i kullandım, ancak burada çalışacak başka herhangi bir algoritmaya açıkım.

Soru: Herkes a ve b için teklif değerleri çizmenin daha verimli bir yolunu önerebilir mi?

Edit: Sistem hakkında ek bilgi: Ben bir vadi boyunca bitki popülasyonu çalışıyorum. Amaç, verici bitkiler ile tozlaştıkları bitkiler arasındaki polen ile kat edilen mesafelerin dağılımını belirlemektir. Sahip olduğum veriler:

  1. Her olası polen vericisi için yer ve DNA
  2. Yetiştirilen ve genotiplenen 60 ana bitkinin (yani polen alıcılarının) bir örneğinden toplanan tohumlar.
  3. Her anne bitkisinin yeri ve DNA'sı.

Donör bitkilerinin kimliğini bilmiyorum, ama bu hangi fidelerin babaları olduğunu belirleyerek genetik verilerden çıkarılabilir. Diyelim ki bu bilgi, her yavru için bir sıra ve her aday donör için bir sütun içeren G olasılıklar matrisinde bulunur , bu da her adayın sadece genetik verilere dayanarak her bir yavruya baba olma olasılığını verir. G'nin hesaplanması yaklaşık 3 saniye sürer ve her yinelemede yeniden hesaplanması gerekir, bu da işleri önemli ölçüde yavaşlatır.

Genel olarak daha yakın aday bağışçıların baba olma olasılığının daha yüksek olmasını beklediğimizden, eğer babalık ve dağılma ortaklaşa çıkarırsanız babalık çıkarımı daha doğru olur. Matris D , G ile aynı boyutlara sahiptir ve sadece anne ve aday arasındaki mesafelerin bir fonksiyonuna ve bazı parametre vektörlerine dayanan babalık olasılıklarını içerir. D ve G'de elemanların çoğaltılması, genetik ve uzamsal verilerle birlikte babalık olasılığını verir. Çarpılan değerlerin çarpımı, dağılma modelini verir.

d

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

burada GND'den dağılma mesafesi olasılığıdır, N aday sayısıdır ve ( ) GND'nin dağılmaya ne kadar katkısı olduğunu belirler.Pr(d|a,b)c0<c<1

Bu nedenle hesaplama yükünü artıran iki ek husus vardır:

  1. Dağılma mesafesi bilinmemektedir, ancak her yinelemede çıkarılması gerekir ve bunu yapmak için G oluşturmak pahalıdır.
  2. Üzerine entegre edilecek üçüncü bir parametre ( .c

Bu nedenlerden dolayı ızgara enterpolasyonu yapmak için çok fazla karmaşık görünmeme rağmen, aksi halde ikna olduğum için mutluyum.

Misal

İşte kullandığım python kodunun basitleştirilmiş bir örneği. Genetik verilerden babalık tahminini basitleştirdim, çünkü bu çok fazla kod içeriyor ve 0 ile 1 arasında bir değer matrisi ile değiştiriyordu.

İlk olarak, GND'yi hesaplamak için fonksiyonları tanımlayın:

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

Sonra 2000 adayı ve 800 çocuğu simüle edin. Ayrıca, yavruların anneleri ile aday babalar arasındaki mesafelerin bir listesini ve bir kukla G matrisini simüle edin .

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]

Başlangıç ​​parametre değerlerini ayarlayın:

# 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

Sırayla a, b ve c'yi güncelleyin ve Metropolis oranını hesaplayın.

# 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
A ve b'de bir öneri mi yoksa bir Metropolis-Hastings algoritmasında teklif dağıtımı mı arıyorsunuz? Her iki terimi de birbirinin yerine kullandığınız görülüyor.
Robin Ryder

Haklısın - açık olmadığın için üzgünüm. En çok MH için bir teklif dağıtımı ile ilgileniyorum. Önceden bahsettiğim başlığı buna göre değiştirdim.
tellis

Önce bir düz ya da Jeffreys altında , diğer bir deyişle ya da I değişken bir değişiklik inanıyoruz kapalı üretir -form koşullu . aπ(a)1π(a)1/aα=abπ(a|b,data)
Xi'an


Metropolis-Hastings'i daha verimli bir şekilde çalıştırmak ya da daha verimli bir şekilde yürütmekle ilgilenip ilgilenmediğiniz konusunda oldukça belirsizdir.
Xi'an

Yanıtlar:


2

Markov Zinciri Monte Carlo (MCMC) yöntemini kullanmanıza gerek yoktur.

Önceden eşit dağılımlar kullanıyorsanız , ve parametreleri için sınırlı bir alan üzerinde maksimum olabilirlik tahmini ile çok benzer bir şey yapıyorsunuz .ab

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

burada bir sabittir ( ve bağımsızdır ) ve olasılık fonksiyonunu 1 ile bütünleşecek şekilde ölçeklendirerek bulunabilir.P(a,b)P(d)ab

Günlük olabilirlik fonksiyonu için değişkenleri IID olduğu:ndiGN(0,a,b)

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

Bu işlev için onu çizmek ve bir maksimum bulmak çok zor olmamalıdır.


Bu gird enterpolasyonu iki parametre ve gözlemlenen mesafeler için işe yarayabilir ve sonunda yaptığım şey olabilir. Aslında, entegrasyon için en az bir başka parametreyi ve zinciri gerçekten yavaşlatan gerçekten yavaş olan (yineleme başına ~ 3 saniye) ekstra olasılık terimini içeren dağılma mesafesi ve babalık çıkarımının ortak tahminini yapıyorum. Sanırım markov zinciri için kullandığımdan yaklaşık 10 kat daha fazla yinelemeye ihtiyacım olacak.
tellis

@tellis bu terimler 'dağılma mesafesi' ve 'babalık çıkarımı' anlamıyorum. Belki bir veri kümesi veya bir parça ekleyerek daha somut bilgiler verebilirsiniz. Bunu yaparken 'başka bir parametre' hakkında daha fazla konuşabilirsiniz. Peki, veri size olmasıdır do var?
Sextus Empiricus

1
Benzetilmiş verileri kullanarak bir örnek ekledim.
tellis

0

Modeli nasıl kurduğunuzu tam olarak anlamıyorum: özellikle, belirli bir tohum için, olası polen dağılım mesafelerinin sonlu bir set olduğu ve bu nedenle "dağılım olasılığınızın" daha iyi bir " dağılma hızı "(olasılık olarak varsayılan babalar üzerinden toplanarak normalleştirilmesi gerektiği için). Bu nedenle parametreler beklediğiniz anlama gelmeyebilir (makul değerlerdeki gibi).

Geçmişte birkaç benzer sorun üzerinde çalıştım ve bu yüzden olası bir yaklaşım / eleştirel görünüm önermenin bir yolu olarak anlayışımdaki boşlukları doldurmaya çalışacağım. Özgün sorunuzun özünü tamamen özürsem özür dilerim. Aşağıdaki tedavi temel olarak bu tür bir modelle ilgili daha iyi makalelerden biri olan Hadfield ve ark .

Let lokus en genotip belirtmek bazı bireysel için . Bilinen anne ve varsayılan baba olan yavrular için , gözlemlenen yavru genotiplerinin olasılığı - en basit durumda bu sadece Mendel kalıtım olasılıklarının bir ürünüdür, ancak daha karmaşık durumlarda genotipleme hatası veya eksik ebeveyn genotiplerinin bir modelini içerebilir, bu yüzden rahatsızlık parametrelerini dahil ediyorum ) .Xl,klkimif

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

Let yavruları için polen dağılımı mesafe de ve izin bilinen anne arasındaki mesafe ve varsayımsal baba ve izin dağılma hızı (örneğin sorunuzdaki genelleştirilmiş normal ve tek tip pdfs'nin ağırlıklı bir kombinasyonu) olabilir. Dağılım hızını bir olasılık olarak ifade etmek için, wrt'u sonlu durum uzayına normalleştirin: çalışma alanınızdaki (sonlu) varsayılan baba sayısının neden olduğu (sonlu) olası dağılım mesafeleri seti, böylece δiidmi,fmifDi,f=q(dmi,f|a,b,c)

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

Bırakın , tohum baba ataması olsun , eğer bitkisi , yavru , . Babalık atamalarından önce üniforma olduğu varsayılırsa, Başka bir deyişle, diğer parametreler ve genotiplere bağlı olarak, baba ataması, söz konusu destek (olası babalar) ile entegre edilerek normalize edilen, sınırlı desteğe sahip ayrı bir rv'dir.PiiPi=ffi

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

Bu nedenle, bu sorun için basit bir örnekleyici yazmanın makul bir yolu Metropolis-Gibbs içinde:

  1. Şartına , güncelleme paternity atamaları tüm . Bu, sonlu destekli ayrı bir rv'dir, böylece kesin bir örneği kolayca çizebilirsiniz{a,b,c,θ}Pii
  2. İlgili şartlı , güncelleştirmek Metropolis- Hastings güncelleme ile. Hedefi oluşturmak için yalnızca yukarıdaki denklemlerdeki değerlerinin güncellenmesi gerekir, bu nedenle bu pahalı değildir{Pi,θ}a,b,cD
  3. Bir MH güncellemesiyle , update üzerinde . Hedefi oluşturmak için değerlerinin güncellenmesi gerekir, bu da maliyetlidir, ancak yoktur.{Pi,a,b,c}θGD

örneklerinin çizim maliyetini azaltmak için 3'ten önce birkaç kez 1-2. Adımları uygulayabilirsiniz. 2-3. Adımlarda teklif dağılımlarını ayarlamak için, için ortak arka dağılımın kovaryansını tahmin edin . Sonra bu kovaryans tahminini çok değişkenli bir Gauss teklifinde kullanın. Eminim bu en etkili yaklaşım değildir, ancak uygulanması kolaydır.{a,b,c}{a,b,c,θ}

Şimdi, bu şema halihazırda yaptığınız şeye yakın olabilir (babalık sorununuzu nasıl modellediğinizi söyleyemem). Ancak hesaplama kaygılarının ötesinde, asıl nokta, parametrelerinin ortalama dağılım mesafesine ilişkin olarak düşündükleri anlamına gelmemesidir. Bunun nedeni, yukarıda tarif ettiğim babalık modeli , hem pay hem de paydaya girmesi (normalleştirme sabiti): böylece, bitkilerin mekansal düzeni değerlerinin yüksek bir olasılık veya posterior olasılığa sahip olduğu potansiyel olarak güçlü bir etkiye sahiptir. Bu, özellikle bitkilerin mekansal dağılımı düzensiz olduğunda doğrudur.a,b,cPr(Pi|)a,b,ca,b,c

Son olarak, daha önce bağlantılı olan Hadfield belgesine ve beraberindeki R paketine ("MasterBayes") bir göz atmanızı öneririm. En azından fikir verebilir.


Benim yaklaşımım gerçekten de iki önemli değişiklikle Hadfield'da modellenmiştir: (1) bir anneden tohumlar tam kardeş olabilir ve bu nedenle bağımsız değildir. Bu nedenle sorun, ortaklaşa çıkarım yapan dağınıklık, babalık, yarasa da kardeşlik yapısıdır. (2) Tüm adayları, babalık atamalarını sırayla güncellemek yerine, babalık olasılıklarıyla orantılı olarak düşünmek için kısmi bir babalık yaklaşımı kullanıyorum, çünkü keşfedilecek olası babaların geniş bir alanı var.
tellis

Bunları yapmak için FAPS paketini kullanıyorum .
tellis

Benim sorum aslında 2. noktanızı yapmak için etkili bir teklif dağıtımı sormaktır. Cevabınızın geri kalanı, G ve D ürününün formülasyonu da dahil olmak üzere zaten yaptığım şeylere çok yakın bir şey anlatıyor (ama bunun için teşekkürler - ben değildim) Doğru yaptığımdan emin değilim, bu yüzden ikinci bir göz çiftinin aynı fikirde olduğunu bilmek yararlıdır!).
tellis

Teklif dağıtımı için hazır bir çözümüm yok, üzgünüm. Ancak birkaç gözlemim var: (1) 1-2. Adımlar çok ucuzdur ve 3. adıma geçmeden önce çok az maliyetle defalarca yinelenebilir. 2. adımda kalitesiz bir teklifle bile, birçok yineleme " durum uzayında büyük hamleler yapmak . a,b,c
Nate Pope

(2) Adım 2'deki koşullu dağılım 3 boyutludur. Gibi: görselleştirmek kolay. normalleştirilmemiş hedefi, sabit bir için babalık atamalarının MAP tahminine nasıl benziyor ? Farklı babalıklarda normal olmayan hedefi görselleştirmek size multimodal, alanlarda düz vb. a,b,cG
Nate Pope
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.