RNA-seq入門(mén)實(shí)戰(zhàn)(三):從featureCounts與Salmon輸出文件獲取counts矩陣

本節(jié)概覽:

  1. 從featureCounts輸出文件中獲取counts與TPM矩陣:
    讀取counts.txt構(gòu)建counts矩陣;樣品的重命名和分組;counts與TPM轉(zhuǎn)換;基因ID轉(zhuǎn)換;初步過(guò)濾低表達(dá)基因與保存counts數(shù)據(jù)
  2. 從salmon輸出文件中獲取counts與TPM矩陣:
    用tximport包讀取quant.sf構(gòu)建counts與TPM矩陣;樣品的重命名和分組;初步過(guò)濾低表達(dá)基因與保存counts數(shù)據(jù)

承接上節(jié)RNA-seq入門(mén)實(shí)戰(zhàn)(二):上游數(shù)據(jù)的比對(duì)計(jì)數(shù)——Hisat2與Salmon
之前已經(jīng)得到了featureCounts與Salmon輸出文件(counts、salmon)和基因ID轉(zhuǎn)化文件(g2s_vm25_gencode.txt、t2s_vm25_gencode.txt)。一般為了對(duì)樣品進(jìn)行分組注釋我們還需要在GEO網(wǎng)站下載樣品Metadata信息表SraRunTable.txt,接下來(lái)就需要在R中對(duì)輸出結(jié)果進(jìn)行操作,轉(zhuǎn)化為我們想要的基因表達(dá)counts矩陣。

一、從featureCounts輸出文件中獲取counts矩陣

1. 讀取counts.txt構(gòu)建counts矩陣,進(jìn)行樣品的重命名和分組

###環(huán)境設(shè)置
rm(list=ls())
options(stringsAsFactors = F) 
library(tidyverse) # ggplot2 stringer dplyr tidyr readr purrr  tibble forcats
library(data.table) #多核讀取文件
setwd("C:/Users/Lenovo/Desktop/test")

#### 對(duì)counts進(jìn)行處理篩選得到表達(dá)矩陣 ####
a1 <- fread('./counts/counts.txt',
              header = T,data.table = F)#載入counts,第一列設(shè)置為列名
colnames(a1)
counts <- a1[,7:ncol(a1)] #截取樣本基因表達(dá)量的counts部分作為counts 
rownames(counts) <- a1$Geneid #將基因名作為行名
#更改樣品名
colnames(counts)
colnames(counts) <- gsub('/home/test/align/bam/','', #刪除樣品名前綴
                   gsub('_sorted.bam','',  colnames(counts))) #刪除樣品名后綴


#### 導(dǎo)入或構(gòu)建樣本信息,  進(jìn)行列樣品名的重命名和分組####
b <- read.csv('./SraRunTable.txt')
b
name_list <- b$source_name[match(colnames(counts),b$Run)]; name_list  #選擇所需要的樣品信息列
nlgl <- data.frame(row.names=colnames(counts),
                   name_list=name_list,
                   group_list=name_list)
fix(nlgl)  #手動(dòng)編輯構(gòu)建樣品名和分組信息
name_list <- nlgl$name_list
colnames(counts) <- name_list #更改樣品名
group_list <- nlgl$group_list
gl <- data.frame(row.names=colnames(counts), #構(gòu)建樣品名與分組對(duì)應(yīng)的數(shù)據(jù)框
                 group_list=group_list)

這里給樣品名加上_1、_2表示重復(fù)樣品,根據(jù)這兩類(lèi)細(xì)胞的多能性狀態(tài)將其分組為naive和primed

fix(nlgl)編輯構(gòu)建樣品名和分組信息

2. counts與TPM轉(zhuǎn)換

基因表達(dá)量一般以TPM或FPKM為單位來(lái)展示,所以還需要進(jìn)行,若還想轉(zhuǎn)化為FPKM或CPM可參見(jiàn)Counts FPKM RPKM TPM 的轉(zhuǎn)化 獲取基因有效長(zhǎng)度的N種方法

#### counts,TPM轉(zhuǎn)化 ####
# 注意需要轉(zhuǎn)化的是未經(jīng)篩選的counts原始矩陣
### 從featurecounts 原始輸出文件counts.txt中提取Geneid、Length(轉(zhuǎn)錄本長(zhǎng)度),計(jì)算tpm
geneid_efflen <- subset(a1,select = c("Geneid","Length"))
colnames(geneid_efflen) <- c("geneid","efflen")  

### 取出counts中g(shù)eneid對(duì)應(yīng)的efflen
efflen <- geneid_efflen[match(rownames(counts),
                              geneid_efflen$geneid),
                        "efflen"]

### 計(jì)算 TPM 公式
 #TPM (Transcripts Per Kilobase Million)  每千個(gè)堿基的轉(zhuǎn)錄每百萬(wàn)映射讀取的Transcripts
  counts2TPM <- function(count=count, efflength=efflen){
    RPK <- count/(efflength/1000)   #每千堿基reads (Reads Per Kilobase) 長(zhǎng)度標(biāo)準(zhǔn)化
    PMSC_rpk <- sum(RPK)/1e6        #RPK的每百萬(wàn)縮放因子 (“per million” scaling factor ) 深度標(biāo)準(zhǔn)化
    RPK/PMSC_rpk              
  }  

tpm <- as.data.frame(apply(counts,2,counts2TPM))
colSums(tpm)         

3. 基因ID轉(zhuǎn)換

若上游中采用的是UCSC的基因組和gtf注釋文件,則表達(dá)矩陣行名就是我們常見(jiàn)的gene symbol基因名;若上游采用的是gencode或ensembl基因組和gtf注釋文件,那么我們就需要將基因表達(dá)矩陣行名的Ensembl_id(gene_id)轉(zhuǎn)換為gene symbol (gene_name)了。
在轉(zhuǎn)換時(shí)經(jīng)常會(huì)出現(xiàn)多個(gè)Ensembl_id對(duì)應(yīng)與一個(gè)gene symbol的情形,此時(shí)就出現(xiàn)了重復(fù)的gene symbol。此時(shí)就需要我們?cè)谶M(jìn)行基因ID轉(zhuǎn)換去除重復(fù)的gene symbol。
下面展示轉(zhuǎn)化ID并合并所有重復(fù)symbol的方法,其他基因名去重復(fù)方法參見(jiàn)Ensembl_id轉(zhuǎn)換與gene symbol基因名去重復(fù)的兩種方法 - 簡(jiǎn)書(shū) (jianshu.com)

#合并所有重復(fù)symbol
g2s <- fread('g2s_vm25_gencode.txt',header = F,data.table = F) #載入從gencode的gtf文件中提取的信息文件
colnames(g2s) <- c("geneid","symbol")
  
symbol <- g2s[match(rownames(counts),g2s$geneid),"symbol"] #匹配counts行名對(duì)應(yīng)的symbol
table(duplicated(symbol))  #統(tǒng)計(jì)重復(fù)基因名
  
###使用aggregate根據(jù)symbol列中的相同基因進(jìn)行合并 
counts <- aggregate(counts, by=list(symbol), FUN=sum)
counts <- column_to_rownames(counts,'Group.1')
  
tpm <- aggregate(tpm, by=list(symbol), FUN=sum) ###使用aggregat 將symbol列中的相同基因進(jìn)行合并 
tpm <- column_to_rownames(tpm,'Group.1')
id轉(zhuǎn)換前
id轉(zhuǎn)換后

4. 初步過(guò)濾低表達(dá)基因與保存counts數(shù)據(jù)

我們的數(shù)據(jù)中會(huì)有很多低表達(dá)甚至不表達(dá)的基因,在后續(xù)分析中可能會(huì)影響數(shù)據(jù)的分析判斷,因此需要對(duì)低表達(dá)的基因進(jìn)行篩除處理。篩選標(biāo)準(zhǔn)不唯一,依自己數(shù)據(jù)情況而定。在這里展示篩選出至少在重復(fù)樣本數(shù)量?jī)?nèi)的表達(dá)量counts大于1的行(基因),可以看到超過(guò)一半以上的基因都被篩掉了。

#### 初步過(guò)濾低表達(dá)基因 ####(篩選標(biāo)準(zhǔn)不唯一、依情況而定)
#篩選出至少在重復(fù)樣本數(shù)量?jī)?nèi)的表達(dá)量counts大于1的行(基因)
keep_feature <- rowSums(counts>1) >= 2
table(keep_feature)  #查看篩選情況,F(xiàn)ALSE為低表達(dá)基因數(shù)(行數(shù)),TURE為要保留基因數(shù)
#FALSE  TRUE 
#35153 20339 

counts_filt <- counts[keep_feature, ] #替換counts為篩選后的基因矩陣(保留較高表達(dá)量的基因)
tpm_filt <- tpm[keep_feature, ]

#### 保存數(shù)據(jù) ####
counts_raw=counts #這里重新命名方便后續(xù)分析調(diào)用
counts=counts_filt
tpm=tpm_filt

save(counts_raw, counts, tpm, 
     group_list, gl,
     file='./1.counts.Rdata') 

二、從salmon輸出文件中獲取counts矩陣

需要用到tximport包從salmon輸出文件中獲取counts矩陣,在tximport函數(shù)中輸入quant.sf文件路徑、轉(zhuǎn)換類(lèi)型type = "salmon"、以及轉(zhuǎn)錄本與基因名gene symbol對(duì)應(yīng)關(guān)系文件(即我們之前得到的t2s_vm25_gencode.txt)就可以轉(zhuǎn)換得到各基因的定量關(guān)系了。其他步驟與操作featureCounts輸出文件類(lèi)似。
這里只展示了獲取基因表達(dá)的TPM值,如果還想了解如何獲得FPKM值請(qǐng)參考文章:獲取基因有效長(zhǎng)度的N種方法中第二部分內(nèi)容以及Counts FPKM RPKM TPM 的轉(zhuǎn)化

rm(list=ls())
options(stringsAsFactors = F)
library(tximport) #Import transcript-level abundances and counts for transcript- and gene-level analysis packages
library(tidyverse) # ggplot2 stringer dplyr tidyr readr purrr  tibble forcats
library(data.table) #多核讀取文件
setwd("C:/Users/Lenovo/Desktop/test/")


####  salmon原始文件處理  ####
##載入transcript_id和symbol的對(duì)應(yīng)關(guān)系文件
t2s <- fread("t2s_vm25_gencode.txt", data.table = F, header = F); head(t2s)

##找到所有quant.sf文件所在路徑  導(dǎo)入salmon文件處理匯總
files <- list.files(pattern="*quant.sf",recursive=T, full.names = T); files  #顯示目錄下所有符合要求的文件
txi <- tximport(files, type = "salmon", tx2gene = t2s)

##提取文件夾中的樣品名作為counts行名
cn <- sapply(strsplit(files,'\\/'), function(x) x[length(x)-1]); cn
colnames(txi$counts) <- gsub('_quant','',cn); colnames(txi$counts)

##提取出counts/tpm表達(dá)矩陣
counts <- as.data.frame(apply(txi$counts,2,as.integer)) #將counts數(shù)取整
rownames(counts) <- rownames(txi$counts) 
tpm <- as.data.frame(txi$abundance)  ###abundance為基因的Tpm值
colnames(tpm) <- colnames(txi$counts)
 

#### 導(dǎo)入或構(gòu)建樣本信息,  進(jìn)行列重命名和分組 ####
b <- read.csv('./SraRunTable.txt')
b
name_list <- b$source_name[match(colnames(counts),b$Run)]; name_list
nlgl <- data.frame(row.names=colnames(counts),
                 name_list=name_list,
                 group_list=name_list)
fix(nlgl)
name_list <- nlgl$name_list
colnames(counts) <- name_list
colnames(tpm) <- name_list

group_list <- nlgl$group_list
gl <- data.frame(row.names=colnames(counts),
                 group_list=group_list)


#### 初步過(guò)濾低表達(dá)基因 ####
#篩選出至少在重復(fù)樣本數(shù)量?jī)?nèi)的表達(dá)量counts大于1的行(基因)
keep_feature <- rowSums(counts > 1) >= 2               #ncol(counts)/length(table(group_list)) 
table(keep_feature)  #查看篩選情況
counts_filt <- counts[keep_feature, ] #替換counts為篩選后的基因矩陣(保留較高表達(dá)量的基因)
tpm_filt <- tpm[keep_feature, ]


#### 保存數(shù)據(jù) ####
counts_raw=counts  
counts=counts_filt
tpm=tpm_filt

save(counts_raw, counts, tpm,
     group_list, gl, txi, #注意保存txi文件用于DESeq2分析
     file='salmon/1.counts.Rdata') 

通過(guò)以上步驟,成功從featureCounts或Salmon輸出文件中獲取了counts和tpm表達(dá)矩陣,保存所需表達(dá)矩陣和分組信息,接著就可以用這些數(shù)據(jù)進(jìn)行下游各類(lèi)分析啦

參考資料
Ensembl_id轉(zhuǎn)換與gene symbol基因名去重復(fù)的兩種方法 - 簡(jiǎn)書(shū) (jianshu.com)
獲取基因有效長(zhǎng)度的N種方法
Counts FPKM RPKM TPM 的轉(zhuǎn)化
本實(shí)戰(zhàn)教程基于以下生信技能樹(shù)分享的視頻:
【生信技能樹(shù)】轉(zhuǎn)錄組測(cè)序數(shù)據(jù)分析_嗶哩嗶哩_bilibili
【生信技能樹(shù)】GEO數(shù)據(jù)庫(kù)挖掘_嗶哩嗶哩_bilibili


RNA-seq實(shí)戰(zhàn)系列文章:
RNA-seq入門(mén)實(shí)戰(zhàn)(零):RNA-seq流程前的準(zhǔn)備——Linux與R的環(huán)境創(chuàng)建
RNA-seq入門(mén)實(shí)戰(zhàn)(一):上游數(shù)據(jù)下載、格式轉(zhuǎn)化和質(zhì)控清洗
RNA-seq入門(mén)實(shí)戰(zhàn)(二):上游數(shù)據(jù)的比對(duì)計(jì)數(shù)——Hisat2+ featureCounts 與 Salmon
RNA-seq入門(mén)實(shí)戰(zhàn)(三):從featureCounts與Salmon輸出文件獲取counts矩陣
RNA-seq入門(mén)實(shí)戰(zhàn)(四):差異分析前的準(zhǔn)備——數(shù)據(jù)檢查
RNA-seq入門(mén)實(shí)戰(zhàn)(五):差異分析——DESeq2 edgeR limma的使用與比較
RNA-seq入門(mén)實(shí)戰(zhàn)(六):GO、KEGG富集分析與enrichplot超全可視化攻略
RNA-seq入門(mén)實(shí)戰(zhàn)(七):GSEA——基因集富集分析
RNA-seq入門(mén)實(shí)戰(zhàn)(八):GSVA——基因集變異分析
RNA-seq入門(mén)實(shí)戰(zhàn)(九):PPI蛋白互作網(wǎng)絡(luò)構(gòu)建(上)——STRING數(shù)據(jù)庫(kù)的使用
RNA-seq入門(mén)實(shí)戰(zhàn)(十):PPI蛋白互作網(wǎng)絡(luò)構(gòu)建(下)——Cytoscape軟件的使用
RNA-seq入門(mén)實(shí)戰(zhàn)(十一):WGCNA加權(quán)基因共表達(dá)網(wǎng)絡(luò)分析——關(guān)聯(lián)基因模塊與表型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容