一般化正規分布の提案分布


10

私は、確率密度関数を持つ一般化された正規分布(wikipediaエントリー)を使用して、植物の分散をモデル化しています。

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

ここで、は移動距離、はスケールパラメーター、は形状パラメーターです。平均移動距離は、この分布の標準偏差によって与えられます。dab

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

これは、場合は指数関数型、場合はガウス型、場合はレプトリック分布を可能にするため便利です。この分布は、一般的には非常にまれであり、したがって情報を見つけるのが難しいにもかかわらず、植物散布に関する文献で定期的に発生します。b=1b=2b<1

最も興味深いパラメータはと平均分散距離です。b

私は推定しようとしていると MCMCを使用して、私はサンプルの提案値への効率的な方法を考え出すのに苦労しています。これまでのところ、私はMetropolis-Hastingsを使用し、および均一分布から描画しました。約200〜400メートルの後方平均分散距離が得られます。これは生物学的に意味があります。ただし、収束は非常に遅く、パラメーター空間全体を調査しているとは思いません。ab0<a<4000<b<3

とプロポーザル分布をより適切に作成するのは難しいことです。なぜなら、それらは、それ自体にはあまり意味がなく、互いに依存しているためです。平均分散距離は、明確な生物学的な意味を持っていますが、与えられた平均分散距離は無限に多くの組み合わせによって説明できると。このようにとの後方に相関しています。ababab

これまでのところ、Metropolis Hastingsを使用しましたが、ここで機能する他のアルゴリズムを使用できます。

質問:と提案値を描画するより効率的な方法を誰かが提案できますか?ab

編集:システムに関する追加情報:谷沿いの植物の個体数を調査しています。目的は、ドナー植物とそれらが受粉する植物との間で花粉が移動する距離の分布を決定することです。私が持っているデータは:

  1. すべての可能な花粉ドナーの場所とDNA
  2. 成長し、遺伝子型が特定された60の母性植物(花粉レシーバー)のサンプルから収集された種子。
  3. 各母性植物の場所とDNA。

私はドナー植物の正体を知りませんが、これは遺伝学データから、どのドナーが各苗の父親であるかを決定することによって推測できます。この情報が、各子の行と各候補ドナーの列を持つ確率Gのマトリックスに含まれているとします。これにより、各候補が各子の父親である確率が遺伝データのみに基づいて得られます。Gは計算に約3秒かかり、反復ごとに再計算する必要があるため、処理速度が大幅に低下します。

私たちは通常、寄付者の候補者が近いほど父親である可能性が高いと予想しているため、父親と分散を一緒に推測すると、父親の推測はより正確になります。行列DGと同じ次元を持ち、母と候補の間の距離の関数とパラメーターのいくつかのベクトルのみに基づく父子の確率を含みます。DGの要素を乗算すると、遺伝的データと空間的データが与えられた場合の父親の同時確率が得られます。乗算された値の積は、分散モデルの可能性を与えます。

上記のように、私は分散をモデル化するためにGNDを使用しています。実際、私は実際にGNDと均一分布の混合を使用して、非常に遠い候補者が偶然のために父性の可能性が高い可能性を可能にしました(遺伝学は乱雑です)、無視するとGNDの見かけの尾部が膨らみます。したがって、分散距離確率は次のとおりです。d

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

ここで、はGNDからの分散距離の確率、Nは候補の数、()はGNDが分散に与える貢献度を決定します。Pr(d|a,b)c0<c<1

したがって、計算負荷を増加させる2つの追加の考慮事項があります。

  1. 散布距離は不明ですが、反復ごとに推測する必要があります。これを行うためにGを作成するにはコストがかかります。
  2. 統合する3番目のパラメーターがあります。c

これらの理由から、グリッド補間を実行するには少し複雑すぎるように思われましたが、それ以外の場合は確信しています。

以下は、私が使用したpythonコードの簡単な例です。遺伝データからの父性の推定を簡略化しました。これには多くの追加コードが含まれるため、0と1の間の値の行列に置き換えました

最初に、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

次に、2000人の候補者と800人の子孫をシミュレートします。また、子孫の母親と父親の候補の間の距離のリストと、ダミーのG行列をシミュレートします。

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]

初期パラメータ値を設定します。

# 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

a、b、cを順に更新して、メトロポリス比を計算します。

# 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とbの事前分布、またはMetropolis-Hastingsアルゴリズムでのプロポーザル分布を探していますか?両方の用語を同じ意味で使用しているようです。
ロビンライダー2018

あなたは正しいです-明確ではないことを残念に思います。私はMHの提案配布に最も興味があります。先に述べたタイトルを適宜変更しました。
テリス

前に平坦またはジェ下、すなわち、又は Iは、変数の変化と信じて閉鎖を生成します-form条件付き。π α 1 π α 1 / A α = A - Bの π | B データaπ(a)1π(a)1/aα=abπ(a|b,data)
西安


Metropolis-Hastingsをより効率的に実行するのに役立つ事前値を設定することに関心があるかどうかは、まだはっきりしていません。
西安

回答:


2

マルコフ連鎖モンテカルロ(MCMC)メソッドを使用する必要はありません。

均一な事前分布を使用している場合は、パラメーターおよび制限された空間での最尤推定と非常によく似ています。ab

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

ここで、は定数(およびから独立しいます)であり、1に積分されるように尤度関数をスケーリングすることで見つけることができます。P(a,b)P(d)ab

iid変数の対数尤度関数 は次のとおりです。ndiGN(0,a,b)

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

この関数の場合、それをプロットして最大値を見つけることはそれほど難しくないはずです。


このグリッド補間は、2つのパラメーターと観測された距離に対して機能し、私がやろうとしていることかもしれません。実際、私は分散距離と父性推論の統合推定を行っています。これには、統合するための少なくとも1つの他のパラメーターと、非常に遅い(反復ごとに約3秒)余分な尤度項があり、チェーンが非常に遅くなります。マルコフ連鎖で現在使用しているよりも約10倍多くの反復が必要になると思います。
テリス2018

@tellisこれらの用語「分散距離」と「父性推論」は私にはあまり理解されていません。データセットまたはその一部を追加することで、より具体的な情報を提供できるでしょう。それをしている間、あなたは「もう一つのパラメーター」についてもっと話した方がいいかもしれません。だから、あなた持っているのはどのようなデータですか?
Sextus Empiricus

1
シミュレーションデータを使用した例を追加しました。
テリス

0

モデルの設定方法がよくわかりません。特に、ある種の場合、花粉の飛散距離は有限のセットであるため、「分散確率」は「分散率」(推定される父親を合計して確率になるように正規化する必要があるため)。したがって、パラメーターは期待どおりの意味(妥当な値など)を持たない場合があります。

私は過去にいくつかの同様の問題に取り組んだことがあるので、考えられるアプローチや批判的な見方を提案する方法として、理解のギャップを埋めようとします。元の質問のポイントを完全に逃した場合はお詫びします。以下の処理は、基本的にはこの種のモデルについての優れた論文の1つであるHadfield et al(2006)に従います。

ましょう遺伝子座における遺伝子型を示し一部の個人のための。既知の母と推定上の父持つ子孫について、観測された子孫遺伝子型の確率を -最も単純なケースでは、これは単にメンデルの継承確率の積ですが、より複雑なケースでは、遺伝子型エラーのモデルや親の遺伝子型の欠落が含まれる可能性があるため、迷惑パラメータを含めます)。Xl,klkimif

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

してみましょう子孫のための花粉飛散距離も、と聞かせ、既知の母の間の距離もと推定される父親の、と聞かせ分散率(たとえば、一般化された標準PDFと均一PDFの重み付けされた組み合わせで、質問のとおり)。分散率を確率として表すには、wrtを有限状態空間に正規化します。になるように、スタディエリア内の(有限)数の推定の父親によって引き起こされる可能な分散距離の(有限)セット δiidmi,fmifDi,f=q(dmi,f|a,b,c)

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

してみましょう父方の種子の割り当てもで、植物の場合子孫の父である。父性の割り当てを事前に統一すると仮定すると、 、父方の割り当ては、前記支持体(可能父親)渡って積分することにより正規化された有限サポートを有する離散RV他のパラメータとの遺伝子型を条件すなわち、です。PiiPi=ffi

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

したがって、この問題の簡単なサンプラーを作成する合理的な方法は、Metropolis-within-Gibbsです。

  1. 条件として、すべての父性の割り当てを更新します。これは有限サポートの個別のrvなので、正確なサンプルを簡単に描くことができます{a,b,c,θ}Pii
  2. 上の条件、更新メトロポリス・ヘイスティングスの更新に。ターゲットを形成するには、上記の方程式の値のみを更新する必要があるため、これはコストがかかりません{Pi,θ}a,b,cD
  3. 上の条件、更新 MH更新有します。ターゲットを形成するには、値を更新する必要があります。これはコストがかかりますが、は更新しません。{Pi,a,b,c}θGD

サンプルを描画するコストを削減するには、3の前にステップ1〜2を複数回実行します。ステップ2〜3でプロポーザルの分布を調整するには、予備実行のサンプルを使用して事後分布の共分散を推定します。次に、この共分散推定を多変量ガウスの提案内で使用します。これは最も効率的な方法ではないと思いますが、実装は簡単です。{a,b,c}{a,b,c,θ}

さて、このスキームはあなたがすでにやっていることに近いかもしれません(私はあなたの質問から父親をどのようにモデル化しているのかわかりません)。しかし、計算上の懸念を超えて、私の大きな問題は分散距離の平均に関して、パラメーターが、ユーザーが考えている意味を持たない可能性があるということです。これは、私が前述した父性モデルのコンテキストでは、が分子と分母(正規化定数)の両方に入るためです。したがって、植物の空間配置は値が高い可能性または事後確率を持つかに潜在的に強い影響を与えますこれは、植物の空間分布が不均一な場合に特に当てはまります。a,b,cPr(Pi|)a,b,ca b ca,b,c

最後に、まだリンクしていない場合は、上記にリンクされているHadfieldの論文と、それに付随するRパッケージ( "MasterBayes")を参照することをお勧めします。少なくともそれはアイデアを提供するかもしれません。


私のアプローチは確かにハドフィールドをモデルにしており、2つの大きな変更点があります。(1)母親からのシードは完全な兄弟であり、したがって独立していない可能性があります。したがって問題は、分散、父性、コウモリの同胞構造も一緒に推測することの1つです。(2)父親の割り当てを順次更新するのではなく、父性の可能性に比例してすべての候補者を同時に検討するために分数父性アプローチを使用しています。
テリス

私はそれらを行うためにパッケージFAPSを使用しています。
テリス

私の質問は基本的に、あなたのポイント2を実行するための効率的な提案の配布について尋ねています。残りの回答は、GとDの積の定式化を含め、私がすでに行ったことに非常に近いものについて説明しています(ただし、このおかげで、私は私がそれを正しく行ったとは思えないので、2つ目の目が一致することを知っておくと役に立ちます!)
テリス

a,b,c

a,b,cG
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.