一文了解R語言數據分析 ----主成分分析


(文末有贈書福利)

在數據挖掘項目中,經常會遇到的情況是有很多特征可以用,這是一件好事,但是有的時候數據中存在很多冗余情況,也就是說數據存在相關性或者共線性。在這種情況下對於分析帶來了很多麻煩。不必要的特征太多會造成模型的過於復雜,共線性相關性會造成模型的不穩定,即數據微小的變化會造成模型結果很大的變化。主成分分析是解決這種問題的一個工具。

一、概述

主成分分析簡稱PCA,PCA是一個很好的預處理工具,用於挑選最相關的變量線性組合,並在我們的預測模型中使用它們。PCA幫助我們找出解釋數據中變化最大的變量。PCA也是解決數據間存在共線性問題的一種方式。

PCA的唯一缺點是它以無監督的方式生成主成分,也就是與數據的標簽沒有任何關系。如果最終的目的是構建模型的話,選出來的主成分不一定對於標簽或者說因變量有很好的預測能力。在本章節會介紹PCA的一些基本概念,並且使用R語言進行實現。

 

1.     維度相關的問題

 

有兩個因素會使得數據的維度變得非常高。首先,具有不同級別的分類變量,其次是數據集中的冗余變量。當我們在建模中包含分類變量時,我們使用虛擬變量,並且分類變量中的級別數越多,我們創建的虛擬變量就越多,這會增加維度。冗余變量代表數據集中的信息不夠精簡,多個特征描述了同一信息,例如,數據集中有三個特征,收益,成本,利潤率,這三個特征就存在冗余,因為第三個特征是通過前兩個特征生成的,因此可以刪除掉冗余特征。

多重共線性(共線性)可以定義為回歸模型中的兩個或更多個變量高度相關的現象,這意味着,模型數據中存在一定的冗余。

變量之間存在冗余變量和多重共線性可以以多種方式影響變量的分析,其中一些在下面例子:

•  破壞參數估計的穩定性。

•  混淆模型解釋。

•  增加過度擬合的風險。

•  增加計算時間。

輸入數據的微小變化(如刪除或添加單個變量)會導致模型發生較大變化,甚至導致參數符號更改。此外,多重共線性的存在增加了系數估計的方差或標准誤差,使其對微小變化敏感,從而導致解釋困難。

當我們討論數據集的最佳回歸模型時,這意味着模型會考慮預測變量,其中每個預測變量與目標/因變量相關,但相互之間幾乎沒有關聯。這種模型被稱為低噪聲模型,具有很強的魯棒性。如果變量本身之間的相關性很高,並且我們在訓練數據集上獲得了很高的預測能力,那么我們可能無法實現在測試數據集上相同。

2.檢測多重共線性

在了解了多重共線性如何影響我們的分析和模型的預測能力之后,學習如何檢測數據中多重共線性的存在非常重要。

以下方法可用於檢測多重共線性:

•  R平方值很大,但沒有β重量統計上顯着的,即整體模型的F檢驗是顯着的,但個體系數估計的t檢驗不是。

•  變量對之間的相關性很大。

•  差異通貨膨脹因素。

3. 方差膨脹因子

在檢測多重共線性時提到的一點是,變量對之間的相關性很大,但有時只關注預測變量對之間的相關性可能是一個限制因素。

成對相關可能很小,但三個或更多變量之間存在線性相關。例如,X1,X2和X3之間的關系由線性方程定義,例如:X3 = 3X1 + 4X2 +Error。對於這種情況,我們使用方差膨脹因子。

VIF衡量估計回歸系數的方差,可以通過模型中預測變量之間相關性的存在來誇大。如果VIF的值> 10,則表明變量之間存在一些嚴重的相關性。

我們不會討論VIF的數學推導。 VIF的公式為:

預測變量“k”的VIF是通過對剩余預測變量上的第k個變量進行回歸來計算R平方值而獲得的。

多重共線性與高緯度的補救措施包括如下:

•  檢查其中一個變量是否重復。

•  刪除冗余變量。

•  通過收集更多數據來增加樣本量。

•  平均中心預測變量。

•  預測變量的標准化 - 如果均值中心沒有影響。

•  主成分分析,嶺回歸,偏最小二乘回歸。

在本文檔中,我們將借助示例討論主成分分析。

二、主成分分析詳解

PCA也稱為特征縮減或特征提取PCA使用數據集中已存在的許多功能創建新功能。在PCA中,不是直接在解釋變量上回歸因變量,而是將解釋變量的主成分用作回歸量。人們通常只使用所有主成分的子集進行回歸,從而使PCR成為一種正則化程序。通常選擇具有較高方差的主要成分作為回歸量。

PCA的一個主要用途在於克服多重共線性問題。PCA可以通過在回歸步驟中排除一些低方差主成分來恰當地處理這種情況。此外,通過僅對所有主成分的子集進行回歸,PCR可以通過顯着降低表征基礎模型的參數的有效數量來減少尺寸。

1. 主成分分析的定義

假設,最初在您的模型中有p個預測變量,每個都有n條記錄。所以,數據矩陣如下所示:

 

 

 

 

2. 主成分分析的簡單原理

假設在最后一步中生成的個新變量是它背后有兩個條件,

•  新變量將是不相關的(或正交的)。

•  最大的變化將沿着,第二大變化將沿着,第三大變化將沿着,依此類推。

關於主成分的原理其實很簡單,其本質上是數據的線形轉換,首先使用用表示$X_1,X_2, , 的方差 - 協方差矩陣。

 

 

3. 主成分分析的算法

 

 

 

 三、使用R語言進行主成分分析

在R中有很多方法可以實現主成分分析,基礎的prcomp函數,psych包中的principal函數都可以構建主成分分析。在進行主成分分析之前,需要判斷是需要選取多少個主成分。判斷的准則有很多,包括:

•  根據經驗或者理論知識進行判斷主成分個數。

•  根據解釋變量方差的積累值的閾值來判斷保留的主成分個數。

•  通過變量間的關系矩陣來判斷需要保留的主成分個數。

•  基於特征值進行判斷,根據Kaiser-Harris准則建議保存特質大於1的主成分。

•  使用Cattell 碎石圖進行判斷,碎石圖繪制了特征值與主成分數量,這類圖可以清晰的展示特征值與主成分數之間的關系,圖形變化最大之前的主成分都可以保留。

•  平行分析法,其原理是模擬一個與原數據集相同大小的矩陣來判斷提取的特征值,若真實的某個特征值大於隨機數據矩陣的平均特征值,則可以保留。

利用psych包中的fa.parallel函數可以對,特征值大於1,碎石檢驗,平行分析三種准則進行評價。所使用到的數據集是psych包中自帶的一個數據集,Thurstone。使用fa.parallel構建碎石圖的參數是需要進行主成分分析的數據集。碎石圖的結果如圖5.1所示。

library(psych)
fa.parallel(Thurstone)
## Warning in fa.parallel(Thurstone): It seems as if you are using a
## correlation matrix, but have not specified the number of cases. The number
## of subjects is arbitrarily set to be 100
## Parallel analysis suggests that the number of factors =  3  and the number of components =  1

 

 

圖1碎石圖的結果給出了三種准則的評判結果,從結果中可以發現,特征值大於1的特征包含三個;碎石圖的曲線從第一個特征到第二個特征之間有急劇的變化,因此,選取第一個主成分;根據平行分析法,有一個特征大於隨機矩陣的特征,總而言之,選取一個主成分最合適。

1. 主成分分析的實現

使用prcomp函數和psych包的principal函數都可以實現主成分分析。對於prcomp而言,傳入需要進行主成分分析的原始數據即可得到主成分分析的結果:

com <- prcomp(Thurstone)
com
## Standard deviations (1, .., p=9):
## [1] 4.068067e-01 3.717632e-01 1.747973e-01 1.614655e-01 1.328383e-01
## [6] 1.137641e-01 8.417453e-02 5.966690e-02 5.671327e-17
## 
## Rotation (n x k) = (9 x 9):
##                           PC1         PC2        PC3         PC4
## Sentences         -0.51809588  0.01904674  0.2219406 -0.10347521
## Vocabulary        -0.50023933  0.09586015  0.1948562 -0.03929555
## Sent.Completion   -0.51043041  0.05906835  0.1922287 -0.05061761
## First.Letters      0.17889726  0.41142018  0.2781580  0.28375796
## Four.Letter.Words  0.22201272  0.34066448  0.3832537  0.47143714
## Suffixes           0.06316668  0.48794084 -0.5349420 -0.38650203
## Letter.Series      0.12799298 -0.46305936  0.1213871  0.04342013
## Pedigrees         -0.18269477 -0.36539660 -0.4557516  0.57758413
## Letter.Group       0.29283881 -0.34002238  0.3780991 -0.44445752
##                           PC5          PC6         PC7         PC8
## Sentences          0.06248519 -0.111471957  0.40722485 -0.68008332
## Vocabulary         0.09218721 -0.016188107  0.42092377  0.71770206
## Sent.Completion   -0.10617941  0.099931122 -0.76715103  0.04517829
## First.Letters      0.05821963  0.752293096  0.13448197 -0.06117109
## Four.Letter.Words -0.04884194 -0.625099183 -0.02856458  0.03809150
## Suffixes           0.12836566 -0.114136797  0.06024721  0.04481668
## Letter.Series      0.77851211  0.004042136 -0.05517789  0.05033184
## Pedigrees         -0.32964974  0.079329046  0.14775329  0.03158129
## Letter.Group      -0.48920364  0.035988647  0.14513339  0.09806774
##                           PC9
## Sentences         0.163013221
## Vocabulary        0.004977171
## Sent.Completion   0.290922025
## First.Letters     0.222883485
## Four.Letter.Words 0.264802257
## Suffixes          0.535941908
## Letter.Series     0.375364298
## Pedigrees         0.392434091
## Letter.Group      0.432241146

從結果中,得到了所有的主成分,然后根據之前的判斷的主成分個數,選取相應的主成分,即可得到所要的結果。

另外一種方式是使用principal進行主成分分析,其可以通過原始數據矩陣或者相關系數矩陣進行主成分分析,其主要的參數如下:

•  r:原始數據矩陣或者相關系數矩陣。

•  nfactors:選取的主成分個數,默認為1。

然后,使用第二種方式進行主成分分析:

com <- principal(r = Thurstone,nfactors = 1)
com
## Principal Components Analysis
## Call: principal(r = Thurstone, nfactors = 1)
## Standardized loadings (pattern matrix) based upon correlation matrix
##                    PC1   h2   u2 com
## Sentences         0.82 0.67 0.33   1
## Vocabulary        0.84 0.70 0.30   1
## Sent.Completion   0.80 0.65 0.35   1
## First.Letters     0.72 0.52 0.48   1
## Four.Letter.Words 0.71 0.51 0.49   1
## Suffixes          0.67 0.45 0.55   1
## Letter.Series     0.67 0.45 0.55   1
## Pedigrees         0.70 0.50 0.50   1
## Letter.Group      0.64 0.41 0.59   1
## 
##                 PC1
## SS loadings    4.85
## Proportion Var 0.54
## 
## Mean item complexity =  1
## Test of the hypothesis that 1 component is sufficient.
## 
## The root mean square of the residuals (RMSR) is  0.12 
## 
## Fit based upon off diagonal values = 0.94

接下來分析結果,PC1欄是成分荷載(componentloadings),表示的是觀測變量與主成分的相關系數,如果不止提取一個主成分,那么會有PC2欄,或者PC3欄目。成分荷載可以用來解釋成分的含義,從結果中可以看出,PC1與所有的變量都非常相關,因此,這個主成分是可以用來進行一般性評價的緯度。h2是公因子方差,表示主成分對於每一個變量的解釋程度。u2表示唯一性,指的是變量無法被主成分解釋的部分。SSloadings 包含了與主成分相關聯的特征值。Proportion Var表示每個主成分對整個數據集的解釋程度。從結果中可以看出,第一個主成分解釋了所有變量54%的方差。

2. 主成分分析案例

在這里,這個例子將使用USArrests數據,該數據包含四個連續變量和50條記錄。首先創建一個散點圖矩陣來檢查變量之間的關系,首先加載USArrests數據集,glimpse用於查看數據的結構,apply函數的使用方式類似於for循環,只是其效率更高,apply(USArrests,2,mean)表示計算每一列的均值,apply的第一個參數需要處理的數據集,第二個參數用於指定是對行進行處理還是對列進行處理,2表示對列進行處理,第三個參數用於指定使用函數進行處理。

data("USArrests")
head(USArrests,3)
##         Murder Assault UrbanPop Rape
## Alabama   13.2     236       58 21.2
## Alaska    10.0     263       48 44.5
## Arizona    8.1     294       80 31.0
library(dplyr)
 #Explore the structure of the data
usarrests <- tbl_df(USArrests)
glimpse(usarrests)
## Observations: 50
## Variables: 4
## $ Murder   <dbl> 13.2, 10.0, 8.1, 8.8, 9.0, 7.9, 3.3, 5.9, 15.4, 17.4, 5…
## $ Assault  <int> 236, 263, 294, 190, 276, 204, 110, 238, 335, 211, 46, 1…
## $ UrbanPop <int> 58, 48, 80, 50, 91, 78, 77, 72, 80, 60, 83, 54, 83, 65,…
## $ Rape     <dbl> 21.2, 44.5, 31.0, 19.5, 40.6, 38.7, 11.1, 15.8, 31.9, 2…
apply(USArrests,2,mean)
##   Murder  Assault UrbanPop     Rape 
##    7.788  170.760   65.540   21.232
apply(USArrests,2,var) #
##     Murder    Assault   UrbanPop       Rape 
##   18.97047 6945.16571  209.51878   87.72916

每個變量的方差都有很大差異。在PCA中,平均值不起作用,但方差在定義PC中起主要

 

normalize <- function(x)
{
  return((x - mean(x))/sd(x))
}

# create normalized variables
usarrests2 <- usarrests %>%
  apply(2, normalize) %>%
  as.data.frame()

接下來對數據進行探索性分析,分析特征的分布以及特征之間的一個相關性,這里使用的是GGally的ggpairs函數,其可以繪制出特征的分布圖,特征之間的散點圖,以及特征的相關系數。ggpairs的第一個參數是數據集,第二個參數是columns用於指定選擇哪些變量進行繪圖。特征相關性結果如圖2所示。

library(GGally)
## Loading required package: ggplot2
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
## 
## Attaching package: 'GGally'
## The following object is masked from 'package:dplyr':
## 
##     nasa
ggpairs(data = usarrests2, 
        columns = 1:4,progress = F)

從圖2看出,MurderAssaultAssaultRapeMurderRapeUrbanPopRape都是高度相關的。因此,數據存在比較嚴重的共線性問題。然后判斷主成分個數,結果的碎石圖如圖3所示。

fa.parallel(usarrests2)
## Parallel analysis suggests that the number of factors =  2  and the number of components =  1

 

 從碎石圖來看,可以選取一個主成分。

然后分別使用進行主成分分析:

pca.out<-prcomp(usarrests2)
pca.out
## Standard deviations (1, .., p=4):
## [1] 1.5748783 0.9948694 0.5971291 0.4164494
## 
## Rotation (n x k) = (4 x 4):
##                 PC1        PC2        PC3         PC4
## Murder   -0.5358995  0.4181809 -0.3412327  0.64922780
## Assault  -0.5831836  0.1879856 -0.2681484 -0.74340748
## UrbanPop -0.2781909 -0.8728062 -0.3780158  0.13387773
## Rape     -0.5434321 -0.1673186  0.8177779  0.08902432
summary(pca.out)
## Importance of components:
##                           PC1    PC2     PC3     PC4
## Standard deviation     1.5749 0.9949 0.59713 0.41645
## Proportion of Variance 0.6201 0.2474 0.08914 0.04336
## Cumulative Proportion  0.6201 0.8675 0.95664 1.00000

現在我們可以看到最大的方差百分比由PC1解釋,並且所有的PC都是相互不相關的。大約62%的方差由PC1解釋,從這個結果同樣可以判斷,選取一個主成分即可。

讓我們建立一個雙重圖來更好地理解,使用biplot繪制雙重圖,biplot的第一個參數是主成分分析的,其他的參數是對圖形細節的調整。主成分分析的雙重圖結果如圖4所示。

biplot(pca.out,scale = 0, cex=0.65)

圖4中,紅色箭頭表示變量,每個方向表示解釋變化最多的方向。可以看到,第二個主成分與所有的變量都非常相關,第一主成分是可以用來描述所有特征的組成分

第二主成分主要與Murder和UrbanPop相關。

四、總結

 主成分分析是數據挖掘中比較常用的一種方法,有着廣泛的應用。主成分的要點之一是判斷主成分的個數,畢竟主成分分析最常使用的一個場景是數據的降低維,這種方法可以用一組不相關變量來替代大量相關的變量,進而簡化分析過程,然后介紹了R中主成分分析的實現。

 

本文選自於清華大學出版社出版的《深入淺出R語言數據分析》一書的小節,略有改動。經出版社授權刊登於此。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM