今天又是入門單細胞分析的一天
在單細胞分析當(dāng)中,我們會用到兩個函數(shù):NormalizeData()和ScaleData()褥芒,這兩個函數(shù)的區(qū)別到底在哪兒?它們到底對我們的單細胞數(shù)據(jù)做了什么樣的處理?今天就這個問題談?wù)勎易鳛槌鯇W(xué)者的理解锰扶。
測序深度
首先第一個問題是献酗,什么是測序深度?
測序深度簡而言之就是測序得到的堿基數(shù)與基因組堿基數(shù)之間的比值坷牛。一般來說罕偎,對一個細胞而言,測序深度越大京闰,每個基因檢測到的reads會越多颜及。這實際上就會造成一個問題,在處理單細胞數(shù)據(jù)時蹂楣,如果一個基因在一個細胞當(dāng)中的reads數(shù)很少俏站,這究竟是這個基因本身就表達很少,還是因為這個細胞本身測序得到的reads數(shù)就很少呢(要窮大家一起窮)痊土?
z-score
第二個問題乾翔,什么是基因的z-score?
z-score的計算方法如下:
實際上可以發(fā)現(xiàn)施戴,這個z-score不就是做了一個(0,1)正態(tài)分布化的操作嗎反浓?那這個操作有什么意義呢?
我們經(jīng)常會畫熱圖來展示基因的表達情況赞哗,但是如果數(shù)據(jù)過于分散會出現(xiàn)什么情況呢雷则?舉個例子:
#生成一個服從標(biāo)準(zhǔn)正態(tài)分布的10*10矩陣
mymatrix <- matrix(data = rnorm(100,mean = 0,sd = 1),ncol = 10)
#將第一個元素的值擴大至10000
mymatrix[1,1] = 10000
heatmap(mymatrix)
可以看到,右上角的那個元素完全是一枝獨秀肪笋,這實際上掩蓋了其它元素的情況月劈,但是當(dāng)我們對數(shù)據(jù)進行正態(tài)標(biāo)準(zhǔn)化之后:
mymatrix <- scale(mymatrix)
heatmap(mymatrix)
怎么樣?這樣是不是好了很多藤乙?實際上標(biāo)準(zhǔn)正態(tài)分布能夠讓數(shù)據(jù)不那么分散猜揪,這在我們繪制熱圖的時候是非常必要的,畢竟我們熱圖的色階只有那么大的范圍坛梁。
NormalizeData()
有了上面的鋪墊之后而姐,我們現(xiàn)在就能理解NormalizeData()在干什么了。NormalizeData()實際上就是在消除不同細胞測序深度的影響划咐,可以看到拴念,NormalizeData()的一般使用格式為:
library(Seurat)
NormalizeData(object, assay=NULL, normalization.method = "LogNormalize", scale.factor = 10000)
函數(shù)默認將每個細胞的文庫大小設(shè)置成為10000個reads大小,有細心的朋友會發(fā)現(xiàn)normalization.method = "LogNormalize"這個參數(shù)褐缠,這又是什么呢政鼠?
還是前面提到的問題,單細胞數(shù)據(jù)當(dāng)中有很多基因的reads數(shù)很多队魏,甚至上千公般,但是有很多基因卻是個位數(shù)甚至0,那這種數(shù)據(jù)離散程度也是很大的,但是我們會發(fā)現(xiàn)當(dāng)我們對1000取以10為底的對數(shù)時官帘,就變成了3蟹略,對10取以10為底的對數(shù)時,就變成了1遏佣,這樣就實現(xiàn)了降低數(shù)據(jù)離散程度的目的。但是這也存在一定的問題揽浙,如果一個基因的reads數(shù)為0状婶,那豈不是不能取對數(shù)?我們對所有的值都加上1不就能夠解決這個問題馅巷?
所以總結(jié)起來膛虫,NormalizeData()這個函數(shù)是首先對基因的reads數(shù)進行了同一文庫大小的校正,然后再對校正后的數(shù)值進行對數(shù)化操作钓猬。
ScaleData()
這個就簡單了稍刀,不過是對基因表達量的數(shù)值進行了z-score的轉(zhuǎn)換,同時也為后面的pca分析做了鋪墊敞曹,因為pca分析默認數(shù)據(jù)是服從正態(tài)分布的账月。
今天又是摸魚的一天呢!0钠取局齿!