简单的相关数据生成

时间:2016-06-24 15:02:01

标签: matlab

我遇到了以下代码,其中数据(:,1)应该生成与rho第一组相关的值。

nDataPts  = 20;    
rho       = .8;    
intercept = .0;

data      = zeros(nDataPts,2);     
data(:,2) = randn (nDataPts,1);   
data(:,1) = randn (nDataPts,1) .* sqrt(1.0-rho^2) + (data (:,2).*rho) + intercept;  

我想知道为什么我们需要 .*sqrt(1.0-rho^2)

谢谢!

1 个答案:

答案 0 :(得分:0)

它来自协方差矩阵的Cholesky分解(CholD),它定义了您希望获得的相关性。

这个page有助于理解为什么生成的随机变量Z = LX具有协方差矩阵Q,其中L是Q的CholD,X是随机正态偏差的矩阵。

对于0.8的相关性,这将是这样的:

C = [1.0 0.8; 0.8 1.0]
U = chol(C) % will have value [1.0 0.8; 0 0.6]

计算分解的算法(参见维基百科关于Cholesky-Banachiewicz和Cholesky-Crout算法的“计算”部分;下面的链接)将产生值rhosqrt(1 - rho^2)的效果分别在U(1,2)U(2,2)

您使用的公式与将正常偏差的两列矩阵乘以CholD基本相同,如下所示:

C= [ 1.0 0.8; 0.8 1.0 ];
U = chol(C);
data = randn(10, 2) * U;

第一列保持不变(在CholD的第1列中仅为1.0),第二列被修改为具有所需的协方差矩阵。

这可以推广到更多变量,如下所示:

C= [ 1.0 0.8 0.4; 0.4 1.0 0.4; 0.8 0.4 1.0 ];
U = chol(C);
data = randn(10, 3) * U;
CholD上的维基百科article在“蒙特卡罗模拟”下提到了这种方法。另外,randn上的Matlab doc page提到了这种方法。