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

本節(jié)概覽:

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

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

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

1. 讀取counts.txt構建counts矩陣,進行樣品的重命名和分組

###環(huán)境設置
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")

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


#### 導入或構建樣本信息,  進行列樣品名的重命名和分組####
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 #更改樣品名
group_list <- nlgl$group_list
gl <- data.frame(row.names=colnames(counts), #構建樣品名與分組對應的數(shù)據(jù)框
                 group_list=group_list)

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

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

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

基因表達量一般以TPM或FPKM為單位來展示滔蝉,所以還需要進行击儡,若還想轉(zhuǎn)化為FPKM或CPM可參見Counts FPKM RPKM TPM 的轉(zhuǎn)化 獲取基因有效長度的N種方法

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

### 取出counts中geneid對應的efflen
efflen <- geneid_efflen[match(rownames(counts),
                              geneid_efflen$geneid),
                        "efflen"]

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

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

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

若上游中采用的是UCSC的基因組和gtf注釋文件,則表達矩陣行名就是我們常見的gene symbol基因名螃概;若上游采用的是gencode或ensembl基因組和gtf注釋文件矫夯,那么我們就需要將基因表達矩陣行名的Ensembl_id(gene_id)轉(zhuǎn)換為gene symbol (gene_name)了。
在轉(zhuǎn)換時經(jīng)常會出現(xiàn)多個Ensembl_id對應與一個gene symbol的情形吊洼,此時就出現(xiàn)了重復的gene symbol训貌。此時就需要我們在進行基因ID轉(zhuǎn)換去除重復的gene symbol。
下面展示轉(zhuǎn)化ID并合并所有重復symbol的方法冒窍,其他基因名去重復方法參見Ensembl_id轉(zhuǎn)換與gene symbol基因名去重復的兩種方法 - 簡書 (jianshu.com)

#合并所有重復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行名對應的symbol
table(duplicated(symbol))  #統(tǒng)計重復基因名
  
###使用aggregate根據(jù)symbol列中的相同基因進行合并 
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列中的相同基因進行合并 
tpm <- column_to_rownames(tpm,'Group.1')
id轉(zhuǎn)換前
id轉(zhuǎn)換后

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

我們的數(shù)據(jù)中會有很多低表達甚至不表達的基因递沪,在后續(xù)分析中可能會影響數(shù)據(jù)的分析判斷,因此需要對低表達的基因進行篩除處理综液。篩選標準不唯一款慨,依自己數(shù)據(jù)情況而定。在這里展示篩選出至少在重復樣本數(shù)量內(nèi)的表達量counts大于1的行(基因)谬莹,可以看到超過一半以上的基因都被篩掉了檩奠。

#### 初步過濾低表達基因 ####(篩選標準不唯一桩了、依情況而定)
#篩選出至少在重復樣本數(shù)量內(nèi)的表達量counts大于1的行(基因)
keep_feature <- rowSums(counts>1) >= 2
table(keep_feature)  #查看篩選情況,F(xiàn)ALSE為低表達基因數(shù)(行數(shù))埠戳,TURE為要保留基因數(shù)
#FALSE  TRUE 
#35153 20339 

counts_filt <- counts[keep_feature, ] #替換counts為篩選后的基因矩陣(保留較高表達量的基因)
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)換類型type = "salmon"送悔、以及轉(zhuǎn)錄本與基因名gene symbol對應關系文件(即我們之前得到的t2s_vm25_gencode.txt)就可以轉(zhuǎn)換得到各基因的定量關系了。其他步驟與操作featureCounts輸出文件類似爪模。
這里只展示了獲取基因表達的TPM值欠啤,如果還想了解如何獲得FPKM值請參考文章:獲取基因有效長度的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的對應關系文件
t2s <- fread("t2s_vm25_gencode.txt", data.table = F, header = F); head(t2s)

##找到所有quant.sf文件所在路徑  導入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表達矩陣
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)
 

#### 導入或構建樣本信息,  進行列重命名和分組 ####
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)


#### 初步過濾低表達基因 ####
#篩選出至少在重復樣本數(shù)量內(nèi)的表達量counts大于1的行(基因)
keep_feature <- rowSums(counts > 1) >= 2               #ncol(counts)/length(table(group_list)) 
table(keep_feature)  #查看篩選情況
counts_filt <- counts[keep_feature, ] #替換counts為篩選后的基因矩陣(保留較高表達量的基因)
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') 

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

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


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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市除嘹,隨后出現(xiàn)的幾起案子写半,更是在濱河造成了極大的恐慌,老刑警劉巖尉咕,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叠蝇,死亡現(xiàn)場離奇詭異,居然都是意外死亡年缎,警方通過查閱死者的電腦和手機悔捶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來单芜,“玉大人蜕该,你說我怎么就攤上這事≈摒” “怎么了堂淡?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扒腕。 經(jīng)常有香客問我绢淀,道長,這世上最難降的妖魔是什么袜匿? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮稚疹,結果婚禮上居灯,老公的妹妹穿的比我還像新娘祭务。我一直安慰自己,他們只是感情好怪嫌,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布义锥。 她就那樣靜靜地躺著,像睡著了一般岩灭。 火紅的嫁衣襯著肌膚如雪拌倍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天噪径,我揣著相機與錄音柱恤,去河邊找鬼。 笑死找爱,一個胖子當著我的面吹牛梗顺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播车摄,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼寺谤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吮播?” 一聲冷哼從身側響起变屁,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎意狠,沒想到半個月后粟关,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡摄职,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年誊役,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谷市。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛔垢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出迫悠,到底是詐尸還是另有隱情鹏漆,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布创泄,位于F島的核電站艺玲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鞠抑。R本人自食惡果不足惜饭聚,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搁拙。 院中可真熱鬧秒梳,春花似錦法绵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兴垦,卻和暖如春吴菠,著一層夾襖步出監(jiān)牢的瞬間捐下,已是汗流浹背孽鸡。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工腐螟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扶关。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓阴汇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親节槐。 傳聞我的和親對象是個殘疾皇子搀庶,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容