Как генерировать коррелированные двоичные переменные - PullRequest
11 голосов
/ 14 марта 2010

Мне нужно сгенерировать серию N случайных двоичных переменных с заданной корреляционной функцией. Пусть x = { x i } будет серией двоичных переменных (принимает значение 0 или 1, i работает от 1 до N ). Предельная вероятность задается Pr ( x i = 1) = p , и переменные должны коррелироваться следующим образом:

Corr [ x i x j ] = const & times; | i & minus; j | & minus; & alpha; (для i! = J)

где & alpha; является положительным числом.

Если проще, рассмотрите функцию корреляции:

Corr [ x i x j ] = (| i & minus; j | +1) & minus; & alpha;

Важной частью является то, что я хочу исследовать поведение, когда корреляционная функция идет как степенной закон. (не & alpha; | i & minus; j | )

Возможно ли создать серию, подобную этой, предпочтительно на Python?

Ответы [ 6 ]

4 голосов
/ 18 марта 2010

Спасибо за ваш вклад. Я нашел ответ на свой вопрос в симпатичной маленькой статье Чул Гю Парк и др., Поэтому, если кто-то столкнется с той же проблемой, посмотрите вверх:

«Простой метод генерации коррелированных двоичных вариаций» (jstor.org.stable / 2684925)

для простого алгоритма. Алгоритм работает, если все элементы в матрице корреляции положительны, и для общего предельного распределения Pr (x_i) = p_i.

J

2 голосов
/ 15 марта 2010

Вы описываете случайный процесс , и мне он кажется сложным ... если вы отменили двоичное (0,1) требование и вместо этого указали ожидаемое значение и дисперсию, это можно было бы описать как генератор белого шума, питающийся через 1-полюсный фильтр нижних частот, который, я думаю, даст вам характеристику & alpha; | ij | .

Это может действительно соответствовать планке для mathoverflow.net, в зависимости от того, как она сформулирована. Позвольте мне попробовать спросить ....


обновление: я спросил на mathoverflow.net для случая & alpha; | i-j | . Но, возможно, есть некоторые идеи, которые можно адаптировать к вашему случаю.

1 голос
/ 15 марта 2010

Быстрый поиск по RSeek показывает, что R имеет пакеты

чтобы сделать это.

0 голосов
/ 17 марта 2010

Вот интуитивный / экспериментальный подход, который, кажется, работает.

Если b - это двоичный код, m - среднее значение двоичного числа, г. c - это соотношение, которое вы хотите, rand () генерирует U (0,1) об. И d - коррелированный двоичный р.в. Вы хотите:

d = if (rand ()

Это если униформа р.в. меньше желаемой корреляции, d = b. В противном случае d = другое случайное двоичное число.

Я запустил это 1000 раз для столбца 2000 двоичных значений. с m = .5 и с = .4 и с = .5 Среднее значение корреляции было точно таким, как указано, распределение оказалось нормальным. Для корреляции 0,4 стандартное отклонение корреляции составило 0,02.

Извините - я не могу доказать, что это работает все время, но вы должны признать, что это легко.

0 голосов
/ 14 марта 2010

Решение грубой силы состоит в том, чтобы выразить ограничения задачи в виде линейной программы с 2^N переменными pr(w), где w охватывает все двоичные строки длины N. Сначала ограничение, что pr будет распределением вероятности:

for all w: 0 <= pr(w) <= 1
sum_w pr(w) = 1

Во-вторых, ограничение, что ожидание каждой переменной будет p:

for all i: sum_{w such that w[i] = 1} pr(w) = p

В-третьих, ковариационные ограничения:

for all i < j: sum_{w such that w[i] = w[j] = 1} pr(w) = const * |j - i|^alpha - p^2

Это очень медленно, но беглый поиск литературы не нашел ничего лучшего. Если вы решите реализовать его, вот некоторые решатели LP с привязками Python: http://wiki.python.org/moin/NumericAndScientific/Libraries

0 голосов
/ 14 марта 2010

Выразите распределение x i как линейную комбинацию некоторых независимых базисных распределений f j : x i = a i1 f 1 + a i2 f 2 + ... . Ограничим f j независимыми переменными, равномерно распределенными в 0..1 или в {0,1} (дискретно). Давайте теперь выразим все, что мы знаем в матричной форме:

Let X be the vector (x1, x2, .., xn)
Let A be the matrix (a_ij) of dimension (k,n) (n rows, k columns)
Let F be the vector (f1, f2, .., fk) 
Let P be the vector (p1, p2, .., pn)
Let R be the matrix (E[x_i,x_j]) for i,j=1..n
Definition of the X distribution: X = A * F
Constraint on the mean of individual X variables: P = A * (1 ..k times.. 1)
Correlation constraint: AT*A = 3R or 2R in the discrete case (because E[x_i x_j] = 
  E[(a_i1*f_1 + a_i2*f_2 + ...)*(a_j1*f_1 + a_j2*f_2 + ...)] =
  E[sum over p,q: a_ip*f_p*a_jq*f_q] = (since for p/=q holds E[f_p*f_q]=0)
  E[sum over p: a_ip*a_jp*f_p^2] =
  sum over p: a_ip*a_jp*E[f_p^2] = (since E[f_p^2] = 1/3 or 1/2 for the discrete case)
  sum over p: 1/3 or 1/2*a_ip*a_jp
And the vector consisting of those sums over p: a_ip*a_jp is precisely AT*A.

Теперь вам нужно решить два уравнения:

AT*A      = 3R (or 2R in the discrete case)
A*(1...1) = P

Решение первого уравнения соответствует нахождению квадратного корня матрицы 3R или 2R. См. Например http://en.wikipedia.org/wiki/Cholesky_factorization и обычно http://en.wikipedia.org/wiki/Square_root_of_a_matrix. Что-то также должно быть сделано со вторым:)

Я прошу окружающих математиков поправить меня, потому что я вполне мог бы смешать AT A с A AT или сделать что-то еще более неправильное.

Чтобы сгенерировать значение x i в виде линейной смеси базисных распределений, используйте двухэтапный процесс: 1) используйте равномерную случайную величину, чтобы выбрать один из базисные распределения, взвешенные с соответствующей вероятностью, 2) генерируют результат, используя выбранное базисное распределение.

...