在 R 中生成三个总和为 1 的随机数

机器算法验证 r 随机生成
2022-03-25 07:40:37

我想生成三个随机数,然后将它们标准化,使它们加起来为 1。

我想重复这个过程,这样从长远来看,每个数字的模式都是 0.33。

4个回答

该模式有点像红鲱鱼。这是一个非常简单的解决方案,可以避免精确定义模式的需要。我很惊讶它没有更早提出。通过从对称分布中抽取样本并适当地缩放它们,可以很容易地满足对模式的约束:

(xi,yi,zi)i.i.d.L(μ,σ)
(xi,yi,zi)=(xixi+yi+zi,yixi+yi+zi,zixi+yi+zi)

在哪里L(μ,σ)是一个对称分布(因此均值、众数和中位数相同)并且被选择为使得低于 0 的概率质量为 0。例如,选择L(μ,σ)成为Beta(2,2)

a1 <- matrix(rbeta(100*3,2,2), nc=3)
a1 <- sweep(a1, 1, rowSums(a1), FUN="/")
colMeans(a1)
# [1] 0.3342165 0.3341534 0.3316301

产生所需的解决方案

sum(colMeans(a1))
# [1] 1

如果 X1、X2 和 X3 是 iid Gamma(a),则 {X1,X2,X3}/(X1+X2+X3) 将是 Dirichlet(a,a,a)。

如果 a>1,则模式将为 1/3。对于较大的 a 值,峰值将更加尖锐。

这是一个近似的数字答案。它可以很容易地变得更精确。
{U,V,W}=X,Y,Z/(X+Y+Z), 在哪里X,Y,Z是具有梯形密度的独立同分布[0,1]

f(x)=1+a2ax. U,V,W将具有相同的边际。
给定一个数字“a”,我使用 Mathematica 来获取 cdfU

F[u_] = Assuming[0 < u < 1, Simplify@Integrate[  
Boole[x < u(x+y+z)] f[x] f[y] f[z], {x,0,1},{y,0,1},{z,0,1}]

区分F两次,将结果设置为零,并求解得到的 7 次多项式给出模式。我使用二进制搜索来细化“a”的值。我一直使用精确的算术,直到求解多项式。

  a      mode

  1    .318182  
 7/8   .322065  
13/16  .327099  
25/32  .330465  
49/64  .332373  
97/128 .333376 <-- close enough?  
 3/4   .334221  
 1/2   .353738  
  0    .359187

分析:给定一个联合pdfX,Y, 和Z fX,Y,Z(x,y,z),如果他们是独立同分布的,那么fX,Y,Z(x,y,z)=fX(x)fY(y)fZ(z), 在哪里fX(x)=fY(y)=fZ(z). 你必须找到pdf

fX,Y,Z(xx+y+z)
微分后等于零,你会找到你的模式。显然,模式将取决于fX,Y,Z(x,y,z)因此在fX(x),fY(y)fZ(z).

数值:从您的首选分布中抽取三个随机数,将它们标准化并将它们保存在ith- 行一个 Nx3 矩阵。重复此过程 N 次并绘制每列的频率。

解析解是首选,而不是试图从 R 中的随机样本中证明它,这只是一个数值近似。