12

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

修正[ x i x j ] = 常数 × | - j | (对于 i!=j)

其中α是一个正数。

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

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

重要的部分是我想研究相关函数像幂律一样时的行为。(不是 α | i - j |

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

4

6 回答 6

5

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

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

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

j

于 2010-03-18T04:57:04.213 回答
2

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

这实际上可能符合 mathoverflow.net 的标准,具体取决于它的措辞方式。让我试着问问......


更新:我确实在 mathoverflow.net 上询问过 α |ij| 案子。但也许那里有一些想法可以适应你的情况。

于 2010-03-15T14:06:20.210 回答
1

A quick search at RSeek reveals that R has packages

to do this.

于 2010-03-15T13:25:26.513 回答
0

这是一种似乎可行的直观/实验方法。

如果b是二进制 rv, m是二进制 rv 的平均值, c是您想要的相关性, rand()生成 U(0,1) rv, d是您想要的相关二进制 rv:

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

也就是说,如果统一的 rv 小于所需的相关性,则 d = b。否则 d = 另一个随机二进制数。

对于 m=.5 和 c = .4 和 c = .5 的 2000 个二进制 rv 列,我运行了 1000 次,相关平均值完全符合指定,分布似乎是正常的。对于 0.4 的相关性,相关性的标准偏差为 0.02。

抱歉 - 我不能证明这一直有效,但你必须承认,这确实很容易。

于 2010-03-17T18:33:08.973 回答
0

蛮力解决方案是将问题的约束表示为一个线性程序,其中2^N变量pr(w)w范围跨越所有长度为 的二进制字符串Npr首先是概率分布的约束:

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

于 2010-03-14T17:49:28.997 回答
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_factorization和一般http://en.wikipedia.org/wiki/Square_root_of_a_matrix。第二个也应该做点什么:)

我请周围的数学家纠正我,因为我很可能将 AT A 与 A AT 混为一谈,或者做错了什么。

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

于 2010-03-14T14:11:53.780 回答