首页 > 解决方案 > SAS:用变量创建协方差矩阵

问题描述

我正在做一个项目,我们必须在其中进行一些模拟。我现在想使用该RandNormal函数,在给定均值向量和协方差矩阵的情况下生成多元法线数据。对于协方差矩阵,我们必须使用不同的参数,所以不是直接将值放入,我只想将变量名称放入矩阵中(因此我们不必手动进行计算)。

我们得到这个错误:

错误:(执行)字符参数应该是数字。

这是我们的代码。数据集Simulatie还包含在 this 中定义的变量proc iml

proc iml;
    use Simulatie;
    read all;
    close Simulatie;

    sigma0sq = 2;
    sigma1sq = 3;
    sigma2sq = 1;
    sigma0 = sqrt(sigma0sq);
    sigma1 = sqrt(sigma1sq);
    sigma2 = sqrt(sigma2sq);
    rhoM = 0.7;
    rhoV = 0.5;
    rhoMsigma0sigma1 = rhoM*sigma0*sigma1;
    rhoVsigma0sigma2 = rhoV*sigma0*sigma2;
    rhoVsigma1sigma2 = rhoV*sigma1*sigma2;

    Mean = {0, 0, 0}; /* population means */

    Cov = {sigma0sq rhoMsigma0sigma1 rhoVsigma0sigma2, /* population covariances */
           rhoMsigma0sigma1 sigma1sq rhoVsigma1sigma2,
           rhoVsigma0sigma2 rhoVsigma1sigma2 sigma2sq};

    N = 185; /* sample size */
    call randseed(123);
    X = RandNormal(N, Mean, Cov); /*x is a nx3 matrix */
    SampleMean = mean(X);
    SampleCov = cov(X);
quit;

例如,我们尝试放入

Cov = {3 2 1, 2 4 0,1 0 5};

效果很好,但是当我们将其更改为变量名时,它会出错。我们进行了一些谷歌搜索,但找不到解决方案,谁能帮助我们:) 这似乎是一个如此愚蠢、易于修复的错误,但我们就是没有成功!

提前致谢。

标签: randomsascovariancesas-imlcovariance-matrix

解决方案


“如何从表达式构建向量”一文中解释了您的错误原因。

最简单的解决方案是使用水平和垂直连接运算符来构建矩阵:

Cov = (sigma0sq || rhoMsigma0sigma1 || rhoVsigma0sigma2) //
      (rhoMsigma0sigma1 || sigma1sq || rhoVsigma1sigma2) //
      (rhoVsigma0sigma2 || rhoVsigma1sigma2 || sigma2sq);

另一种方法是分配 3x3 矩阵,然后使用下标分配每个元素:

Cov = j(3, 3, .);
Cov[1,1] = sigma0sq;
Cov[1,2] = rhoMsigma0sigma1;
Cov[1,3] = rhoVsigma0sigma2;
Cov[2,2] = sigma1sq;
Cov[2,3] = rhoVsigma1sigma2;
Cov[3,3] = sigma2sq;
/* make symmetric */
Cov[2,1] = Cov[1,2];
Cov[3,1] = Cov[1,3];
Cov[3,2] = Cov[2,3];

推荐阅读