基于python使用scanpy分析单细胞转录组数据

探序基因肿瘤研究院  整理

相关后缀的格式介绍:

.h5ad:是一种用于存储单细胞数据的文件格式,可以通过 anndata 库在 Python 中处理

.loom:高效的数据存储格式(.loom 文件),使得用户可以轻松地存储、查询和分析大规模的单细胞数据集。Loompy 的设计目标是提供一个快速、灵活且易于使用的工具,以支持生物信息学家和研究人员在单细胞水平上进行数据分析。

python的单细胞转录组数据结构说明:

基于python使用scanpy分析单细胞转录组数据_第1张图片

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

你可能感兴趣的:(单细胞分析,python,开发语言)