【问题标题】:Simple Correlated Data Generation简单的相关数据生成
【发布时间】:2016-10-27 06:05:33
【问题描述】:

我遇到了以下代码,其中 data(:,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)

谢谢!

【问题讨论】:

    标签: matlab


    【解决方案1】:

    它来自定义您希望获得的相关性的协方差矩阵的 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 也提到了这种方法。

    【讨论】:

      猜你喜欢
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      相关资源
      最近更新 更多