聚類樹和PCA等排序圖的組合繪製

2021-01-12 微生信生物
聚類分析和排序分析(降維分析)都是用於探索多元數據結構的常用方法,二者的結果也可以結合在一起通過一張圖呈現,本篇展示一些常見的示例。https://pan.baidu.com/s/1dQxyRcBuGDoec9ZKm77Y6w示例數據包含15個樣本(對象),20個變量,下文對它執行聚類和降維,並作圖展示。

 


聚類樹一般用以表示層次聚類的結果,排序圖中也可添加聚類樹展示對象間的層次結構。 

在前文簡介主成分分析(PCA)的方法中,展示了一例在PCA排序圖中添加聚類樹的方法。

#vegan 包中的 PCA 方法
library(vegan)

dat <- read.delim('data.txt', row.names = 1, sep = '\t', stringsAsFactors = FALSE, check.names = FALSE)
pca <- rda(dat, scale = TRUE)

pca1 <- round(100*pca$CA$eig[1]/sum(pca$CA$eig), 2)
pca2 <- round(100*pca$CA$eig[2]/sum(pca$CA$eig), 2)

#I 型標尺的 PCA 排序圖
p <- ordiplot(pca, dis = 'site', type = 'n', choices = c(1, 2), scaling = 1,
xlab = paste('PCA1:', pca1, '%'), ylab = paste('PCA2:', pca2, '%'))
points(pca, dis = 'site', choices = c(1, 2), scaling = 1, pch = 21, cex = 1.2,
bg = c(rep('red', 5), rep('orange', 5), rep('green3', 5)), col = NA)

#添加聚類,如 UPGMA 聚類
tree <- hclust(dist(scale(dat), method = 'euclidean'), method = 'average')
plot(tree)

ordicluster(p, tree, col = 'gray')


排序圖繪製以二維散點圖,並將聚類樹投影到二維平面中。

 

如果覺得二維平面難以觀測層次結構,FactoMineR包提供了聚類樹的三維可視化方案,同樣以PCA為例展示。

#FactoMineR 包的三維聚類樹
#參考連結:http://www.sthda.com/english/articles/31-principal-component-methods-in-r-practical-guide/117-hcpc-hierarchical-clustering-on-principal-components-essentials/
library(FactoMineR)

#PCA
res.pca <- PCA(dat, ncp = 3, scale.unit = TRUE, graph = FALSE)

#添加層次聚類,如 UPGMA 聚類
res.hcpc <- HCPC(res.pca, metric = 'euclidean', method = 'average', graph = FALSE)

#三維效果圖
plot(res.hcpc, choice = '3D.map')


相比上述二維平面,層次結構更加清晰明了。

 


非層次聚類方法,如k均值劃分聚類、圍繞中心點劃分聚類、模糊c均值聚類等,一般無法以聚類樹展示其結構。這種情況下,通常在排序圖中添加分組橢圓或多邊形,將同一類的對象「圈起來」,以反映分類信息。

當然上述的層次聚類結果也可以這樣來表示。

以下是一些示例。 

例如前文模糊c均值聚類中,提到可以這樣在排序圖中標記分組。

#以 PCoA 為例降維,並在排序圖中標註模糊 c 均值聚類結果

#計算距離,以歐幾裡得距離為例
dis_euc <- dist(scale(dat), method = 'euclidean')

#PCoA,事實上以歐幾裡得距離的 PCoA 等同於以原始數據的 PCA
pcoa <- cmdscale(dis_euc, k = (nrow(dat) - 1), eig = TRUE)
eig_prop <- 100*pcoa$eig/sum(pcoa$eig)
pcoa_site <- pcoa$point[ ,1:2]
plot(pcoa_site,
xlab = paste('PCoA axis1:', round(eig_prop[1], 2), '%'),
ylab = paste('PCoA axis2:', round(eig_prop[2], 2), '%'))

#模糊 c 均值聚類,聚為 3 類
library(cluster)

set.seed(123)
cm.fanny <- fanny(dis_euc, k = 3, diss = TRUE, maxit = 100)

#標註各對象最接近的聚類簇
for (i in 1:3) {
gg <- pcoa_site[cm.fanny$clustering == i, ]
hpts <- chull(gg)
hpts <- c(hpts, hpts[1])
lines(gg[hpts, ], col = 1+1)
}

#星圖展示了各對象的成員值
stars(cm.fanny$membership, location = pcoa_site, draw.segments = TRUE,
add = TRUE, scale = FALSE, col.segments = 2:4, len = 0.5)


在這種軟聚類方法中,星圖展示了對象屬於各聚類簇的成員值,面積越大代表成員值越高,即該對象在該組中的歸屬程度越大,並將各對象所屬的最佳聚類簇用紅線連接。數據集整體特徵一目了然。

 

對於硬聚類的方法,由於每個對象只有一個確定的分類,因此這種分組邊界的繪製就很簡單,直接通過橢圓或多邊形「圈起來」即可。

前文簡介排序圖繪製中,提到了一些標記對象分組的方法,同樣也可用於標記已識別的分類結果。

#ggplot2 中的一些方法
library(ggplot2)

#以上文 PCA 的排序結果為例展示
#首先提取對象排序坐標,以 I 型標尺為例,以前兩軸為例
pca_site <- data.frame(scores(pca, choices = 1:2, scaling = 1, display = 'site'))

#k-means 聚類,聚為 3 類
set.seed(123)
dat_kmeans <- kmeans(scale(dat), centers = 3, nstart = 25)
dat_kmeans$cluster
pca_site$cluster <- as.character(dat_kmeans$cluster)

#ggplot2 繪製二維散點圖
p <- ggplot(data = pca_site, aes(x = PC1, y = PC2)) +
geom_point(aes(color = cluster)) +
scale_color_manual(values = c('red', 'blue', 'green3')) +
theme(panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), legend.key = element_rect(fill = 'transparent')) +
labs(x = paste('PCA1:', pca1, '%'), y = paste('PCA2:', pca2, '%'))

#添加置信橢圓,可用於表示對象分類
p + stat_ellipse(aes(color = cluster), level = 0.95, linetype = 2, show.legend = FALSE)

p + stat_ellipse(aes(fill = cluster), geom = 'polygon', level = 0.95, alpha = 0.1, show.legend = FALSE) +
scale_fill_manual(values = c('red', 'purple', 'green'))

#將同類別對象連接在一起
source('geom_enterotype.r') #可獲取自 https://pan.baidu.com/s/1KUA5owf4y13y1RJbff-l7g
p + geom_enterotype(aes(fill = cluster, color = cluster, label = cluster), show.legend = FALSE) +
scale_fill_manual(values = c('#ffa6a9', '#e8b4fd', '#c7ffc4'))

#多邊形連接同類別對象的樣式
library(plyr)

cluster_border <- ddply(pca_site, 'cluster', function(df) df[chull(df[[1]], df[[2]]), ])

p + geom_polygon(data = cluster_border, aes(fill = cluster), alpha = 0.1, show.legend = FALSE) +
scale_fill_manual(values = c('red', 'purple', 'green'))


 

上述提到的FactoMineR包也能用於繪製這類統計圖,以上述添加層次聚類的PCA繼續。

#上述已經展示了使用 FactoMineR 包可視化 PCA + 聚類樹
#將聚類樹更改為分組邊界也是常見的可視化方案
library(factoextra)
library(FactoMineR)

fviz_dend(res.hcpc,
cex = 0.7, # Label size
palette = 'jco', # Color palette see ?ggpubr::ggpar
rect = TRUE, rect_fill = TRUE, # Add rectangle around groups
rect_border = 'jco', # Rectangle color
labels_track_height = 0.8) # Augment the room for labels

fviz_cluster(res.hcpc,
repel = TRUE, # Avoid label overlapping
show.clust.cent = TRUE, # Show cluster centers
palette = 'jco', # Color palette see ?ggpubr::ggpar
ggtheme = theme_minimal(),
main = 'Factor map')

 

還有三維的樣式,以下展示一例,更多方法可參考三維排序圖。

#以上文 PCA 的排序結果為例展示
#首先提取對象排序坐標,以 I 型標尺為例,以前 3 軸為例
pca_site <- data.frame(scores(pca, choices = 1:3, scaling = 1, display = 'site'))

pca1 <- round(100*pca$CA$eig[1]/sum(pca$CA$eig), 2)
pca2 <- round(100*pca$CA$eig[2]/sum(pca$CA$eig), 2)
pca3 <- round(100*pca$CA$eig[3]/sum(pca$CA$eig), 2)

#k-means 聚類,聚為 3 類
set.seed(123)
dat_kmeans <- kmeans(scale(dat), centers = 3, nstart = 25)
dat_kmeans$cluster
pca_site$cluster <- as.character(dat_kmeans$cluster)

#car+rgl 包,交互式三維圖
library(car)
library(rgl)

scatter3d(pca_site$PC1, pca_site$PC2, pca_site$PC3, groups = as.factor(pca_site$cluster), surface = FALSE, ellipsoid = TRUE,
xlab = paste('PCA1:', pca1, '%'), ylab = paste('PCA2:', pca2, '%'), zlab = paste('PCA3:', pca3, '%'))

 

相關焦點

  • 用 PCA 方法進行數據降維
    、Xp的一切滿足條件(1)的線性組合中方差最大者,Y2是與Y1不相關的X1、X2、...、Xp所有線性組合中方差最大者,......,Yp是與Y1、Y2、...、Y(p-1)不相關的X1、X2、...、Xp的所有線性組合中方差最大者。基於以上三條原則確定的綜合變量Y1、Y2、...、Yp分別稱為原始變量的第一、第二...第p個主成分。各綜合變量在總方差中所佔的比重依次遞減。
  • 採用DESeq2對表達量進行PCA和聚類分析
    得到基因/轉錄本的表達量之後,通常會通過以下三種類型的圖表來檢驗和分析生物學樣本和實驗設計間關係。1.  樣本的聚類樹利用所有樣本的表達量數據,對樣本進行聚類。理論上如果樣本和實驗操作都沒有問題,那麼屬於同一組的生物學重複樣本會聚到一起。
  • 使用python+sklearn實現概率PCA和因子分析進行模型選擇
    概率PCA和因子分析都是概率模型,新數據的似然性(likelihood)可用於模型選擇和協方差估計
  • 2022國家公務員考試行測技巧:排列組合之圓桌排序
    在行測備考中相信大家最頭疼的一類題型就是數量關係,在數量關係中最頭疼的又莫過於排列組合問題,今天中公教育就幫大家來解決我們數量關係排列組合中的一類型問題:圓桌排列。例1.ABCD圍一張圓桌而坐,問共有多少種不同的排法?A.24 B.12 C.6 D.3【答案】C。
  • 基於TensorFlow理解三大降維技術:PCA、t-SNE 和自編碼器
    我們將從 tf.svd 行開始,這一行給了我們奇異值(就是圖 1 中標記為 Σ 的對角值)和矩陣 U 和 V。然後 tf.diag 是 TensorFlow 的將一個 1D 向量轉換成一個對角矩陣的方法,在我們的例子中會得到 Σ。在 fit 調用結束後,我們將得到奇異值、Σ 和 U。
  • 主成分分析PCA預測未知分類信息
    這裡的方法我們在這個帖子裡面也講過 Limma 求差異基因構建矩陣的兩種方式 這裡我想知道癌和癌旁中的差異基因,轉移和癌旁中的差異基因,轉移和癌的差異基因,所以選擇多組矩陣構建library(limma)f <- tumortype_class# 分組矩陣design <- model.matrix(~0+f)
  • 「花式」微生物群落堆疊圖,你見過幾種?
    事實上,堆疊圖還能夠與β多樣性分析的UPGMA聚類樹進行結合,基於不同的樣本距離矩陣(如bray-curtis、unifrac等類型距離) 進行相似性聚類,將組成結構相似的樣本聚類到同一個小的分支,將結構組成差異大的樣本聚類到不同的分支中。在聚類樹的基礎上,結合堆疊圖,用堆疊圖具體展示相對豐度相近與相異的物種。
  • 使用Matplotlib繪製堆積條形圖
    條形圖非常通用,易於閱讀,並且相對容易構建。就像任何可視化一樣,條形圖也有一些缺點,例如它們的可伸縮性較差。條形圖太多會使人感到難以閱讀,尤其是在當我們處理層次化的類別,也就是當我們有需要可視化的組和子組時,這個問題更常見。在這種情況下,堆積條形圖是一個很好的選擇,它讓我們能更好地比較和分析數據。
  • CAD建築設計高級教程:自動生成三維組合模型
    最好的方法就是在圖紙中生成三維組合模型。下面以中望CAD建築版為例,詳細教大家如何操作。如何在中望建築軟體中查看已經繪製好圖紙的三維組合模型呢,這個時候就需要用到一個命令—樓層框,樓層框是對所繪製的這一棟樓的平面圖進行關聯,點擊左側建築菜單的文件布圖列表下的【建樓層框】即可進行操作。
  • 結構的彎矩圖和剪力圖的繪製及圖例!
    作為一名土木工程師,在實際工作中,有時候要對軟體(midas、sap2000、pkpm的計算結果有個判斷)就要對結構的彎矩和剪力圖有個大概的判斷
  • ggplot2版聚類物種豐度堆疊圖
    寫在前面隨著研究的逐漸深入,我們對繪圖的要求越來越高,各種之前使用的較少的圖形如今追求熱度和新穎程度,都開始逐漸在大文章中顯現。如下圖。
  • 「花式」微生物群落堆疊圖,你見過幾種?
    事實上,堆疊圖還能夠與β多樣性分析的UPGMA聚類樹進行結合,基於不同的樣本距離矩陣(如bray-curtis、unifrac等類型距離) 進行相似性聚類,將組成結構相似的樣本聚類到同一個小的分支,將結構組成差異大的樣本聚類到不同的分支中。
  • 亦明圖記:SolidWorks繪製方形螺旋筆筒,用曲面繪製掃描輪廓曲線
    3、在前視基準面上繪製草圖 豎直直線;4、再次在前視基準面上繪製草圖水平直線;5、掃描曲面:輪廓選擇水平直線;路徑選擇豎直直線;方向/扭轉控制選擇沿路徑扭轉,定義方式旋轉,20圈;6、繪製3D草圖,選擇交叉曲線命令:選擇實體拉伸的曲面和掃描的曲面
  • 使用PCA可視化數據
    這些測量包括細胞半徑和細胞對稱性。最後,為了得到特徵值,我們計算了每個度量值的平均值、標準誤差和最大值(不太好的),這樣我們總共得到30個特徵值。在圖中,我們仔細觀察了其中兩個特徵——細胞的平均對稱性(Benign)和最差平滑度(worst smoothness)。在圖中,我們看到這兩個特徵可以幫助區分這兩個類。那就是良性腫瘤往往更為對稱和光滑。
  • 使用樹莓派控制16路舵機驅動板(pca9685)
    使用樹莓派控制16路舵機驅動板(pca9685)在樹莓派上,可以通過RPI.GPIO方便地輸出PWM進行舵機控制。使用晶片PCA9685,I2C通信,只需要幾根i2c線就可以控制16路pwm,周期和佔空比都可控。
  • 亦明圖記:SolidWorks繪製正四面體和正八面體,用拉伸凸臺命令
    3d正四面體和正八面體模型:使用SolidWorks2014繪製;一、正四面體的繪製過程:1、在上視基準面上繪製草圖 多邊形+中心線:多邊形邊數3;邊長100;三條中心線連成三角形的右下頂點與多邊形的右上頂點重合