全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2127 8
2012-12-04
原始表格就是n个数值变量组成的表格
希望得到一个新的表格,包含正交化后的新的n个变量
在网上没有搜到,不知道有没有现成的
或者比较好的解决方法

我现在想到的一种办法是用iml来做
但是如果原表格有by变量,也就是分组变量的话
有多少个分组就要做多少次iml过程,不太方便

另外我想到的就是用sql步来做
这样可以用到group by来进行分组操作
但是由于施密特正交化是渐近的算法
sql步中的select语句比较难写成统一的宏

不知道我说清楚没有
总之等待大牛解答
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-12-5 10:27:09
前几天刚帮别人用iml写的施密特正交过程~
将iml写到宏里面,加个循环来解决分组的问题,不可以吗?
一些内接运算,还是用矩阵处理比较好,base,sql太吃力了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-12-5 11:07:54
ziyenano 发表于 2012-12-5 10:27
前几天刚帮别人用iml写的施密特正交过程~
将iml写到宏里面,加个循环来解决分组的问题,不可以吗?
一些内 ...
不知能否分享下你写的宏?多谢!

另外我的问题是分组众多,每个分组中向量的维数也不同,还有将数据read进iml的矩阵中是否要新生成一个dataset,或者可以指定一些观测进入iml矩阵?

现在就是不知道SAS的IML对于向量内积有什么优化没,否则用SQL的SUM运算好像速度也没有什么拖慢,只是程序看起来实在是太难看了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-12-5 11:42:11
proc  iml;
a={1 2 3,
   4 0 6,
   7 8 0};
b=j(nrow(a),ncol(a),0);
do i=1 to ncol(a);
if i=1 then do;
b[,1]=a[,1];
end;
else do;
u=a[,i];v=b[,1:i-1];
b[,i]=u-(t(u)*v/((v#v)[+,])*t(v))`;
/*b[,i]=u-v*(t(v)*u/t((v#v)[+,]));*/
end;
end;
print b;
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-12-5 11:45:14
在read data 的时候 可以通过where来筛选进入iml的观测~
use dataset;
read all var {} where  group_variable= ;
用循环或者 call execute都可以
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-12-5 12:35:01
ziyenano 发表于 2012-12-5 11:45
在read data 的时候 可以通过where来筛选进入iml的观测~
use dataset;
read all var {} where  group_var ...
嗯,多谢了!

再问下最后得到的结果矩阵可以导出至现有的SAS数据集吗?
如果每个分组变量生成一个新的数据集也是挺麻烦的事
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群