楼主: Bontique
620 12

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

  • 0关注
  • 1粉丝

本科生

64%

还不是VIP/贵宾

-

威望
0
论坛币
1599 个
学术水平
1 点
热心指数
8 点
信用等级
0 点
经验
3413 点
帖子
73
精华
0
在线时间
50 小时
注册时间
2012-3-30
最后登录
2018-9-19

Bontique 发表于 2018-5-11 10:33:33 |显示全部楼层
本帖最后由 Bontique 于 2018-6-28 16:17 编辑

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楼啦~拜谢~






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

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

stata SPSS
流水不朽 发表于 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,你可以了解一下
回复

使用道具 举报

Bontique 发表于 2018-6-25 09:52:12 |显示全部楼层
Supmilk 发表于 2018-6-22 16:21
sas有专门的矩阵处理,proc iml,你可以了解一下
谢谢,我研究一下~
回复

使用道具 举报

Bontique 发表于 2018-6-25 11:35:51 |显示全部楼层
本帖最后由 Bontique 于 2018-6-25 11:42 编辑

再次谢谢楼上的建议。初步研究一下proc iml 可以做很多批量操作,但好像并不能解决需要按数据块(行和列均有不同)跑模型的loop问题。 有哪位大神有其它idea~或者SAS 里有类似R里面的list存储模式吗?以及lapply这种?再再再再次感谢!
回复

使用道具 举报

learsaas 发表于 2018-6-25 13:39:21 |显示全部楼层
你把源程序和数据帖出来,让大家帮你优化一下。
回复

使用道具 举报

Bontique 发表于 2018-6-25 14:53:42 |显示全部楼层
本帖最后由 Bontique 于 2018-6-25 15:57 编辑

原程序非常长...其实也不是我写的,大概简化了下如下。这只是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;
回复

使用道具 举报

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

GMT+8, 2018-9-25 17:53