SAS中文论坛

标题: 有人做过Principal component吗? [打印本页]

作者: shiyiming    时间: 2009-12-17 12:31
标题: 有人做过Principal component吗?
我有这样组数:
com date spread
A     20020101   50
A     20020202   60
A     20030304   70
...
B     20020101   40
B     20020202   50
B     20030304   60
...
C
...

现在我想首先把数据格式改成如下:
date             A     B     C  ...
20020101     50    40   ...
20020202     60    50   ...
20030304     70    60   ...

这里用一个transpose就可以吧?
proc transpose data=a out=b;
   by date;
   id com;
   var spread;
run;

然后每6个月做一次principal component,数据里的date是不连续的。proc factor出来应该是有多少个com就能得出多少eigenvalue、proportion的数值出来(不知道怎么把output里面这两个数放到我的dataset里去),我想取最大的4个propostion的值。

有人有比较好的算法么?谢谢!
作者: shiyiming    时间: 2009-12-17 13:17
标题: Re: 有人做过Principal component吗?
楼主,能把问题描述得清楚一点吗?MS我刚刚做过一个主分成分析。

给出部分相对完整的数据 吧,可能得到解决问题的代码快些。

ps:变量因素太多的话(比如10000个),可能会提示内存不足。
作者: shiyiming    时间: 2009-12-17 14:03
标题: Re: 有人做过Principal component吗?
这是我transpose过后的一部分数据。

date        com1        com2        com3        com4        com5        com6        com7        com8        com9
2002-1-8        26        95                                                       
2002-1-15                110        48        53        110                               
2002-1-22                                                140                       
2002-1-29                                                        64               
2002-2-5                                                136                       
2002-2-12        40        260                69                                45        43.5
2002-2-19                200                75                                       
2002-2-26                                80                                       
2002-3-5                195                                                       
2002-3-12        30        143.5                                        60               
2002-3-19                140                                                        35
2002-3-26                154        47        63                        70               
2002-4-2                                                132.5                       
2002-4-9                157                57                                       
2002-4-16                151                                                       
2002-4-23        31.5        141.5                49                118                       
2002-4-30        34                                                        32       
2002-5-7                160                                                        35
2002-5-14                                60                                44       
2002-5-21                160                62                                        34
2002-5-28                138.5                                                       
2002-6-4                132                                                       
2002-6-25                140                53                                       
2002-7-2        59        176        63        70                                50       
2002-7-9                184                67                                       
2002-7-16                173                                140        70               
2002-7-23        52        230                81                                       
2002-7-30        85        285        105                        180                60       
2002-8-6        84        325                85                        90        45       
2002-8-13                347.5        132                                               
2002-8-20                376                                        130               
2002-8-27                350        95        79                                50       
2002-9-10        74        315                                239                       
2002-9-17                330                                                39       
2002-9-24                341                100                                       
2002-10-1        71        376                                                       
2002-10-8        68        370        115        98                        150        47       
2002-10-15        65        522.5                130                265                        55
2002-10-22                425                120        225        250                56       
2002-10-29        50        700                                252.5                       
2002-11-5                675                82        195                               
2002-11-12                572.5                                                39.5       
2002-11-19        41.5        195        80        92                227.5                       
2002-11-26        36        214.5                72                170                       
2002-12-3                245                                                       
2002-12-10                200                75                                       
2002-12-17        39        205                82        137                                34
2002-12-24        40                                                               
2003-1-15        37        130.5        54                116                        34        35

我想每6个月做一次principal component。
问题1,我在transpose之后变量名为A, B, C...,我怎么能简单的改成com1, com2, ...,总共有20多个变量,按个改太麻烦了。
问题2,我的pricipal component分析程序如下:
proc factor data=bank5 simple method=prin priors=one mineigen=1 scree rotate=varimax round flag=.40;
        var com1-com9;
run;
但是因为数据中含有大量missing value,没有办法运算:
ERROR: All observations in data set WORK.BANK5 have missing values, or the sum of weights or
       frequencies is nonpositive.
这种情况怎么办?
问题3,每6个月这样的moving window怎么做?我的时间序列很长。

不知道我说清楚了没有,谢谢!
作者: shiyiming    时间: 2009-12-17 14:44
标题: Re: 有人做过Principal component吗?
transpose 语句后面有个选项prefix也许能帮你解决第一个问题。
数据缺失严重,这个恐怕无能为力。
问题三,我现在知道的只有宏了。
作者: shiyiming    时间: 2009-12-17 15:22
标题: Re: 有人做过Principal component吗?
请大虾们先帮我解决下面的问题吧。

com date spread
A 20020101 .
A 20020202 .
A 20030304 70
...
B 20020101 40
B 20020202 .
B 20030304 60

还是看这个例子吧。我现在想做如下调整:
1,如果一个com,missing value占了60%以上,那么这个com的数据就都不要了。
2,其他com把missing value的地方用最近的数值代替,比如A前两个missing value就用70代替,B那里的就用40代替。
这里的主要问题是如果光用lag的话,前一个数也可能是missing的,那么可能需要找下一个,我希望是时间上最接近的。

另外transpose的时候我用了prefix,变量名变成com_A com_B ......,但是后面如何引用这些变量?直接var com_* (我试过这个,告诉我没有这个变量, <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( --> )




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2