1.基于python的单细胞数据预处理-特征选择

文章目录

  • 特征选择背景
  • 基于基因离散度
  • 基于基因归一化方差
  • 基于基因皮尔森近似残差
  • 特征选择总结

参考:
[1] https://github.com/Starlitnightly/single_cell_tutorial
[2] https://github.com/theislab/single-cell-best-practices

特征选择背景

现在已经获得了经过归一化的测序数据,其保留了细胞异质性,同时削弱了测量误差。统计发现,一个细胞表达的基因大约是3000个左右。这意味着测序数据中的一大部分基因是0计数。对于细胞亚型的研究,大部分0计数基因都在这些细胞亚型中,因此,预处理还包含特征选择,可以排除这些不具备分析意义的基因。

基因特征选择一般有三种方法:基于基因离散度,基于基因归一化方差,基于基因的皮尔森残差。

基于基因离散度

在传统的分析流程中,我们会采用基于基因离散度的方式去计算高变基因,一般来说,我们首先确定了单细胞数据集中变异最大的一组基因。我们计算了所有单细胞中每个基因的平均值和离散度(方差/平均值),并根据基因的平均值将基因分为 20 个箱(bins)。然后,在每个箱内,我们对箱内所有基因的离散度进行z归一化,以识别表达值高度可变的基因。

我们使用移位对数归一化后的数据:

import omicverse as ov
import scanpy as sc

ov.utils.ov_plot_set()

adata = sc.read("./data/s4d8_quality_control.h5ad")

#存储原始数据以便后续还原
ov.utils.store_layers(adata,layers='counts')
adata.layers['counts'] = adata.X.copy()

sc.pp.normalize_total(adata)
sc.pp.log1p(adata)
print(adata)

调用scanpy包里的pp.highly_variable_genes函数来计算高可变基因,由于我们使用的是基于基因离散度的方法,故设置flavor='seurat',该方法也是默认方法。基于基因离散度的方法寻找高变基因有两个方式:

  • 指定HVG数量,应用广泛,简单直接。
  • 指定离散度,数据敏感,应用其实很少,还是推荐指定HVG数量。

对于指定HVG数量:

adata_dis_num=sc.pp.highly_variable_genes(
    adata,
    flavor="seurat",
    n_top_genes=2000,
    subset=False,
    inplace=False,
)
print(adata)
print(adata_dis_num)
print(adata_dis_num['highly_variable'].value_counts())

设置inplace=False,将不会改变adata的var(打印adata的视图时,var中没有出现highly_variable)。输出为:
fig1
我们发现,一共选择了2000个高可变基因,这与我们最开始的分析目标一致。

基于基因归一化方差

在seurat v3中,提出了基于基因归一化方差做特征选择,我们不再使用归一化后的数据来计算高变基因。我们首先计算每一个基因的平均值 x ‾ i \overline{x}_{i} xi与方差 σ i \sigma_{i} σi,然后分别对平均值与方差进行log对数变换,然后用2次多项式,将方差作为均值的函数,进行多项式回归: σ ( x ) = a x 2 + b x + c \sigma(x)=ax^{2}+bx+c σ(x)=ax2+bx+c通过这个公式,可以获得每一个基因的预测方差,然后进行z变换: z i j = x i j − x ‾ i σ ( x i ) z_{ij}=\frac{x_{ij}-\overline{x}_{i}}{\sigma(x_{i})} zij=σ(xi)xijxi其中, z i j z_{ij} zij是细胞 j j j中基因 i i i的归一化值, x i j x_{ij} xij是细胞 j j j中基因 i i i的原始值, x ‾ i \overline{x}_{i} xi是所有细胞基因 i i i的平均原始值, σ ( x i ) \sigma(x_{i}) σ(xi)是预测的方差。对于特征选择,根据预测的方差进行排序即可。

在scanpy中,需要flavor='seurat_v3',并指定计数矩阵是没有归一化的layer='counts'

adata_var_num=sc.pp.highly_variable_genes(
    adata,
    flavor="seurat_v3",
    layer='counts',
    n_top_genes=2000,
    subset=False,
    inplace=False,
)
print(adata_var_num['highly_variable'].value_counts())

基于基因皮尔森近似残差

基于皮尔森近似的方法也是使用原始计数:

adata_pearson_num=sc.experimental.pp.highly_variable_genes(
    adata, 
    flavor="pearson_residuals",
    layer='counts',
    n_top_genes=2000,
    subset=False,
    inplace=False,
)
print(adata_pearson_num['highly_variable'].value_counts())

特征选择总结

对比三种不同的方法:

import matplotlib.pyplot as plt
from matplotlib_venn import venn3

adata_dis_num.index=adata.var_names.copy()
adata_var_num.index=adata.var_names.copy()
adata_pearson_num.index=adata.var_names.copy()

# 三个列表的元素
list1 = set(adata_dis_num.loc[adata_dis_num['highly_variable']==True].index.tolist())
list2 = set(adata_var_num.loc[adata_var_num['highly_variable']==True].index.tolist())
list3 = set(adata_pearson_num.loc[adata_pearson_num['highly_variable']==True].index.tolist())

# 绘制 Venn 图
venn = venn3([list1, list2, list3], set_labels=('Dis', 'Var', 'Pearson'))

# 显示图形
plt.title("Venn Diagram of Three HVGs")
plt.savefig("./result/2-5.png")

fig2

发现三种不同方法所找到的高可变基因(HVGs)仅有656个是相同的,这意味着不同的方法所寻找到的高可变基因会影响下游分析的结果一致性。如果对时间要求不严格,推荐使用皮尔森残差法来获得高可变基因。如果需要快速,推荐基于基因离散度的方法。

在omicverse中,归一化和特征选择预处理被包装好了,mode参数为normalize|HVGs,前者是归一化,后者是特征选择:

adata = sc.read("./data/s4d8_quality_control.h5ad")
#存储原始数据以便后续还原
ov.utils.store_layers(adata,layers='counts')
adata.layers['counts']=adata.X.copy()

adata=ov.pp.preprocess(adata,
                       mode='shiftlog|pearson',
                       n_HVGs=2000)
print(adata)

# 存储预处理后的数据
adata.write_h5ad('./data/s4d8_preprocess.h5ad')

在结果上,注意:与scanpy不同,omicverse计算高可变基因后,将保存为var['highly_variable_features'],而在scanpy中,HVG将保存为var['highly_variable'],都是包含bool值的Series。

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

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

相关文章

企业微信集成H5授权登录相关知识(二)

流程: 1.前端请求企业微信获取code:官网网页授权链接 2.企业微信返回的code请求后端判断是否已绑定系统账户 3.后端根据企业微信code,accessToken获得userId 4.userId获取user进行oauth2授权方式进行免密登录 相关知识: 一&a…

初阶数据结构—顺序表和链表

第一章:线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就…

土壤墒情自动监测站—墒情异常数据报警提示

TH-TS600土壤墒情自动监测站通常配备有预警提示功能,用于在墒情出现异常情况时及时向用户发出警告。这一功能对于农业生产至关重要,因为它可以帮助农民或农田管理者及时发现土壤墒情的变化,并采取相应的措施来确保作物健康生长。 土壤墒情自动…

Redis之Stream流

reidis为了抢占市场份额,推出了自己的消息队列,Stream流, 常用操作如下: xadd name id值 key value key1 value1...:若不存在为name的stream流,则创建一个新的名为name的stream流。这里id相当于数据库中的…

修改ollama模型文件下载位置

修改ollama模型文件下载位置。你如果不改这个东西,所有的模型文件都会下到c盘,土豪随意。 这里修改环境变量: OLLAMA_MODELS将这个环境变量设置为你想存放的路径。然后重启电脑!

鹦鹉优化算法原理及代码实现

鹦鹉(Pyrrhura Molinae)表现出四种不同的行为特征:觅食、停留、交流和对陌生人的恐惧。这些行为(如图1所示)在现实环境中构成了我们设计PO动机的基础。 觅食:驯化的鹦鹉(Pyrrhura Molinae)的觅食行为令人着迷,因为个体选择在食物丰富的小群体…

Leetcode—239. 滑动窗口最大值【困难】

2024每日刷题&#xff08;132&#xff09; Leetcode—239. 滑动窗口最大值 算法思想 用vector会超时的&#xff0c;用deque最好&#xff01; 实现代码 class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> …

PCIE学习(2)PCIE配置空间详解

文章目录 前言一、配置空间header二、Base Address register&#xff08;BAR&#xff09;2.1、BAR是干什么的2.2、具体实现过程BAR示例1——32bit内存地址空间请求BAR示例2——64bit内存地址空间请求 前言 图片来自&#xff1a;https://zhuanlan.zhihu.com/p/463518877 一、…

【Linux网络编程】I/O多路转接之select

select 1.初识select2.了解select基本概念和接口介绍3.select服务器4.select特点及优缺点总结 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603;…

乡村振兴与农村基础设施建设:加大农村基础设施建设投入,提升农村公共服务水平,改善农民生产生活条件,构建宜居宜业的美丽乡村

一、引言 乡村振兴是我国现代化进程中的重要战略&#xff0c;而农村基础设施建设则是乡村振兴的基石。随着城市化进程的加快&#xff0c;农村基础设施建设滞后的问题日益凸显&#xff0c;成为制约乡村发展的瓶颈。因此&#xff0c;加大农村基础设施建设投入&#xff0c;提升农…

error C2039: “NotifySeverity“: 不是 “osg“ 的成员 问题分析

程序从osg3.6.5Qt5.9osgearth2.10环境中移植到osg3.7.0Qt5.15.2osgearth3.3环境中&#xff0c;出现了无尽的错误。 有些错误很莫名奇妙&#xff0c;比如下述错误&#xff1a; D:\OsgEarth3.3\include\osgEarth\Notify(34,53): error C2039: "NotifySeverity": 不是 &…

Matlab 验证 复数的幂计算规则

复数的幂计算规则 close all a9; b0:0.1:5;result1 exp(1j*2*pi*a.*b); result2 (exp(1j*2*pi*a)).^b; idxfind(result1result2); b_idxb(idx);figure plot(b,angle(result1(:)),-r*) hold on plot(b,angle(result2(:)),bo) grid on

一个优秀 Maven 项目,各 Model 间最佳继承设计方案

1.单一职责原则 (Single Responsibility Principle): 每个模块应该专注于执行一个清晰且明确定义的功能&#xff0c;遵循单一职责原则&#xff0c;以降低模块的复杂性。 2.高内聚性 (High Cohesion): 模块内的组件和类应该紧密相关&#xff0c;共同实现模块的目标。高内聚性…

文旅行业| 某景区导游培养和管理项目成功案例纪实

——整合导游资源并进行统一管理&#xff0c;构建完善的培养与管理机制&#xff0c;发挥景区导游价值 【客户行业】文旅行业&#xff1b;景区&#xff1b;文旅企业 【问题类型】人才培养&#xff1b;人员管理 【客户背景】 南方某5A级景区&#xff0c;作为国内极具代表性和特…

QT--5

1> 将网络聊天室重新实现一遍 服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ser new QTcpServer(this); }Widget::~Widget() {delete ui; }vo…

H5 鼠标点击粒子扩散效果

&#x1f9d0;别人的博客中有这样的效果&#xff0c;于是自己就尝试实现了一下。 效果如图 源码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

Centos 停服倒计时!你的操作系统何去何从?

在计算机技术的不断演进中&#xff0c;操作系统扮演着至关重要的角色。然而&#xff0c;对于许多企业和个人用户来说&#xff0c;CentOS的突然停服消息带来了一场不小的冲击。作为一款备受欢迎的企业级Linux发行版&#xff0c;CentOS的停服意味着用户需要重新评估自己的操作系统…

MPEG-4 AVC/H.264高清编码器 JR3211P

概述 JR3211P MPEG-4 AVC/H.264高清编码器是一款专业的高清音/视频编码产品。该产品支持几乎所有模拟及数字音/视频输入接口&#xff0c;包括CVBS、YPbPr、S-video、SD/HD-SDI、HDMI视频输入接口、平衡模拟音频&#xff08;XLR&#xff09;、非平衡模拟音频&#xff08;RCA&am…

NX/UG二次开发—3D几何—多边形内部最大圆

多边形内部最大圆&#xff0c;为什么不能说最大内切圆&#xff1f;如果正方形或正凸多边形&#xff0c;最大内部圆是与边相切的&#xff0c;但对于不规则多边形&#xff0c;很多情况是正好经过一些凹点。 本次介绍在NX中计算封闭边界内部最大圆&#xff1a; 1、首先按顺序排序…

bitmap requires a valid src attribute

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览三、问题记录四、 推…