如何使用预先指定的相关矩阵生成数据?


19

我正在尝试生成均值=,方差=,相关系数=相关随机序列。在下面的代码中,我将&用作标准偏差,并将&用作均值。1 0.8010.8s1s2m1m2

p = 0.8 
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2

这使我corrcoef()x和之间的0.8 正确y。我的问题是,如果我希望z该系列也与y(具有相同的相关性)相关但又与不相关,我该如何生成它。我需要知道一个特定的公式吗?我找到了一个,但听不懂。r=0.8x


Answers:


21

看来您在询问如何使用特定的相关矩阵生成数据。

一个有用的事实是,如果您有一个带有协方差矩阵的随机向量,则该随机向量均值为和协方差矩阵。因此,如果您从均值为零的数据开始,则乘以不会改变该值,因此很容易满足您的第一个要求。 Σ X ë XΩ = Σ ŤxΣAxAE(x)Ω=AΣATA

比方说,你开始(均值为零)不相关的数据(即协方差矩阵对角线) -因为我们正在谈论的相关矩阵,我们只取。您可以通过选择作为的cholesky平方根,将其转换为具有给定协方差矩阵的数据,然后将具有所需的协方差矩阵。 Ω X ΩΣ=IAΩAxΩ

在您的示例中,您似乎想要这样的东西:

Ω=(1.80.81.80.81)

不幸的是,矩阵不是正定的,因此它不能是协方差矩阵-您可以通过查看行列式为负来检查这一点。也许吧

Ω=(1.8.3.81.8.3.81)    or   Ω=(12/302/312/302/31)

就足够了。我不确定如何在matlab中计算出cholesky平方根(这似乎是您所使用的),但是R可以使用该chol()函数。

在此示例中,对于上面列出的两个,分别是正确的矩阵倍数Ω

A=(100.8.60.3.933.1972)    or   A=(1002/3.745300.8944.4472)

R用于达到此目的的代码是:

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136

1
MATLAB功能也被称为chol。请注意,如果几乎是奇数,这在数值上可能会非常不稳定。在这种情况下,就数值稳定性而言,使用例如通过SVD获得的对称平方根通常是更好的选择。:)Ω
红衣主教

1
@cardinal当然是正确的-当您尝试使用近乎奇异的矩阵进行数字处理时,许多理论上合理的事情都会变得很糟糕。我(方便地)想象一种情况,即目标相关矩阵不在问题所在的领域。您指出这一点很好-谢谢(感谢您对我的其他答案的编辑)
Macro

1
我之所以想这个主因,是因为您敏锐的眼光认识到OP的第一个建议甚至不是肯定的。而且,希望对其他问题的编辑不会太过热情;我都喜欢这两个答案。
主教

7

如果使用R,还可以使用MASS软件包中的mvrnorm函数,假设您需要正态分布的变量。该实现类似于上面的Macro的描述,但是使用相关矩阵的特征向量,而不是使用奇异值分解(如果将经验选项设置为true),进行cholesky分解和缩放。

XΣγλΣ

X=γλXT

ΣX

请注意,相关矩阵必须是正定的,但是用R中的Matrix包中的nearPD函数进行转换将很有用。


1

ΣyxΣx=IΣyΛV

Σy=VΛVT=(VΛ)(ΛTVT)=AAT

y=Ax

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.