问题描述
我正在做一个项目,我们必须在其中进行一些模拟。我现在想使用 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];