如何生成相关的二进制变量

时间:2010-03-14 07:33:07

标签: algorithm math random statistics probability

我需要生成一系列带有给定相关函数的 N 随机二进制变量。设 x = { x i }是一系列二进制变量(取值0或1,< em> i 从1运行到 N )。边际概率给出Pr( x i = 1)= p ,变量应该相关联以下方式:

Corr [ x i x j ] = const×| i - j | (对于i!= j)

其中α是正数。

如果更容易,请考虑相关函数:

Corr [ x i x j ] =(| i - j | +1)

关键部分是我想调查相关函数像幂律一样的行为。 (不是α | i - j |

是否可以生成这样的系列,最好是在Python中?

6 个答案:

答案 0 :(得分:4)

感谢您的所有投入。我在Chul Gyu Park等人的可爱小文章中找到了我的问题的答案,所以如果有人遇到同样的问题,请查阅:

“生成相关二元变量的简单方法”(jstor.org.stable / 2684925)

用于简单的算法。如果相关矩阵中的所有元素都是正数,并且对于一般边际分布Pr(x_i)= p_i,则算法有效。

Ĵ

答案 1 :(得分:2)

你正在描述一个随机进程,对我来说它看起来很难...如果你消除了二进制(0,1)的要求,而是指定了预期的值和方差,有可能将其描述为通过1极低通滤波器馈送的白噪声发生器,我认为这会给你α | ij | 特性。

这实际上可能符合mathoverflow.net的标准,具体取决于它是如何措辞的。让我试试......


更新:我为α | i-j | 案例做了ask on mathoverflow.net。但也许有一些想法可以适应你的情况。

答案 2 :(得分:1)

RSeek的快速搜索显示R包含

这样做。

答案 3 :(得分:0)

将分布 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_factorizationhttp://en.wikipedia.org/wiki/Square_root_of_a_matrix。 关于第二个问题也应该做点什么:)

我要求周围的数学家纠正我,因为我很可能将AT A与A AT混合在一起或做了更多错误。

要生成 x i 的值作为基础分布的线性混合,请使用两步过程:1)使用均匀随机变量选择一个基础分布,用相应的概率加权,2)使用所选择的基础分布生成结果。

答案 4 :(得分:0)

强力解决方案是将问题的约束表达为具有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

这很慢,但粗略的文学搜索没有更好的结果。如果你决定实现它,下面是一些带有Python绑定的LP解算器:http://wiki.python.org/moin/NumericAndScientific/Libraries

答案 5 :(得分:0)

这是一种似乎有效的直观/实验方法。

如果 b 是二进制r.v., m 是二进制r.v.的平均值, c 是您想要的相关性, rand()生成一个U(0,1)r.v.和 d 是相关的二进制r.v.你想要的:

d = if(rand()&lt; c,b,if(rand()&lt; m,0,1))

如果是统一的r.v.小于期望的相关性,d = b。否则d =另一个随机二进制数。

我为2000二进制r.v.s列运行了1000次m = .5,c = .4,c = .5 相关平均值与指定完全一致,分布似乎正常。 对于0.4的相关性,相关性的标准偏差为0.02。

抱歉 - 我无法证明这一切都有效,但你不得不承认,这肯定很容易。