Seurat的normalization和scaling
Seurat的分析流程有两步, 对数据的normalization和scaling. 两种的作用不同,前者是为了处理每个细胞的总count不同的问题,而后者则是让每个基因的表达量的均值为0,方差为1.
normlization对应的函数是NormalizeData
,通过数据进行一些列变换,消除文库大小的影响。 它有三种方法, LogNormalize, CLR, RC
默认方法方式是LogNormalize, 即对于每个细胞,将每个基因的count除以总数,然后乘以一个scale.factor, 之后以自然对数进行转换。为了提高效率,Seurat编写了C++
代码用于加速
// [[Rcpp::export]]
Eigen::SparseMatrix<double> LogNorm(Eigen::SparseMatrix<double> data, int scale_factor, bool display_progress = true){Progress p(data.outerSize(), display_progress);Eigen::VectorXd colSums = data.transpose() * Eigen::VectorXd::Ones(data.rows());for (int k=0; k < data.outerSize(); ++k){p.increment();for (Eigen::SparseMatrix<double>::InnerIterator it(data, k); it; ++it){it.valueRef() = log1p(double(it.value()) / colSums[k] * scale_factor);}}return data;
}
也就是说,如果你不追求效率,我们是可以用纯R代码实现。
mat <- matrix(data = rbinom(n = 25, size = 5, prob = 0.2), nrow = 5)
mat_norm <- LogNormalize(data = mat)
# LogNormalize等价于
log1p(t(t(mat) / colSums(mat)) * 10000)
Scale这一步对应的函数是ScaleData
, 在它处理之后,使得每个基因在所有样本的均值是0,而方差是1。这让每个基因在下游分析中的具有相同的权重,使得高表达基因不那么显著。
而如果需要移除数据集中不需要的变异来源(unwanted sources of variation), ScaleData
需要设置额外的参数vars.to.regress
,但是作者更加推荐使用SCTransform
。
尽管ScaleData
对应的源代码非常的长,但是和数据处理相关的就是如下这几条
# Currently, RegressOutMatrix will do nothing if latent.data = NULL
data.scale <- scale.function(mat = object[features[block[1]:block[2]], split.cells[[group]], drop = FALSE],scale = do.scale,center = do.center,scale_max = scale.max,display_progress = FALSE
)
其中scale.function
是根据数据类型来决定是FastRowScale
还是FastSparseRowScale
, 而这两个代码Seurat也是通过C++
进行提速了。因此,如果不追求效率,还是可以用纯R代码实现。
pbmc_small <- ScaleData(pbmc_small)
GetAssayData(pbmc_small, "scale.data")[c("IGLL5"),1:2]
# 等价于
scaled_data <- t(scale(t(GetAssayData(pbmc_small, "data"))))
scaled_data[c("IGLL5"),1:2]
默认R语言的
scale
是按列处理,对于行为基因,列为样本的数据,可以直接套用。但是Seurat的输入数据是行为基因,列为样本,那么就需要按行scale。换句话说,如果你需要对行进行scale,那么你可以通过Seurat:::FastRowScale()
的方式调用Seurat写的FastRowScale
函数。此外Seurat编写了大量的Fast*
函数,都可以尝试用在代码中。
Seurat的normalization和scaling相关推荐
- seurat提取表达矩阵_Seurat
library(dplyr) library(Seurat) # 10X的数据可以使用Read10X这个函数,会返回一个UMI count矩阵,其中的每个值表示每个基因(行)在每个细胞(列)的分子数量 ...
- 【ML05】Feature Scaling 特征缩放
Feature Scaling Feature Scaling 特征缩放的目的是什么 Feature Scaling Method #3 Dividing by maximum Mean Normal ...
- 机器学习01-定义、线性回归、梯度下降
目录 一.定义 What is Machine Learning 二.建模 Model Representation 三.一元线性回归 Linear Regression with One Varia ...
- 机器学习算法如何应用于控制_将机器学习算法应用于NBA MVP数据
机器学习算法如何应用于控制 A step-by-step tutorial in R R中的分步教程 1引言 (1 Introduction) This blog makes up the Machi ...
- DengAI —数据预处理
了解机器学习 (Understanding ML) This article is based on my entry into DengAI competition on the DrivenDat ...
- CHIP-seq流程学习笔记(7)-热图软件 deeptools
参考文章: ChIP-seq操作记录 如何使用deeptools处理BAM数据 用deeptools绘制基因组位置的信息 高通量测序数据处理学习记录(四):DeepTools学习笔记 deepTool ...
- Machine Learning Stanford (week 2)
文章目录 1. Multivariate Linear Regression 1.1 Multiple Features 1.2 Gradient Descent For Multiple Varia ...
- 【吴恩达机器学习】第二周课程精简笔记——多元线性回归和计算参数分析
1. Multivariate Linear Regerssion(多元线性回归) (1)Multiple Feature We now introduce notation for equation ...
- 机器学习——网易慕课笔记
文章目录 机器学习笔记 说在前面 第一章 1.1机器学习引言 1.2开发环境准备 1.3一个神经元的网络 第二章 计算机视觉 加载`Fashion MNIST`数据集 构造神经元网络模型 训练和评估模 ...
最新文章
- 2022-2028年中国廉价航空行业深度调研及投资前景预测报告
- html div 隐藏滚动条样式,div滚动条样式隐藏与显示
- 模拟信号可以传输声音和图像,那么文字呢--信息论系列
- 怎么用计算机解开手机,怎么用电脑解开手机锁
- 深入理解.NET Core的基元(三) - 深入理解runtimeconfig.json
- 前端 JS 如何在一个页面中局部加载其它页面的数据
- 每天一个linux命令(37):date命令
- Linux终端下打印带颜色的信息
- 设计灵感素材网站:美工设计者必备
- mysql grant all privileges_MySQL数据备份及还原(一)
- mysql查看和调整最大连接数
- NOIP2017普及组T3(棋盘)题解
- idea svn切换分支,合并分支
- android编译环境-软硬件要求
- nvme固态硬盘开机慢_解决win10系统下nvme固体硬盘开机慢的方法
- 科研日志--python大文件打开内存溢出
- MySQL 字符串数字转换
- DataX Transformer 源码分析及 UDF 扩展与使用
- C 语言字符数组的定义与初始化
- 3D模型汇总----骨骼模型