单细胞文章层出不重,但是数据格式不统一,卡卡在重现大量文章数据的时候发现,有的文章提供的是处理后的单细胞矩阵,而不是原始counts,甚至有的文章提供的数据是scaled data,这样我就有疑问:直接利用scaled data或者normalized counts能否进行单细胞分析,首先我们来回顾一下单细胞分析的基本步骤:
单细胞基本步骤(Seurat包为例)
- 读取raw counts构建seurat对象
- 数据进行lognormalized,去除细胞间的差异
- 获取高可变基因,即FindVariableFeatures函数
- 数据scaled得到scaledata,统一量纲
- 根据scaled data进行PCA降维
- 利用FindClusters函数进行分群
- 人工或自动注释,给细胞以标签
如果文章只提供scaled data的话,我们可以略过lognormalized和scaledata步骤,但是FindVariableFeatures用来发现高可变基因,似乎只有scaled data不能用来获取高可变基因,且这一步的高可变基因会用于后续PCA降维等分析,也不能省略,那么是否可以用scaled data来获取高可变基因呢?为此我看了下FindVariableFeatures的源码(Seurat V3版本):
if (selection.method == "vst") {
data <- GetAssayData(object = object, slot = "counts")
if (IsMatrixEmpty(x = data)) {
warning("selection.method set to 'vst' but count slot is empty; will use data slot instead")
data <- GetAssayData(object = object, slot = "data")
}
}
else {
data <- GetAssayData(object =object, slot = "data")
}
可以看到,源码中高可变基因的获取是利用raw counts矩阵或者lognormalized data的矩阵来计算的,也就是说seurat作者认为scaled data来计算高可变基因可能是不准确的,因此文章只提供了scaled data理论上是不能进行高可变基因的计算的。
当然,会有好(tai)奇(gang)的人问了,我就是要用scaled data来运行FindVariableFeatures,会得到比较可靠的高可变基因吗?为此,我测试了下运用raw counts, lognormalized data, scaled data来分别进行高可变基因获取,并比较异同:
PRO <- readRDS('/mydir/seurat.diff_PRO.rds')
PRO <- FindVariableFeatures(PRO,selection.method = "vst", nfeatures = 2000)
gene_counts <- VariableFeatures(object = PRO)
PRO@assays$RNA@counts <- PRO@assays$RNA@data
PRO <- FindVariableFeatures(PRO,selection.method = "vst", nfeatures = 2000)
gene_data <- VariableFeatures(object = PRO)
PRO<- ScaleData(PRO,features=rownames(PRO))
PRO@assays$RNA@counts <- PRO@assays$RNA@scale.data
PRO <- FindVariableFeatures(PRO,selection.method = "vst", nfeatures = 2000)
gene_scaledata <- VariableFeatures(object = PRO)
length(intersect(gene_counts,gene_data))
842
length(intersect(gene_counts,gene_scaledata))
141
length(intersect(gene_data,gene_scaledata))
103
length(intersect(gene_scaledata,c(gene_data,gene_counts)))
174
可以看到,利用scaled data计算出来的高可变基因与使用raw counts和lognormalized data计算出来的差别是很大的,而使用raw counts和lognormalized data得到的高可变基因的一致性远高于使用scaled data,因此卡卡认为使用scaled data获取的高可变基因是不靠谱的。从理论上来想也很好理解,高可变基因是在细胞间变化程度大的基因,scaled data将方差矫正为1,当然会使结果有很大的偏差。
那么没有高可变基因是不是就不能进行PCA降维等分析了呢?理论上当然不是,RunPCA可以自己指定基因来运行。
文章只提供scaled data可否运行seurat标准流程
卡卡最近实际上是在构建单细胞数据库,个人认为这样的数据是可以放弃分析的,理由如下:
- 无法进行可信的高可变基因的获取
- 无法和其他正常数据整合分析
- 这样的数据占比不高,卡卡分析了数百篇高分文章,只发现了3篇