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三变量分别为数学、物理、计算机,那么可以根据这个主成分判定该学生更偏重文科还是理科,其结果文科必然是为正值,理科则为负值。

上一篇:穆客带你快速定位Node.js内存泄露


下一篇:CSS外边距合并(叠加)