Как получить распределение суммы зависимых переменных Бернулли
У меня есть N переменных Бернулли, X1
,..., XN
, а также Xi~B(1, pi)
, pi
известен каждому Xi
, а также Y=X1+...XN
Теперь мне нужно получить назначение Y
,
Если Xi
а также Xj
является независимым, когда i!=j
тогда я могу использовать симуляцию:
1. Generate `X1`, ..., `XN` via their distribution, and then get the value of `Y`;
2. Repet step 1 for 10000 times, and then I can get `Y1`, ..., `Y10000`, so I can konw the distribution of `Y`.
Но сейчас Xi
а также Xj
зависит, поэтому я также должен принять во внимание корреляцию, предполагая, что corr(Xi, Xj)=0.2
когда i!=j
Как я могу вставить корреляцию для симуляции? Или получить распространение Y другими способами?
Спасибо за помощь и совет.
1 ответ
Вы можете генерировать конкретные попарные корреляции (в определенных пределах), получая условное распределение одного по другому. Ограничения в том, что вы не можете иметь совершенно произвольные p-значения и корреляции. Однако одновременные ограничения, подразумеваемые парными наборами корреляций N-choose-2, будут невозможны для произвольного выбора N, p-значений и корреляций.
Следующая реализация Ruby показывает расчеты для получения указанных p-значений и корреляций для пары X:
# Control the run with command-line args.
# If no args provided, default to test case of
# p1 = 0.2, p2 = 0.8, rho = -0.5, sample size = 10
p1 = (ARGV.shift || 0.2).to_f
p2 = (ARGV.shift || 0.8).to_f
rho = (ARGV.shift || -0.5).to_f
n = (ARGV.shift || 10).to_i
# Calculate conditional probabilities for p2 given p1 = 0, 1
p2_given = [p2 - rho * Math::sqrt(p1 * p2 * (1.0 - p2) / (1.0 - p1)),
p2 + rho * Math::sqrt((1.0 - p1) * p2 * (1.0 - p2) / p1)]
printf "p2_given_1 = %8.5f, p2_given_0 = %8.5f\n", p2_given[1], p2_given[0]
# Only proceed to actually generate values if the conditional
# probabilities are between zero and one
if p2_given.inject(true) {|m, e| m &= (e >= 0 && e <= 1)}
n.times do
x1 = (rand <= p1) ? 1 : 0
x2 = (rand <= p2_given[x1]) ? 1 : 0
printf "%d,%d\n", x1, x2
end
end