如何从总和为1的指数分布中生成随机数(概率)

时间:2018-11-03 11:16:56

标签: r random exponential-distribution

考虑一下,我希望x随机数加起来等于1,并且该分布是指数分布。当我使用

x<-c(10,100,1000)

a<-rexp(x[3],rate=1)

a<-a/sum(a)

这会改变分布,对吗?

那么有人知道一种使概率仍然呈指数分布的方法吗?我知道他们将不再完全独立。

非常感谢!

2 个答案:

答案 0 :(得分:2)

是的,归一化会改变分布,实际上,不可能精确地实现所需的内容。


简单明了

让X 1 ,…,X n 对于某些有限的n是要生成其值的随机变量。您有两个要求

  1. X i 〜Exp(λ)对于一些λ> 0且i = 1,…,n。
  2. X 1 +…+ X n = 1。

虽然很容易满足这两个要求中的每个要求,但不可能同时满足两个要求。这样做的原因是,指数分布的probability density function在[0,∞)上为。这意味着每个X i 都以正概率获得大于1的值,这意味着要求2并不总是成立。实际上,它具有零概率。


归一化所隐含的概率分布

现在,您提出了一种直观的方法,从需求1开始并执行归一化Z i = X i /(X 1 + …+ X n ),每个i = 1,…,n。但是,很少有分布在诸如加法,乘法,尤其是除法的变换下表现良好,因为随机分母几乎很难处理。在这种情况下,我们还要担心Z i 的分子和分母是依赖的。

尽管如此,Z i exact 分布的名称实际上是已知的,它是Dirichlet distribution。可以看到note that X i 〜Gamma(1,λ),其中λ作为速率参数。接下来,我们看一下Dirichlet分布的definition:对于i = 1,…,我们从Y i 〜Gamma(α i ,θ)开始。 n,然后按照您的建议,定义W i = Y i /(Y 1 +…+ Y n )。然后(W 1 ,...,W n )〜Dirichlet(α i ,…,α n )。但是,在要求1的情况下,对于每个i = 1,…,n,我们都有α i = 1。因此,您的方法导致(Z 1 ,...,Z n )〜Dirichlet(1,...,1)。

然后,您可以使用MCMCpack包来模拟其中的值:

library(MCMCpack)
rdirichlet(1, c(1, 1, 1))
#           [,1]      [,2]       [,3]
# [1,] 0.2088649 0.7444334 0.04670173
sum(rdirichlet(1, c(1, 1, 1)))
# [1] 1

现在查看Dirichlet(1,...,1)的probability density function,您会发现它实际上是常数(当为正数时)。因此,从某种意义上讲,您可能会认为它是多元统一的。如果想一秒钟,这是有道理的(例如,考虑x + y = 1,x + y + z = 1上的点)。

但是,多元分布在某种程度上是均匀的,并不意味着在边际分布方面类似。实际上,可以show证明它们是Beta(1,n-1)。

在Z i 上被限制为[0,1]

由于对于某些λ值,指数随机变量集中在接近零的位置,所以人们可能会错误地认为它们实际上具有有限的支持度。

X i 〜Exp(λ)的累积分布函数为1-exp(-λx)。因此,P(X i <= 1)= 1-exp(-λ)仅在极限处为λ->∞,而在λ->∞时为1,但在这种情况下,X的分布收敛为0。因此,我们不能将非退化指数随机变量限制为[0,1]。但是请注意,对于较大的λ1-exp(-λ)固定值来说,它接近1,并且可能会错误地认为X i 实际上限制为[0,1]。

一些琐碎的示范。首先,Z i (遵循Dirichlet分布)被限制为[0,1]。

data <- replicate({
  x <- rexp(5)
  z <- x[1] / sum(x)}, n = 100000)
range(data)
# [1] 1.060492e-06 9.633081e-01
plot(density(data, bw = 0.01))

enter image description here

第二,X〜Exp(1)显然取大于1的值。

x <- rexp(10000)
range(x)
# [1] 7.737341e-05 1.005980e+01
mean(x < 1)
# [1] 0.6391
plot(density(x))

enter image description here


按正数缩放比例

有多条评论建议使用fact,即指数分布在按比例缩放时以正因子闭合,因此如果X〜Exp(λ),则kX〜Exp(λ/ k)。确实是这样,但这不适用于当前情况。原因是k = X 1 +…+ X n 不是常数(这意味着k对于X i 的不同实现是不同的),因此,kX〜Exp(λ/ k)不成立。现在,如果我们将k视为一个常数(例如5),则无法保证Z i = X i / 5将满足您的要求2。实际上,则约束将以0的概率成立。

要清楚地了解正在发生的事情,不要被@MauritsEvers的经验“证明”所误导,这里有一些详细信息。

让(Ω,F,P)为概率空间。然后X i :Ω-> R;即,X i 是一个函数,它取R中的值X i (ω),结果ω(将其想象为set.seed值)来自Ω。现在我们确实具有这样的性质,对于常数k,kX i 〜Exp(λ/ k)。然而,常数是指,不管来自Ω的已实现结果ω,k的值始终相同,就好像k:Ω-> R是常数函数一样。 @MauritsEvers提出的是k = X 1 +…+ X n 。但是,这被视为一个函数,它不是常数,并且取决于结果ω。

一些说明这个逻辑如何失败的简单示例如下:让k = 1 / X i 。然后kX i = 1,它是一个退化的随机变量,而不是指数变量。类似地,如果X〜N(0,1),则kX = 1而不是kX〜N(0,1 / X ^ 2),这将根据X〜N(0,1)给出kX的事实进行“跟进”约N(0,k ^ 2)表示常数 k。


错误逻辑

现在,上述错误逻辑的起源可以说是对概率概念的错误处理+直接处理R中的模拟值。@ MauritsEvers声称如果我们运行

n <- 3
x <- rexp(n)
k <- sum(x)

然后,实现的总和k可以用作上述常数k,并期望kX i 〜Exp(?)。像上面的示例一样,对n <- 1进行的健全性检查已经表明,这种论点有问题,因为x / k就是1-一个退化的随机变量,而不是指数的。声称k <- sum(x)是一个有效的选择,因为它是许多已经观察到的实现。这实际上就是该选择无效的原因。在前面的符号中,我们有k(ω)= X 1 (ω)+…+ X n (ω),因此k不是常数函数。 / p>

另一种看待它的方式是,如果我们认为x是某种随机的,那么k一样随机的,因为它是{{1 }}。现在xx都是数字和实现,但是在要求R打印它们之前,我们都不知道它们的值。常数k的定义是,不管ω或k,我们总是知道它的值。

最后,作为一项大学练习,可以考虑查看kX i 的CDF:

P(kX i <= x)= P(X i <= x / k)= 1-exp(-λx/ k)

,因此是预期的kX i 〜Exp(λ/ k)。现在以set.seed为例。在这种情况下,我们正在处理

P(X 1 /(X 1 + X 2 )<= x)

,我们再也无法轻易摆脱复杂的分母。对于来自Ω的某个固定ω,我们当然可以定义一个常数k = X 1 (ω)+…+ X n (ω)。但是Z i = X i /(X 1 (ω)+ ... + X n (ω) )不再限制为[0,1],并且要求2再次失败。


错误的经验“证明”

最后,有人可能会问,为什么@MauritsEvers的经验“证明”部分(由于模拟+拟合+假设检验与理论证明相去甚远)声称Z i 实际上确实遵循指数分布。

此“证明”的关键要素是取n <- 2lambda <- 1相对较大的值。在这种情况下,我们有

Z i = X i /(X 1 + ... + X n )≈X i / n * n /(X 1 +…+ X n )。

根据大数定律,右边的第二项变为λ-一个固定数-而众所周知的第一项为Exp(λn)。因此,对于较大的n,我们得到Z i 逼近作为λExp(λn)。但是,最初的问题不是关于近似值或极限分布。


摘要

我们可以区分以下三种情况:

  1. 小n。 (Z 1 ,…,Z n )遵循Dirichlet(1,…,1)分布,边际分布不等于指数分布。用指数逼近它们会产生任意差的结果。
  2. 大号。 (Z 1 ,…,Z n )仍然遵循Dirichlet(1,…,1)分布,边际分布仍不等于指数分布。出于实际目的,将它们近似为指数应该可以得出完全有效的结果。
  3. n->∞时的极限情况。随着n的增长,每个Z i 越来越接近λExp(λn)。但是,正如我们所看到的,λExp(λn)趋向于一个退化的随机变量,它等于零。

答案 1 :(得分:0)

来自?rexp

rexp(n, rate = 1)
   [...]
   n: number of observations. If ‘length(n) > 1’, the length is
      taken to be the number required.

所以

x<-c(10,100,1000)
a<-rexp(x,rate=1)

相同
rexp(3, rate = 1)

归一化为1可确保(指数)概率函数满足(指数)概率密度函数的标准。


更新

在与@JuliusVainora的讨论有些晦涩之后,我将证明a确实是指数分布的。

  1. 让我们重新生成数据:

    x <- c(10, 100, 1000)
    set.seed(2018)
    a <- rexp(x[3], rate=1)
    a <- a / sum(a)
    

    我在这里使用固定的随机种子来提高可重复性。

  2. 我将使用贝叶斯指数模型来拟合lambda,并使用a来估算rstan

    library(rstan)
    stan_code <- "
    data {
        int N;
        real x[N];
    }
    
    parameters {
        real lambda;
    }
    
    model {
        x ~ exponential(lambda);
    }
    "
    
    fit <- stan(
        model_code = stan_code,
        data = list(N = length(a), x = a))
    
    fit
    #Inference for Stan model: b690462e8562075784125cf0e71c81e2.
    #4 chains, each with iter=2000; warmup=1000; thin=1;
    #post-warmup draws per chain=1000, total post-warmup draws=4000.
    #
    #          mean se_mean    sd    2.5%     25%     50%     75%   97.5% n_eff Rhat
    #lambda 1000.21    0.80 31.11  941.86  978.74  998.95 1020.84 1062.97  1502    1
    #lp__   5907.27    0.02  0.66 5905.52 5907.09 5907.53 5907.71 5907.75  1907    1
    #
    #Samples were drawn using NUTS(diag_e) at Sun Nov  4 01:09:40 2018.
    #For each parameter, n_eff is a crude measure of effective sample size,
    #and Rhat is the potential scale reduction factor on split chains (at
    #convergence, Rhat=1).
    
  3. 我们执行Kolmogorov-Smirnov检验,以比较a的经验分布和根据先前Stan模型估计的lambda的指数分布

    ks.test(a, "pexp", summary(fit)$summary[1, 1])
    #
    #   One-sample Kolmogorov-Smirnov test
    #
    #data:  a
    #D = 0.021828, p-value = 0.7274
    #alternative hypothesis: two-sided
    

    p 值为0.72时,我们失败拒绝从两个不同分布中抽取样本的原假设。


更新2

要清除评论中的讨论,

  1. straightforward(以及更加透明的IMO)证明了指数分布族在缩放时被正因子封闭,而不必调用整个度量理论机器。

  2. 更重要的是,让我们回想一下,任何概率密度函数都定义为

    phi(x) = p(x) * N
    

    其中

    N = int p(x) 
    

    将积分取到p(x)的样本空间中,使得

    int phi(x) = 1.
    

    是的,p(x)phi的表达式都是相同的N。这里是重要的部分: N仍然是一个常数,因为我们在整个样本空间中进行求和(积分)。

等效地,我们通过(已)抽取样本的恒定总和对从指数分布抽取的样本进行归一化。