文章標(biāo)題是:Tinagl1 Suppresses Triple-Negative Breast Cancer Progression and Metastasis by Simultaneously Inhibiting Integrin/FAK and EGFR Signaling .
菜鳥一枚,所以現(xiàn)在只是復(fù)現(xiàn)這篇文章里的B圖;C圖里的通路GO/KEGG注釋及A圖中的GSEA下回分解?? (感覺任重而道遠(yuǎn))
從文章中,我們找到GSE號
All microarray data generated in this study have been deposited as a superseries at the NCBI Gene Expression Omnibus with the accession code GSE99507, and can be accessed at https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE99507.
點(diǎn)開,看到如下分組,這里面的分組信息先留個(gè)懸念
老大GEO視頻中一閃而過的文章是:從GEO數(shù)據(jù)庫下載得到表達(dá)矩陣 一文就夠
現(xiàn)在我們需要通這個(gè)GPL平臺找到對應(yīng)的注釋R包然后找到下面這個(gè)包裝函數(shù)的板塊,截圖如下:
圖片中是老大已經(jīng)包裝好的函數(shù),我們這次要下載的GSE號是99507,因此在R里代碼框輸入下面即可,如圖:
得到當(dāng)前GSE號所對應(yīng)的芯片平臺,如下圖:即GPL17077.
這個(gè)時(shí)候,我們需要非常熟悉這個(gè)對象哦
我們也可以在GEO網(wǎng)站上看到平臺信息是這樣的,截圖如下
接下來,因此我們可以去老大的搜集貼找對應(yīng)關(guān)系,參考老大的這篇文章:(16)芯片探針與基因的對應(yīng)關(guān)系-生信菜鳥團(tuán)博客2周年精選文章集,截圖如下:
從以上列表中,用GPL17077去找對應(yīng)的注釋包,發(fā)現(xiàn)沒有。(老大已經(jīng)總結(jié)地很全了,但是依然有些GPL平臺是沒有注釋包或者是有我們沒有找到。)
而老大GEO視頻里的GPL平臺其實(shí)是有注釋R包的,就是下圖中的這個(gè)hgu95av2.db
,視頻中老大從R語言20練習(xí)題里有關(guān)于ID轉(zhuǎn)換的代碼,如下圖:
總之,現(xiàn)在的GPL17077平臺現(xiàn)在并沒有對應(yīng)的注釋R包,當(dāng)然更不是視頻中的這個(gè)hgu95av2.db
了。為了能繼續(xù)跟著按照老大視頻中講的繼續(xù)做,我去Google搜索,用的是前面在GEO網(wǎng)站里GPL平臺對應(yīng)的平臺信息,前面也有截圖,如下
Google找的說是這個(gè)hgug4110b.db的注釋R包,其實(shí)在老大總結(jié)里這個(gè)包對應(yīng)的是GPL887平臺,但是我想還是試試,于是我嘗試了下載下,代碼如下啦
# 首先我下載了一個(gè)錯(cuò)誤的包
BiocManager::install('hgug4110b.db')
library('hgug4110b.db')
?hgug4110b
ls("package:hgug4110b.db")
#下面這段很眼熟,就是我上面在R語言20題里的截圖,我把視頻中的hgu95av2.db包換成我在谷歌搜索到的hgug4110b.db包
library('hgug4110b.db')
ids=toTable(hgug4110bSYMBOL)
length(unique(ids$symbol))
tail(sort(table(ids$symbol)))
table(sort(table(ids$symbol)))
plot(table(sort(table(ids$symbol))))
exprSet<-dat
table(rownames(exprSet) %in% ids$probe_id)
dim(exprSet)
exprSet=exprSet[rownames(exprSet) %in% ids$probe_id,]
dim(exprSet)
ids=ids[match(rownames(exprSet),ids$probe_id),]
head(ids)
exprSet[1:5,1:5]
tmp = by(exprSet,ids$symbol,
function(x) rownames(x)[which.max(rowMeans(x))] )
probes = as.character(tmp)
exprSet=exprSet[rownames(exprSet) %in% probes ,]
dim(exprSet)
#寫一個(gè)函數(shù),可以之間過濾掉其他探針并且進(jìn)行ID轉(zhuǎn)換,
#此時(shí)的id轉(zhuǎn)換是用bioconductor包來轉(zhuǎn)換的,如果下載的matrix,則不用轉(zhuǎn)換
jimmy <- function(exprSet,ids){
tmp = by(exprSet,
ids$symbol,
function(x) rownames(x)[which.max(rowMeans(x))] )
probes = as.character(tmp)
print(dim(exprSet))
exprSet=exprSet[rownames(exprSet) %in% probes ,]
print(dim(exprSet))
return(exprSet)
}
new.exprSet <- jimmy(exprSet,ids)
#此時(shí)會報(bào)錯(cuò),因?yàn)楝F(xiàn)在的exprSet和ids的長度不一樣
由于expeSet里的ID能在ids里對應(yīng)的很少,大部分都是對應(yīng)不上的,如下圖
對應(yīng)上的基因數(shù)TRUE只有8190,因此我認(rèn)為我谷歌到的這個(gè)hgug4110b.db
并不對。
不過==沒關(guān)系==鼓起勇氣,繼續(xù)探索
而且老大視頻里又給了找不到對應(yīng)的注釋R包時(shí),通過下面的代碼來實(shí)現(xiàn)探針名和基因名的對接,代碼網(wǎng)址:https://github.com/jmzeng1314/my-R/blob/master/9-microarray-examples/E-MTAB-3017.R
#代碼如下
gpl <- getGEO('GPL17077', destdir=".")
colnames(Table(gpl))
head(Table(gpl)[,c(1,6,7)]) ## you need to check this , which column do you need
write.csv(Table(gpl)[,c(1,6,7)],"GPL17077.csv")
ids=read.csv('GPL17077.csv')
#這樣我們就同樣獲得了探針對應(yīng)基因的表達(dá)矩陣?yán)?/span>
前面我所認(rèn)為的第一步剛剛結(jié)束了,獲得了探針對應(yīng)基因的表達(dá)矩陣
1.直接下載raw data,但不推薦大家用,原始數(shù)據(jù)
2.下載表達(dá)矩陣 series matrix file(s),下載后可讀到R里面,考驗(yàn)網(wǎng)速
a=read.table('GSE42872_series_matrix.txt.gz')
> class(a)
[1] "data.frame"
> str(gset)
3.在R里面讀取GSE號.
gset <- getGEO("GSE42589")
加載GEO包下載
library(GEOquery)
gset <- getGEO('GSE42872',destdir=".",AnnotGPL = F,getGPL = F)
老大推薦第三種方式,下面是代碼
# 就這么來就對了,沒毛病
###step1-downloadR
rm(list = ls()) ## 魔幻操作,一鍵清空~
options(stringsAsFactors = F)
# 注意查看下載文件的大小,檢查數(shù)據(jù)
f='GSE99507_eSet.Rdata'
library(GEOquery)
# 這個(gè)包需要注意兩個(gè)配置,一般來說自動化的配置是足夠的。
#Setting options('download.file.method.GEOquery'='auto')
#Setting options('GEOquery.inmemory.gpl'=FALSE)
if(!file.exists(f)){
gset <- getGEO('GSE99507', destdir=".",
AnnotGPL = F, ## 注釋文件
getGPL = F) ## 平臺文件
save(gset,file=f) ## 保存到本地
}
load('GSE99507_eSet.Rdata') ## 載入數(shù)據(jù)
class(gset)
length(gset)
class(gset[[1]])
# 因?yàn)檫@個(gè)GEO數(shù)據(jù)集只有一個(gè)GPL平臺,所以下載到的是一個(gè)含有一個(gè)元素的list
a=gset[[1]]
dat=exprs
dim(dat)
# GPL3921 [HT_HG-U133A] Affymetrix HT Human Genome U133A Array
# Bioconductor - hgu133a.db
dat[1:4,1:4]
pd=pData(a) #獲得分組信息,就得到了前面一張截圖,即前面懸念的解答處-GSE號對應(yīng)的Samples分組信息,主要是根據(jù)文章里的那個(gè)截圖的分組信息來對字符串進(jìn)行拆分(str_split)和替換(str_replace)
library(stringr)
group_list = trimws(str_split(pd$title,' ',simplify = T)[,5])#拆分
group_list = str_replace(group_list,'LM2','Vector')
table(group_list)
save(dat,group_list,file = 'step1-output.Rdata')
#此時(shí),要注意保存的這個(gè)文件step1-output.Rdata,我們要知道此時(shí)的dat表達(dá)矩陣是什么樣的
###step2-ids-filter.R
rm(list = ls()) ## 魔幻操作,一鍵清空~
options(stringsAsFactors = F)
load('step1-output.Rdata')
gpl <- getGEO('GPL17077', destdir=".")
colnames(Table(gpl)) ## [1] 41108 17
head(Table(gpl)[,c(1,7)]) ## you need to check this , which column do you need
write.csv(Table(gpl)[,c(1,7)],"GPL17077.csv")
ids=read.csv('GPL17077.csv')
ids=ids[,-1]
dat[1:4,1:4]
rownames(dat)
#如前所述,現(xiàn)在沒有這個(gè)平臺對應(yīng)的注視R包,所以下面是根據(jù)下載的dat和ids來進(jìn)行的ID轉(zhuǎn)換步驟
ids[ids$GENE_SYMBOL!='',]
ids=ids[ids$GENE_SYMBOL!='',]
match(rownames(dat),ids$ID)
ids[match(rownames(dat),ids$ID),]
ids=ids[match(rownames(dat),ids$ID),]
ids=ids[complete.cases(ids),]
dat=dat[ids$ID,]
#下面是針對那些有多個(gè)基因去重的步驟,注意理解為什么要取median(中位數(shù)),巧妙
ids$median=apply(dat,1,median)
ids=ids[order(ids$GENE_SYMBOL,ids$median,decreasing = T),]
ids=ids[!duplicated(ids$GENE_SYMBOL),]
dat=dat[ids$ID,]
rownames(dat)=ids$GENE_SYMBOL
dat[1:4,1:4]
dim(dat)
save(dat,group_list,file = 'step2-output.Rdata')
#此時(shí)此時(shí),要注意保存的這個(gè)文件step2-output.Rdata,我們要知道此時(shí)的dat表達(dá)矩陣是什么樣的
###step3-pca-heatmap
##PCA主成分分析
(list = ls()) ## 魔幻操作,一鍵清空~
options(stringsAsFactors = F)
load(file = 'step1-output.Rdata')
# 每次都要檢測數(shù)據(jù)
dat[1:4,1:4]
## 下面是畫PCA的必須操作,需要看說明書。
dat=t(dat)
dat=as.data.frame(dat)
dat=cbind(dat,group_list)
library("FactoMineR")
library("factoextra")
# The variable group_list (index = ) is removed
# before PCA analysis
dat.pca <- PCA(dat[,-ncol(dat)], graph = FALSE)
fviz_pca_ind(dat.pca,repel =T,
#geom.ind = "point", # show points only (nbut not "text")
col.ind = dat$group_list, # color by groups
palette = c("#00AFBB", "#E7B800"),
addEllipses = TRUE, # Concentration ellipses
legend.title = "Groups"
)
##熱圖:heatmap-sd
rm(list = ls()) ## 魔幻操作,一鍵清空~
options(stringsAsFactors = F)
load(file = 'step1-output.Rdata')
# 每次都要檢測數(shù)據(jù)
dat[1:4,1:4]
cg=names(tail(sort(apply(dat, 1, sd)),1000))
library(pheatmap)
pheatmap(dat[cg,],show_colnames =F,show_rownames = F)
rowMeans(dat[,1:3]) - rowMeans(dat[,4:6])
cg1=names(tail(sort(rowMeans(dat[,1:3]) - rowMeans(dat[,4:6]) ),500))
cg2=names(head(sort(rowMeans(dat[,1:3]) - rowMeans(dat[,4:6]) ),500))
cg=c(cg1,cg2)
n=t(scale(t(dat[cg,])))
n[n>2]=2
n[n< -2]= -2
n[1:4,1:4]
pheatmap(n,show_colnames =F,show_rownames = F)
ac=data.frame(g=group_list)
rownames(ac)=colnames(n)
pheatmap(n,show_colnames =F,
show_rownames = F,
cluster_cols = F,
annotation_col=ac)
##step4-DEG
rm(list = ls()) ## 魔幻操作,一鍵清空~
options(stringsAsFactors = F)
load(file = 'step2-output.Rdata')######要知道此時(shí)是step2中的dat哦
# 每次都要檢測數(shù)據(jù)
dat[1:4,1:4]
table(group_list)
##boxplot圖
boxplot(dat[1,]~group_list)
t.test(dat[1,]~group_list)
bp=function(g){
library(ggpubr)
df=data.frame(gene=g,stage=group_list)
p <- ggboxplot(df, x = "stage", y = "gene",
color = "stage", palette = "jco",
add = "jitter")
# Add p-value
p + stat_compare_means()
}
bp(dat[1,])
bp(dat[2,])
bp(dat[3,])
bp(dat[4,])
##DEG-limma包
library(limma)
design=model.matrix(~factor( group_list ))
fit=lmFit(dat,design)
fit=eBayes(fit)
options(digits = 4)
#topTable(fit,coef=2,adjust='BH')
topTable(fit,coef=2,adjust='BH')
bp(dat['KLK10',])
bp(dat['FXYD3',])
deg=topTable(fit,coef=2,adjust='BH',number = Inf)
head(deg)
save(deg,file = 'deg.Rdata')
## for volcano
if(T){
nrDEG=deg
head(nrDEG)
attach(nrDEG)
plot(logFC,-log10(P.Value))
library(ggpubr)
df=nrDEG
df$v= -log10(P.Value)
ggscatter(df, x = "logFC", y = "v",size=0.5)
df$g=ifelse(df$P.Value>0.01,'stable',
ifelse( df$logFC >1.5,'up',
ifelse( df$logFC < -1.5,'down','stable') )
)
table(df$g)#此時(shí)獲得的上調(diào)基因?yàn)?0,下調(diào)基因?yàn)?45
df$symbol=rownames(df)
ggscatter(df, x = "logFC", y = "v",size=0.5,color = 'g')
ggscatter(df, x = "logFC", y = "v", color = "g",size = 0.5,
label = "symbol", repel = T,
#label.select = rownames(df)[df$g != 'stable'] ,
label.select = rownames(head(head(deg))),
palette = c("#00AFBB", "#E7B800", "#FC4E07") )
ggscatter(df, x = "AveExpr", y = "logFC",size = 0.2)
df$p_c = ifelse(df$P.Value<0.001,'p<0.001',
ifelse(df$P.Value<0.01,'0.001<p<0.01','p>0.01'))
table(df$p_c )
ggscatter(df,x = "AveExpr", y = "logFC", color = "p_c",size=0.2,
palette = c("green", "red", "black") )
}
## 熱圖:for heatmap
rm(list = ls()) ## 魔幻操作,一鍵清空~
options(stringsAsFactors = F)
if(T){
load(file = 'step2-output.Rdata')
# 每次都要檢測數(shù)據(jù)
dat[1:4,1:4]
table(group_list)
load(file = 'deg.Rdata')
x=deg$logFC
names(x)=rownames(deg)
cg=c(names(head(sort(x),20)),#老大的代碼中是100、100,由于我獲得上下調(diào)基因少,就改了
names(tail(sort(x),145)))
library(pheatmap)
pheatmap(dat[cg,],show_colnames =F,show_rownames = F)
n=t(scale(t(dat[cg,])))
n[n>2]=2
n[n< -2]= -2
n[1:4,1:4]
pheatmap(n,show_colnames =F,show_rownames = F)
ac=data.frame(g=group_list)
rownames(ac)=colnames(n)
pheatmap(n,show_colnames =F,
show_rownames = F,
cluster_cols = F,
annotation_col=ac)
}
到這里就差不多結(jié)束了,基本得到和文章中差不多的熱圖。還有很多做圖技巧需要慢慢學(xué)習(xí)。其中的代碼均從老大那copy過來的,需要邊做邊理解,注意每一步變量的變化,以不變應(yīng)萬變,這點(diǎn)很重要哇。
十分<感謝老大>
的指導(dǎo)和幫助,第一次做到這里,很開心哇~??
聯(lián)系客服