Вопрос: Как создать коррелированные двоичные переменные


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

Корр [ Икс я   Икс J  ] = const × | я - J |  (для i! = j)

где α - положительное число.

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

Корр [ Икс я   Икс J  ] = (| я - J | +1)  

Существенная часть заключается в том, что я хочу исследовать поведение, когда корреляционная функция идет как степенной закон. (не α | я - J |  )

Возможно ли создать такую ​​серию, предпочтительно в Python?


11


источник


Ответы:


Спасибо за все ваши материалы. Я нашел ответ на свой вопрос в симпатичной маленькой статье Chul Gyu Park et al., Поэтому, если кто-то столкнется с той же проблемой, посмотрите:

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

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

J


4



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

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


обновление: я сделал спросить о mathoverflow.net  для α | I-J |  дело. Но, возможно, есть некоторые идеи, которые могут быть адаптированы к вашему делу.


2



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

сделать это.


1



Решение грубой силы заключается в выражении ограничений задачи как линейной программы с 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



Выразить распределение Икс я  как линейную комбинацию некоторых независимых базисных распределений е J : Икс я  = a i1 е 1  + a i2 е 2 + ...  , Давайте ограничимся е 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 или сделал что-то еще более неправильное.

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


0



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

Если б  является двоичным r.v., м  является средним бинарным r.v., с  это корреляция, которую вы хотите, Rand ()  генерирует U (0,1) r.v. и d  является коррелированным двоичным r.v. вы хотите:

d = if (rand () <c, b, if (rand () <m, 0, 1))

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

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

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


0



Как создать коррелированные двоичные переменные | Programmerz.ru