背景:单细胞转录组常规分析流程的数据标准化(归一化)预处理。
两种方法:
1.log
2.sct
其实这两种标准化方法与批次校正的两种方法息息相关,是多批次数据集校正批次的基础。
- 标准化(归一化)
生物差异或者测序等技术差异会影响同一种细胞的细胞间的测序计数深度分布,单细胞测序数据中的细胞间差异可能会包含这部分测序误差,等价于计数矩阵中包含了变化很大的方差项。
“归一化”的预处理步骤旨在通过将“UMI的方差”缩放到指定的范围,从而调整数据集中的原始UMI计数分布以实现模型建模。
查看原始的UMI分布:
library(Seurat)
library(ggplot2)
library(dplyr)
sc<-readRDS("./sc_qc.rds") #'读取质控后的rds
j=as.data.frame(colSums(sc))
colnames(j)=("V1")
h=ggplot(j)+
geom_histogram(aes(x=V1))+
xlab(label = "UMI count per cell")
#ggsave(h, file="hist.pdf", width=12, height=6)
ggsave(h, file="hist_before.png", width=12, height=6)
norm_before.png
- log标准化
sc_1<-sc%>%NormalizeData()%>%FindVariableFeatures(nfeatures=2000) %>%
ScaleData(features=rownames(sc)) #'log标准化
j=as.data.frame(colSums(sc_1))
colnames(j)=("V1")
h=ggplot(j)+
geom_histogram(aes(x=V1))+
xlab(label = "UMI count per cell")
#ggsave(h, file="hist.pdf", width=12, height=6)
ggsave(h, file="log.png", width=12, height=6)
log.png
- sct标准化
sc_2<- SCTransform(sc,assay = Assays(sc)[1])
j=as.data.frame(colSums(sc_2))
colnames(j)=("V1")
h=ggplot(j)+
geom_histogram(aes(x=V1))+
xlab(label = "UMI count per cell")
#ggsave(h, file="hist.pdf", width=12, height=6)
ggsave(h, file="sct.png", width=12, height=6)
sct.png
- log和sct结构浅比较
那么log和sct标准化后有什么区别呢?通过str(sc_1)
查看log后的数据结构:
str(sc_1).png
可以看见,sc_1中sc_1$RNA
这个数据存储结构中多了sc_1$RNA@data
数据,这里存放的是log标准化后的counts矩阵,sc_1$RNA@scale.data
存放了scale后的counts矩阵,而sc_1$RNA@var.features
存放了寻找出来的2000个高变基因的名字。
继续通过str(sc_2)
查看sct标准化后的数据结构:
首先找到sc_2$SCT
:
sc_2SCT.png
这是做了sct标准化才会新出现的一个数据结构,如果是log标准化就没有这个结构。RNA和SCT是seurat对象的数据结构,sct标准化的结果都在这个sc_2$SCT
结构中,而log标准化的结果都在sc_1$RNA
结构中。
将sc_2$SCT
下拉,可以看见这个结构中也保存了sct标准化后的counts矩阵sc_2$SCT@data
,sct标准化找到的高变基因sc_2$SCT@var.features
,sct标准化后的scale矩阵sc_2$SCT@scale.data
。
sc_2SCT.png
这里有个小tips,sct标准化默认寻找的是3000个高变基因,可以看len(sc_2$SCT@var.features)==3000
。
sct标准化后的分析默认使用的是data$SCT中的矩阵,可以使用DefaultAssay(data)="RNA"
进行修改。
此外,sct数据结构中的@data的细胞数可能会少于@counts,而sct的@counts和RNA的@data才是等维度的。
counts.png
总结:sct标准化一步(一行代码)就做了log标准化的三步骤:标准化、寻找高变基因、scale。
网友评论