Scanpy(1)数据结构和样本过滤

注:主要讲述scanpy处理数据的结构、数据过滤(生信领域)和数据预处理(和机器学习类似,但是又有不同。)

1. Scanpy简介与安装

Scanpy 是一个可扩展的工具包,用于分析与 AnnData(一种数据结构)联合构建的单细胞分析数据。
fig1

通过conda,使用命令cd进入whl文件所在的目录后,然后通过pip安装:

pip install scanpy

2. AnnData

2.1 AnnData的结构

在scanpy中,我们最常见的数据结构是AnnData,它是一个用于存储数据的对象,其数据结构可以描述如下:
fig2
我们把上面这个对象记作 adata,我们需要了解以下几个部分:

功能类型
adata.X矩阵numpy矩阵
adata.obs观测量pandas Dataframe
adata.var特征量pandas Dataframe
adata.uns非结构化数据字典dict

为了进一步了解这个数据结构,我们手动构建一个AnnData对象:

import numpy as np
import pandas as pd
import anndata as ad
from string import ascii_uppercase

# 设置观测样本的数量
n_obs=1000
# obs用于保存观测量的信息
obs=pd.DataFrame()

# numpy.random.choice(a, size=None, p=None)
# 从a(ndarray, 但必须是一维的)中随机抽取元素, 并组成指定大小(size)的数组
# 数组p: 与数组a对应, 表示取数组a中每个元素的概率, 默认情况下选取每个元素的概率相同
obs['time']=np.random.choice(['day1','day2','day4','day8'],size=n_obs)

# 设置特征名var_names
print(ascii_uppercase) # ABCDEFGHIJKLMNOPQRSTUVWXYZ
var_names=[i*letter for i in range(1,10) for letter in ascii_uppercase]
print(var_names)
# ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', ......, 'X', 'Y', 'Z',
# ......
# 'AAAAAAAAA', 'BBBBBBBBB', 'CCCCCCCCC', ......, 'YYYYYYYYY', 'ZZZZZZZZZ']

# 特征数量
n_vars=len(var_names) # 234

# 将特征定义到 Dataframe
var=pd.DataFrame(index=var_names)
print(var.head()) # 现在var没有columns(列索引), 只有index(行索引)

# 创建数据矩阵 adata.X
X=np.arange(n_obs*n_vars).reshape(n_obs,n_vars)
1234567891011121314151617181920212223242526272829303132

然后初始化 AnnData 对象,AnnData 对象默认采用数据类型 float32,我们为了便于后期观察打印结果,设置数据类型为 int32:

adata=ad.AnnData(X,obs=obs,var=var,dtype='int32')

# 查看数据
print(adata)
"""
AnnData object with n_obs × n_vars = 1000 × 234
    obs: 'time'
"""

# 查看adata的X矩阵
print(adata.X)
"""
[[     0      1      2 ...    231    232    233]
 [   234    235    236 ...    465    466    467]
 [   468    469    470 ...    699    700    701]
 ...
 [233298 233299 233300 ... 233529 233530 233531]
 [233532 233533 233534 ... 233763 233764 233765]
 [233766 233767 233768 ... 233997 233998 233999]]
"""
1234567891011121314151617181920

一般对于adata.X,行对应观测(即,细胞),列对应特征(即,基因);

我们每次操作 AnnData 时,并不是再新建一个 AnnData 来存储数据,而是直接找到已经在之前初始化好的 AnnData 的内存地址,通过内存地址来直接改变 AnnData 的值。这样做的好处是:

  • 无需分配多余的内存;
  • 可以直接修改已经初始化后的 AnnoData 对象;

比如:

# 查看 'A' 列的头三个元素
print(adata[:3, 'A'].X)
"""
[[  0]
 [234]
 [468]]
"""

# 设置 'A' 列的头三个元素
adata[:3, 'A'].X = [0, 0, 0]

# 再查看 'A' 列的头五个元素发现值被修改了
print(adata[:5, 'A'].X)
"""
[[  0]
 [  0]
 [  0]
 [702]
 [936]]
"""
1234567891011121314151617181920

但是,如果将 AnnData 对象中的一部分赋值到新对象,该对象会得到一块新内存用于存储实际数据,而不再是对原来adata对象的内存地址引用,比如:

adata_subset = adata[:5, ['A', 'B']]
print(adata_subset)
"""
View of AnnData object with n_obs × n_vars = 5 × 2
    obs: 'time'
"""

# 为新对象 adata_subset 增加观测量 'foo'
adata_subset.obs['foo'] = range(5)
print(adata_subset)
"""
AnnData object with n_obs × n_vars = 5 × 2
    obs: 'time', 'foo'
"""
1234567891011121314

2.2 h5ad:AnnData的写入和读取

我们可以将AnnData对象通过h5ad文件保存到磁盘中,保存过程如下:

# 计算对象的大小
def print_size_in_MB(x):
    print('{:.3} MB'.format(x.__sizeof__()/1e6))

# 查看对象大小
print_size_in_MB(adata) # 0.187 MB

# 查看是否备份
print(adata.isbacked) # False

# 设置备份地址
adata.filename = './test.h5ad'

# 查看是否备份成功
print(adata.isbacked) # True
123456789101112131415

adata.isbacked 状态为 True 后,证明对象已经被写入磁盘;

相反的,我们可以利用 scanpy 很方便地读取文件,获得 AnnData 对象:

import scanpy as sc

Myadata=sc.read('./test.h5ad')
print(Myadata)
"""
AnnData object with n_obs × n_vars = 1000 × 234
    obs: 'time'
"""
12345678

3. Scanpy中一些常用api的用法介绍

首先导入Scanpy:

import scanpy as sc
1

3.1 sc.pp.filter_cells

sc.pp.filter_cells(data, min_genes=None, max_genes=None) 
1

常常用于预处理中,做一些细胞筛选的工作,该函数保留至少有 min_genes 个基因的细胞,或者保留至多有 max_genes 个基因的细胞;

另外注意,参数 min_genes 和参数 max_genes 不能同时传递;

实例:

# 导入数据
adata=sc.datasets.krumsiek11() # 5类细胞, 640个细胞样本, 共测量11种基因
print(adata)
"""
AnnData object with n_obs × n_vars = 640 × 11
    obs: 'cell_type'
    uns: 'iroot', 'highlights'
"""

print(adata.n_obs) # 640个细胞

# 11个基因(即特征)
print(adata.var_names)
"""
Index(['Gata2', 'Gata1', 'Fog1', 'EKLF', 'Fli1', 'SCL', 'Cebpa', 'Pu.1',
       'cJun', 'EgrNab', 'Gfi1'],
      dtype='object')
"""

### 注意观察细胞数量变化 ###
sc.pp.filter_cells(adata,min_genes=0) # 相当于没有筛选

print(adata.n_obs) # 640

print(adata.obs)
"""
      cell_type  n_genes
0    progenitor        9
..          ...      ...
159         Neu        8
细胞一共就5类, 每一类有不同数量个细胞, cell_type左边的index不是dataframe的真正int型index, 
是字符串index, 仅表示每类细胞的index, 比如Neu范围是0到159 
"""
print(set(adata.obs['cell_type'].values)) # 5类细胞{'Neu', 'progenitor', 'Ery', 'Mo', 'Mk'}
print(adata.obs['n_genes'].min()) # 4, 每个细胞至少测量了4个基因

sc.pp.filter_cells(adata,min_genes=6) # 选择测量了6个基因以上的细胞
print(adata.n_obs) # 630
print(adata.obs['n_genes'].min()) # 6
123456789101112131415161718192021222324252627282930313233343536373839

3.2 sc.pp.filter_genes

sc.pp.filter_genes(data, min_cells=None, max_cells=None) 
1

该函数用于保留在至少 min_cells 个细胞中出现的基因,或者保留在至多 max_cells 个细胞中出现的基因;

参数 min_cells 和参数 max_cells 不能同时传递;

对比 sc.pp.filter_cells 可以发现,sc.pp.filter_genes 用于选择基因(筛选列),sc.pp.filter_cells 用于选择细胞(筛选行);

3.3 sc.pp.highly_variable_genes

sc.pp.highly_variable_genes(
							data, 
							n_top_genes=None, 
							min_disp=0.5, 
							max_disp=inf, 
							min_mean=0.0125, 
							max_mean=3)
1234567

该函数用于确定高变基因;

常用参数说明:

  • data:AnnData Matrix,行对应细胞列对应基因
  • n_top_genes:要保留的高变基因的数量

高变异基因就是highly variable features(HVGs),就是在细胞与细胞间进行比较,选择表达量差别最大的基因,Seurat使用FindVariableFeatures函数鉴定高变基因,这些基因在不同细胞之间的表达量差异很大(在一些细胞中高表达,在另一些细胞中低表达)。默认情况下,会返回2,000个高变基因用于下游的分析。

利用FindVariableFeatures函数,会计算一个mean-variance结果,也就是给出表达量均值和方差的关系并且得到top variable features,这一步的目的是鉴定出细胞与细胞之间表达量相差很大的基因,用于后续鉴定细胞类型。

标记基因 (marker gene),是一种已知功能或已知序列的基因,能够起着特异性标记的作用。

3.4 sc.pp.normalize_total

sc.pp.normalize_total(adata, target_sum=None, inplace=True)
1

函数可以对每个细胞进行标准化,以便每个细胞在标准化后沿着基因方向求和具有相同的总数target_sum

实例:

adata.X
array([[ 3.,  3.,  3.,  6.,  6.],
       [ 1.,  1.,  1.,  2.,  2.],
       [ 1., 22.,  1.,  2.,  2.]], dtype=float32)
# 设置 target_sum=1 标准化后
X_norm
array([[0.14, 0.14, 0.14, 0.29, 0.29],
       [0.14, 0.14, 0.14, 0.29, 0.29],
       [0.04, 0.79, 0.04, 0.07, 0.07]], dtype=float32)
123456789

ta.X
array([[ 3., 3., 3., 6., 6.],
[ 1., 1., 1., 2., 2.],
[ 1., 22., 1., 2., 2.]], dtype=float32)

设置 target_sum=1 标准化后

X_norm
array([[0.14, 0.14, 0.14, 0.29, 0.29],
[0.14, 0.14, 0.14, 0.29, 0.29],
[0.04, 0.79, 0.04, 0.07, 0.07]], dtype=float32)
123456789


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563510.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

螺纹滑牙的原因有哪些——SunTorque智能扭矩系统

螺纹滑牙的原因,通常是由于在旋紧或旋松过程中,螺纹副之间的摩擦力不足以维持所需的预紧力或工作载荷,导致螺纹副的相对位置发生变化。这种现象可能由多种因素引起,包括材料选择不当、设计不合理、制造工艺缺陷、环境因素以及使用…

欧科云链:香港虚拟资产OTC合规在即,技术监管成市场规范关键

4月12日香港OTC发牌制度公众咨询结束后,欧科云链研究院在星岛日报发表专栏文章,分享对香港OTC市场的调研情况,并提出“技术监管是香港OTC及Web3生态走向规范的关键”。欧科云链研究院认为,随着OTC监管及虚拟资产现货ETF等事件向前…

DC30V36V60V100V转9V、12V/1.5A方案 车灯驱动芯片IC H5028L ,高性价比,皮实耐抗

DC24V、30V、36V、60V、100V转9V、12V/1.5A方案,以及车灯驱动芯片IC,这通常涉及到电源转换和驱动电路的设计。这些方案的目标是将一个较高的直流电压(如24V、30V、36V、60V或100V)转换为较低但稳定的直流电压(如9V或12…

Leetcode 第 394 场周赛

Leetcode 第 394 场周赛 1. [统计特殊字母的数量 I](https://leetcode.cn/problems/count-the-number-of-special-characters-i/)2. [统计特殊字母的数量 II](https://leetcode.cn/problems/count-the-number-of-special-characters-ii/)3. [使矩阵满足条件的最少操作次数](htt…

前端工程化02-复习jQuery当中的插件开发

2、jQuery插件开发 在我们开发的时候、有时候jQuery提供的方法并不能满足我们的需求,如果我们想给jQuery扩展一些其他的方法,那这种情况下,可能会需要写一个插件 jQurey官网:jquery.com 例如一些、图片懒加载插件、滚动的插件、…

BUUCTF-MISC-04大白

题目:让图片全面显示宽高 更改高宽一致 发现大白没有完全显示,优先考虑到图片高度隐写,猜测是FLAG隐藏在少掉的部分里,所以需要修改图片的高度与宽一致 我们借助010工具完成操作 根据内容可以看到高和宽不一样,这时候&#xff0…

图像处理基础知识

图像处理基础知识 图像 1、模拟图像 模拟图像,又称连续图像,是指在二维坐标系中连续变化的图像,即图像的像点是无限稠密的,同时具有灰度值(即图像从暗到亮的变化值)。 2、数字图像 数字图像&#xff0…

Jenkins CI/CD 持续集成专题一 Jenkins的安装和配置

一 jenkins 官方教程 安装Jenkins 二 安装 2.1 安装方式一 通过安装包的package方式安装 第一步下载链接: Download the latest package 第二步操作方式:打开包装并按照说明操作 2.2 安装方式二 brew安装 第一 安装最新版本jenkins brew install …

C语言进阶课程学习记录 - 函数的意义

C语言进阶课程学习记录 - 函数的意义 实验-声明与定义小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-声明与定义 //global.c #include <stdio.h>//int g_var 10;//case1float g_var …

极客时间《SQL必知必会》学习笔记

开篇词丨SQL可能是你掌握的最有用的技能 尽管技术人员或多或少地会使用 SQL&#xff0c;但不同的人编写出来的 SQL 的效率是不同的&#xff0c;比如说一份好的 SQL 执行计划就会尽量减少 I/O 操作&#xff0c;因为 I/O 是 DBMS &#xff08;数据库管理系统&#xff0c;Database…

上位机图像处理和嵌入式模块部署(树莓派4b进行驱动的编写)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 树莓派4b上面还支持驱动代码的编写&#xff0c;这是我没有想到的。这里驱动&#xff0c;更多的是一种框架的编写&#xff0c;不一定是编写真正的驱…

提取出图像的感兴趣区域

这是我们的原图像 将图像的数值统计后进行条形图展示 import matplotlib.pyplot as plt from PIL import Image import numpy as np# 图像路径 image_path r"D:\My Data\Figure\OIP.jpg"# 打开图像 image Image.open(image_path)# 将图像转换为numpy数组 image_ar…

C#控制台相关方法

控制台相关方法 文章目录 控制台输入1、清空2、设置控制台3、设置光标位置&#xff0c;1y 2x4、设置颜色相关5、光标显隐6、关闭控制台思考 移动方块 控制台输入 //如果ReadKey(true)不会把输入的内容显示再控制台上 char c Console.ReadKey(true).KeyChar;1、清空 ​ Cons…

poll实现echo服务器的并发

poll实现echo服务器的并发 代码实现 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/time.h> #include <unistd.h> #…

C++ 初识模板

目录 0.前言 1.泛型编程 2.函数模板 2.1概念 2.2格式 2.3原理 2.4函数模板的实例化 2.4.1隐式实例化 2.4.2显式实例化 2.5模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 4.结语 &#xff08;图像由AI生成&#xff09; 0.前言 在 C 中&a…

密码学 | 承诺:常见的承诺方案

&#x1f951;原文&#xff1a;密码学原语如何应用&#xff1f;解析密码学承诺的妙用 - 知乎 1 简介 密码学承诺 涉及 承诺方、验证方 两个参与方&#xff0c;以及以下两个阶段&#xff1a; 承诺阶段&#xff1a;承诺方选择一个敏感数据 v v v&#xff0c;为它计算出相应…

【团体程序设计天梯赛】L2-052 吉利矩阵

思路&#xff1a; 直接回溯枚举每一个位置填的数&#xff0c;二维肯定是不方便的&#xff0c;我们转成一维&#xff0c;下标x从0到n*n-1。二维数组下标从0到n-1&#xff0c;在一维中下标为x的点在二维中对应行是x/n&#xff0c;列是x%n。 每个数最小能填的是0&#xff0c;最大…

总结线程池

目录 导言&#xff1a; 正文&#xff1a; 1.概念 2.线程池的组成和基本原理 3.使用ThreadPoolExecutor创建线程池 4.使用Executors 创建常见的线程池 总结&#xff1a; 导言&#xff1a; 虽然创建销毁线程比创建销毁进程更轻量&#xff0c; 但是在频繁创建销毁线程的时候…

深度学习transformer架构详细详解

一、transformer的贡献 transformer架构的贡献&#xff1a;该架构只使用自注意力机制&#xff0c;没有使用RNN或卷积网络。且可以实现并行计算&#xff0c;加快模型训练速度。 &#xff08;将所有的循环层全部换成&#xff1a;multi-headed self-attention&#xff09; 二、t…

JavaScript运算符(赋值、自增自减、比较、逻辑、展开、优先级)、分支语句(if、三元表达式、switch)、循环结构(while、for)、断点调试

目录 1. 运算符1.1 赋值运算符1.2 自增和自减运算符1.3 比较运算符1.4 逻辑运算符1.5 展开运算符1.6 运算符优先级 2. 分支语句2.1 if2.2 三元表达式2.3 switch 3. 循环结构3.1 while循环3.2 for循环 4. 断点调试 1. 运算符 1.1 赋值运算符 -*/% 1.2 自增和自减运算符 前置…