如果我有一个向量ñN相关概率。我怎样才能把它们变成二进制0 , 10,1不破坏相关性?

机器算法验证 相关性 数理统计 模拟 系词
2022-04-04 11:28:35

我的最终目标是能够有一种方法来生成一个大小的向量N相关的伯努利随机变量。我这样做的一种方法是使用 Gaussian Coupla 方法。然而,高斯 Coupla 方法只给我留下了一个向量:

(p1,,pN)[0,1]N

假设我已经生成(p1,,pN)使得它们之间的共同相关性是ρ. 现在,我怎样才能将这些转换成一个新的向量0或者1的?换句话说,我想:

(X1,,XN){0,1}N

但具有相同的相关性ρ.

我想到的一种方法是分配一个硬截止规则,这样如果pi<0.5,然后让Xi=0而如果pi0.5,然后让Xi=1.

这似乎在模拟中效果很好,因为它保留了相关结构,但对我来说,应该选择什么截止值是非常随意的0.5.

另一种方法是对待每个Xi作为具有成功概率的伯努利随机变量pi并从中取样。然而,这种方法似乎会导致相关性的丧失,而不是ρ,我可能会得到ρ2或者ρ3.

有没有人对此有任何想法或意见?谢谢你。

1个回答

我对高斯 Copula 的了解不够了解问题所在。但我找到了一种生成相关伯努利向量的方法。

如果我们采用一组固定向量,请遵循https://mathoverflow.net/a/19436/105908v1...vn和单位球面上的随机向量u,我们可以变换u成二进制X在哪里Xi=(uvi>0). 在这个设置中,cor(Xi,Xj)=π2θ(i,j)π在哪里θ(i,j)是之间的角度vivj.

如何找到合适的矩阵V=|v1...vn|产生所需的相关矩阵R? 角度条件转换为VVT=cos(πRπ2)因此我们可以找到V用 Cholesky 分解。

R中的示例代码如下:

#Get a simple correlation matrix 
N = 3
cor_matrix <- matrix(c(1,0.5,0.8,0.5,1,0.4,0.8,0.4,1), N, N)

#Calculate the vectors with desired angles
vector_matrix <- chol(cos( (pi * cor_matrix - pi) * -0.5))

#You can generate random unit vectors by normalizing a vector 
#of normally distributed variables, note however that the normalization
#does not affect the sign of the dot product and so we ignore it
num_samples <- 10000
normal_rand <- matrix(rnorm(num_samples * N), num_samples, N)

#Generate the target variables
B <- (normal_rand %*% vector_matrix) > 0

#See for yourself that it works
cor(B)  
cor(B) - cor_matrix 

感谢@jakub-bartczuk 链接到 MO 问题 - 我自己找不到。


上面的代码有一个很大的限制:边际分布固定在XiBernoulli(0.5). 我目前不知道如何扩展这种方法以适应相关性和边际分布。另一个答案有一种适用于一般情况的方法,但它失去了很多简单性(它涉及数值积分)。还有一篇名为生成具有指定相关系数的尖峰列车和随附的Matlab 包的论文,其中采样涉及“仅”通过二等分找到单调函数的唯一零值。