一个主成分分析例子

文档排版有问题,可以下载附件,,假设有一个数据框a,num是样本序号,var1-var4是四个变量
> a
   num var1 var2  var3 var4
1    1 21.0 10.7  99.7  9.5
2    2  9.5 17.9 139.6 18.7
3    3 21.2  8.4  90.0  6.8
4    4 12.0 22.7  42.5 24.1
5    5  6.8 21.2  55.2 22.4
6    6  8.2 22.4  55.6 22.6
7    7  3.6 29.2  68.3 26.7
8    8 19.5 15.2  18.8 17.4
9    9 24.8  5.4  43.7  2.9
10  10  8.4 18.6 146.2 19.7
11  11 28.9  4.4   4.9  1.1
12  12 19.5 15.1  10.2 18.5
13  13 28.3  4.7  13.3  1.8
14  14 24.7 12.1 116.8 12.6
15  15 12.8 23.6  90.0 23.7
16  16 23.1  6.8 100.1  3.7
17  17 15.1 13.7 100.9 14.2
18  18  2.9  6.2  80.7  2.7
19  19 18.4 11.8  99.3 13.8
20  20 22.9 12.3  47.6 13.3
21  21  5.8 29.4  83.5 27.6
22  22 18.8  8.6  61.1  8.9
对四个变量进行主成分分析
pr<-princomp(~var1+var2+var3+var4,data=a,cor=TRUE,scores=TRUE)  #从相关矩阵求解,并列出主成分得分

> summary(pr,loadings=TRUE)
Importance of components:
                          Comp.1    Comp.2     Comp.3     Comp.4
Standard deviation     1.6430057 0.9753338 0.57235000 0.14721331
Proportion of Variance 0.6748669 0.2378190 0.08189613 0.00541794
Cumulative Proportion  0.6748669 0.9126859 0.99458206 1.00000000
Loadings:
     Comp.1 Comp.2 Comp.3 Comp.4
var1  0.530  0.111  0.836       
var2 -0.582  0.232  0.262 -0.734
var3 -0.233 -0.934  0.271       
var4 -0.571  0.247  0.399  0.674
Standard deviation 表示特征根的开方,Proportion表示主成分的贡献率,也就是,比如第1个特征值的贡献率0.6749 = 2.69946764 / (2.69946764+0.95127608+0.32758452+0.02167176)。
可以看出前两个主成分已经贡献了90%以上,可以保留两个主成分
loadings表示主成分的系数矩阵
> cor(a[,-1])        #列出四个变量的相关系数矩阵
           var1       var2       var3       var4
var1  1.0000000 -0.7352556 -0.3579002 -0.6830847
var2 -0.7352556  1.0000000  0.1825704  0.9752175
var3 -0.3579002  0.1825704  1.0000000  0.1738883
var4 -0.6830847  0.9752175  0.1738883  1.0000000

e<-cbind(a,prscores)       #加入主成分得分 
 
 
> head(e) 
  num var1 var2  var3 var4    Comp.1     Comp.2      Comp.3       Comp.4 
1   1 21.0 10.7  99.7  9.5  0.775962 -0.8698329  0.34876728 -0.064368645 
2   2  9.5 17.9 139.6 18.7 -1.422291 -1.4919746  0.09178083  0.082690047 
3   3 21.2  8.4  90.0  6.8  1.209521 -0.7860833  0.09398025 -0.055128662 
4   4 12.0 22.7  42.5 24.1 -1.416036  1.1717796  0.11009779  0.055716119 
5   5  6.8 21.2  55.2 22.4 -1.610139  0.6979540 -0.48820410  0.118147542 
6   6  8.2 22.4  55.6 22.6 -1.624810  0.7512985 -0.28509515  0.001357859 
 
 
 
 
 
那么主成分得分是怎么来的呢? 
先对原始变量进行标准化,然后乘以相应的特征向量就是主成分 
b<-scale(a[,-1]) 
b%*%prloadings



特征值和特征向量隐藏的秘密主成分变量对应的特征向量的每个元素,与对应的特征值的平方根的乘积,等于该主成分变量,与该元素列标签对应的原始变量之间的相关系数。这是特征值与特征向量隐藏的秘密,可以用矩阵代数严格推导出来。不过这句话读起来比较费劲,我们用图8来表示这一关系。图中的eigVec1至eigVec4是4个特征向量,对应的特征值分别为eigVal1至eigVal4。我们在每个列中进行操作,用特征向量每个元素分别乘以对应特征值的平方根,得到该主成分变量与所有原始变量的相关系数。

posted on 2016-04-09 12:49  Mountain's_blog  阅读(3386)  评论(3编辑  收藏  举报

导航