loom 介绍
随着单细胞技术的发展,数据量增加使得计算需求呈指数增长。分析单细胞数据时,使用稀100000个细胞的系数矩阵处理对于Seurat 来说就很有挑战性。HDF5 格式现在被用于储存
生物大数据,单细胞可以储存上百万个细胞的数据。
Linnarson实验室开发了基于HDF5的数据结构-loom loompy,用于储存单细胞数据以及数据相关的属性信息。并且,他们还发布了一个工具loompy。
一个loom包含6各部分,一个数据集(matrix),以及5个组layers, row_attrs, col_attrs, row_graphs, and col_graphs。
- matrix: n个基因m个细胞
- layers:matrix处理后的数据,例如标准化后的数据。
- row_attrs:基因得到metadata
- col_attrs: 细胞metadata
- row_graphs col_graphs
R
在R
中,我们可以使用Seurat包来处理Loom文件中的单细胞数据。
保存到loom
loom_subset <- as.loom(sc.obj.TCells, filename = "~/velocyto_test/seurat_TCells_211028.loom")
loom对象有一个get.attribute.df()
方法,可以获取各种metadata 信息整合成数据框(data frame)
attrs <- c("nUMI", "nGene", "orig.ident")
attr.df <- lfile$get.attribute.df(MARGIN = 2, attribute.names = attrs)
head(x = attr.df)
为了提高效率,HDF5
库对底层数据矩阵的访问进行了转置。基因储存在列,细胞储存在行;
但是LoomR
中,row.attrs还是表示基因,col.attrs表示细胞;这点容易让人混淆。
lfile[["row_attrs/gene_names"]]$dims
lfile[["row_attrs/gene_names"]]$dims == lfile[["matrix"]]$dims[2]
lfile[["row_attrs/gene_names"]]$dims == lfile$shape[1]
获取部分基因或细胞数据
data.subset <- lfile[["matrix"]][1:5, ]
dim(x = data.subset)
data.subset <- t(x = data.subset)
dim(x = data.subset)
data.gene <- lfile[["matrix"]][, lfile$row.attrs$gene_names[] == "MS4A1"]
head(x = data.gene)
添加数据到loom
- add.layer()
- add.row.attribute()
- add.col.attribute()
# Generate random ENSEMBL IDs for demonstration purposes
ensembl.ids <- paste0("ENSG0000", 1:length(x = lfile$row.attrs$gene_names[]))
# Use add.row.attribute to add the IDs Note that if you want to overwrite an
# existing value, set overwrite = TRUE
lfile$add.row.attribute(list(ensembl.id = ensembl.ids), overwrite = TRUE)
lfile[["row_attrs"]]
## Class: H5Group
## Filename: /home/paul/Documents/Satija/pbmc.loom
## Group: /row_attrs
## Listing:
## name obj_type dataset.dims dataset.type_class
## ensembl.id H5I_DATASET 13714 H5T_STRING
## gene_names H5I_DATASET 13714 H5T_STRING
Python
在Python
中,我们可以使用scanpy库来处理Loom文件中的单细胞数据。loompy也支持10X的数据:
import scanpy as sc
# 加载Loom文件
adata = sc.read_loom('example.loom')
# 查看数据的基本信息
print(adata)
需要先临时改变环境配置, 在终端直接输入:
export HDF5_USE_FILE_LOCKING='FALSE'
loompy.create_from_cellranger(folder, output_filename)
ds = loompy.connect("test.loom")
ds.close()
用到了再用实例完善。