主成分分析和因子分析总结(总结笔记)

时间:2022-06-22 17:00:59

注:本文是《从数据到结论》的读书心得,希望没有曲解原书之意

正文开始

一、作用

       万事万物中,事物的属性之间可能存在着相关性。寻找多变量的”代表”。

1、        降低变量的维数

2、        主成本分析(principal analysis)是因子分析(factoranalysis)特例。

 

主成分分析

二、问题抛出

       现有100个高中学生的考试成绩(100条记录),科目分别为数,理,化,语文,历史,英语。

1、        这6门课程的成绩是否具有相关性?

2、        能否用一两个综合变量来表示6门课程的成绩?

3、        如果能表示,这些综合变量包含有多少原来6门课程的信息?

4、        如何解释这些综合变量?

5、        能否用综合变量进一步分析学生的学习情况?如给学生排序?

 

三、形象描述

Ø 二维情况

              先考虑简单的情况(两个变量),可以绘制出散点图plot(x,y)

              if(数据点可以形成椭圆形轮廓的点阵){

                     三个轴:椭圆的长轴,短轴,坐标轴

                     三个轴之间的关系:

1、        长短轴关系

                     共同点:都要主轴

                     相异点:短轴数据变化小,长轴变化大,

                     关系:长轴描述了数据的主要变化,包含了数据的大部分信息,用长轴                          变量替换这两个变量,由此降维。

                     2、椭圆轴与坐标轴关系

                     通常长轴不一定和坐标轴平行,如何解决?通过线性变换,找到长轴平                         行的条件。极端情况下,短轴退化为点,即一个变量为唯一值,长轴就                   可以完全解释这些散点的变化。

              }

Ø 多维情况

              和二维类似,椭球的情况

              步骤:

1、        找出多维的主轴

2、        再用代表大多数信息的最长的几个轴作为新的变量

 

四、分析步骤

主成分分析和因子分析总结(总结笔记)

上图有SPSS软件获得,其中6个主轴长度,又称特征值(数据相关矩阵的特征值eigenvalue)

       图标解释:

       Total:各主轴(特征值)大小

       of variance:方差(特征值)占比

       cumulative:累计占比

       可以看出前两个主成分的特征值累计占了总方差的81%,其余4个 contribution(贡献)比较小

       结论:选择前两个主成分即可

 

一个图形 (screeplot)

http://www.improvedoutcomes.com/docs/WebSiteDocs/PCA/Creating_a_Scree_Plot.htm有关于这个图形的解释,

主要用途是:

       提供了因子数目和特征值大小的图形表示。可以用于直观的判定因子数目

 

主成分是原数据6个原始变量的线性组合!

主成分分析和因子分析总结(总结笔记)

图二

SPSS输出上面的表格:相关矩阵,主成分的负荷矩阵

其中每一列代表一个主成分作为原来变量线性组合的系数

类似:

主成分分析和因子分析总结(总结笔记)

图三

y1,y2称为主成分,-0.806系数称为主成分载荷。如果相关系数绝对值越大,说明主成分对原始变量的代表性越强。

 

通过上面的公式,就可以对每个学生的各科成绩算出其主成分y1和y2的值,称为得分(打分)。

在计算前的注意事项:对原始数据先进行标准化

何为标准化?

主成分分析和因子分析总结(总结笔记)

图四

       其中xij*就是标准化后的需要代入公式(图三)x1,x2…xn的值

       xij*= (xij-mean(x)) / sd(x) ,其中xij是6门功课的其中一门,x是一个学生的6门功课的成绩向量。

       还可以通过loadingplot载荷图分析主成分是如何解释原始变量的。通过图二中2个主成分关于各科的坐标

主成分分析和因子分析总结(总结笔记)

图五

 

SPSS操作总结

1、        菜单中分析选项à降维à因子分析

2、        将通过读取txt文件录入spss中的数据的变量选入变量框中

3、        点击抽取,在方法中选择主成分

4、        其他操作见图

 

 

 

因子分析

五、概述

共同点

1、        根据特征值选择因子

2、        选择因子的标准类似,相同的scree plot

3、        也有因子载荷的概念,代表了因子和原先变量的相关系数

4、        给出了二维载荷图,和主成分分析的载荷图类似

区别

1、        因子分析事先要确定有几个成分(component),也称因子(factor)

2、        变量和因子个数不一致,导致数学模型和计算方法有一定区别

3、        多了一道工序因子旋转(factor rotation)

 

六、因子分析过程

通过SPSS的输出结果

主成分分析和因子分析总结(总结笔记)

图六

 

SPSS操作的一般步骤:

1、Extract的method采用了varimax,

2、然后选择主成分或者选择因子的数目

3、旋转选择一个方法,如果none就是主成分分析

4、计算score得分,并勾选上scree plot和loadingplot两个图,并选择regression

 

图六中说明了6个科目成绩作为变量和因子之间的关系

 主成分分析和因子分析总结(总结笔记)

图七

从系数矩阵可以看出,f1主要和x[4-6]正相关,f2与x[1-3]正相关。

注意:

1、        原始变量在左,因子在右。体现了用因子表示原始变量。

2、        可以将两个因子分成文科因子和理科因子,通过loading plot清晰分明

 主成分分析和因子分析总结(总结笔记)

图八

图八是SPSS另一个输出,因子得分系数矩阵。给出了f1,f2如何用原始变量来表示。

 

 

通过上面的计算公式,可以计算出每个学生两个因子的总得分,并可以根据这两个因子的得分对学生f1(文科),f2(理科)进行排序

 

 

七、因子分析的注意事项

Ø 依赖原始变量,只反应原始变量,选择变量慎重,不能夹杂不相关变量

Ø 如果变量间相互独立,降维可能失败。因为很难用少数综合变量来表示不相关的原始变量。对综合变量可以起相应的名字,但不一定能很好描述

Ø 不一定所有的因子都很好解释,与选取的变量的数据整理质量有关

Ø 在用因子得分进行排序时,要小心。因为原始变量不同,选取的因子不同,排序的结果也可能不同。尤其对于敏感问题的排名。

 主成分分析和因子分析总结(总结笔记)

主成分分析和因子分析总结(总结笔记)


通过上面的计算公式,可以计算出每个学生两个因子的总得分,并可以根据这两个因子的得分对学生f1(文科),f2(理科)进行排序

 

 

七、因子分析的注意事项

Ø 依赖原始变量,只反应原始变量,选择变量慎重,不能夹杂不相关变量

Ø 如果变量间相互独立,降维可能失败。因为很难用少数综合变量来表示不相关的原始变量。对综合变量可以起相应的名字,但不一定能很好描述

Ø 不一定所有的因子都很好解释,与选取的变量的数据整理质量有关

在用因子得分进行排序时,要小心。因为原始变量不同,选取的因子不同,排序的结果也可能不同。尤其对于敏感问题的排名。

 

八、R语言实现主成分分析

> stu=read.table("/Users/liuzhicheng/Rtest/student.txt",header=T)

> y=princomp(stu,cor=T);y

Call:

princomp(x = stu, cor = T)

 

Standard deviations:

   Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6

1.9326794 1.0645380 0.6761372 0.5679627 0.4463085 0.3906080

 

 6  variables and  100 observations.

> y$sdev; #特征值

   Comp.1    Comp.2    Comp.3    Comp.4    Comp.5    Comp.6

1.9326794 1.0645380 0.6761372 0.5679627 0.4463085 0.3906080

> y$load; #单位特征向量 -->对应spss为载荷(loadings),但是差一个特征值平方根的因子

 

Loadings:

        Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6

math    -0.417 -0.331         0.825        -0.175

phys    -0.349 -0.499  0.672 -0.422             

chem    -0.349 -0.482 -0.738 -0.318             

literat  0.462 -0.288                0.173 -0.818

history  0.427 -0.409         0.140 -0.766  0.212

english  0.433 -0.400         0.130  0.618  0.504

 

               Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6

SS loadings     1.000  1.000  1.000  1.000  1.000  1.000

Proportion Var  0.167  0.167  0.167  0.167  0.167  0.167

Cumulative Var  0.167  0.333  0.500  0.667  0.833  1.000

> #y$scores; #因子得分

> sweep(y$loa,2,y$sde,"*") #实现和spss一样的载荷,只差一个常数因子

 

Loadings:

        Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6

math    -0.806 -0.353         0.468             

phys    -0.674 -0.531  0.454 -0.240             

chem    -0.675 -0.513 -0.499 -0.181              

literat  0.893 -0.306                      -0.320

history  0.825 -0.435               -0.342      

english  0.836 -0.425                0.276  0.197

 

               Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6

SS loadings     3.735  1.133  0.457  0.323  0.199  0.153

Proportion Var  0.623  0.189  0.076  0.054  0.033  0.025

Cumulative Var  0.623  0.811  0.888  0.941  0.975  1.000

> z=prcomp(stu,cor=T) # 另外一种方法

> z$sdev;z$rotation

[1] 22.945071 13.053612  9.236635  5.917179  4.781981  4.567181

               PC1        PC2          PC3        PC4         PC5          PC6

math     0.3398410 -0.1528053 -0.003788518  0.8801438  0.27099655 -0.114245835

phys     0.4497694 -0.5385549  0.665606182 -0.2511810 -0.03579590  0.016162234

chem     0.4240121 -0.4545526 -0.745698939 -0.2389537 -0.01819525  0.009938032

literat -0.5025806 -0.4234788 -0.007352564 -0.1275811  0.67529689 -0.309388929

history -0.3443203 -0.3819371 -0.020922969  0.2123413 -0.67664600 -0.481862171

english -0.3623335 -0.3934218 -0.019882641  0.2092616 -0.10522719  0.811588101

 

 

脚本

stu=read.table("/Users/liuzhicheng/Rtest/student.txt",header=T)

y=princomp(stu,cor=T);y

y$sdev;#特征值

y$load;#单位特征向量 -->对应spss为载荷(loadings),但是差一个特征值平方根的因子

#y$scores;#因子得分

sweep(y$loa,2,y$sde,"*")#实现和spss一样的载荷,只差一个常数因子

z=prcomp(stu,cor=T)# 另外一种方法


九、R实现因子分析

> y=factanal(stu,fact=2)

> y$loadings

 

Loadings:

        Factor1 Factor2

math    -0.355   0.793

phys    -0.201   0.713

chem    -0.216   0.689

literat  0.850  -0.376

history  0.854  -0.235

english  0.872  -0.242

 

               Factor1 Factor2

SS loadings      2.425   1.868

Proportion Var   0.404   0.311

Cumulative Var   0.404   0.716

 

脚本

>y=factanal(stu,fact=2)

> y$loadings