腸型在這裏

內容基本上翻譯自:https://enterotype.embl.de/index.html

介紹

腸型是一種根據人類腸道微生物羣來分層的人的方法。它們來自個體腸道微生物羣中不同微生物羣的相對丰度(目前處於屬級;請參閱維基百科關於"相對物種丰度"的文章,以瞭解相對丰度的概念)。腸型不是離散類型,如血型,而是在微生物羣特徵的更高維度空間中稠密的區域。我們假設稠密的區中,個體的很大一部分,它們之間或周圍有人煙稀少的區域,但這種分佈的原因尚不清楚,也沒有公佈足夠的數據來量化,隨着時間的推移,腸道類型的分類和可能開關的魯棒性。

2011年4月,MetaHIT公佈了人類腸道微生物羣中腸型的發現。與研究相關的數據被公開,計算過程背後的理論在文章的補充資料中作了解釋。然而,確切的命令(在R環境中),使任何人都可以重現文章中的所有數字沒有報告在補充。在這裏,我們介紹了一個詳細的教程,以複製我們在原始文章中的工作,使用R與原始文章中使用的數據集。

可以在此處下載重現本教程結果的 R 代碼摘要,但我們強烈建議完成它以及下面提供的詳細信息。

數據

本文中有三個數據集。主要結論來自基於Sanger的宏基因組序列,我們在本教程中使用該數據集。處理其他數據集的步驟相同,除非另有提及。注:初始數據集包含 39 個示例。四個日本嬰兒樣本被排除在外,因爲已知嬰兒含有非常異質、不穩定和獨特的微生物羣。兩個美國成人樣本被排除在外,因爲細菌類和疑似技術文物水平異常低。有關詳細信息,請參閱文章及其參考。

首先,下載包含 33 個樣本的 Sanger 數據集的屬丰度表,並將其加載爲 R 環境中的表:

data=read.table("MetaHIT_SangerSamples.genus.txt", header=T, row.names=1, dec=".", sep="\t") #讀入文件
data=data[-1,] #去除第一行表頭

瞭解屬丰度表

屬丰度表總結了33個樣本的相對屬丰度。此表採用 R 表格式 - 這意味着第一行是具有 33 個示例標識符的列標題,以下行爲 34 列,每列爲屬標識符。兩個基於基因組的數據集中的第二行,具有屬標識符"-1",對應於無法可靠地分配給已知屬的基因組讀取分數。在觀察到可以可靠地分配的讀取部分樣本之間存在較大差異(例如,在上表中,19% 到 78% 的讀取未分配),我們引入了此未分配分數(而不是忽略所有未可靠地分配給已知屬的讀取)。對未分配分數進行覈算可確保可以更可靠地比較多個樣本中給定屬的相對丰度。然而,由於此分數不代表真實屬,並且是所有屬的集團,我們至今沒有代表,因此,在估算聚類過程的 Jensen-Shannon 距離 (D) 時,我們不將其視爲特徵,因此,未分配分數的類似水平不會誤認爲是真正的遺傳相似性。這意味着相對丰度表不會重新規範化 - 當包含"未分配"分數時,它仍然求和爲 1,但"未分配"分數不用於計算 Jensen-Shannon 距離。

聚 類

使用JSD距離和Medoids(PAM)聚類算法,根據相對屬丰度對樣本進行聚類。使用卡林斯基-哈拉巴斯(CH) 指數 評估了星團的最佳數量的結果。我們還通過比較最優聚類的輪廓係數(Rousseeuw,1984年)與從模擬派生的輪廓係數的分佈進行比較,從而評估了最優聚類的統計意義(請參閱下面的模擬數據部分)。

距離指標

屬丰度剖面(遺傳)和OG丰度剖面(功能)被歸一化,以產生概率分佈(以下簡稱丰度分佈)。我們使用與Jensen-Shannon 區別 (JSD)相關的概率分佈距離指標對樣本進行分組。Jensen-Shannon 區別是一個積極的確定尺度,滿足以下條件:

JSD(a,b)>=0
JSD(a,b)=0如果且僅當a=b

它還是對稱的:

JSD(a,b)=JSD(b,a)

但是,它不符合三角不平等條件,被認爲是一個真正的指標。

JSD(a,c)=JSD(a,b)=JSD(b,c)

另一方面,JSD的平方根是一個真正的距離指標(Endres & Schindelin,2003年;在Arumugam等人2011年的補充中引證爲參考文獻59)。這就是我們使用平方根而不是JSD本身的原因。

JSD<- function(x,y) sqrt(0.5 * KLD(x, (x+y)/2) + 0.5 * KLD(y, (x+y)/2))
#我們在丰度分佈中添加了 0.000001 的僞計數,以避免公式的分子和/或分母中的零。
KLD <- function(x,y) sum(x * log(x/y))

下面是在 R 中創建 JSD 距離矩陣的完整函數示例:

#Function 1
dist.JSD <- function(inMatrix, pseudocount=0.000001, ...) {
	KLD <- function(x,y) sum(x *log(x/y))
	JSD<- function(x,y) sqrt(0.5 * KLD(x, (x+y)/2) + 0.5 * KLD(y, (x+y)/2))
	matrixColSize <- length(colnames(inMatrix))
	matrixRowSize <- length(rownames(inMatrix))
	colnames <- colnames(inMatrix)
	resultsMatrix <- matrix(0, matrixColSize, matrixColSize)
        
  inMatrix = apply(inMatrix,1:2,function(x) ifelse (x==0,pseudocount,x))

	for(i in 1:matrixColSize) {
		for(j in 1:matrixColSize) { 
			resultsMatrix[i,j]=JSD(as.vector(inMatrix[,i]),
			as.vector(inMatrix[,j]))
		}
	}
	colnames -> colnames(resultsMatrix) -> rownames(resultsMatrix)
	as.dist(resultsMatrix)->resultsMatrix
	attr(resultsMatrix, "method") <- "dist"
	return(resultsMatrix) 
 }

現在,我們可以在數據上應用此功能:

data.dist=dist.JSD(data)

算法

我們使用圍繞中心點 (PAM) 聚類算法的來聚類丰度譜文件。PAM 源自基本 k-means 算法,但優點是它支持任何任意距離度量,並且比 k-means 更強勁。它是一個受監督的過程,其中預先確定的羣集數作爲過程的輸入給出,然後將數據分區到這麼多羣集中。

在 R 中,我們在羣集庫中使用了pam()函數

pam(as.dist(x), k, diss=TRUE) # x is a distance matrix and k the number of clusters

pam()返回不同的對象,但我們只關注$clustering。
下面是一個在 R 中執行 PAM 聚類的示例函數:

 pam.clustering=function(x,k) { # x is a distance matrix and k the number of clusters
                         require(cluster)
                         cluster = as.vector(pam(as.dist(x), k, diss=TRUE)$clustering)
                         return(cluster)
                        }

在確定羣集的最佳數量之前,以k=3羣集爲例,在我們的數據集上運行測試(請參閱下面的部分):

data.cluster=pam.clustering(data.dist, k=3)

最佳羣集數

爲了評估數據集最牢固地分區到的羣集的最佳數量,我們使用了 Calinski-Harabasz(CH) 索引,該指數在恢復羣集數量方面表現出良好的性能。
其中 Bk是聚類之間的平方和 (即所有點i和j之間的平方距離 ,其中 i和j不在同一個聚類) 和Wk是聚類內平方和 (即所有點i和j之間的平方距離, 其中i和j位於同一羣集中)。此度量實現了當羣集之間的距離比羣集內距離大得多時,聚類更加健壯。因此,我們選擇了羣集k的數量,因此CHk是最大化的。

在這裏,我們使用函數索引。G1()來自庫集羣Sim:

require(clusterSim)
nclusters = index.G1(t(data), data.cluster, d = data.dist, centrotypes = "medoids")

我們需要計算每個數量的羣集k的CH索引,下面是執行該操作的示例代碼(並繪製結果):

nclusters=NULL

for (k in 1:20) { 
	if (k==1) {
		nclusters[k]=NA 
	} else {
		data.cluster_temp=pam.clustering(data.dist, k)
		nclusters[k]=index.G1(t(data),data.cluster_temp,  d = data.dist,
		centrotypes = "medoids")
	}
}

plot(nclusters, type="h", xlab="k clusters", ylab="CH index")

這表明,此特定數據集的最佳羣集數爲 3(k=3)。
在這裏插入圖片描述

  data.cluster=pam.clustering(data.dist, k=3)

羣集證

聚類驗證方法可用於評估與基礎數據點相關羣集的質量。在這裏,我們使用輪廓驗證技術。
(5)
a(i)是樣本i與同一羣集中所有其他樣本的平均不同(或距離),而b(i)是最接近其他羣集中所有對象的平均不同(或距離)。

公式表示-1 =< S(i) =< 1 。與其他羣集更靠近其自身羣集的樣本具有較高的S(i)值,而S(i)接近 0 表示給定的樣本位於兩個羣集之間的某處。較大的負S(i)值表示樣本已分配給錯誤的羣集。

爲了評估輪廓係數 S(i),我們只需使用羣集庫中的函數輪廓(),該函數剪影()用作聚類和距離矩陣對象的輸入。要獲得羣集質量的全局評估,所有數據點上的平均S(i)是一個有用的度量。

obs.silhouette=mean(silhouette(data.cluster, data.dist)[,3])

模擬數據

對於一組給定的N特徵載體,每個載體代表基因組樣本的遺傳(屬、植激素等)或功能(基因、正交組、功能模塊等)組成,我們模擬了包含相同數特徵的N假設基因組樣本,從連續體中抽樣如下:

模板均勻:每個生成的要素對應於真實數據集中的要素,其跨多個樣本的值在真實數據集中該要素的最小和最大豐度之間均勻分佈
模板-高斯:每個生成的要素對應於真實數據集中的要素,其跨多個樣本的值遵循高斯分佈,其平均值和標準差與相應真實數據中觀察到的平均值和標準差相同
生成的值然後規範化,使樣本總和內的丰度爲 1。

然後,對模擬數據進行聚類,並估計每個模擬的輪廓係數。然後,我們將這些與數據集最佳聚類的輪廓係數進行比較,以評估其統計顯著性。但是,我們不能排除由於模型選擇不當而產生具有統計顯著性的結果的可能性,即使最佳聚類結構不能爲我們的數據提供良好的模型。

圖形解釋

腸型可以通過許多不同的方式可視化。其中兩種是類間分析(BCA) 和主座標分析 (PCoA)。BCA 是Arumugam 等人文章中使用的第一個,可用於可視化羣集的分類驅動因素(即腸型)。然而,PCoA在生態研究中更爲常見,我們目前推薦了這種可視化技術,使用JSD距離矩陣作爲輸入。

類間分析

進行了類間分析(BCA)以支持聚類並標識腸型的驅動程序。分析使用Ade4包的R完成。在分析之前,在光明網數據集中,如果所有樣本的平均丰度低於0.01%,則去除丰度極低的屬體,以降低噪聲。類間分析是主體元分析與工具變量的一個特定案例:在這裏變量是一個定性因子(即腸型聚類)。類間分析使我們能夠首先根據每個組的重心找到主要組件,以突出組之間的差異,然後將每個樣本與其組聯繫起來。它是數據的受監督投影,其中預定義類之間的距離(在本例中爲腸型)最大化。因此,此投影中的前兩個組件不一定與解釋數據中最高可變性的前兩個組件相同。

下面是消除噪聲的函數(即低豐盛的屬):

 noise.removal <- function(dataframe, percent=0.01, top=NULL){
	dataframe->Matrix
	bigones <- rowSums(Matrix)*100/(sum(rowSums(Matrix))) > percent 
	Matrix_1 <- Matrix[bigones,]
	print(percent)
	return(Matrix_1)
 }

我們建議將此功能應用於使用短測序技術生成的數據,如 Illumina 或 Solid。在原始手稿中,我們僅在 Solexa 數據上應用降噪,而不適用於桑格或熱測序數據。噪聲消除功能可應用如下:

data.denoized=noise.removal(data, percent=0.01)

最後,我們可以執行類間分析,並使用s.class()函數繪製結果

 obs.pca=dudi.pca(data.frame(t(data)), scannf=F, nf=10)
 obs.bet=bca(obs.pca, fac=as.factor(data.cluster), scannf=F, nf=k-1) 
 s.class(obs.bet$ls, fac=as.factor(data.cluster), grid=F)

此圖再現了原始文章中的圖 2a(包括下文供比較),而不添加用於發佈的修飾。聚類標籤(1,2,3)由聚類過程隨機分配,它們分別對應於輸入型ET3、ET1和ET2。原始文章中已發佈的圖 2a(下圖)是通過編輯原始繪圖生成的:(1)添加樣本的標籤,(2)使用三個不同的符號代替默認點,(3)爲不同的腸型對橢圓着色,(4)將每個腸型的驅動程序系投影到 BCA 上。

在這裏插入圖片描述
下面是上面的圖,沒有代表三個腸型和沒有腸型質質連接器的橢圓。

s.class(obs.bet$ls, fac=as.factor(data.cluster), grid=F, cell=0, cstar=0, col=c(4,2,3))

有關ade4包的更多信息和教程,請參閱此處

主體座標分析
下面是一個簡單的代碼段,用於使用pco()執行PCoA,然後使用s.class()進行繪圖:

obs.pcoa=dudi.pco(data.dist, scannf=F, nf=3)
s.class(obs.pcoa$li, fac=as.factor(data.cluster), grid=F)

下面是相同的圖,沒有代表三個腸型的橢圓,沒有腸型質質連接器。
在這裏插入圖片描述

s.class(obs.pcoa$li, fac=as.factor(data.cluster), grid=F, cell=0, cstar=0, col=c(3,2,4))

有關ade4包的詳細信息和教程可在此處獲取,而本教程中的所有代碼都嵌入到BiotypeR中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章