SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 710|回复: 4
打印 上一主题 下一主题

有人做过Principal component吗?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-12-17 12:31:01 | 只看该作者

有人做过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的值。

有人有比较好的算法么?谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-12-17 13:17:17 | 只看该作者

Re: 有人做过Principal component吗?

楼主,能把问题描述得清楚一点吗?MS我刚刚做过一个主分成分析。

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

ps:变量因素太多的话(比如10000个),可能会提示内存不足。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-12-17 14:03:31 | 只看该作者

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怎么做?我的时间序列很长。

不知道我说清楚了没有,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-12-17 14:44:37 | 只看该作者

Re: 有人做过Principal component吗?

transpose 语句后面有个选项prefix也许能帮你解决第一个问题。
数据缺失严重,这个恐怕无能为力。
问题三,我现在知道的只有宏了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-12-17 15:22:23 | 只看该作者

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:( --> )
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 06:27 , Processed in 0.113930 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表