单细胞分析中的NormalizeData()与ScaleData()区别在哪儿?
<meta charset="utf-8">
今天又是入门单细胞分析的一天
在单细胞分析当中,我们会用到两个函数:NormalizeData()和ScaleData(),这两个函数的区别到底在哪儿?它们到底对我们的单细胞数据做了什么样的处理?今天就这个问题谈谈我作为初学者的理解。
测序深度
首先第一个问题是,什么是测序深度?
测序深度简而言之就是测序得到的碱基数与基因组碱基数之间的比值。一般来说,对一个细胞而言,测序深度越大,每个基因检测到的reads会越多。这实际上就会造成一个问题,在处理单细胞数据时,如果一个基因在一个细胞当中的reads数很少,这究竟是这个基因本身就表达很少,还是因为这个细胞本身测序得到的reads数就很少呢(要穷大家一起穷)?
z-score
第二个问题,什么是基因的z-score?
z-score的计算方法如下:
[图片上传失败...(image-b1faf6-1635260454961)]
实际上可以发现,这个z-score不就是做了一个(0,1)正态分布化的操作吗?那这个操作有什么意义呢?
我们经常会画热图来展示基因的表达情况,但是如果数据过于分散会出现什么情况呢?举个例子:
#生成一个服从标准正态分布的10*10矩阵
mymatrix <- matrix(data = rnorm(100,mean = 0,sd = 1),ncol = 10)
#将第一个元素的值扩大至10000
mymatrix[1,1] = 10000
heatmap(mymatrix)
可以看到,右上角的那个元素完全是一枝独秀,这实际上掩盖了其它元素的情况,但是当我们对数据进行正态标准化之后:
mymatrix <- scale(mymatrix)
heatmap(mymatrix)
怎么样?这样是不是好了很多?实际上标准正态分布能够让数据不那么分散,这在我们绘制热图的时候是非常必要的,毕竟我们热图的色阶只有那么大的范围。
NormalizeData()
有了上面的铺垫之后,我们现在就能理解NormalizeData()在干什么了。NormalizeData()实际上就是在消除不同细胞测序深度的影响,可以看到,NormalizeData()的一般使用格式为:
library(Seurat)
NormalizeData(object, assay=NULL, normalization.method = "LogNormalize", scale.factor = 10000)
函数默认将每个细胞的文库大小设置成为10000个reads大小,有细心的朋友会发现normalization.method = "LogNormalize"这个参数,这又是什么呢?
还是前面提到的问题,单细胞数据当中有很多基因的reads数很多,甚至上千,但是有很多基因却是个位数甚至0,那这种数据离散程度也是很大的,但是我们会发现当我们对1000取以10为底的对数时,就变成了3,对10取以10为底的对数时,就变成了1,这样就实现了降低数据离散程度的目的。但是这也存在一定的问题,如果一个基因的reads数为0,那岂不是不能取对数?我们对所有的值都加上1不就能够解决这个问题?
所以总结起来,NormalizeData()这个函数是首先对基因的reads数进行了同一文库大小的校正,然后再对校正后的数值进行对数化操作。
ScaleData()
这个就简单了,不过是对基因表达量的数值进行了z-score的转换,同时也为后面的pca分析做了铺垫,因为pca分析默认数据是服从正态分布的。
今天又是摸鱼的一天呢!!!
作者:Bio_Infor
链接:https://www.jianshu.com/p/4a15cf570b87
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。