counts转换为RPKM

作者: 医学小白学生信 | 来源:发表于2020-10-29 15:06 被阅读0次

    RPKM概念和三种计算方法
    WGCNA的输入到底是什么格式

    基因长度

    image.png

    RPKM = counts数 /(基因长度×文库大小)

    (所以测到的counts数和文库大小对于RPKM的影响较大)

    1 counts矩阵

    library(limma)
    rt = read.table("gene matrix.txt",header=T,sep="\t",check.names=F)
    rt=as.matrix(rt)
    rownames(rt)=rt[,1]
    exp=rt[,2:ncol(rt)]
    dimnames=list(rownames(exp),colnames(exp))
    a=matrix(as.numeric(as.matrix(exp)),nrow=nrow(exp),dimnames=dimnames)
    a=avereps(a) #对于重复行取平均值
    a=a[rowSums(a)>1,] #保证基因至少在2个样本中表达
    a<-as.data.frame(a)
    a[1:4,1:4]
    
    a

    2 基因长度

    2.1 定义基因长度为非冗余exon长度之和

    TxDb.Hsapiens.UCSC.hg19.knownGene would be a TxDb object, of Homo sapiens data from UCSC build hg19 based on the knownGene Track.

    #小鼠
    library("TxDb.Mmusculus.UCSC.mm10.knownGene") #该函储存转录本信息,包括基因的外显子信息
    txdb <- TxDb.Mmusculus.UCSC.mm10.knownGene
    #人
    library("TxDb.Hsapiens.UCSC.hg19.knownGene") 
    txdb <- TxDb.Hsapiens.UCSC.hg19.knownGene
    
    if(F){
      exon_txdb=exons(txdb) #包含了所有外显子的坐标和外显子编码id
      exon_txdb
      genes_txdb=genes(txdb) #包含了所有基因的坐标和基因ID
      genes_txdb
      o = findOverlaps(exon_txdb,genes_txdb) #找到二者之间的交叉
      o #找到exon的第18个和gene的第6909个对应
    #  queryHits subjectHits
    #  <integer>   <integer>
    #    [1]        18        6909
    #  [2]        19        6909
    #  [3]        20        6909
    #  [4]        21        6909
      
      t1=exon_txdb[queryHits(o)] #将所有对应上的外显子信息提取出来
      t2=genes_txdb[subjectHits(o)] #将所有基因信息提取出来
      t1=as.data.frame(t1)
      t1$geneid=mcols(t2)[,1] #mcols就是取t2的gene_id,给ti加上一列gene_id
      
      #lapply : 遍历列表向量内的每个元素,并且使用指定函数来对其元素进行处理。返回列表向量。
      #函数split()可以按照分组因子,把向量,矩阵和数据框进行适当的分组;
      #它的返回值是一个列表,代表分组变量每个水平的观测。
      g_l = lapply(split(t1,t1$geneid),function(x){
        # x=split(t1,t1$geneid)[[1]]
        head(x)
        tmp=apply(x,1,function(y){
          y[2]:y[3]
        }) #按行将一个基因中所有外显子的坐标点全部展示出来
        length(unique(unlist(tmp))) #对所有坐标点进行去重复的操作,去除外显子坐标存在重合的问题
        # sum(x[,4])
      })
      head(g_l)
      g_l=data.frame(gene_id=names(g_l),length=as.numeric(g_l))
      
      save(g_l,file = 'step7-g_l.Rdata')
    }
    load(file = 'step7-g_l.Rdata') #基因编号和对应外显子的长度
    
    head(g_l)
    library(org.Mm.eg.db) #包含gene_id的symbol  小鼠
    s2g=toTable(org.Mm.egSYMBOL)
    head(s2g)
    g_l=merge(g_l,s2g,by='gene_id') #把g_l,s2g两个数据框以'gene_id'为连接进行拼接
    
    gene_id对应的基因名的外显子长度

    2.2 定义基因长度为最长转录本长度

    #小鼠
    library("TxDb.Mmusculus.UCSC.mm10.knownGene") #该函储存转录本信息,包括基因的外显子信息
    txdb <- TxDb.Mmusculus.UCSC.mm10.knownGene
    #人
    library("TxDb.Hsapiens.UCSC.hg19.knownGene") 
    txdb <- TxDb.Hsapiens.UCSC.hg19.knownGene
    
    if(F){
      
      t_l=transcriptLengths(txdb) #transcriptLengths提取基因对应转录本长度
      head(t_l)
      t_l=na.omit(t_l)
      head(t_l)
      t_l=t_l[order(t_l$gene_id,t_l$tx_len,decreasing = T),] #按照降序,先给gene_id排序,再给转录本长度排序
      head(t_l)
      t_l=t_l[!duplicated(t_l$gene_id),]#去重,只保存第一次出现的gene_id,刚好就保留了最长转录本
      head(t_l)
      g_l=t_l[,c(3,5)] #得到的就是gene_id和对应的最长转录本
    }
    head(g_l)
    #小鼠
    library(org.Mm.eg.db) #包含gene_id的symbol
    s2g=toTable(org.Mm.egSYMBOL)
    #人
    #library(org.Hs.eg.db) #包含gene_id的symbol
    #s2g=toTable(org.Hs.egSYMBOL)
    head(s2g)
    g_l=merge(g_l,s2g,by='gene_id') #把g_l,s2g两个数据框以'gene_id'为连接进行拼接
    
    最长转录本长度

    3 计算RPKM

    #基因长度用上述的最长转录本长度
    a[1:4,1:4]
    #取a数据框的行名与g_l数据框的symbol列的交集,因为有基因长度的,我们才能计算RPKM
    ng=intersect(rownames(a),g_l$symbol) 
    
    # 有了counts矩阵和对应的基因长度信息,就很容易进行各种计算了:
    exprSet=a[ng,] #保留有长度信息的基因
    lengths=g_l[match(ng,g_l$symbol),2] #按照ng的顺序,提取了对应转录本长度
    head(lengths)
    head(rownames(exprSet))
    
    exprSet[1:4,1:4]
    total_count<- colSums(exprSet) #每个样本中所有基因counts数求和是文库大小
    head(total_count)
    head(lengths)
    
    #计算第四个样本中第一个基因的RPKM值,因为K M,所有最后*10^9。
    #total_count[4]
    #lengths[1]
    #1*10^9/(2434*123319) #RPKM就是counts数/(基因长度×文库大小)
    
    #批量计算RPKM值
    rpkm <- t(do.call( rbind,
                       lapply(1:length(total_count),
                              function(i){
                                10^9*exprSet[,i]/lengths/total_count[i]
                              }) ))
    #do.call用法
    #dat <- list(matrix(1:25, ncol = 5), matrix(4:28, ncol = 5), matrix(21:45, ncol=5))
    #dat_bind <- do.call(cbind,dat)
    #dat_bind <- do.call(rbind,dat)
    
    rpkm[1:4,1:4]
    rownames(rpkm)<-rownames(exprSet)
    colnames(rpkm)<-colnames(exprSet)
    rpkm<-as.data.frame(rpkm)
    write.table(rpkm,file="RPKM.txt",quote=F,sep = "\t")
    
    rpkm

    最后,感谢生信技能树的分享!

    相关文章

      网友评论

        本文标题:counts转换为RPKM

        本文链接:https://www.haomeiwen.com/subject/vjukvktx.html