前言
這篇筆記是StatQuest系列教程的第47,48,49節(jié)。第47節(jié)與第48節(jié)有很在一部分內(nèi)容是重復的,主要講的是層次聚類,第49節(jié)講提K-means聚類。
熱圖簡單案例
平時在讀一個測序文章時,我們可能會經(jīng)??吹綗釄D,就像現(xiàn)在的這種圖:

現(xiàn)在我們來解釋一下這張圖:
- 這是一張熱圖(heatmap),為什么要叫熱圖呢,因為它用不同的顏色來表示數(shù)值的大小,通常來說,用暖色(紅色)表示數(shù)值大,冷色(藍色)表示數(shù)值小。
- 這個熱圖的行(row)是基因名(可能太小看不清楚),列是RNA-seq的樣本名。
- 當原始數(shù)據(jù)通過熱圖來展現(xiàn)時,數(shù)據(jù)經(jīng)過了兩種修飾來展示出來。第一種修飾就是相對豐度(relative abundances),以這種方式展示的數(shù)據(jù),它研究的是一個基因在不同樣本中的相對表達情況,這種展示方式,需要對同一行(也就是相同的基因在不同樣本中的表達水平)的數(shù)據(jù)進行縮放(scaled),也就是Z轉(zhuǎn)換。從下面的圖中,我們就可以看到,樣本1的某基因表達量明顯高于其它樣本(因為樣本1的顏色最紅,根據(jù)圖例,它的表達值就最高),如下所示:

為了方便理解,我隨手用Excel做了一下簡陋的熱圖,如下所示:

可以看出,基因4在樣本1中的表達量很高。不過按照第一種展示數(shù)據(jù)的方式,無法比較不同基因的表達水平差異,例如,在上圖的黑色方框中,基因4顯紅色,這只能表達,樣本1中基因4的表達水平比其它的樣本高,不能說明樣本1中的其它基因(例如基因3)的水平也比其它樣本高,這種數(shù)據(jù)的展示方式只用于研究同一個基因在不同的樣本中的表達水平差異。
第二處修飾后的展示方式就是根據(jù)這些基因表達的相似性,把它們放到一塊,如下所示:

再看下面的圖形:

從上到下,我們可以看到這些基因的表達的模式。
在第一個紫紅色的方框中,我們可以看到,這些基因在第2個樣本中表達水平最高,而在第4個樣本中表達水平最低。
在第二個黑色的方框中,我們可以看到,這些基因在第1個樣本中表達水平最高,而在第4個樣本中表達水平最低。
在第三個橙色方框中中,我們可以看到,這些基因在第2個樣本中的表達水平最高,而在第3個棲中的表達水平最低。
根據(jù)不同基因表達模式的相似性進行的“聚類”(clustering)并不是偶然的,而是通過一定的算法實現(xiàn)的,這些算法會將那些表達模式類似的基因放到一塊,如下所示:

如果不進行聚類(clustering),那么用熱圖展示出來就是下圖右邊的那個樣子,如下所示:

如果熱圖中既不進行聚類(clustering),也不進行縮放(scaling),那么熱圖就變成了如下的這個樣子:

從圖上我們可以看到,紅色部分的這個基因表達水平最高(比其他的基因表達高太多了),可以把它視為一個異常值。
熱圖復雜案例
現(xiàn)在我們再看一下比較復雜的熱圖案例,如下所示:

從這個圖的標題上我們可以看出,這個貌似是一個結腸的單細胞測序數(shù)據(jù)的熱圖。這個熱圖的數(shù)據(jù)經(jīng)過了縮放(scaled)與聚類(clustered),它的縮放是全局的,因此,這一組數(shù)據(jù)中并沒有異常值,這里的縮放要與前面熱圖的縮放區(qū)分開來,前面的前面是按照某個基因進行縮放的,也就是把同一行的數(shù)據(jù)當成整體,進行了縮放(也就是z轉(zhuǎn)換),而這個數(shù)據(jù)是把所有的數(shù)據(jù)當作整體,進行縮放。
再看聚類。這個熱圖的聚類是按照列(column,也就是樣本)和行(row,也就是基因)同時進行的聚類,如下所示:

在上圖中,我們可以看到,縱矩形的部分表示基因表達模式相似的樣本聚在了一起,橫矩形表示的是,表達模式相似的基因聚集在了一起。它們的交集表示,這些樣本的基因表達模式相似,以及有哪些基因相似。
如果不進行聚類,也不進行數(shù)據(jù)縮放(scaling),那么下圖的右上表示的就是不聚類的熱圖,右下表示的就是即不進行聚類,又不進行縮放的熱圖,如下所示:

此時我們再回到前面的那個簡單熱圖案例中來,我們試想一個問題,在那張熱圖中,如果我們對所有的基因進行整體的縮放(global scaling),而非單個基因的縮放,那么這個熱圖會怎么樣,我們看下圖:

經(jīng)過全局縮放(global scaling)后,得到下面的圖形,如下所示:

此時,我們會發(fā)現(xiàn),這些聚類的結果就會發(fā)生了改變,并且新生成的圖形中出面了異常高的熱圖,它是異常值,這個異常值會導致熱圖整體上出來嚴重的偏離,并且不容易觀察基因的變化,如下所示:

因此,我們從上面的結果可以知道,縮放(scaling)會影響兩個結果,第一,不同表達水平基因的顏色,這會影響你比較不同樣本中的相同基因的表達水平,第二,影響聚類(clustering),如下所示:

如何對數(shù)據(jù)進行縮放(scale)
此時,我們再回到數(shù)據(jù)的縮放這個話題上,無論你對相同基因在不同樣本中進行縮放,還是對全局的基因進行縮放,最常用的方法就是Z值縮放法(Z-Score Scaling),如下所示:

接著,我們具體看一下這種方法是如何實現(xiàn)數(shù)據(jù)的縮放的。在下圖中,我們看到一個數(shù)軸上分布了幾個樣本的reads數(shù),如下所示:

第一步:計算其均值(均值為16.5),如下所示:

第二步:每個樣本的數(shù)值減去均值,此時,如果這個數(shù)值大,就表示此樣本的某基因轉(zhuǎn)錄水平高;如果數(shù)值小,就表示此樣本的某基因轉(zhuǎn)錄水平低,如下所示:

第三步:計算標準差(標準差為6.28);
第四步:將第2步中的數(shù)值除以標準差,如下所示:

經(jīng)過上述的處理后,無論原始數(shù)據(jù)的變異程度如何,這些數(shù)據(jù)的范圍最終會縮小,之所以這樣處理,就是因為如果原始數(shù)據(jù)之間差異過大,那么不同基因表達水平就會變化程度(more subtle)更高的色度(shade)來表示,經(jīng)過這樣的處理,用較小程度的色度(shade)就能表示出基因水平的差異,方便觀察,如下所示:

此時,我們可能會遇到這樣的一種情況,例如,如果數(shù)據(jù)中出現(xiàn)異常值時,數(shù)據(jù)會怎么樣,就像下面的這個樣子:

此時如果進行Z轉(zhuǎn)換的話,標準差會很大,也就是Z值的分子會很大,最終得到的值會有一部分集中在0附近,只能用很少的色度來進行區(qū)分,如下所示:

例如,我們?nèi)绻捎萌挚s放來處理原始數(shù)據(jù)中,在第一個案例中,我們就會得到下面這樣的圖形,其中有一個基因明顯表達水平非常高,使得其它的基因差異很難看出來,如下所示:

如何聚類
原始數(shù)據(jù)經(jīng)過縮放后(scaling),此時就可以進行聚類了,聚類有2種方法,分別是層次聚類(hierarchical clustering)和K-均值(K-means)聚類,我們先講層次聚類(hierarchical clustering),如下所示:

層次聚類(hierarchical clustering)
先看一個簡單的案例,在這個案例中,有3個樣本,每個樣本4個基因,如下所示:

這種聚類方法的思路是這樣的:
第一步,計算出哪些基因與基因1最為接近,基因2明顯與基因1表達模式不同,基因3與基因1的表達形式比較類似,基因4與基因1的表達模式也比較類似,但是,在這幾個基因中,與基因1表達模式最接近的還是基因3,如下所示:

第二步,計算出哪些基因的表達模式與基因2最為接近(然后是基因3,基因4),經(jīng)計算發(fā)現(xiàn),基因4與基因2的表達模式最相似,如下所示:

第三步,我們在前面找到基因1和基因3的表達模式相似,基因2和基因4的表達模式相似,但是,基因1和基因3的相似程度要比基因2和基因4的相似程度高,我們把前面的組合(基因1和基因3)放到一個簇(cluster)中,如下所示:

第四步:此時再回到第一步,把基因1和基因3構成的簇(Cluster # 1)當作一個基因,然后再按照第二步,第三步來計算,經(jīng)計算,此時,基因2和基因4最相似,把它們再放到一個簇中(Cluster #2),如下所示:

通常情況下,層次聚類(Hierarchical Clustering)通常會用一個樹形圖(dendrogram)連接起來,用于表明聚類成員之間的相似性和聚類次序,如下所示:

在右側的樹形中,我們可以發(fā)現(xiàn),Cluster #1是最先形成的聚類,它們的相似性最高,如下所示:

Cluster #2是第二個形成的聚類,它們的相似性次高,如下所示:

而第三個聚類Cluster #3則包含了所有的基因,它是最后形成的,如下所示:

層次聚類的原理
前面我們提到過,層次聚類的第一步就是計算兩組基因的相似性,此時我們詳細介紹一下如何進行計算。
在計算相似性方面并沒有一個統(tǒng)計的標準,但有一些常用的手段。第一種計算相似性的方法就是歐氏距離(Euclidian distance),如下所示:

為了簡單地說明歐氏距離(Euclidian distance),我們以最簡單的例子來說明,在這個例子中,有2個樣本,每個樣本有2個基因,然后兩個樣本的相同基因的差值的平方相加,并開平方,得到的數(shù)值就是歐氏距離,如下所示:

除了歐氏距離可以計算相似性外,還可以使用曼哈頓距離(Manhattan distance)和坎貝拉距離(Canberra distance)來計算相似性,其中曼哈頓距離只是不同樣本之間相同基因差值的絕對值之和,如下所示:

我們看一下用不同的方法計算相似性的區(qū)別,下圖的左側圖使用的歐氏距離(Euclidian distance)來得到的熱圖,右圖使用的是曼哈頓距離(Manhattan distance)得到的熱圖,如下所示:

從圖上來看,使用這兩種不同的相似性計算方法得到的熱圖略有差異,具體要使用哪種方法來計算相似性,并沒有一個統(tǒng)計的標準,它們也沒有什么生物學意義。
此時,我們再回到原來的案例中來,在前面部分中我們提到,基因1和基因3的相似程度最高,把它們都放到一個簇(Cluster #1)中,此時,我們?nèi)绾斡嬎鉉luster #1和基因2,基因4的相似性呢?有幾種方法。
其中最簡單的一種方法就是求出Cluster #1中的兩個基因的平均值,然后進行計算。但還有其它的方法,這些方法同樣會影響聚類,如下所示:

為了簡單地說明簇(Cluster #1)與其它基因相似性計算的問題,我們假設有一批數(shù)據(jù),分布在X-Y軸上,此時,我們已經(jīng)生成了2個簇,如下所示:

此時,我們僅需要計算最后一個點屬于哪個簇,如下所示:

此時我們可以采用以下這些方法進行計算:
第一,計算這個點與兩個簇平均值的距離(centroid),如下所示:

第二,計算這個點到兩個簇最近的點的距離(single-linkage),如下所示:

第三,計算這個點到兩個簇中最遠的點的距離(complete-linkage),如下所示:

我們用前面的單細胞測序的熱圖來說明一下這三種方法,從左到右分別是:某點到某簇最遠點的距離(在R中默認的就是這個選項),某點到某簇均值的距離,某點到某簇最近的點的距離,如下所示:

K-means聚類
什么是K-means
先看一個場景,例如我們手中有這樣的一批數(shù)據(jù),把它們繪制到一個數(shù)軸上,此時你的目的就是把它們分成3個簇(cluster),這三個數(shù)據(jù)或許是來源于三種不同的細胞或都是三種不同的腫瘤,如下所示:

我們僅從肉眼觀察,就知道這一批數(shù)據(jù)明顯可以分成3個簇,但是,如果我們不用肉眼來觀察,用計算機來計算,如何得到這3個簇呢?此時就需要用到一種算法,即K-means聚類,如下所示:

K-means的基本思想
此時,我們先了解一下K-means聚類的基本思想。
第一步:選擇你要聚類的個數(shù),K-means聚類中的這個K就是你要聚類的數(shù)目的意思,此時,你們選擇K=3,這也就是說,我們想把這些數(shù)據(jù)取成3個簇(cluster),對這個K值如何選擇,我們后文會提到,如下所示:

第二步,隨機選擇3個不同的數(shù)據(jù)點當成3個簇,如下所示:

第三步:計算第1個點到這三個簇的距離,先計算第1個點到藍簇的距離,如下所示:

接著,計算第1個點到綠簇的距離,如下所示:

最后,計算第1個點到橘黃簇的距離,如下所示:

第四步:將第1個點歸于離它最近的簇,在這個案例中,第1個點就屬于藍簇,如下所示:

接著,重復前面的步驟,只是這次計算的第2個點,第2個點最終的計算結果它屬于綠簇,如下所示:

再計算第3個點,它屬于橘黃簇,如下所示:

經(jīng)過最終計算,第3個點到最后的點都屬于橘黃簇,如下所示:

此時,所有的點都進行了聚類,如下所示:

第五步:計算每個簇的均值,如下所示:

此時,我們還按照前面的方法,計算每個點到這三個簇的均值的距離,如下所示:

最終計算結果如下所示:

經(jīng)過最終的計算,我們發(fā)現(xiàn),這些聚類結果并沒有發(fā)生改變,如下所示:

也就是說,K-means的聚類結果似乎比我們?nèi)庋圻M行的聚類的結果還要差,如下所示:

此時,我們需要對聚類的結果進行評估,其方法就是計算每個簇的變異,如下所示:

由于K-means的聚類過程并不能“看”到最佳的聚類,只能追蹤這些簇與這些簇的總變異,然后通過不斷更改起始的數(shù)據(jù)點進行迭代。
此時我們回到起點,再將隨機選擇3個初始數(shù)據(jù)點作為初始的簇,按照前面同樣的自救,計算剩余的點到這三個簇的距離,計算每個簇的均值,然后基于新的均值進行聚類,直接這些簇不再改變?yōu)橹?,如下所示?/p>

計算的結果如下所示,此時這些數(shù)據(jù)已經(jīng)進行了聚類,再計算這三個簇的變異,如下所示:

這一輪迭代結束,然后再來一輪,如下所示:

我們把這三次的聚類結果放一塊兒,我們可以發(fā)現(xiàn),第二次的聚類結果最好,如下所示:

但是我們并不清楚這個結果是不是所有可能的聚類結果中最好的(總變異最?。虼宋覀冃枰M行更多次的聚類,然后才能下結論。
此時我們提出一個問題,K值應該如何選?在這個案例中,明顯可以知道K值為3,但是,有的時候,這個K值并不像本案例中這么明顯,如下所示:

其中一種確定K值的方法就是不斷地使用不同的K值,如下所示:

我們先使用K=1這個數(shù)值,通過計算總的變異程度,明顯這個結果不行,如下所示:

再使用K=2,此時我們計算一下總變異,這個結果比K=1的時候要好一些,如下所示:

接著,我們使用K=3,通過計算它的總變異,我們發(fā)現(xiàn)K=3的結果要比K=2更好,因為它的總變異更低,如下所示:

再繼續(xù),使K=4,我們發(fā)現(xiàn),K=4的總變異比K=3的總變異還要小,如下所示:

從前面的這些計算結果來看,我們能總結出一個規(guī)律,每當我們添加一個新的簇時,總變異就會降低,當簇的數(shù)目等于總的數(shù)據(jù)點的數(shù)目時,總變異就是0,如下所示:

如果我們把K值與變異降低的程度繪制成曲線,那么就能得到下面的這條曲線:

從這個曲線上我們可以看到,當K=3時,它之后的K值每增加1,總變異的降低幅度就沒有前面的快,我們把K=3這個點稱為拐點(elbow plot)。
K-mean聚類與層次聚類的區(qū)別
此時,我們再提出一個問題:K-mean聚類與層次聚類有什么區(qū)別?
K-means聚類會把數(shù)據(jù)聚成你所期望的簇的數(shù)目,而層次聚類則中介告訴你,哪兩個數(shù)據(jù)是最相似的,如下所示:

二維坐標的K-means
如果我們的數(shù)據(jù)無法繪制到一條數(shù)軸上時,如何進行K-means聚類呢,如下所示:

這種情況下,它的聚類原理跟一維數(shù)軸的原理一樣,第一步就是隨機找到三個點(前提是你想聚成3個簇),如下所示:

然后,計算不同的點到這三個簇的歐氏距離(Euclidean distance),在二維坐標中,計算這個歐氏距離就是采用勾股定理,如下所示:

接著,就像前面講的那樣,距離最近的就屬于某個簇,如下所示:

第一次的聚類結果如下所示:

再接著,我們會像前面是找到的那樣,計算出每個族的中心點(也就是均值),然后再聚類,如下所示:

最后,得到比較滿意的聚類圖,如下所示:

熱圖的K-means
如果我們的數(shù)據(jù)是熱圖,那么如何進行K-means聚類呢?
為了方便描述,我們就以下面的案例說明一下,兩個樣本(sample 1和sample 2),分別有4個基因,現(xiàn)在把這兩個樣本分別命令為X,Y,把它們的基因放到二維坐標軸上,如下所示:

然后像前面那樣進行聚類,如下所示:

事實上,在實際的計算過程中,我們并不需要把數(shù)據(jù)投射到二維坐標上,只用計算不同樣本之間的距離即可,例如歐氏距離,如下所示:

R的kmeans()函數(shù)備注
在R中,進行K-menas聚類的函數(shù)是kmeans(),它有一些注意事項。
- 此函數(shù)會對每個距離加上權重,因此那些大簇(large clusters)的權重要略高于小簇(small clusters)的權重。
- 默認情況下,此函數(shù)只有一組原始的簇,如果你要使用多個不同的起始數(shù)據(jù)點,那么你需要設定參數(shù)
nclust=25或者是25左右的數(shù)字,例如(kmans(data, k=3, nclust=25))。
如下所示:
