SAS:用变量创建协方差矩阵

问题描述

我正在做一个项目,我们必须在其中进行一些模拟。我现在想使用 Randnormal 函数,在给定均值向量和协方差矩阵的情况下生成多元正态数据。对于协方差矩阵,我们必须使用不同的参数,所以我不想直接把值放进去,我只想把变量名放在矩阵里(这样我们就不必手工计算了)。

我们收到此错误

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

这是我们的代码。数据集 Simulatie 还包含在此 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}; /* 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};

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

提前致谢。

解决方法

您的错误原因在文章 "How to build a vector from expressions."

中进行了说明

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

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,3];
Cov[3,2] = Cov[2,3];