1

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

4

2 回答 2

1

为了在集合中均匀采样{(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)的所有可行值。积分,是或小于的概率是。更详细地说:a1a4a2k4(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

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

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

在 R 中,我们可以对 1000 个值进行采样a2

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

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

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

指定a1a2a3后,只有一个可能的值a4

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值的分布相同)。因为我们a1在 range 中统一选择[0, 1-2*a2],所以较低的值比较高的值更常见:

在此处输入图像描述

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

在此处输入图像描述

于 2015-09-16T05:51:01.223 回答
1

我试着考虑使用狄利克雷分布,

好吧,对我来说,它看起来像狄利克雷分布。

但它没有提供强制两个变量相等的机制。

但你不必。您实际上有三个来自 Dirichlet 分布的变量 - 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 中)

生成 N 个总和为 M 的均匀随机数

于 2015-09-17T18:00:32.317 回答