random - 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};
效果很好,但是当我们将其更改为变量名时,它会出错。我们进行了一些谷歌搜索,但找不到解决方案,谁能帮助我们:) 这似乎是一个如此愚蠢、易于修复的错误,但我们就是没有成功!
提前致谢。
解决方案
“如何从表达式构建向量”一文中解释了您的错误原因。
最简单的解决方案是使用水平和垂直连接运算符来构建矩阵:
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];
推荐阅读
- c++ - 为什么 Bazel 找不到 Visual C++ 构建工具?
- awk - awk 数据透视表并在重复列中使用标题行
- google-api - 如何以编程方式添加朋友?
- r - 根据另一列的值分配给一列的非循环方式
- r - 单变量和多变量正态图/图表不显示
- c# - 如何从设置对话框访问复选框状态
- html - 如何将 Json 内容类型作为 HTML 标头
- objective-c - 如何将 NSError.code 与 Swift 5 中的#defined 错误号进行比较
- powershell - 比较本地文本文件和在线文件
- c# - 尝试通过 FindObjectByType 获取集合时找不到对象集合