我遇到了以下代码,其中数据(:,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)
谢谢!
答案 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算法的“计算”部分;下面的链接)将产生值rho
和sqrt(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提到了这种方法。