多元因子分析(MFA)及其在R中實現

多元因子分析(MFA)及其在R中實現
多元因子分析(multiple factor analysisMFA)是主成分分析(PCA)的擴充套件,旨在描述多組變數集的相互關係(Escofier and Pagès, 1990)。透過平衡每組變數的影響,綜合各組變數集的貢獻確定物件之間的距離,分析由幾組變數共同描述的物件特徵,以及觀測變數之間的綜合關係。
MFA是一種探索性的對稱排序方法,不是因果關係的假設檢驗,變數集之間的關係透過某種型別的相關性衡量。
MFA允許輸入多組不同型別的變數集:各組變數集所含變數數量允許不同,變數的性質(分類或定量)在各變數集之間也允許各異,但各變數集內部所有變數的性質必須相同,且所有變數集的物件必須相同。
MFA的計算步驟如下:
首先標準化各組變數集的所有變數。
對標準化後的各變數集執行特徵分解,全為定量變數的變數集執行主成分分析(PCA),全為分類變數的變數集執行多重對應分析(MCA)。
將各組變數集中的變數除以各自PCA(或MCA)第一軸的特徵根獲得歸一化的變數集,並將所有歸一化的變數集都彙總到一個大資料表中,對該表執行全域性PCA分析。
將每組變數投影到全域性PCA排序圖上,透過物件和變數的排序圖評估資料集的共同結構和差異。

Abdi et al, 2013
MFA已被廣泛用於多種領域,例如:
調查分析,物件為被調查的個體,變數為調查問題,問題可按主題劃分為變數集;
感官分析,物件是食品,第一組變數包括味覺變數(甜,苦等),第二組包括化學變數(pH值、葡萄糖速率等);
生態學分析,物件為觀測地域,第一組變數描述了環境特性,第二組描述物種數量;
多組學分析,物件是樣本,不同的變數集可以為轉錄組、蛋白組、代謝組等測量資料;
時間序列,可以將各變數集定義為每個變數在不同時間的測量值;
本篇簡介RFactoMineRMFA方法,以及結合factoextra包實現視覺化。分析中將展示如何揭示重要的變數,這些變數對解釋資料集的方差起最大的作用。
資料集

FactoMineR包的內建資料集wine,記錄了21種葡萄酒的資訊。
library(FactoMineR)
#資料集,詳情 ?wine

data(wine)

head(wine[1:6])

該資料集中,每一行代表一種葡萄酒,共21行。
每一列代表了葡萄酒的屬性資訊,共31列。其中前2列是分類變數,labelSaumurBourgueilChinon)代表了葡萄酒的產地,soilReferenceEnv1Env2Env4)代表了植物的土壤環境;第3-31列是定量變數,代表了葡萄酒各類品質特徵的打分。

整體而言,對於資料集中所有代表葡萄酒屬性的變數,可將它們組合為6組變數集,包含1組分類變數和5組定量變數:
1-2列,共2列,包括葡萄酒產地等屬性,該變數集代表葡萄酒“來源屬性”(origin);
3-7列,共5列,包括搖動前的氣味強度、香氣質量、果味等屬性,該變數集代表葡萄酒“搖動前的氣味屬性”(odor before shaking);
8-10列,共3列,包括視覺上的區分度等屬性,該變數集代表葡萄酒“視覺屬性”(visual);
11-20列,共10列,包括搖動後的氣味強度、香氣質量、果味等屬性,該變數集代表葡萄酒“搖動後的氣味屬性”(odor after shaking);
21-29列,共9列,包括酸度等屬性,該變數集代表葡萄酒“味覺屬性”(taste);
30-31列,共2列,包括質量等屬性,該變數集代表葡萄酒“質量屬性”(quality)。
接下來期望根據這些組合屬性,對21種葡萄酒的品質進行綜合評價,以及尋找它們之間的共同特徵或差異,即可透過MFA來完成。
R包FactoMineR的MFA

FactoMineR中,MFA透過MFA()函式執行。
#執行 MFA,詳情 ?MFA

#其中,搖動前後的氣味、視覺和味覺作為 active groups,來源和質量作為 supplementary groups

res.mfa <- MFA(wine, group = c(2, 5, 3, 10, 9, 2), type = c('n', 's', 's', 's', 's', 's'),

    name.group = c('origin', 'odor_before_shaking', 'visual', 'odor_after_shaking', 'taste', 'quality'),

    num.group.sup = c(1, 6), graph = TRUE)
summary(res.mfa)

其中,group指定列的集合作為變數集(資料集的列需要提前按組排列好)。
type指定變數標準化方法,與各變數集一一對應。MFA的目標是整合描述相同觀察物件的不同變數集,由於各變數的量綱不一致,為了平衡每組變數的影響(或者說為了使各變數集具有可比性),需對各變數集執行標準化處理。對於定量變數集(將用於PCA),通常透過將每個變數除以其標準差進行標準化(即Z-scores);對於分類變數集(將用於MCA),每組透過將其所有元素除以稱為其第一奇異值(該值是標準差矩陣等效項)的量進行標準化。type引數中,n即用於這種對分類變數的標準化,s用於定量變數的標準化,詳情參閱幫助文件。
name.group為變數集指定名稱。

結果概要顯示,前兩軸承載了68.87%的總方差,具有較高的代表性。
接下來對於物件(葡萄酒)和變數(屬性)間的關係,以及變數對排序空間的貢獻等,可主要透過排序圖評估。
graph = TRUE引數,可在計算過程中自動輸出圖形。不過我們有更便捷的視覺化方法,見下文。
同樣地,對於MFA主要資訊的提取,除了可直接在結果中提取外,也和排序圖的展示一樣使用其它工具輔助完成,見下文。
#提取主要資訊,例如

res.mfa

res.mfa$eig    #各軸特徵值

R包factoextra的視覺化方法

接下來展示使用factoextra包來幫助解釋和視覺化MFA結果。
儘管下述方法並非全部來自factoextra包。
特徵值/方差
首先檢視MFA的特徵值概況。
#藉助 factoextra 包更好地提取資料和視覺化

library(factoextra)
#提取每個維度(軸)的特徵值/承載的方差

eig.val <- get_eigenvalue(res.mfa)

head(eig.val)
#視覺化各軸特徵值/方差

fviz_screeplot(res.mfa)

eigenvalue為各MFA軸的特徵值,即各軸承載的方差;variance.percent為各軸特徵值與所有軸特徵值總和的比例,即各軸的方差貢獻率;cumulative.variance.percent為累積貢獻率。
變數集整體間的關係及其對排序空間的貢獻
MFA結果中,可首先觀測各變數集整體之間的關係。
#變數集結果,用於反映變數集整體對 MFA 排序空間的貢獻

group <- get_mfa_var(res.mfa, 'group')

group

#檢視細節部分,例如

#各變數集作為整體,計算了它們與各 MFA 軸的相關性

head(group$correlation)
#排序座標也可用於反映各變數集與各 MFA 軸的相關程度,前兩軸為例展示

head(group$coord)

fviz_mfa_var(res.mfa, 'group', axes = 1:2)

對應MFA命令列引數,搖動前後的氣味、視覺和味覺作為active groups,圖中紅色顯示;來源和質量作為supplementary groups,圖中綠色顯示。
根據變數集在排序圖中的位置,可以評估各變數集與MFA軸之間的相關性及相對貢獻。第一軸上4active groups的座標幾乎相同,意味著它們對第一維的貢獻相似;對於第二軸,搖動前後的氣味具有相對較大的座標,表明它們對第二維的貢獻最大。
#直接顯示了各變數集對各排序軸的貢獻度

head(group$contrib)
#視覺化各變數集對前兩軸的貢獻度

fviz_contrib(res.mfa, 'group', axes = 1)

fviz_contrib(res.mfa, 'group', axes = 2)

#變數集之間的相關性透過 RV 係數衡量

#變數集之間的相關性矩陣

res.mfa$group$RV
#相關圖

library(corrplot)

corrplot(res.mfa$group$RV, method = 'number', number.cex = 0.8, diag = FALSE, tl.cex = 0.8)

corrplot(res.mfa$group$RV, add = TRUE, type = 'upper', method = 'pie', diag = FALSE, tl.pos = 'n', cl.pos = 'n')
#這種相關性可透過置換檢驗確定重要性

#例如搖動前的氣味(原始資料集的 3-7 行)和搖動後的氣味(原始資料集的 11-20 行)之間的相關性的置換檢驗

#記得執行 Z-scores 標準化變數集

coeffRV(scale(wine[3:7]), scale(wine[11:20]))$p.value

各變數間的關係及其對排序空間的貢獻
上述查看了變數集整體間的關係,接下來可以檢視各變數間的關係。
#各具體變數對排序空間的貢獻,資料結構同上述“變數集整體”

quanti.var <- get_mfa_var(res.mfa, 'quanti.var')

quanti.var 
#例如同樣以排序圖視覺化各變數與 MFA 軸的關係,前兩軸為例展示

head(quanti.var$coord)   #排序座標

fviz_mfa_var(res.mfa, 'quanti.var', axes = 1:2, palette = 'jco', col.var.sup = 'violet', repel = TRUE)

圖中顏色代表了變數所屬的變數集,定量變數展示為向量。相關圈(correlation circle)代表所有定量變數範數標準化向量。
兩個變數之間的夾角為銳角,則二者存在正相關;鈍角為負相關;趨於正交則相關性很低。變數與哪個軸的夾角越小,表明其越作用於哪個軸;變數在某軸的投影長度越長,則表明其對該軸的貢獻越大。
#直接顯示了各變數對各排序軸的貢獻度

head(quanti.var$contrib)
#展示 top20 變數對前兩軸的貢獻度

fviz_contrib(res.mfa, choice = 'quanti.var', axes = 1, top = 20, palette = 'jco')

fviz_contrib(res.mfa, choice = 'quanti.var', axes = 2, top = 20, palette = 'jco')

紅色虛線表示平均貢獻值,便於觀測哪些變數大於平均貢獻。
#可選使用漸變色,在排序圖中按變數貢獻對 active groups 變數上色

#這裡方便觀測資料,將所有變數以點展示

fviz_mfa_var(res.mfa, 'quanti.var', axes = 1:2, col.var = 'contrib', geom = c('point', 'text'), 

    gradient.cols = c('#00AFBB', '#E7B800', '#FC4E07'), col.var.sup = 'violet', repel = TRUE)

#變數太多了,評估最具典型的一些變數

select_val <- dimdesc(res.mfa, axes = 1:2, proba = 0.001)

summary(select_val)
#保留最具典型的一些變數的排序圖

varsig <- res.mfa$quanti.var$cor

varsig <- subset(varsig, rownames(varsig) %in% unique(c(rownames(select_val$Dim.1$quanti), rownames(select_val$Dim.2$quanti))))
plot(varsig[ ,1:2], asp = 1, type = 'n', xlim = c(-1, 1), ylim = c(-1, 1))

abline(h = 0, lty = 3)

abline(v = 0, lty = 3)

symbols(0, 0, circles = 1, inches = FALSE, add = TRUE)

arrows(0, 0, varsig[,1], varsig[,2], length = 0.08, angle = 20)

for (v in 1:nrow(varsig)) {

    if (abs(varsig[v,1]) > abs(varsig[v,2])) {

        if (varsig[v,1] >= 0) pos <- 4 else pos <- 2

    } else {

        if (varsig[v,2] >= 0) pos <- 3 else pos <- 1

    }

    text(varsig[v,1], varsig[v,2], labels=rownames(varsig)[v], pos = pos)

}

物件間以及物件和變數間的關係
觀測物件(葡萄酒)在排序空間中的位置及相互關係,以及物件和變數的關係。
#檢視排序物件,資料結構類上上述

ind <- get_mfa_ind(res.mfa)

ind
#例如檢視物件排序座標

head(ind$coord)
#展示物件在前兩軸中的排序圖

#如果不想在圖中展示分類變數,可使用引數 invisible = 'quali.var'

fviz_mfa_ind(res.mfa, axes = 1:2, palette = c('#00AFBB', '#E7B800', '#FC4E07'),

    habillage = 'Label', addEllipses = TRUE, ellipse.type = 'confidence', repel = TRUE)

分類變數將預設和物件一起展示在該圖中。分類變數顯示為黑色,Env1Env2Env3代表變數集中的土壤類別,SaumurBourgueuilChinon代表酒的產地。在該圖中,物件(葡萄酒)按其產地著色顯示。
若兩種葡萄酒的品質較為相似,則它們在排序圖中的位置相互接近。
可結合上文中變數集或變數對各排序軸的貢獻,評價葡萄酒特徵。例如,葡萄酒T1T2在第二軸上對應較高的數值,而葡萄酒搖動前後的氣味兩組變數集對第二軸具有較高的貢獻,那麼可知T1T2應當屬於更為“芳香濃郁”型別。
以及評估分類變數和物件以及定量變數間的關係。例如,分類變數Env4在第二軸上具有較高座標值,靠近葡萄酒T1T2,暗示改土壤環境中的葡萄更具香甜品質。
#其它可選視覺化方案,例如分別按兩組分類變數特徵,在圖中對代表葡萄酒的點標註顏色

fviz_ellipses(res.mfa, axes = 1:2, c('Label', 'Soil'), repel = TRUE)

在排序圖中展示MFA的全域性PCA與各組變數集PCA中物件得分的關係。
#MFA 圖中物件位置與各組變數集 PCA 中的物件位置,前兩軸為例展示

fviz_mfa_ind(res.mfa, axes = 1:2, partial = 'all')
#可選擇部分物件展示

fviz_mfa_ind(res.mfa, axes = 1:2, partial = c('1DAM', '1VAU', '2ING'))

圖中黑點代表MFA排序空間內的物件座標;與物件點相連的不同顏色的線則代表了各變數集各自的PCA中物件的座標,它們的形心即為MFA中物件座標。
偏軸圖
偏軸(partial axes)代表了所有變數集各自PCA(或MCA)所得特徵向量(排序軸)投影到MFA排序空間中的情況,圖中圓圈的半徑(等於1)代表標準化偏軸最大的長度。
#偏軸圖,前兩軸為例展示

fviz_mfa_axes(res.mfa, axes = 1:2)

透過該圖可評估哪些變數集的特徵對MFA排序空間具有更高的貢獻,這些變數集的前兩軸與MFA的前兩軸是否高度相關,MFA的各維度主要受哪種型別的屬性集支配等。
參考資料

Abdi, Hervé, Williams L J, Valentin D. Multiple factor analysis: principal component analysis for multitable and multiblock data sets. Wiley Interdisciplinary Reviews: Computational Statistics, 2013, 5(2):149-179.
DanielBorcard, FranoisGillet, PierreLegendre, et al. 數量生態學:R語言的應用(賴江山譯)高等教育出版社, 2014.
Escofier, B. and Pagès, J. Multiple factor analysis. Computational Statistics & Data Analysis, 1990, 18, 121–140.
http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/116-mfa-multiple-factor-analysis-in-r-essentials/
連結

相關文章