cpm log2((cpm/10) + 1) nmf 1e6 1e5

Gene expression units explained: RPM, RPKM, FPKM, TPM, DESeq, TMM, SCnorm, GeTMM, and ComBat-Seq 

Read count、CPM、 RPKM、FPKM和TPM的区别 - 简书 (jianshu.com)

http://zyxue.github.io/2017/06/02/understanding-TCGA-mRNA-Level3-analysis-results-files-from-firebrose.html#:~:text=The%20scaled%20estimate%20value%20on%20the%20other%20hand,%28multiplied%20by%201e6%29%20TPM%20-%20Transcripts%20Per%20Million. 

FPKM,RPKM,RPM以及TPM的关系之见解

RPKM: Reads Per Kilobase of exon model per Million mapped reads (每千个碱基的转录每百万映射读取的reads)

FPKM: Fragments Per Kilobase of exon model per Million mapped fragments(每千个碱基的转录每百万映射读取的fragments)

RPM/CPM: Reads/Counts of exon model per Million mapped reads (每百万映射读取的reads)

TPM:Transcripts Per Kilobase of exon model per Million mapped reads (每千个碱基的转录每百万映射读取的Transcripts)

#####################################################################

RPKM (Reads Per Kilobase Million)

FPKM (Fragments Per Kilobase Million)

TPM(Transcripts Per Kilobase Million)

RPM (Reads per million)

CPM (Counts per million)

#####################################################################

在edgeR中,提供了一种名为CPM的定量方式,全称为count-per-millon。
假定原始的表达量矩阵为count, 计算CPM的代码如下

cpm <- apply(count ,2, function(x) { x/sum(x)*1000000 })
原始的表达量除以该样本表达量的总和,在乘以一百万就得到了CPM值 。从公式可以看出, CPM其实就是相对丰度,只不过考虑到测序的reads总量很多,所以总的reads数目以百万为单位。

在前面的文章中我们介绍了edgeR提供的TMM归一化算法,CPM这种求相对丰度的思想,虽然也是一种比较简单的归一化方式,但它并不用于差异分析之前的归一化。

在edgeR中,CPM主要有以下两种用途

1. 过滤表达量较低的基因
DESeq2和edgeR都是针对raw count表达量进行分析,在DESeq2中,在过滤低表达量的基因时,直接是根据reads数的总和进行判断,代码如下

countData <- count[apply(count, 1, sum) > 10 , ]
由于不同样本测序的reads总数不同,所以直接将所有样本的reads相加,然后进行过滤,这种方式略显粗糙。edgeR中,利用CPM的定量结果,对低表达量的基因进行过滤,代码如下

countData <- count[apply(cpm(count), 1, sum) > 2 , ]
利用相对丰度的加和进行过滤,消除了样本间reads总数不同的影响。需要注意的是,我们只是用CPM来过滤基因,而后续分析还是基于raw  count的结果,因为只有raw count是基于负二项分布的。
 

  log2 (1 + CPMi,j/10) 

Read count、CPM、 RPKM、FPKM和TPM的区别 - 简书 (jianshu.com)

Normalize Data — NormalizeData • Seurat (satijalab.org)

https://github.com/broadinstitute/single_cell_classification/blob/master/src/QC_methods.R

 # run Seurat methods to get gene expression clusters
  seuObj <- Seurat::NormalizeData(object = seuObj, 
                                  normalization.method = "LogNormalize", 
                                  scale.factor = 1e5, verbose = FALSE)

单细胞seurat包中,这样处理之后,数据是cpm数据嘛:seuObj <- Seurat::NormalizeData(object = seuObj, normalization.method = "LogNormalize", scale.factor = 1e5, verbose = FALSE)

https://github.com/broadinstitute/single_cell_classification/blob/a06b369eae13b2dc5ca7288f8a5d4a03098a2268/src/gene_expression_classification.R#L64


#compute summed counts across cells for each cluster, then CPM transform
clust_cpm <- plyr::laply(levels(seuObj), function(clust) {
  Matrix::rowSums(Seurat::GetAssayData(seuObj, slot = 'counts')[, names(Seurat::Idents(seuObj)[Seurat::Idents(seuObj) == clust])])
}) %>%
  t() %>%
  edgeR::cpm(prior.count = 1, log = TRUE)

这看起来是一个 R 语言中使用 edgeR 包的代码片段,用于计算表达矩阵的 counts per million (CPM) 值,并且在计算时使用了先验计数为 1,以及进行对数转换。下面是对每个参数的解释:

  1. edgeR::cpm(): 这是 edgeR 包中的一个函数,用于计算 counts per million (CPM) 值。CPM 是一种常用的规范化方法,用于在不同样本或条件之间比较基因表达水平。它将原始计数转化为每百万个读取的表达值。

  2. prior.count = 1: 这个参数指定了在计算 CPM 值时使用的先验计数。通常,当样本的计数非常低时,为了避免出现无限大的值,可以设置一个小的先验计数。在这里,使用了 1 作为先验计数。

  3. log = TRUE: 这个参数指定是否在计算后对 CPM 值进行对数转换。对数转换可以使数据更符合正态分布,有时在分析中会更有用。

在计算 CPM(Counts Per Million)时,公式是将每个基因的计数除以总的读取数,然后乘以一百万。例如,如果一个基因在一个样本中有 10 个计数,而总的读取数是 1,000,000,那么它的 CPM 就是 (10 / 1,000,000) * 1,000,000 = 10。

然而,当样本的计数非常低时,例如只有很少的几个计数,会导致计算结果变得不稳定。这是因为分母非常小,可能接近零,这将使分子除以一个接近零的数,导致结果变得非常大或无限大,这在统计分析中是不合理的。

为了解决这个问题,可以在计算 CPM 值时引入一个小的常数,称为先验计数(prior count)。这个常数在分母上加上,从而避免出现除以零的情况。通常情况下,使用一个小的常数,比如 1,作为先验计数。

所以,在给定的函数中,prior.count = 1 表示在计算 CPM 值时,会在每个基因的计数上加上一个先验计数值 1,然后再进行计算。这样做可以确保即使基因的计数非常低,也不会出现分母为零的情况,从而得到更合理的结果。

 https://github.com/gabrielakinker/CCLE_heterogeneity/blob/master/nmf_programs.R

library(nmf)

nmf_programs <- function(cpm, is.log=F, rank, method="snmf/r", seed=1) {
    
  if(is.log==F) CP100K_log <- log2((cpm/10) + 1) else CP100K_log <- cpm
  CP100K_log <- CP100K_log[apply(CP100K_log, 1, function(x) length(which(x > 3.5)) > ncol(CP100K_log)*0.02),]
  CP100K_log <- CP100K_log - rowMeans(CP100K_log)
  CP100K_log[CP100K_log < 0] <- 0
 
  nmf_programs <- nmf(CP100K_log, rank=rank, method=method, seed=seed)
  
  nmf_programs_scores <- list(w_basis=basis(nmf_programs), h_coef=t(coef(nmf_programs)))
                                 
  return(nmf_programs_scores)
}
    

猜你喜欢

转载自blog.csdn.net/qq_52813185/article/details/132218853