2014-01-16 3 views
0

У меня есть N Бернулли переменные, X1 ..., XN и Xi~B(1, pi), pi известен для каждого Xi и Y=X1+...XN, теперь мне нужно, чтобы получить destribution из 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 другими способами?

Спасибо за помощь и советую.

ответ

0

Вы можете генерировать определенные парные корреляции (в пределах) путем получения условного распределения одного заданного другого. Пределы заключаются в том, что вы не можете иметь абсолютно произвольные p-значения и корреляции. Однако одновременные ограничения, предполагаемые N-select-2 попарно наборами корреляций, будут недопустимы для произвольного выбора N, p-значений и корреляций.

Следующая реализация Рубин показывает расчеты для получения заданных р-значения и корреляции для пары иксы:

# 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 
Смежные вопросы