芯片數(shù)據(jù)和RNA-seq的差異分析流程

由于太久沒有分析過bulk數(shù)據(jù)了麻裳,前幾天突然被要求分析一個文章的數(shù)據(jù)時有點(diǎn)亂了手腳狞换,所以在這里想總結(jié)一下關(guān)于芯片數(shù)據(jù)與seq數(shù)據(jù)的差異分析流程谭网。

假如你是小白,也剛剛了解NGS的冰山一角(我指的是轉(zhuǎn)錄組)坝撑,就不要隨隨便便拿到數(shù)據(jù)去跑你那所謂的流程代碼,因?yàn)楹苡锌赡苁清e的粮揉,還得意洋洋(我會鄙視你的)

所以這篇blog想要闡明的問題就是:芯片數(shù)據(jù)和seq數(shù)據(jù)不同的差異分析流程

首先聲明绍载,你得去了解什么是基因芯片測序和seq測序,這里我不講滔蝉,自行Google击儡!

一個必要的好習(xí)慣:當(dāng)別人給你一個bulk的轉(zhuǎn)錄組數(shù)據(jù)時,你首先需要做的事蝠引,問這個測序是什么方式測序(芯片or二代測序)阳谍,因?yàn)椴粏柲銦o法分析或者分析的也是大錯特錯!sΩ拧矫夯!

ok,咱們就直接開始

1 芯片數(shù)據(jù)

假如你拿到是芯片數(shù)據(jù)那么就用下面的分析流程吧
首先你得需要一個表達(dá)矩陣吧吊洼,若你想分析文章的數(shù)據(jù)是芯片數(shù)據(jù)训貌,你需要怎么下載呢,很簡單用一個包
1.1下載和處理數(shù)據(jù)

#數(shù)據(jù)下載
rm(list = ls())
library(GEOquery)
gse_number = "GSE56649"  #這里你只需要改成你要下載文獻(xiàn)的GEO號
eSet <- getGEO(gse_number, 
               destdir = '.', 
               getGPL = F)。 #這個包會自動聯(lián)網(wǎng)去GEO數(shù)據(jù)庫下載該文章的數(shù)據(jù)
class(eSet)
length(eSet)
eSet = eSet[[1]]
#(1)提取表達(dá)矩陣exp
exp <- exprs(eSet)    #表達(dá)矩陣在assay data中exprs
exp[1:4,1:4]
if(T){exp = log2(exp+1)}#避免有0值的存在 加1不影響大械莼Α(觀察表達(dá)矩陣中有無取過log)
boxplot(exp)   #觀察是否差不多的箱長豺鼻,如果不一樣
if(T){exp = limma::normalizeBetweenArrays(exp)}  
boxplot(exp)   #這時候箱長就會一樣的
#(2)提取臨床信息
pd <- pData(eSet)
#(3)調(diào)整pd的行名順序與exp列名完全一致
p = identical(rownames(pd),colnames(exp));p
if(!p) exp = exp[,match(rownames(pd),colnames(exp))]
#(4)提取芯片平臺編號  
gpl_number <- eSet@annotation
圖片.png

對上面代碼塊中關(guān)于表達(dá)矩陣的處理進(jìn)行解釋,
通過exp[1:4,1:4]判斷數(shù)據(jù)長啥樣款慨,判斷表達(dá)矩陣是否已經(jīng)取過log儒飒,假如表達(dá)矩陣的數(shù)值范圍在0-15,最大不超過20檩奠,那么就是取過log了桩了,不要運(yùn)行exp = log2(exp+1),反之就要運(yùn)行埠戳,這里解釋一下問什么要取log井誉,假如沒有取log的話,差異logFC會大的離譜整胃,但是你取了多次log的話送悔,后面的logFC會很小,我們對表達(dá)值取log不僅是對logFC有作用爪模,而且對后面畫熱圖數(shù)值的歸一化也很有用 然后我們就要?dú)w一化處理limma::normalizeBetweenArrays(exp)欠啤,什么是歸一化,為什么要?dú)w一化自己查
到此我們得到了我們需要的數(shù)據(jù)了屋灌,并且對數(shù)據(jù)也處理好了洁段,下面就可以進(jìn)行差異分析了
1.2 設(shè)置分組 易出錯的步驟
差異分析顧名思義就是對比出差異,你需要告訴包共郭,那幾個樣本是control組哪些樣本是實(shí)驗(yàn)組祠丝,在這里為了大家都能用,所以只展示手動設(shè)置分組

Group = rep(c("treat","control"),times = c(13,9)) 
#為了大家分析不出錯除嘹,建議大家把實(shí)驗(yàn)組的sample調(diào)到前面写半,control組的sample調(diào)到后面,
#這樣就可以無腦運(yùn)行后面的代碼了尉咕,并且匹配設(shè)置group
#設(shè)置參考水平叠蝇,指定levels,對照組在前年缎,處理組在后
Group = factor(Group,
               levels = c("control","treat"))  #這里一定要這樣設(shè)置因子的位置
Group                                       #因?yàn)楹竺娴拇a是按照這樣匹配的                                           
圖片.png

1.3由于芯片測序的特殊性悔捶,我們需要拿到探針注釋,這樣才能將探針轉(zhuǎn)換為gene symbol 有很多種方法 這里只推薦為經(jīng)常用的三種 選一種即可

#第一種
#利用tinyarray的包
library(tinyarray)
find_anno(gpl_number)   #假如你自己的數(shù)據(jù)单芜,請自行給gpl_number賦予平臺number
ids <- AnnoProbe::idmap('GPL570')  #在這里就可以看到ids有兩列 一個是探針 一個是symbol
#方法2 
#首先你需要知道 每一個平臺都有對應(yīng)的包蜕该。我們需要找到對應(yīng)的包,然后安裝洲鸠,利用包來轉(zhuǎn)換
#那我們怎么知道每一個平臺對應(yīng)的包呢堂淡,這里就要感謝jimmy大神了,大佬弄了一個list 里面有對應(yīng)關(guān)系
gpl_number    
#我們知道我們的gpl_number后。
#http://www.bio-info-trainee.com/1399.html  #打開這個鏈接绢淀。在里面找對應(yīng)
if(!require(hgu133plus2.db))BiocManager::install("hgu133plus2.db")
library(hgu133plus2.db)
ls("package:hgu133plus2.db")
ids <- toTable(hgu133plus2SYMBOL)
head(ids)
# 方法3   #比較慢
#利用geo數(shù)據(jù)庫
#讀取GPL平臺的soft文件萤悴,按列取子集
##https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GPL570
if(F){
  library(GEOquery)
  #注:soft文件列名不統(tǒng)一,活學(xué)活用更啄,有的表格里沒有symbol列稚疹,也有的GPL平臺沒有提供注釋
  a = getGEO(gpl_number,destdir = ".")
  b = a@dataTable@table
  colnames(b)
  ids2 = b[,c("ID","Gene Symbol")]
  colnames(ids2) = c("probe_id","symbol")
  ids2 = ids2[ids2$symbol!="" & !str_detect(ids2$symbol,"http:///"),]
}

jimmy大佬的list


圖片.png

ids


圖片.png

1.4 在這里強(qiáng)調(diào)居灯,芯片數(shù)據(jù)的差異分析只能用limma包來做<牢瘛!怪嫌!
#差異分析义锥,用limma包來做
#需要表達(dá)矩陣和Group,不需要改
library(limma)
design=model.matrix(~Group) #根據(jù)group分組信息進(jìn)行貝葉斯檢驗(yàn)得出差異分析logFC以及p value
fit=lmFit(exp,design)
fit=eBayes(fit)
deg=topTable(fit,coef=2,number = Inf)

#為deg數(shù)據(jù)框添加幾列
#1.加probe_id列岩灭,把行名變成一列
library(dplyr)
deg <- mutate(deg,probe_id=rownames(deg))  #mutate函數(shù)給數(shù)據(jù)框添加一列probe_id 內(nèi)容是rownames(deg)
#2.加上探針注釋      
ids = ids[!duplicated(ids$symbol),]  #探針去重 自行了解       
deg <- inner_join(deg,ids,by="probe_id")    #將deg與ids合并  自動把deg中重復(fù)的probe_id給刪除
nrow(deg)

沒有將探針轉(zhuǎn)換為symbol的數(shù)據(jù)


圖片.png

轉(zhuǎn)換了的數(shù)據(jù)


圖片.png

這樣我們就有芯片測序結(jié)果的差異分析了拌倍。
總結(jié):

1 判斷是否為芯片數(shù)據(jù) 是否取log
2需要測序平臺的number
3設(shè)置group,這里拋出一個問題噪径,就是多組比較怎么辦
4探針與symbol的轉(zhuǎn)換

2 seq數(shù)據(jù)

假如是用二代測序技術(shù)測的seq那么分析就跟芯片數(shù)據(jù)有很大的不同柱恤,為什么二者的分析的流程不能夠相互用這個你需要自己去google了https://zhuanlan.zhihu.com/p/375797068
在此特別強(qiáng)調(diào)!U野梗顺!
由于現(xiàn)在seq數(shù)據(jù)的三個差異分析的包對于輸入數(shù)據(jù)的要求都是要求count數(shù)據(jù),假如從網(wǎng)上下載的數(shù)據(jù)不是count數(shù)據(jù)车摄,那么你的數(shù)據(jù)分析到此就很有可能截然而止了寺谤,不過有以下幾種辦法你可以嘗試:
1:發(fā)email問作者要(但是幾率很小,懂得都懂)
2:下載作者的fastq數(shù)據(jù)進(jìn)行上游分析(在你真的很想用這篇文章的數(shù)據(jù)的時候吮播,因?yàn)楹苡锌赡苣愕姆治鼋Y(jié)果得不到作者的結(jié)果)
3:硬來变屁,但是你的分析是不符合規(guī)范的!R夂荨粟关!
4:找到作者對上傳數(shù)據(jù)處理的手法,例如log环戈,那么你就log回去誊役,就會得到count數(shù)據(jù)了

ok,廢話不多說谷市,直接開始seq的數(shù)據(jù)的差異分析
再強(qiáng)調(diào)一遍蛔垢,需要輸入count數(shù)據(jù)!F扔啤E羝帷!
2.1 導(dǎo)入count數(shù)據(jù)和清洗數(shù)據(jù)

#seq數(shù)據(jù)無法用geoquery包,r直接聯(lián)網(wǎng)去下載數(shù)據(jù)
#你需要去手動下載supplement file里下載 并且記得看大小對不對得上
dat = read.table(”你的count數(shù)據(jù)“艺玲,check.names = F,row.names = 1,header = T)

#表達(dá)矩陣過濾
#需要過濾一下那些在很多樣本里表達(dá)量都為0或者表達(dá)量很低的基因括蝠。過濾標(biāo)準(zhǔn)不唯一。
nrow(dat)  #過濾之前基因數(shù)量:
exp = dat[apply(dat, 1, function(x) sum(x > 0) > 0.5*ncol(exp)), ]#僅保留在一半以上樣本里表達(dá)的基因
nrow(exp)

最后你需要將數(shù)據(jù)處理為這個樣子


圖片.png

我們可以看到列名為sample名饭聚,行名為gene symbol忌警,再仔細(xì)觀察一下,會發(fā)現(xiàn)count數(shù)有的很大有幾千秒梳,而且都是整數(shù)法绵,都是整數(shù),都是整數(shù)@业狻E笃!

2.2 設(shè)置分組
跟芯片數(shù)據(jù)的分析一樣兴垦,要設(shè)置分組,我們還是手動設(shè)置吧

Group = rep(c("treat","control"),times = c(13,9)) #必須嚴(yán)格按照sample設(shè)置
#設(shè)置參考水平徙赢,指定levels,對照組在前探越,處理組在后
Group = factor(Group,
               levels = c("control","treat"))  #這里一定要這樣設(shè)置因子的位置
Group 

這里得說一嘴狡赐,就是這里的代碼是需要你組內(nèi)有重復(fù),假如你組內(nèi)沒有重復(fù)至少在這個代碼里會報(bào)錯(例如control組至少有兩個sample)
2.3 差異分析
對于seq數(shù)據(jù)差異分析有三個包DESeq2钦幔,edgeR枕屉,limma這里全部奉上三個包的代碼

library(DESeq2)
library(edgeR)
library(limma)
logFC_t = 2
pvalue_t = 0.05

#DESeq2做差異分析
colData <- data.frame(row.names =colnames(exp),   #DESeq2要先創(chuàng)建一個數(shù)據(jù)框
                      condition=Group)
if(!file.exists(paste0(proj,"_dd.Rdata"))){
  dds <- DESeqDataSetFromMatrix(
  countData = exp,
  colData = colData,
  design = ~ condition)           #第10行到第14行是創(chuàng)建一個有擬合分組的對象
  dds <- DESeq(dds)               #進(jìn)行差異分析
  save(dds,file = paste0(proj,"_dd.Rdata"))  #保存差異分析數(shù)據(jù)
}
load(file = paste0(proj,"_dd.Rdata"))
class(dds)
res <- results(dds, contrast = c("condition",rev(levels(Group)))) #提取做差異的結(jié)果
c("condition",rev(levels(Group)))
class(res)
DEG1 <- as.data.frame(res)    #變成一個數(shù)據(jù)框
DEG1 <- DEG1[order(DEG1$pvalue),] 
DEG1 = na.omit(DEG1)
head(DEG1)
#添加change列標(biāo)記基因上調(diào)下調(diào)
k1 = (DEG1$pvalue < pvalue_t)&(DEG1$log2FoldChange < -logFC_t);table(k1)
k2 = (DEG1$pvalue < pvalue_t)&(DEG1$log2FoldChange > logFC_t);table(k2)
DEG1$change = ifelse(k1,"DOWN",ifelse(k2,"UP","NOT"))
table(DEG1$change)
head(DEG1)

#edgeR----
dge <- DGEList(counts=exp,group=Group)   #也是要一個表達(dá)矩陣和分組信息
dge$samples$lib.size <- colSums(dge$counts)
dge <- calcNormFactors(dge) 

design <- model.matrix(~Group)

dge <- estimateGLMCommonDisp(dge, design)
dge <- estimateGLMTrendedDisp(dge, design)
dge <- estimateGLMTagwiseDisp(dge, design)

fit <- glmFit(dge, design)
fit <- glmLRT(fit) 

DEG2=topTags(fit, n=Inf)
class(DEG2)
DEG2=as.data.frame(DEG2)   #提取差異結(jié)果
head(DEG2)
k1 = (DEG2$PValue < pvalue_t)&(DEG2$logFC < -logFC_t);table(k1)
k2 = (DEG2$PValue < pvalue_t)&(DEG2$logFC > logFC_t);table(k2)
DEG2$change = ifelse(k1,"DOWN",ifelse(k2,"UP","NOT"))
table(DEG2$change)

###limma----
dge <- DGEList(counts=exp)
dge <- calcNormFactors(dge)
design <- model.matrix(~Group)
v <- voom(dge,design, normalize="quantile")   #limma包對RNA-SEQ的話要VOOM標(biāo)準(zhǔn)化
fit <- lmFit(v, design)
fit= eBayes(fit)

DEG3 = topTable(fit, coef=2, n=Inf)     #直接提取 不用as.data.frame
DEG3 = na.omit(DEG3)

k1 = (DEG3$P.Value < pvalue_t)&(DEG3$logFC < -logFC_t);table(k1)
k2 = (DEG3$P.Value < pvalue_t)&(DEG3$logFC > logFC_t);table(k2)
DEG3$change = ifelse(k1,"DOWN",ifelse(k2,"UP","NOT"))
table(DEG3$change)
head(DEG3)
圖片.png

上面的包選擇其中一個即可,或者你可以取他們的交集节槐,怎么判斷自己分析出來的差異結(jié)果是對的呢搀庶,這里說一句就是對于無處理count的seq數(shù)據(jù)logFC大概會在正負(fù)10左右,而且stable的基因遠(yuǎn)遠(yuǎn)大于上下調(diào)gene铜异,假如你想要更深程度知道每一個包的分析流程(更多個性話多流程)哥倔,你可以去學(xué)習(xí)每一個包的分析流程,大概都大差不差揍庄,按照要求輸入數(shù)據(jù)咆蒿,清洗數(shù)據(jù),設(shè)置組別蚂子,差異分析沃测。

ok后面的就是簡簡單單的富集分析了.....

上面有寫的不對的地方,歡迎大家批評指正與討論

References:
https://zhuanlan.zhihu.com/p/375797068
https://blog.csdn.net/qazplm12_3/article/details/121134183
https://www.sohu.com/a/446981070_120380672
https://zhuanlan.zhihu.com/p/493445452
這里面有幾篇寫的很好J尘ァ5倨啤!

加油1鹩妗8矫浴惧互!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市喇伯,隨后出現(xiàn)的幾起案子喊儡,更是在濱河造成了極大的恐慌,老刑警劉巖稻据,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艾猜,死亡現(xiàn)場離奇詭異,居然都是意外死亡捻悯,警方通過查閱死者的電腦和手機(jī)匆赃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秋度,“玉大人炸庞,你說我怎么就攤上這事钱床〖运梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵查牌,是天一觀的道長事期。 經(jīng)常有香客問我,道長纸颜,這世上最難降的妖魔是什么兽泣? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮胁孙,結(jié)果婚禮上唠倦,老公的妹妹穿的比我還像新娘。我一直安慰自己涮较,他們只是感情好稠鼻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狂票,像睡著了一般候齿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闺属,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天慌盯,我揣著相機(jī)與錄音,去河邊找鬼掂器。 笑死亚皂,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的国瓮。 我是一名探鬼主播灭必,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼匠楚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厂财?” 一聲冷哼從身側(cè)響起芋簿,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璃饱,沒想到半個月后与斤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荚恶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年撩穿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒撼。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡食寡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出廓潜,到底是詐尸還是另有隱情抵皱,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布辩蛋,位于F島的核電站呻畸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悼院。R本人自食惡果不足惜伤为,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望据途。 院中可真熱鬧绞愚,春花似錦、人聲如沸颖医。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽便脊。三九已至蚂四,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哪痰,已是汗流浹背遂赠。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晌杰,地道東北人跷睦。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像肋演,于是被迫代替她去往敵國和親抑诸。 傳聞我的和親對象是個殘疾皇子烂琴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

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