• Home
  • About
    • Chi's blog photo

      Chi's blog

      Share and save some study notes about health economics and policy.

    • Learn More
    • Github
    • StackOverflow
  • Posts
    • All Posts
    • All Tags
  • Projects

Step by Step to do Pricipal Component Analysis

21 Oct 2019

Reading time ~3 minutes

Chi Shen, Oct 13 2019

New Haven, CT

关于主成分分析

主成分分析(Principal component analysis)是由Pearson在1901年提出的,后来被Hotelling在1933进行了发展。

目的:
把多个相关的原始变量降维成少数几个不相关的主成分。

原理:
本质是原始变量的线性组合。

进行主成分分析的步骤

1.数据预处理

原始数据矩阵或者相关系数矩阵都可以进行分析,需要注意的几点:

  • 原始数据矩阵实际是计算协方差矩阵进行的主成分分析
  • 原始数据矩阵只适用于度量单位相同,或者差别不大时进行分析,如果差别大可以进行Z得分转换
  • 不论是原始数据矩阵还是相关系数矩阵,都不能有缺失值

2.确定主成分个数

在计算主成分得分之前,需要先判断主成分个数,通常有四种准则:

  • 根据先验经验或者理论知识
  • Kaiser-Harris准则,只保留特征值大于1的主成分
  • Cattell碎石检验,通过绘制特征值与主成分数的图形,只保留在图形变化最大处之上的主成分
  • 平行分析,依据与初始矩阵相同大小的随机数据矩阵来判断要提取的特征值,若基于真实数据的某个特征值大于一组随机数据矩阵相 应的平均特征值,那么该主成分可以保留。

通常需要结合四种准则,综合判断主成分个数

3.计算主成分

在R语言中既可以使用base包中的princomp()函数,也可以使用psych包中的principal()函数

4.旋转主成分

旋转是一系列将成分载荷阵变得更容易解释的数学方法,它们尽可能地对成分去噪。

旋转方法有两种: + 正交旋转:使选择的成分保持不相关 + 斜交旋转:和让它们变得相关

旋转方法也会依据去噪定义的不同而不同。

最流行的正交旋转是方差极大旋转,它试图对载荷阵的列进行去噪,使得每个成分只是由一组有限的变量来解释(即载荷阵每列只有少数几个很大的载荷,其他 都是很小的载荷)。

5.解释结果并计算主成分得分

对结果进行解释,并计算各个主成分的得分,需要注意的是:

使用相关系数矩阵进行主成分分析时,无法直接获得主成分得分,只能得到原始变量的主成分系数。

主成分分析的示列

建议在R语言中,使用psych包进行主成分分析。

1.载入包和数据

示列数据集使用的是psych包中自带的Harman23.cor数据集。

library(psych)

data(Harman23.cor)
str(Harman23.cor) #可以看出Harman23.cor是一个list,需要提取出分析使用的cov数据集

## List of 3
##  $ cov   : num [1:8, 1:8] 1 0.846 0.805 0.859 0.473 0.398 0.301 0.382 0.846 1 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : chr [1:8] "height" "arm.span" "forearm" "lower.leg" ...
##   .. ..$ : chr [1:8] "height" "arm.span" "forearm" "lower.leg" ...
##  $ center: num [1:8] 0 0 0 0 0 0 0 0
##  $ n.obs : num 305

df <- Harman23.cor$cov
str(df)

##  num [1:8, 1:8] 1 0.846 0.805 0.859 0.473 0.398 0.301 0.382 0.846 1 ...
##  - attr(*, "dimnames")=List of 2
##   ..$ : chr [1:8] "height" "arm.span" "forearm" "lower.leg" ...
##   ..$ : chr [1:8] "height" "arm.span" "forearm" "lower.leg" ...

2.判断主成分个数

psych包中给出了一个特别有用的函数fa.parallel(),可以很方便的同时给出Kaiser-Harris准则,Cattell碎石检验,平行分析的结果。

由上步骤可以看出,df实际为相关系数矩阵,n.obs是指定原始观测数,n.iter是指定平行分析的随机迭代次数,fa是用来指定进行主成分分析, 取值有三类(‘fa’,‘pc’,‘both’)。

由结果看出,特征值大于1,拐点之上,大于随机的特征值,满足以上三个条件,只有前两个主成分,因此主成分个数为2.

fa.parallel(df, n.obs = 302, n.iter = 100, main = "Parallel Analysis Scree Plots", fa = 'pc', show.legend = TRUE)

image

## Parallel analysis suggests that the number of factors =  NA  and the number of components =  2

3.主成分分析

结果中

  • PC1和PC2既为2个主成分在各个原始变量上的载荷(loading,也就是相关系数),可以看出系数都较高
  • h2为成分公因子方差,用来说明主成分对每个变量的方差解释度,此值越高说明解释力度越大
  • u2栏指成分唯一性——方差,用来说明无法被主成分解释的比例,h2与u2之和为1
  • Proportion Var为每个主成分对整个数据集的解释程度
  • Cumulative Var是Proportion Var的累计和,其值至少应该需大于0.80以上

可以看出,PC1和PC2在部分变量上都有较高的解释度,不满足各个主成分之间应该正交的条件,需进行旋转

principal(df, nfactors = 2, rotate = 'none', n.obs = 302, scores = TRUE)

## Principal Components Analysis
## Call: principal(r = df, nfactors = 2, rotate = "none", n.obs = 302, 
##     scores = TRUE)
## Standardized loadings (pattern matrix) based upon correlation matrix
##                 PC1   PC2   h2    u2 com
## height         0.86 -0.37 0.88 0.123 1.4
## arm.span       0.84 -0.44 0.90 0.097 1.5
## forearm        0.81 -0.46 0.87 0.128 1.6
## lower.leg      0.84 -0.40 0.86 0.139 1.4
## weight         0.76  0.52 0.85 0.150 1.8
## bitro.diameter 0.67  0.53 0.74 0.261 1.9
## chest.girth    0.62  0.58 0.72 0.283 2.0
## chest.width    0.67  0.42 0.62 0.375 1.7
## 
##                        PC1  PC2
## SS loadings           4.67 1.77
## Proportion Var        0.58 0.22
## Cumulative Var        0.58 0.81
## Proportion Explained  0.73 0.27
## Cumulative Proportion 0.73 1.00
## 
## Mean item complexity =  1.7
## Test of the hypothesis that 2 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.05 
##  with the empirical chi square  46.77  with prob <  1.1e-05 
## 
## Fit based upon off diagonal values = 0.99

4.主成分分析

从结果可以看出,PC1和PC2变成了RC1和RC2,即表示经过旋转了,可以很清楚的看出:

旋转后,RC1在前4个变量(height – lower.leg)上具有更高的解释度
RC2在后4个变量(weight – chest.width)上具有更高的解释度

说明两个主成分正交(不相关)

同时可以发现,旋转后并不改变Cumulative Var

dfp <- principal(df, nfactors = 2, rotate = 'varimax', n.obs = 302, scores = TRUE)
dfp

## Principal Components Analysis
## Call: principal(r = df, nfactors = 2, rotate = "varimax", n.obs = 302, 
##     scores = TRUE)
## Standardized loadings (pattern matrix) based upon correlation matrix
##                 RC1  RC2   h2    u2 com
## height         0.90 0.25 0.88 0.123 1.2
## arm.span       0.93 0.19 0.90 0.097 1.1
## forearm        0.92 0.16 0.87 0.128 1.1
## lower.leg      0.90 0.22 0.86 0.139 1.1
## weight         0.26 0.88 0.85 0.150 1.2
## bitro.diameter 0.19 0.84 0.74 0.261 1.1
## chest.girth    0.11 0.84 0.72 0.283 1.0
## chest.width    0.26 0.75 0.62 0.375 1.2
## 
##                        RC1  RC2
## SS loadings           3.52 2.92
## Proportion Var        0.44 0.37
## Cumulative Var        0.44 0.81
## Proportion Explained  0.55 0.45
## Cumulative Proportion 0.55 1.00
## 
## Mean item complexity =  1.1
## Test of the hypothesis that 2 components are sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.05 
##  with the empirical chi square  46.77  with prob <  1.1e-05 
## 
## Fit based upon off diagonal values = 0.99

5.计算主成分得分

在principal函数中的scores即是制定是否计算主成分得分的,如果为TRUE,则在dfp中已保存有得分,利用dfp$scores即可以取出得分。

但是本示列中使用的是相关系数矩阵,无法计算得分,只能计算得分权重,为:

dfp$weights

##                        RC1         RC2
## height          0.27524417 -0.04748169
## arm.span        0.29673051 -0.08005490
## forearm         0.29823990 -0.09158460
## lower.leg       0.28014088 -0.06027214
## weight         -0.06053059  0.33228637
## bitro.diameter -0.07752349  0.32477593
## chest.girth    -0.10366026  0.33763942
## chest.width    -0.03730720  0.27392667


RPCA Share Tweet +1