前言
关于bulk-seq分析,你是使用fpkm?还是tpm?
这个问题,可能对于初学者来说,很是纠结。因为,你在文章中有使用fpkm,也有使用tpm?也有使用count?我们在“一文了解Count、FPKM、RPKM、TPM”推文中也详细介绍了各参数的表示的意义。以及在关于Count,FPKM,TPM,RPKM等表达量的计算及转换中也介绍了它们之间的转换。
但是,**学习的一直是在不断向前,以及不断纠错的过程。**我们每个人都在经历此过程。
bulk-seq分析中,是什么标准进行后续的分析呢?
对于这个问题,我们“社群”也有在讨论过?也有很多同学在咨询这个问题。有同学认为FPKM
并不是很准确,推荐使用tpm
值。但是也有同学一直在使用FPKM
值,或是其它值进行筛选,如count(最原始的表达量),RPM等。
对于,最生信的同学来说,无论是count
,FPKM
、TPM
等值,都只是一个数字,仅仅只是一个数字,“不能表示任何意义”,我们只需要整体的趋势一样即。因此,无论是使用fpkm,或是tpm,都可以满足我们的需求。
但是,使用不同的表达量,最大的区别在于筛选的基因数量,这个是无法避免的。
FPKM
FPKM: FPKM的全称为Fragments Per Kilobase Million,Fragments Per Kilobase of exon model per Million mapped fragments(每千个碱基的转录每百万映射读取的fragments)。通俗讲,把比对到的某个基因的Fragment数目,除以基因的长度,其比值再除以所有基因的总长度。注意,这里的基因长度是指基因外显子的总长度。
RPKM
**RPKM: **Reads Per Kilobase of exon model per Million mapped reads (每千个碱基的转录每百万映射读取的reads);
RPM
RPM: RPM/CPM: Reads/Counts of exon model per Million mapped reads (每百万映射读取的reads)
公式:RPM = ExonMappedReads * 10^6 /TotalMappedReads
TPM
**TPM:**TPM的全称为Transcripts per million,Transcripts Per Kilobase of exon model per Million mapped reads (每千个碱基的转录每百万映射读取的Transcripts)
转换或计算
我们都知道,无论是fpkm,tpm,rpm值都是基于每个基因的count值与Gene Length进行计算。
计算的方法也很多,但是或出现:使用不同的计算方式,得到的结果并不一致。
这个问题,大家也会经常遇到,包括我自己。到这一步,就会很纠结,也会质疑自己,然后会“卡”很久。
木知,大家知否是这样的?
Code
我们也基于前期分享,在分享使用Count转换FPKM或是TPM值的代码。
我们的代码仅提供给大家参考。
Count To FPKM
- R语言Code
##'@计算FPKM
data <- read.table("./01.cucumber.mRNA.gene.count.txt",header = T, sep = "\t", row.names = 1)
head(data)
gene_length_kb <- data$Length /1000
expression_matrix <- data[, 2:ncol(data)]
head(expression_matrix)
# # 计算每列总Counts
total_counts <- colSums(expression_matrix)# 计算FPKM值
fpkm_matrix <- sweep(expression_matrix, 2, total_counts / 1e6, "/") # 除以总Reads
fpkm_matrix <- sweep(fpkm_matrix, 1, gene_length_kb, "/") # 除以基因长度
fpkm_matrix[1:5,1:10]
输入数据
- perl脚本
use strict;open A,"$ARGV[0]";<A>;
my @colsum;
while(<A>){chomp;my @line=split;shift @line;shift @line;for(0..$#line){$colsum[$_]+=$line[$_];}
}open B,"$ARGV[0]";
my $head=<B>;
chomp($head);
print "$head\n";
while(<B>){chomp;my @line=split;my $gene=shift @line;my $length=shift @line;print "$gene\t";for(my $i=0;$i<@line;$i++){my $fpkm=$line[$i]*1000000*1000/($colsum[$i]*$length);print "$fpkm\t";}print "\n";
}
运行
perl CountToFPKM.pl Input_count.txt > OutPut_FPKM.txt
Count To TPM
##'@使用count计算tpm
count_df <- read.table("./01.cucumber.mRNA.gene.count.txt",header = T, sep = "\t", row.names = 1)
head(count_df)# TPM函数
calculate_tpm <- function(counts, lengths) {rpk <- counts / (lengths / 1000) # RPK: count per kilobasescaling_factors <- colSums(rpk) / 1e6 # per million scaling factortpm <- sweep(rpk, 2, scaling_factors, "/") # divide each column by its scaling factorreturn(tpm)
}# 准备数据
gene_lengths <- count_df$Length
count_matrix <- as.matrix(count_df[, -1]) # 排除长度列,仅保留 count 数据# 计算 TPM
tpm_matrix <- calculate_tpm(count_matrix, gene_lengths)# 查看结果
tpm_matrix[1:5,1:10]
关于Count值,直接使用featureCounts
等软件即可获得。
OK,以上仅是自己的学习笔记,若是有不对的地方,请大家指出。
若是你有其他的方法,我们欢迎你的留言区进行留言讨论!
若我们的教程对你有所帮助,请点赞+收藏+转发,大家的支持是我们更新的动力!!
2024已离你我而去,2025加油!!
2024年推文汇总 (点击后访问)
2023年推文汇总 (点击后访问)
2022年推文汇总 (点击后访问)
往期部分文章
1. 最全WGCNA教程(替换数据即可出全部结果与图形)
- WGCNA分析代码六
推荐大家购买最新的教程,若是已经购买以前WGNCA教程的同学,可以在对应教程留言,即可获得最新的教程。(注:此教程也仅基于自己理解,不仅局限于此,难免有不恰当地方,请结合自己需求,进行改动。)
2. 精美图形绘制教程
- 精美图形绘制教程
- 《R语言绘图专栏–50+图形绘制教程》
3. 转录组分析教程
-
转录组上游分析教程[零基础]
-
一个转录组上游分析流程 | Hisat2-Stringtie
-
Samll RNA上游分析
4. 转录组下游分析
-
批量做差异分析及图形绘制 | 基于DESeq2差异分析
-
GO和KEGG富集分析
-
单基因GSEA富集分析
-
全基因集GSEA富集分析
小杜的生信筆記 ,主要发表或收录生物信息学教程,以及基于R分析和可视化(包括数据分析,图形绘制等);分享感兴趣的文献和学习资料!!