R包做主成分分析(含實(shí)例)

注:內(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)的樣本分不太開放接。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末戒职,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子透乾,更是在濱河造成了極大的恐慌洪燥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乳乌,死亡現(xiàn)場離奇詭異捧韵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汉操,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門再来,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事芒篷∷驯洌” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵针炉,是天一觀的道長挠他。 經(jīng)常有香客問我,道長篡帕,這世上最難降的妖魔是什么殖侵? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮镰烧,結(jié)果婚禮上拢军,老公的妹妹穿的比我還像新娘。我一直安慰自己怔鳖,他們只是感情好茉唉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著结执,像睡著了一般度陆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昌犹,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機(jī)與錄音览芳,去河邊找鬼斜姥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沧竟,可吹牛的內(nèi)容都是我干的铸敏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悟泵,長吁一口氣:“原來是場噩夢啊……” “哼杈笔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糕非,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒙具,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后朽肥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禁筏,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年衡招,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篱昔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖州刽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情穗椅,我是刑警寧澤辨绊,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站房待,受9級特大地震影響邢羔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桑孩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一拜鹤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧流椒,春花似錦敏簿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绣硝,卻和暖如春蜻势,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹉胖。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工握玛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人甫菠。 一個(gè)月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓挠铲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寂诱。 傳聞我的和親對象是個(gè)殘疾皇子拂苹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容