2020.08.14【RNA-Seq流程】丨将HTseq生成的基因COUNT值转换为FPKM值

count转换FPKM介绍

  • 公式介绍
  • R语言脚本

公式介绍

2020.08.14【RNA-Seq流程】丨将HTseq生成的基因COUNT值转换为FPKM值_第1张图片
下方公式是FPKM的综述文章写的,参数并不好理解,但是对数量级表示很明白
2020.08.14【RNA-Seq流程】丨将HTseq生成的基因COUNT值转换为FPKM值_第2张图片

https://haroldpimentel.wordpress.com/2014/05/08/what-the-fpkm-a-review-rna-seq-expression-units/

要求出FPKM值,需要获得三个参数。
cDNA Fragments:可以理解为单个基因比对到基因组上的reads数,在测序数据里就是count值。HTseq处理后可以直接得到结果。
Mapped Fragments:指每个样品中所有基因比对到基因组上的reads数。也就是用求和函数sum()将单一样品的count全部加起来。注意,由于单位是百万,所以求和后需要除以10^6。
Transcript Length:也就是exon length,是指reads比对到基因外显子上的长度。这个需要找到参考基因组才能获得数据。

R语言脚本

#!/usr/bin/R

#根据参考基因组获得每条reads的exon length /home/XXX/RNA-seq_ref/04_36_homo_2019//ref/gencode/gencode.v29.annotation.gtf
library(GenomicFeatures)
txdb <- makeTxDbFromGFF("/home/XXX/RNA-seq_ref/04_36_homo_2019//ref/gencode/gencode.v29.annotation.gtf",format="gtf")
exons_gene <- exonsBy(txdb, by = "gene")
exons_gene_lens <- lapply(exons_gene,function(x){
     sum(width(reduce(x)))})
n=t(as.data.frame(exons_gene_lens))

这里是引用网上的一段代码,大概意思就是说使用GenomicFeatures这个R包,可以获得exon length。

需要注意的是GenomicFeatures1.7最新版本只支持R 4.0版本,不支持3.6,请大家重新安装好对应版本再安装工具包。

#导入所有reads的count值,header = T保证后续计算不会将列名算入而造成错误。如果file和脚本不在同一个路径,记得添加file的绝对路径。
count <- read.table(file="all_count.txt",header = T)

#从第二列开始,将每个样本的count循环转化成FPKM
i <- 2

repeat{
     
        mapped_reads <- sum(count[1:58721,i])#计算每个样本的mapped reads数,由于count文本最后几行是综述数据,需要舍去,因此选择58721行之前的基因数据。
        FPKM <- count[1:58721,i]/(10^-9*mapped_reads*n[1:58721,1])#计算FPKM值,10^-9是单位转换后的换算,不能放在分母外的原因是mapped_reads*n[1:58721,1]的乘积很大会报错,因此需要先缩小倍数再进行计算
        count = data.frame(count[1:58721,],FPKM)#添加到count表格后面i
        i <- i + 1

        if(i >41){
     
        break
        }#样品总共有40个样品,我们需要获取从第2列到第41列count值
}

#生成表格列名称
count_colname <- read.table("all_count.txt",header = F,nrow = 1,as.is=TRUE)
FPKM_colname <- paste(count_colname[1,],"_FPKM",sep="")
colname <- c(count_colname,FPKM_colname)
col_name <- colname[-which(colname=="gene_FPKM")]#删除gene_FPKM
names(count) <- col_name

#生成表格
write.csv(count,"ALL_FPKM.csv",row.names = FALSE)#row.names是为了去除第一列自动生成的行名,同理col.names=FALSE可以去除第一行自动生成的列名
head(read.csv("ALL_FPKM.csv"))

你可能感兴趣的:(生物信息,数据处理读书笔记,R语言,r语言,数据分析)