探序基因肿瘤研究院 整理
相关后缀的格式介绍:
.h5ad:是一种用于存储单细胞数据的文件格式,可以通过 anndata
库在 Python 中处理
.loom:高效的数据存储格式(.loom 文件),使得用户可以轻松地存储、查询和分析大规模的单细胞数据集。Loompy 的设计目标是提供一个快速、灵活且易于使用的工具,以支持生物信息学家和研究人员在单细胞水平上进行数据分析。
python的单细胞转录组数据结构说明:
data.X 存储count matrix,数据类型为稀疏矩阵scipy.sparse.csr.csr_matrix
data.obs 存储关于 obervations(cells) 的 metadata,数据类型为 pandas dataframe
data.var 存储关于 variables(genes) 的 metadata,数据类型为 pandas dataframe
Anndata是生物学领域中用于存储单细胞信息的常见数据结构,本文将为您详细介绍Anndata的各个部分。
观察Anndata的结构,可以发现“X”、“obs”、“obsm”和“obsp”的行相同,而“X”、“var”、“varm”和“varp”的列相同。
接下来,让我们逐一了解各部分的意义:
1. obs:表示样本信息,包括细胞的属性和标记。
2. obsm:存储样本的额外信息,如细胞的时空位置。对于观测的多维注释,它是可变的ndarray,就是说维度是可变的!小云偷偷告诉你,这里的维度一般是2至多维哦。而Obsm这里的m指的就是multi-dim多个维度的,obs_m对应于obs,但obs的每个成员都是一维的观测注释,obs_m的每个成员(X_pac和X_umap)都是多维的观测注释。哦对了,忘了告诉你,obs就是矩阵的行,也就是样本!
3. obsp:记录样本之间的关系或距离,如细胞间的相似度。
4. var:代表变量信息,对应细胞表达的基因。
5. varm:存储变量的额外信息,如基因的功能或注释。
6. varp:记录变量的额外属性,如基因的表达范围。
7. uns:包含未分类或未指定的数据,可用于存放实验设置、参数或任何未在其他部分记录的信息。
参考:Scanpy数据结构:AnnData - 何帅 - 博客园,单细胞分析的 Python 包 Scanpy(图文详解)
具体操作:
在R中,将基因表达矩阵输出成txt文件(按制表符\t分隔),在python中读入。
import scanpy as sc
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
adata_sc = pd.read_csv("xxx.gcmat.txt", sep='\t', index_col=0)
adata_sc = adata_sc[~adata_sc.index.duplicated(keep='first')]
adata_sc = sc.AnnData(X=adata_sc.values.T, obs=pd.DataFrame(index=adata_sc.columns), var=pd.DataFrame(index=adata_sc.index))
sc.pp.normalize_total(adata_sc, target_sum=1e4)
sc.pp.log1p(adata_sc)
adata_sc.raw = adata_sc
sc.pp.highly_variable_genes(adata_sc, min_mean=0.0125, max_mean=3, min_disp=0.5)
sc.pl.highly_variable_genes(adata_sc)
plt.savefig("highly_variable_genes.pdf")
sc.pp.regress_out(adata_sc, ['total_counts', 'pct_counts_mt'])
sc.pp.scale(adata_sc,max_value=10)
sc.tl.pca(adata_sc, svd_solver='arpack')
sc.pl.pca_variance_ratio(adata_sc,log=True)
plt.savefig("PCA.pdf")
sc.pp.neighbors(adata_sc, n_neighbors=10, n_pcs=25)
sc.tl.leiden(adata_sc,resolution=0.3)
sc.tl.umap(adata_sc)
sc.pl.umap(adata_sc, color=['leiden'])
plt.savefig("Umap.pdf")
保存:
import pickle
with open('xxx.adata.sc.pkl', 'wb') as f:
pickle.dump(adata_sc,f)
数据结构:
>>> adata_sc
AnnData object with n_obs × n_vars = 17732 × 20476
obs: 'n_genes_by_counts', 'total_counts', 'total_counts_mt', 'pct_counts_mt', 'total_counts_hb', 'pct_counts_hb', 'total_counts_ribo', 'pct_counts_ribo', 'leiden'
var: 'mt', 'hb', 'ribo', 'n_cells_by_counts', 'mean_counts', 'pct_dropout_by_counts', 'total_counts', 'highly_variable', 'means', 'dispersions', 'dispersions_norm', 'mean', 'std'
uns: 'log1p', 'hvg', 'pca', 'neighbors', 'leiden', 'umap', 'leiden_colors'
obsm: 'X_pca', 'X_umap'
varm: 'PCs'
obsp: 'distances', 'connectivities'
使用案例:
访问X_umap:
>>> adata_sc.obsm["X_umap"]
array([[-0.37170717, 1.7448593 ],
[ 0.5783125 , -0.25678745],
[ 0.8823264 , 1.909029 ],
...,
[-1.5174662 , 9.025265 ],
[ 0.65086323, 8.25642 ],
[ 4.3083034 , 9.791711 ]], dtype=float32)
>>> type(adata_sc.obsm["X_umap"])
这个是numpy.ndarray的数据结构。可通过如下方式访问
>>> adata_sc.obsm["X_umap"][0,0]
-0.37170717
将其转换成两个一维数组x和y
umap=adata_sc.obsm['X_umap']
x = [d[0] for d in umap]
y = [d[1] for d in umap]
构建这个array:
>>> pp=np.array([[1.2,1.2],[4.1,3.1],[7.1,8.1]],dtype=float)
>>> pp
array([[1.2, 1.2],
[4.1, 3.1],
[7.1, 8.1]])
分群信息:
>>> adata_sc.obs.leiden
AAACCTGAGACACGAC.5 2
AAACCTGCACACCGCA.5 2
AAACCTGCAGTCCTTC.5 2
AAACCTGGTACGAAAT.5 2
AAACCTGGTCCAGTAT.5 2
..
TTTGTCACAATAACGA.4 4
TTTGTCACACCTCGGA.4 1
TTTGTCACACGAAATA.4 1
TTTGTCAGTACTTAGC.4 1
TTTGTCAGTATAAACG.4 3
Name: leiden, Length: 17732, dtype: category
Categories (6, object): ['0', '1', '2', '3', '4', '5']
参考:CSDN-Python之numpy:数组定义&ndarray操作,简书-Numpy: 构建ndarray