楼主: Bontique
1967 12

[问答] [SAS]如何将以下loop问题转换成矩阵或其它运行速度更快的方式? [推广有奖]

  • 0关注
  • 1粉丝

本科生

69%

还不是VIP/贵宾

-

威望
0
论坛币
1601 个
通用积分
79.9543
学术水平
1 点
热心指数
8 点
信用等级
0 点
经验
3481 点
帖子
70
精华
0
在线时间
56 小时
注册时间
2012-3-30
最后登录
2022-2-14

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

6月28更新


非常谢谢大家出谋划策, 新遇到的需要做pca的每个小组在大数据集里所取用的x和y均不同, 所以目前看来应该只能loop了.


但是如果y相同, 加入by变量可以大大提升速度.


再次感谢大家~



------------------------------------------------------以下原问题-------------------------------------------------

有一个非常大的数据集,有一个指标变量,指标变量里有三个独立的数字会变化,比如a1b1c1,a1b1c2,a1b1c3, a1b2c1.....对每一个指标组都要进行一次主成分分析与一次回归。如果用for循环, 会有三层循环,由于组别非常多,循环次数非常多,跑一次要好几个小时,非常不利于debug和实际应用。有没有其它可以提高运行速度的办法呢?


求大神指教,多谢多谢!


6月21日补充:


试了一下下面大神的办法,确实可以快很多。但是新的问题是,:


        proc princomp data = a out = b outstat = c plots=none;

                by flag;

                var abc;

        run;


如上程序,每一个flag组的var不完全一致怎么办?


我有试过让不属于哪个flag组的var在那个flag组就为missing,但是var好像有一个missing, 整条记录都不会被用。

所以再次来问有批量处理的方法吗?loop效率真的太低了。。。


再次感谢~


程序更新在10楼啦~拜谢~





二维码

扫码加我 拉你入群

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

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

关键词:loop debug for循环 主成分分析 指标变量

已有 1 人评分热心指数 收起 理由
eijuhz + 2 精彩帖子

总评分: 热心指数 + 2   查看全部评分

沙发
流水不朽 发表于 2018-5-11 12:33:26 |只看作者 |坛友微信交流群
原表结构是怎样的?描述一下?

使用道具

藤椅
流水不朽 发表于 2018-5-11 12:43:14 |只看作者 |坛友微信交流群
你把指标组,用一个变量来标名,比如:flg='A' / 'B' /'C'

在进行主成分分析的时候,by  flg 即可。

proc pls data=test nfac=10 plot=XYScores method=pcr;
   model log_RAI =因变量;
   by flg;
run;
已有 1 人评分论坛币 热心指数 收起 理由
Bontique + 2 + 1 热心帮助其他会员

总评分: 论坛币 + 2  热心指数 + 1   查看全部评分

使用道具

板凳
Bontique 发表于 2018-5-14 15:36:25 |只看作者 |坛友微信交流群
流水不朽 发表于 2018-5-11 12:43
你把指标组,用一个变量来标名,比如:flg='A' / 'B' /'C'

在进行主成分分析的时候,by  flg 即可。
非常感谢!

原来的程序还挺复杂的,大致就是现根据指标组subset出一个data set, 然后对这个data set做主成分,取前三名,做回归。然后对整个过程loop。

所以您的方法可以解决主成分loop的问题~再次感谢~

使用道具

报纸
Bontique 发表于 2018-6-21 14:29:16 |只看作者 |坛友微信交流群
增加了新的问题~求大神指教~谢谢~

使用道具

地板
Supmilk 发表于 2018-6-22 16:21:43 |只看作者 |坛友微信交流群
sas有专门的矩阵处理,proc iml,你可以了解一下

使用道具

7
Bontique 发表于 2018-6-25 09:52:12 |只看作者 |坛友微信交流群
Supmilk 发表于 2018-6-22 16:21
sas有专门的矩阵处理,proc iml,你可以了解一下
谢谢,我研究一下~

使用道具

8
Bontique 发表于 2018-6-25 11:35:51 |只看作者 |坛友微信交流群
再次谢谢楼上的建议。初步研究一下proc iml 可以做很多批量操作,但好像并不能解决需要按数据块(行和列均有不同)跑模型的loop问题。 有哪位大神有其它idea~或者SAS 里有类似R里面的list存储模式吗?以及lapply这种?再再再再次感谢!

使用道具

9
learsaas 发表于 2018-6-25 13:39:21 |只看作者 |坛友微信交流群
你把源程序和数据帖出来,让大家帮你优化一下。

使用道具

10
Bontique 发表于 2018-6-25 14:53:42 |只看作者 |坛友微信交流群
原程序非常长...其实也不是我写的,大概简化了下如下。这只是PCA的部分。后面还有regression的部分~先解决PCA,然后我看看能不能类比regression吧~非常谢谢大家~另外,proc iml给我的电脑上的SAS没有,所以应该是用不了的。再次感谢!
%macro Reg_Prep;/*LOOP 468 Times, do 1404 PCA*/

%do j = 0 %to 11;         

        %do i = 0 %to 12;               

                %do k = 0 %to 2;               

                ***** Split *****;

                data master_for_model_A&i._B&j._C&k.;
                        set model.master_for_model;
                        if A_Id = &i. and B_ID = &j. and C_ID = &k.;               
                run;
               
        ***** PCA ***** 3 times for X/Y/Z;



                proc princomp data = master_for_model_A&i._B&j._C&k. out = model.master_for_model_A&i._B&j._C&k._X prefix = X_
                        outstat = pca.pca_X_A&i._B&j._C&k. plots=none;
                        var &&PCA_X_A&j..;
                run;



                proc princomp data = master_for_model_A&i._B&j._C&k. out = model.master_for_model_A&i._B&j._C&k._Y prefix = Y_
                        outstat = pca.pca_otc_A&i._B&j._C&k. plots=none;
                        var &&PCA_Y_A&j..;
                run;

                proc princomp data = master_for_model_A&i._B&j._C&k. out = model.master_for_model_A&i._B&j._C&k._Z prefix = Z_
                        outstat = pca.pca_Z_A&i._B&j._C&k. plots=none;
                        var &&PCA_Z_A&j..;
                run;


        /* To add manual calculation */
        

                data master_for_model_A&i._B&j._C&k.;
                        merge model.master_for_model_A&i._B&j._C&k._X
                                  model.master_for_model_A&i._B&j._C&k._Y
                                  model.master_for_model_A&i._B&j._C&k._Z;
                        by A_ID B_ID C_ID DATE;
                run;


                /* other data processing ...... */

        
        %end;
%end;
%mend Reg_Prep;

%Reg_Prep;

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-5 04:27