广义正态分布的提案分布


10

我正在使用具有概率密度函数的广义正态分布(维基百科条目)来模拟植物扩散。

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秒钟的时间来计算,并且每次迭代都需要重新计算,这大大降低了速度。

由于我们通常期望更接近的候选人捐赠者更有可能是父亲,因此,如果您共同推断父子关系和分散父子关系,则父子关系推断会更准确。矩阵D具有与G相同的维度,并且仅基于母体与候选者之间的距离和某些参数向量的函数包含父系概率。在给定遗传和空间数据的情况下,DG中的相乘元素给出了父权的联合概率。乘积值的乘积给出了离散模型的可能性。

如上所述,我一直在使用GND来建模色散。实际上,我实际上使用了GND和均匀分布的混合体,以允许非常遥远的候选者仅由于偶然性(遗传杂乱)而具有较高的亲子关系可能性(如果忽略,这会使GND的明显尾部膨胀)。因此,扩散距离的概率为:d

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

其中是到GND的散布距离的概率,N是候选者的数量,而()确定GND对散布的贡献。Pr(d|a,b)c0<c<1

因此,还有两个额外的考虑因素会增加计算负担:

  1. 色散距离是未知的,但必须在每次迭代中进行推断,而创建G来做到这一点非常昂贵。
  2. 有第三个参数进行积分。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算法中寻找提案分配?您似乎已经互换使用了这两个术语。
罗宾·赖德

您说的没错-很抱歉,不清楚。我对MH的提案分发最感兴趣。我已经相应地更改了我先前提到的标题。
–tellis

下平坦或杰弗里斯之前上,即或 相信变量来改变产生一个封闭的形式的条件。aπ(a)1π(a)1/aα=abπ(a|b,data)
西安


尚不清楚您是否对设置帮助有所帮助或更有效地运行Metropolis-Hastings感兴趣。
西安

Answers:


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

对于此功能,将其绘制并找到最大值应该不太困难。


这个网格插值法适用于两个参数和观察到的距离,这也许就是我最终要做的。实际上,我正在对散布距离和亲子关系推断进行联合估计,这涉及至少一个要积分的参数,以及一个额外的似然项,该项的确很慢(每次迭代约3秒),这实际上会使链条变慢。我认为我需要比当前用于markov链的迭代多10倍的迭代。
–tellis

@tellis这些术语“分散距离”和“亲子鉴定”我不太了解。也许您可以通过添加数据集或其中的一部分来提供一些更具体的信息。在这样做的同时,您不妨更多地谈论“另一个参数”。那么,什么数据是,你呢?
Sextus Empiricus

1
我添加了一个使用模拟数据的示例。
特利斯

0

我不太了解您是如何建立模型的:尤其是在我看来,对于给定的种子,可能的花粉散布距离是一个有限的集合,因此您的“散布概率”可能更好地称为“分散率”(因为可能需要通过对推定父亲的总和来归一化)。因此,这些参数可能并没有您期望的含义(如合理值)。

过去,我曾处理过几个类似的问题,因此,我将尝试填补我的理解中的空白,以此来建议可能的方法/批判性外观。抱歉,如果我完全错过了您最初提出的问题。下面的处理基本上遵循Hadfield等人(2006)的研究,该论文是关于这种模型的较好论文之一。

令表示基因在某个个体处的基因型。对于具有已知母亲和假定父亲后代,让观察到的后代基因型的概率为 -在最简单的情况下,这只是孟德尔遗传概率的乘积,但在更复杂的情况下,可能包括某些基因分型错误模型或缺失的父母基因型,因此我添加了讨厌的参数)。Xl,klkimif

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

令为后代的花粉散布距离,令为已知母亲与推定父亲之间的距离,令是分散率(例如,您所质疑的广义法线和统一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

因此,为这个问题编写一个简单采样器的合理方法是Gibbs中的Metropolis。

  1. 以,为所有更新分配。这是具有有限支持的离散rv,因此您可以轻松绘制精确的样本{a,b,c,θ}Pii
  2. 以使用Metropolis-Hastings更新来更新。为了形成目标,只需要更新以上方程式中的值,因此这并不昂贵{Pi,θ}a,b,cD
  3. 以,使用MH更新来更新。为了形成目标,需要更新值,这很昂贵,但是不需要。{Pi,a,b,c}θGD

为了降低样本的成本,您可以在3之前多次执行步骤1-2。要在步骤2-3中调整提案分布,可以使用初步运行的样本到估计的关节后验分布的协方差。然后在多元高斯提案中使用此协方差估计。我确定这不是最有效的方法,但是很容易实现。{a,b,c}{a,b,c,θ}

现在,该方案可能接近您已经在做的事情(我无法根据您的问题告诉您如何建模亲子关系)。但是除了计算方面的问题外,我的更大观点是,就平均分散距离而言,参数可能没有您认为的含义。这是因为,在上述亲子关系模型 I的情况下,进入分子和分母(归一化常数):因此,植物的空间排列将对具有较高的可能性或后验概率具有潜在的强烈影响当植物的空间分布不均匀时,尤其如此。a,b,cPr(Pi|)a,b,ca,b,c

最后,我建议您看看上面链接的Hadfield论文以及随附的R软件包(“ MasterBayes”)(如果还没有的话)。至少它可以提供一些想法。


我的方法的确以哈德菲尔德的方法为模型,但有两个主要变化:(1)母亲的种子可能是全兄弟姐妹,因此不是独立的。因此,问题是共同推断散布,亲子关系,蝙蝠也有同胞关系之一。(2)我使用分数父权制方法来根据其父权的可能性同时考虑所有候选人,而不是顺序更新父权分配,因为父亲的探索空间很大。
特利斯

我正在使用FAPS软件包来执行这些操作。
特利斯

我的问题本质上是关于为您的观点2分配有效的提案。您的其余答案描述的内容与我已经完成的工作非常接近,包括G和D乘积的公式化(但是感谢您-我当时不是我不确定我做得正确,因此知道第二双眼睛是否同意非常有用!)。
特利斯

抱歉,我没有罐装解决方案或建议书分发。但是,我有一些发现:(1)第 1-2步非常便宜,并且在进入第3步之前可以以很少的成本进行多次迭代。即使第2步的建议比较拙劣,许多迭代也足以满足“在的状态空间中进行大动作” 。a,b,c
Nate Pope

(2)步骤2中的条件分布是3维的。如:易于可视化。在固定的亲子关系分配的MAP估计中,的未归一化目标是什么样子?可视化在不同paternities,非标准化的目标应该给你的感觉的,如果它是多,平中区等a,b,cG
内特教宗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.