注:內(nèi)容非原創(chuàng)构舟,來自對網(wǎng)站http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/112-pca-principal-component-analysis-essentials/的翻譯垂券。
1 什么是主成分分析炎辨?
Principal component analysis is used to extract the important information from a multivariate data table and to express this information as a set of few new variables called?principal components.?
主成分分析(Principal component analysis,PCA)屬于多元統(tǒng)計(jì)分析中的一種丝格,適用于將具有一定相關(guān)性的多個(gè)變量化為少數(shù)幾個(gè)相互無關(guān)的綜合指標(biāo)(主成分)撑瞧,以方便可視化。
比如我這里有兩個(gè)地區(qū)采集到的多個(gè)A蟲樣本(individuals)显蝌,測量了31個(gè)形態(tài)指標(biāo)(即變量variables)预伺,我想知道兩個(gè)地區(qū)的A蟲是否存在形態(tài)上的差異,就用我的數(shù)據(jù)做一下主成分分析曼尊。
真正理解主成分分析原理需要線性代數(shù)的知識酬诀,這里只作簡單解釋:
如下圖A,數(shù)據(jù)本來在xy坐標(biāo)系中顯示出來骆撇,通過找到數(shù)據(jù)展現(xiàn)出最大變異的PC1瞒御,再把數(shù)據(jù)投影到PC1上,我們實(shí)現(xiàn)了降維神郊,把在二維坐標(biāo)系中的數(shù)據(jù)降到了一維肴裙。PC2軸是第二重要的方向,它和PC1正交涌乳,也就是說二者之間不相關(guān)蜻懦。
The amount of variance retained by each principal component is measured by the so-called?eigenvalue.
每個(gè)主成分保留的變異又通過特征值來表示。
在數(shù)據(jù)集中的變量彼此高度相關(guān)時(shí)夕晓,主成分分析尤其有用阻肩。變量相關(guān)就說明數(shù)據(jù)存在冗余。
上圖來感受下什么是高度冗余(兩個(gè)變量高度相關(guān)):
什么是較低的冗余(兩個(gè)變量相關(guān)不明顯):
2 R中如何實(shí)現(xiàn)主成分分析
我們通過R包"FactoMineR"和"factoextra"來實(shí)現(xiàn)主成分分析和可視化运授。
下面我會通過自己的一個(gè)實(shí)例來展示烤惊。
#安裝和載入所需要的R包
>install.packages(c("FactoMineR","factoextra","ggplot2"))
>library("FactoMineR")
>library("ggplot2")
>library("factoextra")
“FactoMineR”是用來實(shí)現(xiàn)數(shù)據(jù)分析的,“factoextra”是用來實(shí)現(xiàn)基于“ggplot2”的可視化的
首先展示一下我的數(shù)據(jù):
前兩列是樣本編號(樣本吁朦,individuals)和每個(gè)樣本的采樣地點(diǎn)(sites)柒室,不參與數(shù)據(jù)分析。后面31列對應(yīng)的是31個(gè)變量(觀測值或者變量逗宜,variables)
#從剪切板讀取數(shù)據(jù)雄右,前提是在excel里面已經(jīng)復(fù)制數(shù)據(jù)集
>collina=read.table("clipboard",header=TRUE)
#顯示數(shù)據(jù)框的前幾行,確保正確讀取數(shù)據(jù)
>head(collina)
#進(jìn)行主成成分分析纺讲,第1擂仍、2列不參與數(shù)據(jù)分析(第一列是巢編號,第二列是采樣地點(diǎn))
>collina.pca <- PCA(collina[,-c(1,2)],graph = FALSE)
一般在數(shù)據(jù)分析之前要進(jìn)行標(biāo)準(zhǔn)化處理(standardization)熬甚,尤其是當(dāng)變量的測量單位不同的時(shí)候(如千米逢渔,厘米等)。標(biāo)準(zhǔn)化的目的是為了讓變量可比乡括,總的來說就是標(biāo)準(zhǔn)差為1肃廓,平均值為0智厌。
進(jìn)行標(biāo)準(zhǔn)化時(shí),數(shù)據(jù)可進(jìn)行如下轉(zhuǎn)化:
用R自帶的scale()可以進(jìn)行標(biāo)準(zhǔn)化盲赊,但FactoMineR里的PCA()已經(jīng)包括了標(biāo)準(zhǔn)化的步驟铣鹏,因此不需要額外的標(biāo)準(zhǔn)化處理
3 對主成分分析的解讀和可視化
3.1 主成分的特征值(eigenvalues)和方差(variance)
前面說過,特征值衡量的是主成分保留的變異量哀蘑,第一主成分保留的變異量最大诚卸,依次遞減。第一主成分也與數(shù)據(jù)集方差最大的方向相同绘迁。通過特征值惨险,我們可以決定主成分的個(gè)數(shù)。
#提取主成分(PCs)的特征值和保留方差的百分比(信息)脊髓,輸入:
>eig.val <- get_eigenvalue(collina.pca)
>eig.val
出來的結(jié)果如下圖:
第一列是每個(gè)主成分的特征值。
第二列是每個(gè)特征值解釋的變異的百分比栅受,計(jì)算方法是某主成分特征值/特征值的加和将硝。
第三列是累計(jì)的變異的百分比
在本例中,第一屏镊、二主成分能解釋48.9%的變異依疼。
我們在前面說過特征值可以用來決定保留的主成分的個(gè)數(shù),那么怎么來確定呢而芥?
方法1 選擇特征值大于1 的主成分保留
在數(shù)據(jù)已經(jīng)進(jìn)行標(biāo)準(zhǔn)化處理的前提下律罢,主成分特征值大于1,意味著主成分比標(biāo)準(zhǔn)化后的原始數(shù)據(jù)集的任一變量解釋的方差要多棍丐。根據(jù)這個(gè)標(biāo)準(zhǔn)误辑,本例中可以保留前7個(gè)主成分。
方法二 根據(jù)累計(jì)方差百分比
一般認(rèn)為主成分的累計(jì)方差百分比達(dá)到80%以上歌逢,就可以了巾钉。根據(jù)這個(gè)標(biāo)準(zhǔn),本例中可以保留前7個(gè)主成分秘案。
當(dāng)然80%這個(gè)值是可變的砰苍,如果你認(rèn)為70%就夠了也是可以的。
方法3 做陡坡圖來確定
陡坡圖就是將主成分按照第二列其阱高,特征值解釋的變異的百分比的大小順序來排列的柱狀圖赚导。當(dāng)趨勢降低到已經(jīng)變得差不多小,沒有太大減小的趨勢時(shí)赤惊,認(rèn)為前面的主成分就是可以保留的吼旧。
#做陡坡圖,確定主成分的個(gè)數(shù)
>fviz_eig(collina.pca, addlabels = TRUE,ylim = c(0, 32))
結(jié)果如下圖:
根據(jù)陡坡圖未舟,本例中黍少,可以保留前4個(gè)主成分寡夹。
3.2獲得和可視化變量結(jié)果
3.2.1 獲得主成分分析中變量的結(jié)果
#獲得主成分分析中變量的結(jié)果
>var <- get_pca_var(collina.pca)
>var
這個(gè)命令可以幫助我們得到關(guān)于變量的主成分分析的結(jié)果,幫助我們進(jìn)行變量的作圖厂置,具體幫助如下:
?var$coord:coordinates of variables to create a scatter plot
var$coord提供用變量做散點(diǎn)圖的坐標(biāo)
var$cos2: represents the quality ofrepresentation for variables on the factor map. It’s calculated as the squaredcoordinates: var.cos2 = var.coord * var.coord.
var$cos2代表的是變量在因子圖中代表的變異的質(zhì)量
var$contrib: contains the contributions(in percentage) of the variables to the principal components. The contributionof a variable (var) to a given principal component is (in percentage) :(var.cos2 * 100) / (total cos2 of the component).
var$contrib代表的是變量對于主成分的貢獻(xiàn)(百分比表示)菩掏。
#查看前4個(gè)變量對主成分的貢獻(xiàn)
>head(var$contrib, 4)
# 變量對主成分1(PC1)的貢獻(xiàn)作圖,顯示貢獻(xiàn)前20的變量
fviz_contrib(collina.pca, choice ="var", axes = 1, top = 20)
# 變量對主成分1(PC1)的貢獻(xiàn)作圖昵济,顯示貢獻(xiàn)前20的變量
fviz_contrib(collina.pca, choice ="var", axes = 2, top = 20)
# 變量對主成分1智绸、2(PC1和PC2)的貢獻(xiàn)作圖,顯示貢獻(xiàn)前26的變量
fviz_contrib(res.pca, choice ="var", axes = 1:2, top = 26)
其中紅色的虛線代表的是期望的平均貢獻(xiàn)访忿,如果變量的超過了這條線瞧栗,認(rèn)為是對主成分有重要貢獻(xiàn)的。
3.2.2 獲得主成分分析中樣本(individuals)的結(jié)果
>ind <- get_pca_ind(res.pca)
>ind
具體含義和變量的結(jié)果類似海铆。
要查看各項(xiàng)結(jié)果輸入:
# Coordinates of individuals
head(ind$coord)
# Quality of individuals
head(ind$cos2)
# Contributions of individuals
head(ind$contrib)
3.2.3 biplot作圖
The representation of variables differs from the plot of the observations: The observations are represented by their projections, but the variables are represented by their correlations.
主成分分析的結(jié)果主要通過biplot圖來呈現(xiàn)迹恐,橫坐標(biāo)是主成分1,縱坐標(biāo)是主成分2卧斟,變量通過與主成分的相關(guān)關(guān)系表現(xiàn)在圖中殴边,樣本點(diǎn)通過該樣本多個(gè)變量的觀測值在主成分上的投影表現(xiàn)在圖中。輸入:
>fviz_pca_biplot(collina.pca,
? ? ? ? ? ? ? ? #individuals
? ? ? ? ? ? ? ? geom.ind = "point",#只顯示樣本點(diǎn)珍语,不包括文本信息锤岸,即樣本編號
? ? ? ? ? ? ? ? fill.ind = collina$sites,#按sites進(jìn)行分組
? ? ? ? ? ? ? ? pointshape = 21, pointsize = "contrib",#點(diǎn)的尺寸大小表示樣本的貢獻(xiàn)
? ? ? ? ? ? ? ? palette = "jco",#配色選擇“jco”雜志的調(diào)色板
? ? ? ? ? ? ? ? addEllipses = TRUE,#在相同組的樣本點(diǎn)為畫出密度橢圓
? ? ? ? ? ? ? ? #variables
? ? ? ? ? ? ? ? col.var = "cos2",#變量的顏色表示其在因子圖中代表的變異的質(zhì)量,即cos2
? ? ? ? ? ? ? ? gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),repel=TRUE,
? ? ? ? ? ? ? ? legend.title = list(fill = "sites"))
出來的PCA分析的biplot圖如下:
我們可以看出來板乙,變量的cos2值的大小通過不同的顏色梯度表示出來是偷,每個(gè)樣本點(diǎn)對主成分的貢獻(xiàn)通過點(diǎn)的大小表現(xiàn)出來。兩個(gè)采樣地的樣本點(diǎn)也進(jìn)行了分組募逞。
但是蛋铆,由于我自身數(shù)據(jù)的原因,兩個(gè)采樣點(diǎn)的樣本分不太開放接。