前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >count转TPM/FPKM实战(GSE229904)

count转TPM/FPKM实战(GSE229904)

作者头像
生信技能树
发布于 2025-03-29 07:23:17
发布于 2025-03-29 07:23:17
38200
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

接下来是对学员的答疑部分,学员提了一个问题,他想知道怎么将我们的count值进行标准化转为tpm和fpkm值。我们技能树对这个转换已经介绍过非常多次啦:

下面就是用GEO的转录组测序数据进行一下实战,正好GEO数据库对二代高通量测序数据统一进行了自己的处理,每一个数据都有count值,tpm值以及fpkm值。

我们本次实战选的数据为:GSE229904,https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE229904

数据下载

这个数据做的是前列腺癌患者原发肿瘤的mRNA和miRNA表达谱,从这里点进去:

将这个页面的 https://www.ncbi.nlm.nih.gov/geo/download/?acc=GSE229904 下列数据下载下来:

得到基因长度

这里数据库直接提供了配套定量的基因长度文件,不同的参考基因组版本计算出来的长度会有区别,所以我们这里就用Human.GRCh38.p13.annot.tsv.gz

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# NCBI的注释文件
anno <- fread("GSE229904/Human.GRCh38.p13.annot.tsv.gz",data.table = F)
colnames(anno)
anno <- anno[,c("GeneID","Symbol","EnsemblGeneID","Length","GeneType")]
save(anno,file = "GSE229904/GRCh38.p13.annot.Rdata")
head(anno)
image-20250328155407494
image-20250328155407494

image-20250328155407494

count转TPM

TPM的标准化方式如下:

先读取count:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
############################### count2TPM
# 1.读取count
counts <- fread("GSE229904/GSE229904_raw_counts_GRCh38.p13_NCBI.tsv.gz",data.table = F)
counts[1:4,1:4]
rownames(counts) <- counts[,1]
counts <- counts[,-1]
counts[1:4,1:4]

#            GSM7179964 GSM7179965 GSM7179966 GSM7179967
# 100287102         14          8          4         10
# 653635           986        597        746       1398
# 102466751         38         24         22         57
# 107985730          0          1          0          4

# 2.提取基因长度列
load("GSE229904/GRCh38.p13.annot.Rdata")
head(anno)
rownames(anno) <- anno$GeneID
effLen <- anno[row.names(counts), "Length"]
range(effLen)

接下来定义两个函数,这里有两个不同的写法:

来自:What the FPKM? A review of RNA-Seq expression units | The farrago (wordpress.com)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 转化
Counts2TPM <- function(counts, effLen){
  rate <- log(counts) - log(effLen)
  denom <- log(sum(exp(rate)))
  exp(rate - denom + log(1e6))
}

tpm_raw <- apply(counts, 2, Counts2TPM, effLen = effLen)
tpm_raw[1:5,1:5]

# 与官方的tpm比较
# 3.与原文件相比
tpm <- fread("GSE229904/GSE229904_norm_counts_TPM_GRCh38.p13_NCBI.tsv.gz",data.table = F)
tpm[1:5,1:5]

结果一致:

还有一个根据公式写的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#TPM (Transcripts Per Kilobase Million)  每千个碱基的转录每百万映射读取的Transcripts 
counts2TPM2 <- function(count=count, efflength=efflen){   
  RPK <- count/(efflength/1000)   #每千碱基reads (reads per kilobase) 长度标准化   
  PMSC_rpk <- sum(RPK)/1e6        #RPK的每百万缩放因子 (“per million” scaling factor ) 深度标准化   
  RPK/PMSC_rpk                       
}

tpm_raw2 <- apply(counts, 2, counts2TPM2, efflength = effLen)
tpm_raw2[1:5,1:5]

# 3.与原文件相比
tpm[1:5,1:5]

结果一致:

count转FPKM

FPKM的公式如下:

接下来定义两个函数,这里有两个不同的写法:

来自:What the FPKM? A review of RNA-Seq expression units | The farrago (wordpress.com)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 转化
countToFpkm <- function(counts, effLen) { 
  N <- sum(counts) 
  exp( log(counts) + log(1e9) - log(effLen) - log(N) ) 
} 
fpkm_raw <- apply(counts, 2, countToFpkm, effLen = effLen)
fpkm_raw[1:5,1:5]


# 3.与原文件相比
fpkm <- fread("GSE229904/GSE229904_norm_counts_FPKM_GRCh38.p13_NCBI.tsv.gz",data.table = F)
rownames(fpkm) <- fpkm[,1]
fpkm <- fpkm[, -1]
fpkm[1:5,1:5]

结果一致:

还有一个根据公式写的版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
##### 函数
# FPKM/RPKM (Fragments/Reads Per Kilobase Million )  每千个碱基的转录每百万映射读取的Fragments/reads 
# RPKMFPKM分别针对单端与双端测序而言,计算公式是一样的 
counts2FPKM <- function(count=count, efflength=efflen){    
  PMSC_counts <- sum(count)/1e6   #counts的每百万缩放因子 (“per million” scaling factor) 深度标准化   
  FPM <- count/PMSC_counts        #每百万reads/Fragments (Reads/Fragments Per Million) 长度标准化   
  FPM/(efflength/1000)                                       
} 

fpkm_raw2 <- apply(counts, 2, counts2FPKM, efflength = effLen)
fpkm_raw2[1:5,1:5]

# 3.与原文件相比
fpkm[1:5,1:5]

结果一致:

Note:根据gtf获取基因长度

这个例子当中,GEO数据库提供了现成的基因长度,如果是自己的项目呢,一般 featureCounts 软件的结果会提供一个基因长度,在结果的第六列,就可以完成上面的操作了:

除此之外,我们还可以使用定量的时候配套的gtf文件获取基因长度,这里需要注意一定是同一个版本(不同的版本算出来的基因长度会有点不一样)

gtf文件下载:https://www.ensembl.org/index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rm(list=ls())
#BiocManager::install("GenomicFeatures")
library(GenomicFeatures)

# 
# gtf <- "/nas1/zhangj/database/genome/Human/release-113/Homo_sapiens.GRCh38.113.gtf"
#txdb <- makeTxDbFromGFF(gtf,format="gtf")
# 上面的图片定量使用的版本是GRCh38 release 104
txdb <- makeTxDbFromGFF("GSE229904/Homo_sapiens.GRCh38.104.chr.gtf.gz",format="gtf")
txdb

# 获取每个基因id的外显子数据
exons.list.per.gene <- exonsBy(txdb, by="gene")

# 对于每个基因,将所有外显子减少成一组非重叠外显子,计算它们的长度(宽度)并求和
exonic.gene.sizes <- sum(width(GenomicRanges::reduce(exons.list.per.gene)))

# 得到geneid和长度数据
gfe <- data.frame(gene_id=names(exonic.gene.sizes), length=exonic.gene.sizes)
head(gfe)

长度如下,与上面的图片经过了验证,得到的长度与 featureCounts 软件的结果一致:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                        gene_id length
ENSG00000000003 ENSG00000000003   4536
ENSG00000000005 ENSG00000000005   1476
ENSG00000000419 ENSG00000000419   9276
ENSG00000000457 ENSG00000000457   6883
ENSG00000000460 ENSG00000000460   5970
ENSG00000000938 ENSG00000000938   3382
你学会了吗?
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Counts FPKM RPKM TPM CPM 的转化
最近有粉丝自告奋勇希望可以把他自己在简书等平台的生物信息学笔记分享在我们公众号,在专业的舞台上跟大家切磋!
生信技能树
2022/06/08
4.1K0
RNAseq数据分析中count、FPKM和TPM之间的转换
现在常用的基因定量方法包括:RPKM, FPKM, TPM。这些表达量的主要区别是:通过不同的标准化方法为转录本丰度提供一个数值表示,以便于后续差异分析。
DoubleHelix
2023/12/14
24.4K0
RNAseq数据分析中count、FPKM和TPM之间的转换
获取基因有效长度的N种方法
最近有粉丝自告奋勇希望可以把他自己在简书等平台的生物信息学笔记分享在我们生信技能树公众号,在专业的舞台上跟大家切磋!
生信技能树
2022/06/27
5.1K0
获取基因有效长度的N种方法
作者仅提供了fpkm格式表达量矩阵的转录组测序数据集该如何重新分析呢
研究者们在GEO数据库是有数据分享:https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE182923
生信技能树
2024/06/08
4360
作者仅提供了fpkm格式表达量矩阵的转录组测序数据集该如何重新分析呢
Count数据转换为TPM数据方法整理-常规方法、DGEobj.utils和IOBR包
在正式分析之前,对于数据的处理是至关重要的,这种重要性是体现在很多方面,其中有一点是要求分析者采用正确的数据类型。
凑齐六个字吧
2024/07/13
6530
Count数据转换为TPM数据方法整理-常规方法、DGEobj.utils和IOBR包
一行命令将count转为CPM/TPM/FPKM
一行命令将count转为CPM/TPM/FPKM 的软件为rnanorm,是一个基于Python开发的命令行工具。安装可以通过命令安装:
生信技能树
2023/02/27
3.9K0
一行命令将count转为CPM/TPM/FPKM
RNA-seq入门实战(三):在R里面整理表达量counts矩阵
连续两次求贤令:曾经我给你带来了十万用户,但现在祝你倒闭,以及 生信技能树知识整理实习生招募,让我走大运结识了几位优秀小伙伴!大家开始根据我的ngs组学视频进行一系列公共数据集分析实战,其中几个小伙伴让我非常惊喜,不需要怎么沟通和指导,就默默的完成了一个实战!
生信技能树
2022/07/26
21.2K0
RNA-seq入门实战(三):在R里面整理表达量counts矩阵
怀疑了不该怀疑的人
前面介绍了 : 一行命令将count转为CPM/TPM/FPKM ,是一个Python软件,也是读取gtf文件,根据id来自动计算每个基因的长度后进行相对应的公式的转换:
生信技能树
2023/02/27
4980
怀疑了不该怀疑的人
count值转FPKM(R语言)
R语言中,当我们获取到了基因表达的count矩阵,怎么下载对应的基因长度并将count矩阵转换为FPKM矩阵
Dr.Yuan
2024/04/28
8750
规范统一格式的GEO RNA-seq count及其标准化数据
参考网址:https://www.ncbi.nlm.nih.gov/geo/info/rnaseqcounts.html#why
用户11414625
2024/12/20
4860
规范统一格式的GEO RNA-seq count及其标准化数据
转录组GSE157718_Tpm与Count差异分析的比较
在尝试复现GSE157718数据集的时候,发现网站同时提供了表达矩阵tpm形式与count形式,因此分别用这两种形式进行基因差异与富集分析,再进行对比。
sheldor没耳朵
2024/08/01
4800
转录组GSE157718_Tpm与Count差异分析的比较
RNA-seq 231023
参考https://www.zhihu.com/people/gu_chen/posts?page=2
素素
2023/10/31
5580
TCGA mRNA数据分析流程
TCGA mRNA定量分析流程测量HT-Seq 原始reads统计中的基因表达水平,Fragments per Kilobase of transcript per Million mapped reads(FPKM)和FPKM-UQ(上四分位标准化)。首先将reads与GRCh38 reference genome 参考基因组比对,然后通过量化比对的reads产生这些值。为了促进样品间归一化,所有RNA-Seq读数在分析过程中都被视为unstranded的状态.
生信交流平台
2022/09/21
1.6K0
TCGA mRNA数据分析流程
不装了,摊牌了,转录组测序表达量矩阵就这么简单!
虽然说我们确实是在单细胞天地,生信菜鸟团,生信技能树等多个公众号转发了:作者仅提供了fpkm格式表达量矩阵的转录组测序数据集该如何重新分析呢 里面的小技巧,但仍然是各个交流群还是有人发问,关于转录组测序的公共数据集如何分析,因为大家看到的常规教程都是之前的表达量芯片的数据分析流程。
生信技能树
2024/11/21
1450
不装了,摊牌了,转录组测序表达量矩阵就这么简单!
什么,你一定要基于FPKM标准化表达矩阵做单细胞差异分析
前言:使用GSE81861提供的数据,比较CRC肿瘤上皮细胞与正常上皮细胞的差异。
生信技能树
2020/09/22
7.7K0
转录组测序的表达量的两个归一化方向会影响差异分析吗
如果是使用deseq2这样的包进行转录组测序的表达量的差异分析需要的是最原始的整数的counts矩阵即可,如果是做表达量热图,通常是使用归一化后的矩阵,可以是两个方向都做。如果仅仅是考虑文库大小就是cpm和rpm,如果同时考虑基因长度就是 FPKM(Fragments Per Kilobase of transcript per Million mapped reads),以及tpm,让我们来理解一下:
生信技能树
2024/07/26
2030
转录组测序的表达量的两个归一化方向会影响差异分析吗
你凭啥写“该基因在人体中高表达”--谁给你的勇气,梁静茹吗?
摸着你的良心,你有没有在文章的introduction里面煞有介事的介绍过某基因,你写“xxx基因是在人体中分布广泛、高表达且高保守的基因/蛋白,主要参与XXX等生物学过程”,套路,都是套路!
生信技能树
2018/12/12
2.9K0
你凭啥写“该基因在人体中高表达”--谁给你的勇气,梁静茹吗?
一文解决大量基因的生存分析并作图
这两篇纯生信文章都是对单个基因或者所有单个marker做生存分析,目的是找到其中能够影响患者生存的marker或者基因(包括miRNA,lncRNA,mRNA等等)。这也是目前非常常见的筛选基因或者marker的方法。
用户1359560
2019/06/01
3K0
双端测序的转录组需要两个fastq文件独立定量吗
本来呢,如果作者提供了表达量矩阵是容易跟着我们的笔记做差异分析以及后续的生物学功能富集,各种各样的统计可视化。
生信技能树
2022/06/08
1.1K0
双端测序的转录组需要两个fastq文件独立定量吗
GEO2R更新后可以分析bulk RNAseq
当然了,仅仅是做到这些还不够,我们还需要足够的资金支持,因为绝大部分网页工具的十几年如一日的维护推广和更新,也是不小的花销。相信大家应该是看到过无数的网页工具云平台如雨后春笋般出现和消失,这一点来说,由美国国立生物技术信息中心(NCBI)维护的一个公共数据库,用于存储和共享高通量基因表达数据的GEO(Gene Expression Omnibus)就是其中的佼佼者啦,它有一个在线分析工具GEO2R,用于比较两个或多个基因表达数据集,并识别在不同条件下表达显著差异的基因。用于快速的基因表达分析,研究人员可以使用它来比较不同实验条件下的基因表达差异,例如,疾病与对照组、不同治疗组之间的差异等。
生信技能树
2023/09/19
6730
GEO2R更新后可以分析bulk RNAseq
推荐阅读
相关推荐
Counts FPKM RPKM TPM CPM 的转化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验