【单细胞测序】RNA velocity:scVelo 应用(二)
dooooob
2020年09月28日 09:00
收录于文集
共23篇

一般要去计算RNA velocity的时候,是已经有先期处理数据了,比如做过了降维,聚类,差异分析,等。因此,做RNA velocity的时候,考虑的经常是怎么把之前的结果和RNA velocity的结果合并展示。而不是,对同一份数据,之前一套,RNA velocity又重新做一套。

因此,在这里会从数据的整合开始。

讨论的情况是:在R上用Seurat做过了分析,现在要用python的scVelo做RNA velocity分析。

这里选择的方法是把velocyto生成的loom文件读取之后,和Seurat分析过的数据整合在一起,然后再导出为loom格式,最后在jupyter notebook上用scVelo做RNA velocity分析。

需要安装的R包:velocyto.R,loomR,hdf5r

  •     用velocyto.R::read.loom.matrices(file = loomFile, engine = “hdf5r)读取loom文件

  •     以Seurat对象为基础,为loom中的unspliced, spliced, ambiguous三个矩阵建立新的Assay

  •     导出loom

读取loom文件

case 1:单个样本

x <- velocyto.R::read.loom.matrices(file = loomFile, engine = “hdf5r)

object[["spliced&#​34;]] <- CreateAssayObject(counts = x[["spliced&#​34;]])#object为Seurat object

object[["unspliced&#​34;]] <- CreateAssayObject(counts = x[["unspliced&#​34;]])

object[["ambiguous&#​34;]] <- CreateAssayObject(counts = x[["ambiguous&#​34;]])

注意

1. 如果loom中包括的细胞ID和object中的细胞ID不一致,需要对细胞ID进行调整,选择两者公有的。同理,基因ID。

2. 还有一种情况是细胞ID其实一致,但是加了不同的后缀,同样需要去做调整。

解决方式(以spliced矩阵为例):

spliced <- x[["spliced&#​34;]]

rownames(spliced),查看spliced矩阵的基因ID

colnames(spliced),查看spliced矩阵的细胞ID

rownames(object),查看Seurat对象object的基因ID

colnames(object),查看Seurat对象object的细胞ID

如果发现spliced矩阵和object的基因或者细胞ID不完全一致,那么就取交集。如果发现一致,但是格式有问题,那么就更改一致。

上述操作完成之后,Seurat对象object中包括了RNA counts ,spliced mRNA counts,unspliced mRNA counts,ambiguous mRNA counts四个矩阵。同时,由于object已经是前期处理过的数据,也会有降维信息等。

如:

An object of class Seurat ***** features across **** samples within 4 assays Active assay: RNA (26334 features, 2000 variable features) 3 other assays present: spliced, unspliced, ambiguous 2 dimensional reductions calculated: pca, umap

case 2:多个样本合并

更普遍的一种情况是,我们有多个样本要一起处理。

用Seurat已经将样本merge合并了,integrate整合了。然后对各个样本分别获得了对应的loom文件。现在需要将不同样本的loom也合并起来然后整理到一个Seurat对象中。

x1 <- velocyto.R::read.loom.matrices(file = loomFile1, engine = “hdf5r)

x2 <- velocyto.R::read.loom.matrices(file = loomFile2, engine = “hdf5r)

spliced <- cbind(x1[["spliced&#​34;]], x2[["spliced&#​34;]])

object[["spliced&#​34;]] <- CreateAssayObject(counts = spliced)

unspliced, ambiguous同理。

注意

1. Seurat合并样本时,为了让细胞ID不冲突,会给不同样本的细胞ID加后缀或者前缀,因此需要根据自己的数据对细胞ID进行处理。

2. 对于Seurat整合数据,即做了批次校正的数据,Seurat对象object中包含了一个基因只有anchor.feature的Assay,因此,最好是采用merge形式的object,然后把integrate形式的降维数据传递过去。

输出loom文件

因为读取了loom之后,新的object包含了很多Assay,需要在输出loom时把所有的Assay中的矩阵都输出。

代码如下:

  x <- object

  meta.data <- x[[]]

  colnames(x = meta.data) <- gsub(

    pattern = '\\.&#​39;,

    replacement = '_&#​39;,

    x = colnames(x = meta.data)

  )

  meta.data$clusters <- as.integer(x = Idents(object = x)[rownames(x = meta.data)])

  meta.data$clusters <- as.character(x = Idents(object = x)[rownames(x = meta.data)])

  meta.feature <- x[[assay]][[]]

  colnames(x = meta.feature) <- gsub(

    pattern = '\\.&#​39;,

    replacement = '_&#​39;,

    x = colnames(x = meta.feature)

  )

  if (length(x = VariableFeatures(object = x)) > 0) {

    meta.feature[VariableFeatures(object = x), 'highly_variable_genes&#​39;] <- 1

    meta.feature[is.na(x = meta.feature$highly_variable_genes), 'highly_variable_genes&#​39;] <- 0

  }

  DefaultAssay(object = x) <- "RNA&#​34;

  data <- GetAssayData(object = x, slot = 'counts&#​39;) # Raw counts matrix

  layers = list('spliced&#​39; = as.matrix(t(as.data.frame(x@assays$spliced@counts))))

 # Make the initial loom object

  lfile <- loomR::create(

    filename = filename,

    data = data,

    feature.attrs = as.list(x = meta.feature), # Feature-level metadata

    cell.attrs = as.list(x = meta.data), # Cell-level metadata

    layers = layers, #spliced data

    transpose = TRUE,

    calc.count = FALSE

  )

  lfile$add.layer(layers = list('unspliced&#​39; = as.matrix(t(as.data.frame(x@assays$unspliced@counts)))))

  lfile$add.layer(layers = list('ambiguous&#​39; = as.matrix(t(as.data.frame(x@assays$ambiguous@counts)))))

  # Add dimensional reduction information

  dim.reducs <- names(x@reductions)

  for (dr in dim.reducs) {

    message("Adding dimensional reduction information for ", dr)

    embeddings <- Embeddings(object = x, reduction = dr)[cell.order, ]

    embeddings <- list(embeddings)

    names(x = embeddings) <- paste0('X_&#​39;, dr)

    message("Adding cell embedding information for ", dr)

    lfile$add.col.attribute(attributes = embeddings)

    loadings <- Loadings(

      object = x,

      reduction = dr,

      projected = dim(x = slot(object = x[[dr]], name = 'feature.loadings.projected&#​39;))

    )

  }

  # Store assay

  hdf5r::h5attr(x = lfile, which = 'assay&#​39;) <- "RNA&#​34;

  lfile$close_all()

RNA velocity

参照基础用法