Выборка положительных весов с единицей суммы и ограничением равенства

Предположим, у меня есть вектор положительных весов a=(a1, a2, a3, a4), такой что a2=a3 и a1+a2+a3+a4=1. Есть ли способ сэмплировать такие веса с помощью R? Я пытался подумать об использовании распределения Дирихле, но оно не дает механизма, который заставил бы две переменные быть равными.


person Dey    schedule 16.09.2015    source источник


Ответы (2)


Для равномерной выборки по набору {(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), содержащий все допустимые значения a1 и a4. При интегрировании вероятность того, что 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

Таким образом, мы можем выбрать значения для 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)

После указания a1, a2 и a3 существует только одно возможное значение для 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 равномерно в диапазоне [0, 1-2*a2], более низкие значения встречаются чаще, чем более высокие:

введите здесь описание изображения

Вот распределение значений a2 (по определению это то же самое, что и распределение значений a3). Форма распределения аналогична a1, но максимальное значение равно 0,5:

введите здесь описание изображения

person josliber♦    schedule 16.09.2015
comment
Вы предположили, что PDF для a2 пропорциональна длине отрезка, содержащего все возможные значения для a1 и a4, т.е. (1-2a_2)sqrt(2). Это правильно ? По мере увеличения длины отрезка значение a_2 должно уменьшаться. - person Dey; 18.09.2015

Я пытался подумать об использовании распределения Дирихле,

Ну, для меня это похоже на распределение Дирихле.

но он не дает механизма, чтобы заставить две переменные быть равными.

но вам не нужно. На самом деле у вас есть три варианта распределения Дирихле — 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

person Severin Pappadeux    schedule 17.09.2015
comment
Спасибо @SeverinPappadeux. Это хорошее наблюдение. У меня есть сомнения, которые я задал вам в StackExchange, поскольку это не был вопрос, связанный с кодом. - person Dey; 18.09.2015
comment
Не могли бы вы отредактировать свой ответ, чтобы аргументировать, почему это равномерно сэмплирует пространство {(a1, a2, a3, a4 | a2=a3, a1+a2+a3+a4=1, a1>0, a2>0, a3>0, a4>0}? Я вычислил случайные вариации из своего ответа и из вашего, и они имеют разные распределения (например, корреляции между парами переменных различаются). - person josliber♦; 18.09.2015
comment
@josilber I've computed random variates from my answer and from yours and they have different distributions. Они могут быть. Я считаю, что у нас есть случай распределения Дирихле n = 3. Распределение Дирихле имеет свойства x_i в пределах [0...1] и Sum(x_i)=1, но также параметризуется \alpha_i. Самый простой случай, который используется в моем коде Python, - это когда все \alpha_i=1. Мне лень проверять, но я не удивлюсь, если вы построите дистрибутив Дирихле с другим \alpha_i (\alpha_i = 0,5?). В таком случае ваше решение является удовлетворительным ответом (как и мое) - person Severin Pappadeux; 18.09.2015
comment
I believe we have a case of n=3 Dirichlet distribution. Не могли бы вы сказать, почему вы в это верите? Я не знаю, является ли набор распределением Дирихле (для меня не очевидно, почему это так), но я почти уверен, что это не распределение Дирихле с alpha_i=1 для всех переменных, как вы сейчас предложили в своем отвечать. Не могли бы вы привести какое-нибудь математическое обоснование того, почему вы думаете, что это распределение Дирихле? - person josliber♦; 18.09.2015