R语言做主成分分析的过程(检讨问题及新得)-阿里云开发者社区

开发者社区> 云计算> 正文
登录阅读全文

R语言做主成分分析的过程(检讨问题及新得)

简介:

我对R的评价是没有做不到的只有想不到的,谢谢楼主分享的ACP的分析过程。但是觉得Statistic的基础没有学好的话,虽然也能用R分析但是底气显得十分不足。

     昨天写了一篇关于主成分分析理解的文章,今早登陆QQ看到舍得老师的提醒,发现自己分析中有个比较严重的问题。问题产生的原因大体是这样造成的:

     这两天写毕设,想用主成分分析法确定权重,这个权重并不是确定所产生的各主成分的权重而是原始变量的权重,确定方法我在之前的文章中提到过,这里不表,欢迎大家纠错。在确定了原指标的权重后我思考为什么利用主成分分析法能够给原变量赋权,提出的假设是:相关变量间利用主成分分析法构建的原变量权重和原变量的方差有关。

     下面用R语言详细分析这一错误产生的过程,具体如下:

   1、提出猜想      

         > x<-read.table(“C:\Users\zp\Desktop\主成分.txt”,header=T)  &&读取数据

         > for(i in 1:5){cat(var(x[,i]))}                    &&各变量的方差
      输出:变量7:1.450593、变量7.1:0.9011858、变量7.2:0.6798419、变量7.3:0.3162055、

            变量7.4:0.7114625

     上图看到变量7、变量7.1的方差较大,于是猜想:如果变量方差大并且变量所在的第一、第二主成分系数也大,那么变量的方差对主要主成分的贡献可能也大。

   2、验证

        > a<-cor(x)               &&求相关矩阵(协方差)要求相关都为正

        > eigen(a)                &&输出特征值、特征向量

      输出:

      $values                     
      [1] 2.4827037 1.1607728 0.6199678 0.5945743 0.1419814       &&特征值

      $vectors                                                    &&特征向量
                [,1]       [,2]       [,3]       [,4]       [,5]
       [1,] -0.5154713  0.3474973  0.2857406  0.4043920  0.6069221
       [2,] -0.5901477  0.1397281  0.1231241  0.1860615 -0.7631666
       [3,] -0.3153434 -0.6165648 -0.6063161  0.3708382  0.1235566
       [4,] -0.3074906 -0.6295498  0.5665878 -0.4190523  0.1117583
       [5,] -0.4382044  0.2885074 -0.4631974 -0.6990868  0.1465133

   注1:顺便验证了一下R语言的输出特征向量是否已经单位化

       > f<-eigen(c)$vectors                       &&提取特征向量

       > for(i in 1:5){r[i]<-(f[i,1]^2)}           &&将第一列各数平方后赋予变量r

       > sum(r)                                    结论:可以看出r语言给出的特征向量是经过单位化的
       [1] 1

    注2:由合同矩阵的公式A=T(C)BC,其中A,B合同、C为特征矩阵,T(C)为C的转置,可知每列特征向量前符号的改变对合同矩阵的结果不产生影响,因此特征向量图中的第一列可全变为正号

    3、分析

    第一主成分的方差贡献率较大,变量7,变量7.1在第一主成分中的系数也较大,因此这两个变量是最能代表第一主成分的两个变量,而这两个变量的方差也较大,所以产生了方差大则对第一主成分贡献大的错误假设。

    4、纠错

    但这一假设的错误其实犯得很不应该,原因在于没有对原始数据进行标准化,标准化的意义就在于统一量纲,消除方差影响,这样一来所有变量的方差就为1了。所以,很遗憾,上面的计算过程都白整了,嘿嘿。

    5、标准化介绍

    目前R语言里标准化的简单代码我还不清楚,可以利用中心化处理后再处理或用EXCEL计算完直接读取数据,中心化为:

    scale(*,scale=F) 其中*为列向量,可以在此基础上除以原列向量标准差得标准化;

    还有个代码是 scale(*,center=F) 介绍里说是标准化,但我看了下结果肯定不是,所以还希望有懂这个代码的跟我说说;

    5、结论

    主成分分析只和相关有关,如果两个变量高度相关,或者多个变量高度相关,我设想在方差贡献较大的几个主成分里一定会有某个主成分是由这几个高度相关变量主要决定的,并且这一主成分的特征值会排在所有特征值的前列。这一结论还有待进一步的数学论证。另外我们看到有些特征向量里的符号不统一,这没关系,它是可以作为判定标准来评价的。例如,某校对学生成绩进行主成分分析,其中一个特征值较大的主成分为F=0.33*X1+0.54*X2+0.45*X3-0.32*X4-0.76*X5-0.43*X6,这里X1、X2、X3三变量分别为地理、历史、文化,X4、X5、X6三变量分别为数学、物理、计算机,那么可以根据这个主成分判定该学生更偏重文科还是理科,其结果文科必然是为正值,理科则为负值。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
云计算
使用钉钉扫一扫加入圈子
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

其他文章
最新文章
相关文章