使用PROC IML处理矩阵和样本

时间:2017-07-13 01:34:41

标签: sas sas-iml

我试图从以下分布中抽取随机样本:enter image description here

我的代码运行但数字看起来很奇怪。所以我不确定出了什么问题,也许是一些运营商。元素非常大。 我的尝试:

C_hat=(((x`)*x)**(-1))*((x`)*z);
S=((z-x*c_hat)`)*((z-x*c_hat));

*draw sigma;
sigma = shape(RandWishart(1, 513 - 3 - 2,s**(-1)),4,4);
*draw vec(c);
vec_c_hat= colvec(c_hat`); *vectorization of c_hat;
call randseed(4321);
vec_c = RandNormal(1,vec_c_hat,(sigma`)@(((x`)*x)**(-1)));
c = shape(vec_c,4,4);
print c;

1 个答案:

答案 0 :(得分:0)

由于您还没有提供数据或参考资料,因此很难猜测您的“"奇怪"和#34;非常大"数字是正确的。但是,程序看起来大致正确,因此请检查您的数据。

程序的一个小问题是您正在使用SHAPE函数将vec_c向量重新整形为矩阵。您应该使用SHAPECOL函数(或转置结果)。

以下程序使用与SAS一起分发的Sashelp.Cars数据来初始化X和Z矩阵。该程序计算随机矩阵C,该矩阵C接近数据的逆交叉积矩阵。我还添加了一些中间计算和评论。此版本在Sashelp.Cars数据上按预期工作:

proc iml;
use sashelp.cars;
read all var {weight wheelbase enginesize horsepower} into X;
read all var {mpg_city mpg_highway} into Z;
close;

*normal equations and covariance;
xpx = x`*x;
invxpx = inv(xpx);
C_hat = invxpx*(x`*z);
r = z-x*c_hat;
S = r`*r;

*draw sigma;
call randseed(4321);
DF = nrow(X)-ncol(X)-2;
W = RandWishart(1, DF, inv(S));  /* 1 x (p*p) row vector */
sigma = shape(W, sqrt(ncol(W))); /* reshape to p x p matrix */
*draw vec(c);
vec_c_hat = colvec(c_hat`);      /* stack columns of c_hat */
vec_c = RandNormal(1, vec_c_hat, sigma@invxpx);
c = shapecol(vec_c, nrow(C_hat), ncol(C_hat));   /* reshape w/ SHAPECOL */
print C_hat, c;