主成份分析

  主成份分析(PCA)主要是想要用比較少的「成份」來看資料變異的來源(也就是降低資料的維度)。主成份分析是因子分析的一個特例,但主成份分析想看的是造成資料變異的結構,而因子分析想看的是資料裡變數之間的關係。

 

  這些成份是由原來資料變數的線性組合所造出來,當然並不是所有的線性組合都可以,不然係數愈大,所造出的來的線性組合的變異也愈大,必須對係數加入限制,每一個主成份的係數的向量,長度為1。另外我們也不希望各主成份之間會互相影響,所以不同主成份的內積是0。我們希望主成份可以降低資料的維度,所以只要挑比較大的幾個主成份就足夠解釋。這樣一來資料的維度就會降低,而又可以達到需要解釋的水準。

 

  先想一個極端的例子,如果資料裡面有五個變數,2nd~5th 都是1st的倍數,那我們需要把所有的變數都放到模型裡去?其實這份資料的變異來源就只有第一個變數。在有高度線性相關的變數,用主成份去做分析會比用原來的變數做分析來得恰當。

 

根據這些性質,在矩陣運算上所使用的特徵值和特徵向量會符合這些特性。我們就採用這種方法來做主成份分析(PCA)

 

現在用一個例子來看,先把Fertility的資料扣起來,待拿來做迴歸。

data(swiss) #資料在Rdata set

S=var(swiss[,-1]) #Fertility的資料扣起來

pca=princomp(swiss[,-1])#丟資料

names(pca)

summary(pca)

       

 

Comp.1

Comp.2

Comp.3

Comp.4

Comp.5

Standard deviation

42.896

21.202

7.588

3.688

2.721

Proportion of Variance

0.777

0.190

0.024

0.006

0.003

Cumulative Proportion

0.777

0.967

0.991

0.997

1.000

 

pld=pca$loading

fix(pld)

#比較一下,特徵值、特徵向量和PCA做出來的東西#

e=eigen(S)$vecto r       #特徵向量

v=eigen(S)$value          #特徵值

#---特徵向量e的部分----(有時會差一個負號)#

pld

 

Comp.1

Comp.2

Comp.3

Comp.4

Comp.5

Agriculture

0.282

0.884

-0.37

-0.027

-0.049

Examination

-0.121

-0.174

-0.45

-0.867

0.033

Education

-0.058

-0.311

-0.807

0.485

-0.117

Catholic

0.95

-0.303

0.002

-0.071

0.022

Infant.Mortality

0.01

-0.019

0.099

-0.087

-0.991

e

 

[,1]

[,2]

[,3]

[,4]

[,5]

[1,]

0.282

0.884

0.37

-0.027

-0.049

[2,]

-0.121

-0.174

0.45

-0.867

0.033

[3,]

-0.058

-0.311

0.807

0.485

-0.117

[4,]

0.95

-0.303

-0.002

-0.071

0.022

[5,]

0.01

-0.019

-0.099

-0.087

-0.991

 

#---特徵值v的部分------#

sqrt(v) #summary出來的是Sd

43.360

21.431

7.670

3.728

2.751

v/sum(v)

0.777

0.19

0.024

0.006

0.003

圖一:各主成份所解釋的變異百分比

由圖一可以看出選擇二個主成份即可,在第三主成份有一個折點。第三個主成份之後就只有很小的貢獻。特徵值的部分可以和前面的summary(pca)比較,特徵值會有一點不一樣,但是變異數的比例是和特徵值算出來的一樣。

 

現在來看我們做出來的主成份。第一個主成份是和CatholicInfant.Mortality有關,第二個主成份是和Agriculture Education Catholic有關等等。有時候我們可以藉由主份份來將變數來分群,賦予新的意義,但這邊看來,似乎和原本的變數較接近,每一個主成份有極大的比例是在某一個變數上面。所以主成份的順序可以看成是變數重要性的次序。Catholic這樣來看,是資料swiss[,-1]最重要的變數。

 

比較奇怪的是這個。照理說,用主成份來做迴歸應該是愈前面的主成份配適得愈好,因為它已經代表predictors大部份的變異,但結果似乎並不是這樣。

mod=lm(swiss[,1]~pca$score[,1:3]) #用前面三個主成份做的model

summary(mod)

Coefficients:

               Estimate Std. Error       t value    Pr(>|t|)   

(Intercept)    70.14255     1.10854          63.275    < 2e-16           ***

pca$score[, 1]  0.14376    0.02584          5.563     1.57e-06                ***

pca$score[, 2]  0.11115     0.05228          2.126      0.0393           * 

pca$score[, 3]  0.98882     0.14609          6.769      2.79e-08       ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

Residual standard error: 7.6 on 43 degrees of freedom

Multiple R-squared: 0.654, Adjusted R-squared: 0.6299

F-statistic: 27.09 on 3 and 43 DF, p-value: 5.357e-10

 

mod1=lm(swiss[,1]~pca$score[,1:2]) #另一個比較小的model

Call:

lm(formula = swiss[, 1] ~ pca$score[, 1:2])

….

Residual standard error: 10.8 on 44 degrees of freedom

Multiple R-squared: 0.2854,     Adjusted R-squared: 0.2529

F-statistic: 8.786 on 2 and 44 DF, p-value: 0.000616

 

cor(cbind(swiss[,1],pca$score))[2:6,1]

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

0.499              0.191              0.607              -0.088            -0.212

 

這是Fertility和其它主成份的相關係數,看起來,第二主成份並不是很相關。這樣的結果是對的?

因為主成份只有解釋那一些我們丟進去的資料。由那些資料變數的線性組合生成新的主成份,所以和我們沒有丟進去的資料並不一定相關,當然原來資料可以解釋的部分用全部的主成份下去也是一樣。所以可能較前面的主成份並不一定可以對Fertility有很好的解釋。除非Fertility變異的方式和我們丟進去資料的變異很相似。

也許看一下pairs plot 會有其它的想法。

pairs(swiss, panel = panel.smooth, main = "swiss data", 

col = 3 + (swiss$Catholic > 50))

  藍色和綠色的表現是不是很不一樣?所以,Catholic是一個很重要的變數。

圖二:藍色的部分是天主教比例較高的地區