具有总和和等式约束的正权重采样

Sampling of positive weights with sum unity and an equality constraint

假设我有一个正权重向量 a=(a1, a2, a3, a4) 使得 a2=a3a1+a2+a3+a4=1。有什么方法可以使用 R 对这种权重进行采样吗?我试着考虑使用 Dirichlet 分布,但它没有提供强制两个变量相等的机制。

为了在集合 {(a1, a2, a3, a4 | a2=a3, a1+a2+a3+a4=1, a1>0, a2>0, a3>0, a4>0} 中均匀采样,我将首先对 a2 的值进行采样(等于 a3)。为此,我们需要知道这个值的分布。如果a2 = a3 = r,那么我们有a1+a4 = 1-2r;对于正的 a1 和 a4,有一条长度为 (1-2k)*sqrt(2) 的线段,其中包含 a1a4 的所有可行值。积分,a2等于k或更小的概率是4(k - k^2)。更详细:

Prob (a2 <= k) = Integral(0 to k) (1-2r)*sqrt(2) dr / Integral(0 to 0.5) (1-2r)*sqrt(2) dr
               = ((k-k^2)*sqrt(2)) / (sqrt(2)/4)
               = 4k - 4k^2

因此,我们可以通过 select 均匀分布的值 u~U(0, 1) 并将 a2 设置为等于 k 的值来对 a2 的值进行采样4k - 4k^2 = u。通过二次公式求解,得到:

a2 = 0.5 * (1 - sqrt(1-u))

在 R 中,我们可以为 a2 采样 1000 个值:

set.seed(144)
a2 <- 0.5 * (1 - sqrt(1 - runif(1000)))
a3 <- a2

给定一个固定值a2 = a3 = ka1的值均匀分布在[0, 1-2k]中:

a1 <- runif(1000) * (1 - 2*a2)

已指定 a1a2a3a4 只有一个可能的值:

a4 <- 1 - a1 - a2 - a3

我们可以看一下我们的一些采样值:

head(cbind(a1, a2, a2, a4))
#              a1         a2         a2         a4
# [1,] 0.83455239 0.01251016 0.01251016 0.14042729
# [2,] 0.02744599 0.22932773 0.22932773 0.51389856
# [3,] 0.45835472 0.23860119 0.23860119 0.06444291
# [4,] 0.36843649 0.14679703 0.14679703 0.33796946
# [5,] 0.35109881 0.08702039 0.08702039 0.47486041
# [6,] 0.02916818 0.19942616 0.19942616 0.57197949

这是 a1 值的分布(请注意,根据对称性,这与 a4 值的分布相同)。因为我们 select a1 统一在 [0, 1-2*a2] 范围内,较低的值比较高的值更常见:

这是 a2 值的分布(根据定义,这与 a3 值的分布相同)。分布的形状类似于a1,但最大值为0.5:

I tried to think about using the Dirichlet distribution,

嗯,对我来说它看起来像 Dirichlet 分布。

but it gives no mechanism to force two of the variates to be equal.

但您不必这样做。实际上,狄利克雷分布具有三个变量 - A、B、C,所有 >= 0,均匀分布 U(0,1),因此 A+B+C=1

采样后 (A, B, C) 你只需赋值

a1 = A;
a2 = B/2.0;
a3 = B/2.0;
a4 = C;

请看一下如何采样(好吧,在 Python 中)

Generating N uniform random numbers that sum to M