count转fpkm,tpm完整版

参考资料:
1.如何把从TCGA下载的HTseq count转换成FPKM - 简书 (jianshu.com)
2.RNAseq数据分析中count、FPKM和TPM之间的转换-腾讯云开发者社区-腾讯云
3.基因有效长度计算
4.简单小需求:如何将FPKM转换成TPM?

tinyarray包是生信技能树讲师小洁老师写的,里面的很多函数都非常好用,让我们的代码更加简洁易读,让我们感谢小洁老师!


1.处理count矩阵

1.1读取

dat = read.delim("GSE104140_raw_counts_GRCh38.p13_NCBI.tsv.gz",row.names=1)
dat[1:3,1:3]
##           GSM2790523 GSM2790524 GSM2790525
## 100287102         22         29         18
## 653635           599        574        530
## 102466751         32         29         27

1.2行名id转化

行名是Gene ID,把它转化成symbol

dat1 =trans_entrezexp(dat)  #为了防止后面不能查看最原始的数据,还是再建一个变量吧。

1.3基因过滤

表达量为0的基因有点多,我选择去除表达量为0占一半以上样本的基因

nrow(dat1)
## [1] 37734
dat1 = dat1[apply(dat1, 1, function(x) sum(x > 0) > 0.5*ncol(dat1)), ]
nrow(dat1)
## [1] 27615

2.count转化为fpkm

2.1获取基因有效长度

这里的有效长度指的是非冗余外显子长度之和。
(环境内存不够怎么办?有效数据存起来,另开一个session)

if(T){
  if(!require(GenomicFeatures))BiocManager::install("GenomicFeatures")
  library(GenomicFeatures)
  txdb <- makeTxDbFromGFF("gencode.v45.annotation.gtf.gz",format="gtf") 
  exons_gene <- exonsBy(txdb,by="gene")
  exons_gene_lens<-lapply(exons_gene,function(x){sum(width(reduce(x)))})
  length(exons_gene_lens) #查看基因数量
  exons_gene_lens1<-as.data.frame(exons_gene_lens)
  #转换格式:列表转为数据框
  exons_gene_lens1 <- t(exons_gene_lens1)#转置一下
  save(exons_gene_lens1,file = "efflength.Rdata")
}

2.2行名id转化

load("efflength.Rdata")
head(exons_gene_lens1)
##                    [,1]
## ENSG00000000003.16 4530
## ENSG00000000005.6  1476
## ENSG00000000419.14 9276
## ENSG00000000457.14 6883
## ENSG00000000460.17 5970
## ENSG00000000938.13 3382

发现问题:exon是一个只有一列的矩阵,比较特殊,不符合行名转化的示例格式。只好再添加一列,最大程度的模仿示例格式(要不然使用函数会报错)

exons_gene_lens1 = as.data.frame(exons_gene_lens1)
exons_gene_lens1$rnorm <- rnorm(n=nrow(exons_gene_lens1))
exons1 = trans_exp_new(exons_gene_lens1)

3.合并count矩阵和exon长度表

3.1行名对应相等

colnames(exons1)[1] <- "length" #改一下列名
p = identical(rownames(dat1),rownames(exons1));p #行名不一致
## [1] FALSE
s = intersect(rownames(dat1),rownames(exons1)) #取交集
dat1 = dat1[s,]
exons1 = exons1[s,]
table(rownames(dat1) == rownames(exons1)) #检查一下行名是不是对应相等
## 
##  TRUE 
## 21367

3.2合并

合并完成,exon length是新count表的最后一列啦!

count_with_length <- cbind(dat1,length = exons1[,1])

4.count转fpkm

方法一:使用函数(常用推荐)
不合并也可以,但是要行名对应相等。

countToFpkm <- function(counts, effLen)
{
    N <- sum(counts)
    exp( log(counts) + log(1e9) - log(effLen) - log(N) )
}
fpkms <- apply(dat1,2,countToFpkm,effLen = exons1[,1] )
head(fpkms[1:3,1:3])
##           GSM2790523 GSM2790524 GSM2790525
## DDX11L1     1.225466   1.498593   1.073968
## WASH7P     15.280702  13.584247  14.482132
## MIR6859-1  16.566724  13.928099  14.972371

用fpkm转tpm,列加和相等验证一下。

fpkmToTpm <- function(fpkm)
{
  exp(log(fpkm) - log(sum(fpkm)) + log(1e6))
}
TPM <- apply(fpkms,2,fpkmToTpm)
table(colSums(TPM)) 
## 999999.999999999            1e+06 
##               14               18

方法二:需要先合并

kb <- count_with_length$length/1000
countdata <- count_with_length[,1:32]
rpk <- countdata/kb
fpkms2 <- t(t(rpk)/colSums(countdata)*10^6)
head(fpkms2[1:3,1:3])
##           GSM2790523 GSM2790524 GSM2790525
## DDX11L1     1.225466   1.498593   1.073968
## WASH7P     15.280702  13.584247  14.482132
## MIR6859-1  16.566724  13.928099  14.972371

终于大功告成啦!


启发

  1. 不要无脑复制粘贴别人的代码,理解最重要。
    毕竟别人的代码不一定能适应你的数据。自己的数据自己去处理,灵活一点。
  2. 最靠谱的学习来源:官网和帮助文档。
    网上的各种各样的代码最终还是由官方提供的演化来的,那为什么不从源头开始学习呢?
  3. 报错怎么处理?
    根据R的提示,一步一步排查问题。不符合函数要求的格式?参数没设置对?
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容